<?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-05-26T08:43:08+00:00</updated>
<link rel="self" type="application/atom+xml" href="https://www.jenkins.io/full-rss.xml" />
<link rel="alternate" type="text/html" href="https://www.jenkins.io/" />
<entry>
<id>https://www.jenkins.io/blog/2026/05/26/jenkins-community-award-winners/</id>
<title>Jenkins 2026 Community Award Winners</title>
<updated>2026-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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>
<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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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>
<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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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>
<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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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-05-26T08:43:08+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>
<entry>
<id>https://www.jenkins.io/blog/2025/12/23/repository-signing-keys-changing/</id>
<title>Jenkins 2.543 and 2.541.1: New Linux Repository Signing Keys</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-12-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/12/23/repository-signing-keys-changing/" />
<category term='announcement'></category>
<category term='linux'></category>
<category term='platform'></category>
<summary>
Beginning December 23, 2025 with 2.543, the Jenkins weekly releases will use new repository signing keys for the Linux installation packages.
The same change will be made in Jenkins LTS releases beginning January 21, 2026.
Administrators of Linux systems must install the new signing keys on their Linux servers before installing Jenkins Jenkins weekly 2.543 or Jenkins LTS 2.541.1.


Debian/Ubuntu


Update Debian compatible operating systems (Debian, Ubuntu, Linux Mint Debian Edition, etc.) with the command:


Debian/Ubuntu LTS release

curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2026.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc &gt; /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list &gt; /dev/null



Debian/Ubuntu weekly release

curl -fsSL...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning December 23, 2025 with 2.543, the Jenkins weekly releases will use new repository signing keys for the Linux installation packages.
The same change will be made in Jenkins LTS releases beginning January 21, 2026.
Administrators of Linux systems &lt;strong&gt;must&lt;/strong&gt; install the new signing keys on their Linux servers &lt;strong&gt;before&lt;/strong&gt; installing Jenkins Jenkins weekly 2.543 or Jenkins LTS 2.541.1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;debianubuntu&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#debianubuntu&quot; /&gt;Debian/Ubuntu&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Update Debian compatible operating systems (Debian, Ubuntu, Linux Mint Debian Edition, etc.) with the command:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Debian/Ubuntu LTS release&lt;/div&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;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://pkg.jenkins.io/debian-stable/jenkins.io-2026.key | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  /usr/share/keyrings/jenkins-keyring.asc &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;deb &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;signed-by&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/share/keyrings/jenkins-keyring.asc] &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  https://pkg.jenkins.io/debian-stable binary/ | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  /etc/apt/sources.list.d/jenkins.list &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Debian/Ubuntu weekly release&lt;/div&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;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://pkg.jenkins.io/debian/jenkins.io-2026.key | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  /usr/share/keyrings/jenkins-keyring.asc &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;deb &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;signed-by&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/share/keyrings/jenkins-keyring.asc] &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  https://pkg.jenkins.io/debian binary/ | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  /etc/apt/sources.list.d/jenkins.list &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null&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;red-hatcentos&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#red-hatcentos&quot; /&gt;Red Hat/CentOS&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Update Red Hat compatible operating systems (Red Hat Enterprise Linux, Alma Linux, CentOS, Fedora, Oracle Linux, Rocky Linux, Scientific Linux, etc.) with the command:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Red Hat/CentOS LTS release&lt;/div&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;sudo &lt;/span&gt;rpm &lt;span class=&quot;nt&quot;&gt;--import&lt;/span&gt; https://pkg.jenkins.io/rpm-stable/jenkins.io-2026.key&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Red Hat/CentOS weekly release&lt;/div&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;sudo &lt;/span&gt;rpm &lt;span class=&quot;nt&quot;&gt;--import&lt;/span&gt; https://pkg.jenkins.io/rpm/jenkins.io-2026.key&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;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;what-if-i-dont-update-the-repository-signing-key&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-if-i-dont-update-the-repository-signing-key&quot; /&gt;What if I don’t update the repository signing key?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Updates may be &lt;strong&gt;blocked&lt;/strong&gt; or interrupted by the operating system package manager (apt, yum, dnf) on operating systems that have not installed the new repository signing key.
Sample messages from the operating system may look like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Debian/Ubuntu&lt;/div&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;Reading package lists... Done
W: GPG error: https://pkg.jenkins.io/debian-stable binary/ Release:
    The following signatures couldn&lt;span class=&quot;s1&quot;&gt;&#39;t be verified because the public key is not available:
        NO_PUBKEY 7198F4B714ABFC68
E: The repository &#39;&lt;/span&gt;https://pkg.jenkins.io/debian-stable binary/ Release&lt;span class=&quot;s1&quot;&gt;&#39; is not signed.
N: Updating from such a repository can&#39;&lt;/span&gt;t be &lt;span class=&quot;k&quot;&gt;done &lt;/span&gt;securely, and is therefore disabled by default.
N: See apt-secure&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;8&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; manpage &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;repository creation and user configuration details.&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;why-is-the-repository-signing-key-being-updated&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-is-the-repository-signing-key-being-updated&quot; /&gt;Why is the repository signing key being updated?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The repository signing key expires after 3 years so that it matches with the expiration dates of the jar file signing and the MSI signing certificate.
The updated GPG repository signing key is used in the weekly repositories and the stable repositories.&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;Operating systems that use Debian package management (apt) and operating systems that use Red Hat package management (yum and dnf) need the new repository signing key.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other operating systems like Windows, macOS, FreeBSD, OpenBSD, Solaris, and OpenIndiana are not affected.&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/10/jenkins-bug-bounty-program-yeswehack-european-commission/</id>
<title>Announcing the new Jenkins Bug Bounty Program</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-12-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/12/10/jenkins-bug-bounty-program-yeswehack-european-commission/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='security'></category>
<category term='yeswehack'></category>
<category term='europeancommission'></category>
<summary>
It is with great pleasure that we announce the new Jenkins Bug Bounty Program!
The European Commission (EC OSPO) has partnered with YesWeHack to launch bug bounty programs for several open source projects.
The Jenkins project was selected as a valuable asset for public administration across the European Union.


The program will run for one year, rewarding security researchers who find and responsibly disclose security vulnerabilities in Jenkins.


Why a Bug Bounty Program?


Bug bounty programs complement our existing security practices by engaging the security research community in identifying and responsibly disclosing vulnerabilities.


This additional layer of scrutiny, combined with financial incentives, helps ensure Jenkins remains...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is with great pleasure that we announce the new Jenkins Bug Bounty Program!
The European Commission (&lt;a href=&quot;https://interoperable-europe.ec.europa.eu/collection/ec-ospo&quot;&gt;EC OSPO&lt;/a&gt;) has partnered with &lt;a href=&quot;https://www.yeswehack.com/&quot;&gt;YesWeHack&lt;/a&gt; to launch bug bounty programs for several open source projects.
The Jenkins project was selected as a valuable asset for public administration across the European Union.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The program will run for one year, rewarding security researchers who find and responsibly disclose security vulnerabilities in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-a-bug-bounty-program&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-a-bug-bounty-program&quot; /&gt;Why a Bug Bounty Program?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Bug bounty programs complement our existing security practices by engaging the security research community in identifying and responsibly disclosing vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This additional layer of scrutiny, combined with financial incentives, helps ensure Jenkins remains a secure and reliable automation server for organizations worldwide.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;program-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#program-details&quot; /&gt;Program Details&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;Initial scope&lt;/strong&gt;: Jenkins Core and its main components, and four plugins related to security&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reward&lt;/strong&gt;: Up to €5,000 for valid critical findings!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platform&lt;/strong&gt;: &lt;a href=&quot;https://yeswehack.com/programs/jenkins-bug-bounty-program&quot;&gt;Jenkins Bug Bounty Program on YesWeHack&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Funding&lt;/strong&gt;: European Commission&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Depending on the level of interest and quality of reports, we will consider expanding the scope to other components of the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For security researchers, it’s an additional reason to invest time on Jenkins. In addition to the white-box testing enabled by the open-source nature of the project, you can even get financial rewards for your efforts!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-does-it-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-does-it-work&quot; /&gt;How Does It Work?&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;The in-scope reports are sent to the YesWeHack platform.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The initial triage is done by YesWeHack team.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Valid reports are then sent to the Jenkins Security Team for further analysis / validation, creating the corresponding SECURITY tickets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Then the maintainers of the components are contacted to fix the issues.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This enhancement integrates seamlessly with our existing security workflow, while providing additional visibility and support from the European Commission and YesWeHack.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;thank-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thank-you&quot; /&gt;Thank You&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We sincerely thank the European Commission and YesWeHack for making this program possible. Their support enables the Jenkins project to further strengthen its security posture and continue serving the open source community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We invite security researchers to explore the program and help us make Jenkins more secure. Whether you’re a seasoned researcher or new to bug bounties, your contributions are valuable to the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/10/31/automating-jenkins-on-android/</id>
<title>Automating Jenkins on Android with Infrastructure as Code</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-10-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/10/31/automating-jenkins-on-android/" />
<category term='jenkins'></category>
<category term='android'></category>
<category term='termux'></category>
<category term='ansible'></category>
<category term='infrastructure-as-code'></category>
<category term='automation'></category>
<summary>
From Manual to Automated


In March 2023, I explored running Jenkins on Android devices using Termux, demonstrating that it&#8217;s technically possible to transform aging smartphones into CI/CD infrastructure. The manual setup worked, but it required 2-3 hours of configuration and was error-prone.


Fast-forward to 2025: I&#8217;ve automated the entire process using Infrastructure as Code principles. What once took hours of manual configuration now completes in 15 minutes with a single command. This article presents the automation solution and the lessons learned while building it.




Why Automate Jenkins on Android?


The motivation is straightforward:




Reproducibility: Manual setups are difficult to replicate across multiple devices. Automation ensures...
</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/2023/03/29/2023-03-22-android-and-jenkins/love.png&quot; alt=&quot;Jenkins on Android automation&quot; width=&quot;50%&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;from-manual-to-automated&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#from-manual-to-automated&quot; /&gt;From Manual to Automated&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/30/android-and-jenkins/&quot;&gt;March 2023&lt;/a&gt;, I explored running Jenkins on Android devices using Termux, demonstrating that it’s technically possible to transform aging smartphones into CI/CD infrastructure. The manual setup worked, but it required 2-3 hours of configuration and was error-prone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Fast-forward to 2025: I’ve automated the entire process using Infrastructure as Code principles. What once took hours of manual configuration now completes in 15 minutes with a single command. This article presents the automation solution and the lessons learned while building it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-automate-jenkins-on-android&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-automate-jenkins-on-android&quot; /&gt;Why Automate Jenkins on Android?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The motivation is straightforward:&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;Reproducibility&lt;/strong&gt;: Manual setups are difficult to replicate across multiple devices. Automation ensures consistency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;E-waste reduction&lt;/strong&gt;: Millions of functional Android devices sit in drawers. Why not repurpose them as build agents?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learning opportunity&lt;/strong&gt;: Building this automation taught valuable lessons about service management, SSH configuration, and testing methodologies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cost-effective CI/CD&lt;/strong&gt;: For small projects, hobbyists, or educational environments, repurposed phones offer free compute.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal wasn’t just to automate &lt;strong&gt;my&lt;/strong&gt; setup—it was to create a reproducible solution anyone could use.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-infrastructure-as-code-solution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-infrastructure-as-code-solution&quot; /&gt;The Infrastructure as Code Solution&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The complete automation is available at &lt;a href=&quot;https://github.com/gounthar/termux-jenkins-automation&quot;&gt;github.com/gounthar/termux-jenkins-automation&lt;/a&gt;. The solution uses:&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;Ansible&lt;/strong&gt;: Infrastructure automation across 8 reusable roles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins Configuration as Code (JCasC)&lt;/strong&gt;: Declarative Jenkins configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Termux&lt;/strong&gt;: Linux environment on Android without root access&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;architecture-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#architecture-overview&quot; /&gt;Architecture Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The automation deploys a complete Jenkins infrastructure on a single Android device:&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;┌───────────────────────────────────────┐
│      Android Phone (Termux)        │
│  ┌──────────────────────────────────┐ │
│  │  Jenkins Controller (Minimal) │ │
│  │  - Port 8080 (Web UI)         │ │
│  │  - JCasC configured           │ │
│  └──────────┬───────────────────────┘ │
│            │ SSH (localhost:8022)  │
│  ┌──────────▼───────────────────────┐ │
│  │  Jenkins Agent (SSH)          │ │
│  │  - Build tools installed      │ │
│  │  - 2 executors                │ │
│  └──────────────────────────────────┘ │
└───────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The controller handles job orchestration while delegating builds to the agent (on the same device). This architecture mirrors production setups and teaches Jenkins best practices.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;eight-ansible-roles&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#eight-ansible-roles&quot; /&gt;Eight Ansible Roles&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The automation is organized into focused, reusable roles:&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;&lt;strong&gt;termux-base&lt;/strong&gt;: Core Termux setup (SSH, Python, package management)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;termux-complete-setup&lt;/strong&gt;: Comprehensive package installation (59+ packages including build tools, languages, dev tools)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;jenkins-controller&lt;/strong&gt;: Jenkins installation and initialization&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;jenkins-agent&lt;/strong&gt;: SSH agent configuration and workspace setup&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;jenkins-jcasc&lt;/strong&gt;: Configuration as Code deployment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;jenkins-backup&lt;/strong&gt;: Job and configuration backup utilities&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;termux-boot-setup&lt;/strong&gt;: Optional auto-start on device boot&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;termux-buildtools&lt;/strong&gt;: Legacy build tools (superseded by termux-complete-setup)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each role is idempotent and can be run independently or as part of the complete setup playbook.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;quick-start&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quick-start&quot; /&gt;Quick Start&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main orchestration playbook ties everything together:&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;# On the Android device (in Termux)&lt;/span&gt;
pkg &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;openssh python
sshd
passwd
&lt;span class=&quot;nb&quot;&gt;whoami
&lt;/span&gt;ifconfig wlan0

&lt;span class=&quot;c&quot;&gt;# On your laptop/PC&lt;/span&gt;
git clone https://github.com/gounthar/termux-jenkins-automation.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;termux-jenkins-automation
./scripts/run-setup.sh

&lt;span class=&quot;c&quot;&gt;# Answer prompts:&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# - IP address (from ifconfig)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# - SSH port (8022 default)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# - Username (from whoami)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# - Jenkins admin password&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# - Authentication method (SSH key recommended)&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Wait ~15 minutes&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Access Jenkins:&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# http://&amp;lt;phone-ip&amp;gt;:8080&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 script handles prerequisites checking, inventory configuration, and playbook execution. No manual Ansible configuration required.&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;key-technical-insights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-technical-insights&quot; /&gt;Key Technical Insights&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building this automation revealed several important lessons:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;service-management-runit-over-background-processes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#service-management-runit-over-background-processes&quot; /&gt;Service Management: runit over Background Processes&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Initially, I ran Jenkins as a background process (&lt;code&gt;java -jar jenkins.war &amp;amp;&lt;/code&gt;). This approach had problems:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Process dies when terminal closes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No automatic restart on failure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No log management&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Difficult to monitor&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The solution: Termux’s service management system using &lt;code&gt;runit&lt;/code&gt; and &lt;code&gt;sv&lt;/code&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;c&quot;&gt;# Jenkins runs as a managed service&lt;/span&gt;
sv status jenkins
&lt;span class=&quot;c&quot;&gt;# Output: run: jenkins: (pid 31647) 95s; run: log: (pid 26734) 4516s&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Service management commands&lt;/span&gt;
sv up jenkins      &lt;span class=&quot;c&quot;&gt;# Start&lt;/span&gt;
sv down jenkins    &lt;span class=&quot;c&quot;&gt;# Stop&lt;/span&gt;
sv restart jenkins &lt;span class=&quot;c&quot;&gt;# Restart&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;Logs are handled by &lt;code&gt;svlogd&lt;/code&gt; with automatic rotation:&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;# View live logs&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;tail&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ~/.jenkins/logs/current

&lt;span class=&quot;c&quot;&gt;# All logs automatically rotated and compressed&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-lh&lt;/span&gt; ~/.jenkins/logs/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This mirrors production service management and prevents the &quot;my Jenkins died overnight&quot; problem.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;fresh-installation-testing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fresh-installation-testing&quot; /&gt;Fresh Installation Testing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The biggest mistake: testing only on my development phone. The automation worked perfectly…​ on the device I’d been configuring manually for weeks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I tested on a fresh Termux installation, it failed immediately. Missing dependencies that I’d installed manually months ago weren’t in the playbooks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;: Systematic fresh installation testing on multiple devices. This revealed:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Missing repository configurations (needed &lt;code&gt;root-repo&lt;/code&gt; and &lt;code&gt;pointless&lt;/code&gt; repos for &lt;code&gt;gcc-8&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Undocumented package dependencies&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSH key permission issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Service startup race conditions&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Fresh installation testing became part of the development workflow. Every change was validated on a wiped device.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Current success rate&lt;/strong&gt;: 98% on fresh Termux installations (the 2% failure is usually network timeouts during package installation).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-configuration-as-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-configuration-as-code&quot; /&gt;Jenkins Configuration as Code&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Manual Jenkins configuration through the UI isn’t reproducible. The solution: JCasC (Jenkins Configuration as Code).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Complete Jenkins configuration in YAML:&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;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;systemMessage&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;Jenkins&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Android&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;(Termux)&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Automated&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Setup&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;numExecutors&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Controller doesn&#39;t run builds&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;securityRealm&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;users&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;admin&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;password&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;${JENKINS_ADMIN_PASSWORD:-admin}&quot;&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;system&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;domainCredentials&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;domain&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;name&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;SSH&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Agent&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Credentials&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;credentials&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;basicSSHUserPrivateKey&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;termux-agent-key&quot;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;privateKeySource&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;na&quot;&gt;directEntry&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
                  &lt;span class=&quot;na&quot;&gt;privateKey&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;${readFile:/data/data/com.termux/files/home/.jenkins/ssh/id_ed25519}&quot;&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;nodes&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;permanent&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;name&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;termux-agent-1&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;remoteFS&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;/data/data/com.termux/files/home/jenkins-agent&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;launcher&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;host&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;localhost&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8022&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;credentialsId&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;termux-agent-key&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;The automation deploys this configuration, and Jenkins applies it on startup. No clicking through UI 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;lessons-for-production-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lessons-for-production-jenkins&quot; /&gt;Lessons for Production Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While this project targets Android devices, the patterns apply to any Jenkins deployment:&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;Infrastructure as Code&lt;/strong&gt;: All configuration in version control&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service Management&lt;/strong&gt;: Proper process supervision (systemd, runit, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configuration as Code&lt;/strong&gt;: JCasC for reproducible Jenkins configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fresh Installation Testing&lt;/strong&gt;: Never assume dependencies are present&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modular Roles&lt;/strong&gt;: Break automation into focused, reusable components&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;termux-jenkins-automation&lt;/code&gt; repository demonstrates these principles in a constrained environment (no root, mobile platform, limited resources). If it works on Android, these patterns will definitely work on traditional servers.&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 automation is production-ready for single-device setups. Future enhancements could include:&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;Multi-device clustering&lt;/strong&gt;: Coordinate multiple Android phones as a Jenkins cluster&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plugin automation&lt;/strong&gt;: Automated plugin installation and updates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Backup/restore workflows&lt;/strong&gt;: Scheduled backups to cloud storage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance optimization&lt;/strong&gt;: Memory tuning for constrained devices&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitoring integration&lt;/strong&gt;: Prometheus metrics export&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The foundation is solid. The patterns are proven. The infrastructure is code.&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-yourself&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#try-it-yourself&quot; /&gt;Try It Yourself&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The complete automation, documentation, and troubleshooting guides are available at:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gounthar/termux-jenkins-automation&quot; class=&quot;bare&quot;&gt;https://github.com/gounthar/termux-jenkins-automation&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Requirements:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Android device with Termux installed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laptop/PC with Ansible 2.10+&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;15 minutes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whether you’re repurposing e-waste, building a home lab, or learning Jenkins administration, this automation provides a reproducible path from bare Android device to functioning Jenkins infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From manual experiment to automated solution—that’s the Infrastructure as Code journey.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Related articles:&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://www.jenkins.io/blog/2023/03/30/android-and-jenkins/&quot;&gt;Android and Jenkins: what is the limit?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/04/07/android-and-jenkins-discovery/&quot;&gt;Building Android apps with Jenkins: an introduction&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/10/19/maeve-final-evaluation/</id>
<title>Advancing the Jenkins Tekton Client Plugin through CRD Generation, JUnit 5 Modernization, and Automated CI</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-10-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/10/19/maeve-final-evaluation/" />
<category term='gsoc'></category>
<category term='gsoc2025'></category>
<category term='jenkins'></category>
<category term='tekton'></category>
<category term='kubernetes'></category>
<category term='cicd'></category>
<category term='plugin'></category>
<category term='testing'></category>
<category term='crd'></category>
<summary>
The Jenkins Tekton Client Plugin bridges Jenkins and Kubernetes-native Tekton pipelines, allowing Jenkins users to trigger and manage Tekton resources directly from their existing CI/CD workflows. Over the course of Google Summer of Code 2025, significant progress was made in modernizing, stabilizing, and extending the plugin’s capabilities.


This project introduced end-to-end CI automation, migrated tests to JUnit 5, implemented large-scale CRD-to-Java and UI generation systems, and improved Jenkins–Tekton interoperability.



Project Overview

The Jenkins Tekton Client Plugin enables Jenkins jobs to interact with Tekton resources such as Pipelines, PipelineRuns, and Tasks running on Kubernetes clusters. The goal of this GSoC project was to:




Modernize the...
</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/2025/08/31/gsoc-maeveho-tekton.png&quot; alt=&quot;Advancing the Jenkins Tekton Plugin&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Tekton Client Plugin bridges Jenkins and Kubernetes-native Tekton pipelines, allowing Jenkins users to trigger and manage Tekton resources directly from their existing CI/CD workflows. Over the course of Google Summer of Code 2025, significant progress was made in modernizing, stabilizing, and extending the plugin’s capabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project introduced end-to-end CI automation, migrated tests to JUnit 5, implemented large-scale CRD-to-Java and UI generation systems, and improved Jenkins–Tekton interoperability.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-overview&quot; /&gt;Project Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Tekton Client Plugin enables Jenkins jobs to interact with Tekton resources such as Pipelines, PipelineRuns, and Tasks running on Kubernetes clusters. The goal of this GSoC project was to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Modernize the build and testing infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improve test coverage and reliability&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate the generation of Java POJOs and Jenkins UI elements from Tekton Custom Resource Definitions (CRDs)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Strengthen the CI/CD integration between Jenkins and Tekton&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All work was completed in close collaboration with the Jenkins community through public pull requests, reviews, and test deployments.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;continuous-integration-and-build-automation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#continuous-integration-and-build-automation&quot; /&gt;Continuous Integration and Build Automation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/391&quot;&gt;#391 – Add GitHub Actions&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A new GitHub Actions configuration was added to automate the build and testing process.
Two workflows, &lt;code&gt;test.yml&lt;/code&gt; and &lt;code&gt;build.yml&lt;/code&gt;, now ensure that &lt;code&gt;mvn clean verify&lt;/code&gt; and full build validation are executed on every commit.
This CI layer ensures early detection of build issues and maintains consistent testing across environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/393&quot;&gt;#393 – Update Jenkinsfile for Linux JDK 17&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkinsfile was upgraded to use modern Linux agents and JDK 17, aligning the plugin with current Jenkins core requirements. This transition improves build consistency, performance, and future compatibility.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;documentation-and-developer-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-and-developer-experience&quot; /&gt;Documentation and Developer Experience&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/416&quot;&gt;#416 – Update README with comprehensive plugin documentation&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The README file was rewritten to include installation guidance, usage examples, and CI/CD architecture explanations.
A clear breakdown of supported Jenkins versions, Tekton compatibility, and build prerequisites was added, making the plugin more accessible for new contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/423&quot;&gt;#423 – Rename default branch to main&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The default branch was renamed from &lt;code&gt;master&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt; to follow modern repository standards.
All workflow and build references were updated accordingly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/427&quot;&gt;#427 – Remove Windows support for CI&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Windows testing environments were deprecated to streamline CI execution and reduce maintenance complexity.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;test-modernization-and-migration-to-junit-5&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#test-modernization-and-migration-to-junit-5&quot; /&gt;Test Modernization and Migration to JUnit 5&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/421&quot;&gt;#421 – Migrate and Refactor Tests to JUnit 5&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A full migration from JUnit 4 to JUnit 5 was completed. The modernized test suite enhances readability, reliability, and extensibility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Highlights include:
* Migration of &lt;code&gt;CreateRawTest&lt;/code&gt; and &lt;code&gt;CreateRawMockServerTest&lt;/code&gt; to JUnit 5
* Partial migration and modernization of &lt;code&gt;JenkinsFreestyleTest&lt;/code&gt; and &lt;code&gt;JenkinsPipelineTest&lt;/code&gt;
* Reactivation of disabled tests
* Adoption of parameterized and assertion-based testing features available in JUnit 5&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This upgrade ensures the plugin aligns with the current Jenkins testing ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;integration-and-end-to-end-testing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#integration-and-end-to-end-testing&quot; /&gt;Integration and End-to-End Testing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/433&quot;&gt;#433 – Add Jenkins Build End-to-End Tests and JaCoCo Integration&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Comprehensive end-to-end tests were introduced to validate interactions between Jenkins jobs and Tekton pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following scenarios were implemented:
* Freestyle builds with Jenkins environment variables
* Parameterized pipeline builds with Tekton resources
* Tekton pipeline execution from file-based definitions
* Jenkins Pipeline integration using Tekton APIs&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JaCoCo was also integrated to automatically measure test coverage.
These tests ensure reliable behavior across Jenkins–Tekton workflows and serve as regression guards for future changes.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;bug-fixes-and-functional-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bug-fixes-and-functional-improvements&quot; /&gt;Bug Fixes and Functional Improvements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/446&quot;&gt;#446 – Fix Duplicate @Symbol Annotation in tektonCreateRaw&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Resolved a long-standing UI issue where the “Create Resource (Raw)” step was missing from the Jenkins interface due to duplicate &lt;code&gt;@Symbol&lt;/code&gt; annotations.
The fix restored visibility and configurability of Tekton resource creation within the Jenkins UI.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;crd-to-java-pojo-generation-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#crd-to-java-pojo-generation-system&quot; /&gt;CRD to Java POJO Generation System&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/450&quot;&gt;#450 – Add CRD to Java POJO Generation at Maven Build Time&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was the core deliverable of the GSoC project.
A new system was designed to automatically generate Java classes from Tekton CRDs at build time. This feature allows the plugin to stay in sync with evolving Tekton APIs without manual intervention.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Key components:
* &lt;code&gt;CrdJavaGenerator&lt;/code&gt; – integrates CRD generation into the Maven lifecycle
* &lt;code&gt;EnhancedCrdProcessor&lt;/code&gt; – parses CRD schemas and converts them into Java classes using &lt;code&gt;jsonschema2pojo&lt;/code&gt;
* Maven profile &lt;code&gt;download-binaries&lt;/code&gt; – downloads Tekton CRD definitions during build
* Generated POJOs include &lt;code&gt;@DataBoundConstructor&lt;/code&gt; and extend Jenkins &lt;code&gt;BaseStep&lt;/code&gt; for UI integration&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The system now supports multiple Tekton API versions (&lt;code&gt;v1&lt;/code&gt;, &lt;code&gt;v1beta1&lt;/code&gt;, &lt;code&gt;v1alpha1&lt;/code&gt;) and produces over one thousand Java classes that reflect the CRD specifications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This automation significantly reduces maintenance burden and enables Jenkins to support new Tekton resources dynamically.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;unit-testing-for-the-generation-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#unit-testing-for-the-generation-system&quot; /&gt;Unit Testing for the Generation System&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/480&quot;&gt;#480 – Unit Tests for CRD Generation System&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An extensive test suite was implemented to validate the CRD-to-POJO generator.
Tests cover:
* Multi-version CRD compatibility
* Field-level mapping and schema inheritance
* Generated code compilation and JSON serialization
* Integration between generated POJOs and existing Jenkins steps&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over fifty unit and integration tests ensure the generator behaves deterministically and maintains correctness across Tekton versions.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;crd-to-jenkins-ui-auto-generation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#crd-to-jenkins-ui-auto-generation&quot; /&gt;CRD to Jenkins UI Auto-Generation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;PR: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/484&quot;&gt;#484 – Add CRD to Jenkins UI Auto-Generation System&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second major feature developed during the project extends the generation pipeline to the Jenkins front-end.
This system automatically converts Tekton CRDs into functional Jenkins configuration forms.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Core modules:
* &lt;code&gt;TektonCrdToJavaProcessor.java&lt;/code&gt;
* &lt;code&gt;AdvancedJellyConfigGenerator.java&lt;/code&gt;
* &lt;code&gt;JellyConfigGenerator.java&lt;/code&gt;
* &lt;code&gt;TektonPojoGenerator.java&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The process transforms CRD definitions into structured Jenkins forms, automatically detecting data types and grouping configuration fields into logical sections such as metadata, spec, and parameters.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This lays the groundwork for dynamic UI generation in future Jenkins releases, allowing new Tekton APIs to appear automatically in the Jenkins interface without manual XML or Jelly coding.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;technical-takeaways&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#technical-takeaways&quot; /&gt;Technical Takeaways&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project brought together multiple aspects of Jenkins plugin development, including CI automation, test modernization, and large-scale code generation.
The most challenging aspect was maintaining compatibility between Jenkins’ job-based architecture and Tekton’s Kubernetes-native workflow model.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Key results:
* JUnit 5 migration modernized the testing infrastructure.
* Automated CRD and UI generation established a maintainable path for future Tekton API integration.
* End-to-end testing improved confidence in Jenkins–Tekton interoperability.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;future-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-work&quot; /&gt;Future Work&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next steps for the Jenkins Tekton Client Plugin include:
* Expanding UI testing and validation for auto-generated Jelly forms
* Extending support to Tekton Chains, Triggers, and Results
* Increasing coverage and reducing build time for large CRD sets
* Integrating the generator directly into Jenkins release workflows&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to thank my mentors and the Jenkins community for their support and detailed feedback throughout this project.
Working on the Jenkins Tekton Client Plugin during Google Summer of Code 2025 has provided invaluable experience in large-scale open source development and continuous integration architecture.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Project repository: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin&quot;&gt;jenkinsci/tekton-client-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull requests:
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/391&quot;&gt;#391&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/393&quot;&gt;#393&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/416&quot;&gt;#416&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/421&quot;&gt;#421&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/423&quot;&gt;#423&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/427&quot;&gt;#427&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/433&quot;&gt;#433&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/446&quot;&gt;#446&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/450&quot;&gt;#450&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/480&quot;&gt;#480&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/484&quot;&gt;#484&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&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/2025/10/19/birajit-saikia-gsoc-finalterm-update-blog-post/</id>
<title>GSoC 2025 Final Term: Build Retooling of jenkins.io</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-10-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/10/19/birajit-saikia-gsoc-finalterm-update-blog-post/" />
<author>
<name>biru-codeastromer</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2025'></category>
<category term='gsoc2025-endterm'></category>
<category term='jenkins.io'></category>
<category term='jenkins-infra'></category>
<category term='documentation'></category>
<category term='vitejs'></category>
<category term='antora'></category>
<summary>
This post marks the successful completion of my Google Summer of Code 2025 project: Complete Build Retooling of jenkins.io. Over the past months, we&#8217;ve transformed the Jenkins documentation infrastructure from legacy systems to a modern, performant, and well-organized platform.


Table of Contents




Project Recap


Post-Midterm Achievements



Non-Versioned Site (Vite.js) Completion


Versioned Site (Antora) Enhancements





Technical Implementation Deep Dive


Challenges &amp; Learnings


Future Roadmap


Acknowledgments


Project Resources






Project Recap


The initiative set out to achieve three core objectives for the Jenkins documentation system:




Modernization: Transitioning from legacy tools to contemporary solutions (Antora + Vite.js)


Performance: Implementing faster build processes and better user experience


Organization: Establishing clear separation between versioned content (LTS releases) and non-versioned content (general...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC Logo&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post marks the successful completion of my Google Summer of Code 2025 project: &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/complete-alternative-jenkins-io-build-retooling/&quot;&gt;Complete Build Retooling of jenkins.io&lt;/a&gt;&lt;/strong&gt;. Over the past months, we’ve transformed the Jenkins documentation infrastructure from legacy systems to a modern, performant, and well-organized platform.&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;#project-recap&quot;&gt;Project Recap&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#post-midterm-achievements&quot;&gt;Post-Midterm Achievements&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;#non-versioned-site-vite-js-completion&quot;&gt;Non-Versioned Site (Vite.js) Completion&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#versioned-site-antora-enhancements&quot;&gt;Versioned Site (Antora) Enhancements&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;#technical-implementation-deep-dive&quot;&gt;Technical Implementation Deep Dive&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#challenges-learnings&quot;&gt;Challenges &amp;amp; Learnings&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#future-roadmap&quot;&gt;Future Roadmap&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgments&quot;&gt;Acknowledgments&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#project-resources&quot;&gt;Project Resources&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;project-recap&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-recap&quot; /&gt;Project Recap&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The initiative set out to achieve three core objectives for the Jenkins documentation system:&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;&lt;strong&gt;Modernization&lt;/strong&gt;: Transitioning from legacy tools to contemporary solutions (Antora + Vite.js)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Implementing faster build processes and better user experience&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organization&lt;/strong&gt;: Establishing clear separation between versioned content (LTS releases) and non-versioned content (general documentation)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By midterm, we had successfully laid the foundation with Antora for versioned documentation and Vite.js for non-versioned content, having migrated several core pages and established the basic architecture.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;post-midterm-achievements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#post-midterm-achievements&quot; /&gt;Post-Midterm Achievements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second half of GSoC focused on completing the migration of all remaining components and polishing the user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;non-versioned-site-vite-js-completion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#non-versioned-site-vite-js-completion&quot; /&gt;Non-Versioned Site (Vite.js) Completion&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Vite.js site saw comprehensive completion with the migration of all critical components:&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;Home Page&lt;/strong&gt;: Fully implemented with dynamic content integration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blog System&lt;/strong&gt;: Complete migration with proper date handling and categorization&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security Advisories&lt;/strong&gt;: Full security folder with all advisories and individual issue pages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Changelogs&lt;/strong&gt;: Both LTS and weekly changelog pages implemented&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UI/UX Polish&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;System-aware dark/light mode throughout&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Proper note icons and warning elements across all pages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Consistent header and footer using jenkins-io-components&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mobile-responsive design improvements&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Key merged PRs include:&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/biru-codeastromer/docs.jenkins.io-vite.js-site/pull/43&quot;&gt;#43&lt;/a&gt; - Home page implementation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/docs.jenkins.io-vite.js-site/pull/42&quot;&gt;#42&lt;/a&gt; - Note icons correction across all pages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/docs.jenkins.io-vite.js-site/pull/40&quot;&gt;#40&lt;/a&gt; - Changelogs integration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/docs.jenkins.io-vite.js-site/pull/39&quot;&gt;#39&lt;/a&gt; - Security advisories folder&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/docs.jenkins.io-vite.js-site/pull/37&quot;&gt;#37&lt;/a&gt; - Blog system migration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/docs.jenkins.io-vite.js-site/pull/33&quot;&gt;#33&lt;/a&gt; - Thank-you note on download page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/docs.jenkins.io-vite.js-site/pull/31&quot;&gt;#31&lt;/a&gt; - Jenkins.io components header and footer&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;versioned-site-antora-enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#versioned-site-antora-enhancements&quot; /&gt;Versioned Site (Antora) Enhancements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The documentation repository received significant 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;UI Modernization&lt;/strong&gt;: Updated styling and component consistency&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Content Cleanup&lt;/strong&gt;: Removal of redundant security folder (now in Vite.js site)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Navigation Improvements&lt;/strong&gt;: Enhanced sidebar and navigation elements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SEO Foundation&lt;/strong&gt;: Meta tags and search engine optimization setup&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Key contributions:&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/docs.jenkins.io/pull/380&quot;&gt;#380&lt;/a&gt; - Comprehensive UI changes and modernization&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/docs.jenkins.io/pull/379&quot;&gt;#379&lt;/a&gt; - Removal of deprecated security folder&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ongoing cleanup and navigation link fixes&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;technical-implementation-deep-dive&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#technical-implementation-deep-dive&quot; /&gt;Technical Implementation Deep Dive&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The migration employed several sophisticated technical approaches:&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;Content Transformation&lt;/strong&gt;: Automated conversion of AsciiDoc to structured JSON/YAML for dynamic rendering in Vite.js&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Component Architecture&lt;/strong&gt;: Reusable React components for consistent UI across both platforms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Progressive Migration&lt;/strong&gt;: Incremental page-by-page migration ensuring zero downtime&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Visual Parity&lt;/strong&gt;: Pixel-perfect matching with existing jenkins.io design language&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build Optimization&lt;/strong&gt;: Streamlined build processes with proper asset handling&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;challenges-learnings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges-learnings&quot; /&gt;Challenges &amp;amp; Learnings&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This journey presented numerous learning opportunities:&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;Content Scale&lt;/strong&gt;: Managing thousands of documentation pages and blog posts required careful orchestration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tooling Integration&lt;/strong&gt;: Smooth coordination between Antora and Vite.js ecosystems&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UI Consistency&lt;/strong&gt;: Maintaining visual parity while modernizing the underlying technology&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community Collaboration&lt;/strong&gt;: Learning to effectively communicate and coordinate with the Jenkins infrastructure team&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Personal Resilience&lt;/strong&gt;: Overcoming technical hurdles, hardware failures, and scheduling challenges&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The experience strengthened not only my technical skills in modern web technologies and documentation systems but also my abilities in project management, communication, and open-source collaboration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-roadmap&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-roadmap&quot; /&gt;Future Roadmap&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the core migration is complete, several enhancements remain for future contributors:&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;Search Integration&lt;/strong&gt;: Algolia search implementation for both sites&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance Optimization&lt;/strong&gt;: Image compression and build time improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Progressive Web App&lt;/strong&gt;: Enhanced mobile experience and offline capabilities&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;: Comprehensive accessibility audit and improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;More UI Enhancements&lt;/strong&gt;: Continue modernizing the Antora (versioned) site with consistent components and improved user navigation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community Contribution&lt;/strong&gt;: Streamlined processes for community documentation contributions&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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project’s success is a testament to the incredible support and guidance from my mentors: &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/iamrajiv&quot;&gt;Rajiv Singh&lt;/a&gt;&lt;/strong&gt;. Their technical expertise, strategic guidance, and unwavering support were instrumental throughout this complex migration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to the entire Jenkins infrastructure team for their support and review, and to Alexander Brandes for guidance on search integration. The Jenkins GSoC org admins created a nurturing environment that made this learning journey possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me, this has been more than a summer project; it’s been a transformative experience in open-source contribution, technical architecture, and professional growth.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;final-presentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#final-presentation&quot; /&gt;Final Presentation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final project presentation delivered a comprehensive overview of the completed work and technical achievements. You can view all GSoC 2025 presentations &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#gsoc-2025&quot;&gt;on the Jenkins in Google Summer of Code page&lt;/a&gt;.&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;project-resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-resources&quot; /&gt;Project Resources&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://github.com/jenkins-infra/docs.jenkins.io&quot;&gt;Versioned Documentation Repository (Antora)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/docs.jenkins.io-vite.js-site&quot;&gt;Non-Versioned Site Implementation (Vite.js)&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 Complete Build Retooling project has initiated the retooling of the jenkins.io website as a modern, scalable, and maintainable documentation platform that will serve the Jenkins community for years to come. Thank you to everyone who supported this journey!&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/10/16/revamped-tests-in-jenkins/</id>
<title>Revamped Tests UI in Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-10-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/10/16/revamped-tests-in-jenkins/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<category term='testing'></category>
<category term='junit'></category>
<summary>
The JUnit plugin has received a major redesign, focusing on a cleaner and more consistent UI. This work draws directly
from the Pipeline Graph View plugin and the Jenkins Design Library, bringing much-needed polish to one of Jenkins'
oldest plugins.



So what&#8217;s new?

New user interface


The plugin has been redesigned to make test results easier to understand at a glance. Pages have been streamlined,
components simplified and standardized, and the overall experience given a major cleanup.


Test names are split more intuitively, based on method, class, and package. This makes scanning large test suites easier.


Stacktraces are now also syntax-highlighted for better readability, and they can now...
</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/2025/10/16/revamped-tests-in-jenkins.png&quot; alt=&quot;Revamped Tests in Jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The JUnit plugin has received a major redesign, focusing on a cleaner and more consistent UI. This work draws directly
from the Pipeline Graph View plugin and the Jenkins Design Library, bringing much-needed polish to one of Jenkins&#39;
oldest plugins.&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;New user interface&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin has been redesigned to make test results easier to understand at a glance. Pages have been streamlined,
components simplified and standardized, and the overall experience given a major cleanup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Test names are split more intuitively, based on method, class, and package. This makes scanning large test suites easier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stacktraces are now also syntax-highlighted for better readability, and they can now be copied with a single click.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Responsive&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The interface now scales from the largest screen to the smallest, so you can check results even on the go.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Moments of joy&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When all of your tests pass, enjoy &lt;a href=&quot;https://ci.jenkins.io/job/Core/job/jenkins/job/master/lastSuccessfulBuild/testReport/&quot;&gt;celebratory confetti&lt;/a&gt;. Because we know the satisfaction of watching a suite go green after a stubborn failure.&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.504.3 and later.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See it in action in the &lt;a href=&quot;https://ci.jenkins.io/job/Core/job/jenkins/job/master/lastUnstableBuild/testReport/&quot;&gt;Jenkins core build on ci.jenkins.io&lt;/a&gt;.&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;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/09/24/hacktoberfest-2025-intro/</id>
<title>Hacktoberfest 2025</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-09-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/09/24/hacktoberfest-2025-intro/" />
<author>
<name>krisstern</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<category term='newcomer'></category>
<category term='outreach-programs'></category>
<summary>
The annual Hacktoberfest is back!
Please join us as we celebrate and support open-source during the month of October.
Contributors can earn badges and improve their open source contribution skills.


The Jenkins project will participate once again in the event.
We invite you to contribute to the Jenkins project but also, as maintainers, to welcome and help newcomers.


Contributors


This is what contributors need to know to participate and complete Hacktoberfest:




Register on the event website anytime between September 15 and October 31


Pull requests can be made in any jenkinsci or jenkins-infra GitHub repository that’s participating in Hacktoberfest (look for the "hacktoberfest" topic in the repo)


Project maintainers...
</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/hacktoberfest/hacktoberfest_2025_logo.svg&quot; alt=&quot;Hacktoberfest&quot; width=&quot;75%&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The annual &lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;Hacktoberfest&lt;/a&gt; is back!
Please join us as we celebrate and support open-source during the month of October.
Contributors can earn badges and improve their open source contribution skills.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project will participate once again in the event.
We invite you to contribute to the Jenkins project but also, as maintainers, to welcome and help newcomers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is what &lt;strong&gt;contributors&lt;/strong&gt; need to know to participate and complete Hacktoberfest:&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://hacktoberfest.com/&quot;&gt;Register on the event website&lt;/a&gt; anytime between September 15 and October 31&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull requests can be made in any &lt;a href=&quot;https://github.com/jenkinsci/&quot;&gt;jenkinsci&lt;/a&gt; or &lt;a href=&quot;https://github.com/jenkins-infra/&quot;&gt;jenkins-infra&lt;/a&gt; GitHub repository that’s participating in Hacktoberfest (look for the &quot;hacktoberfest&quot; topic in the repo)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Project maintainers must accept your pull requests for them to count towards your total&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Have a total of 6 high-quality pull requests accepted between October 1 and October 31 to complete Hacktoberfest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You will unlock a digital badge when you register for Hacktoberfest, and level it up with each of your 6 pull requests accepted during Hacktoberfest&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins’ specific details can be found on the &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/&quot;&gt;Jenkins Hacktoberfest page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some good resources for beginners can be found here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Good first issues in Jenkins repositories:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/search?q=org%3Ajenkinsci+label%3A%22good+first+issue%22+state%3Aopen&amp;amp;type=issues/&quot;&gt;jenkinsci&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/search?q=org%3Ajenkins-infra+label%3A%22good+first+issue%22+state%3Aopen&amp;amp;type=issues/&quot;&gt;jenkins-infra&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intro to open source&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://opensource.guide/how-to-contribute/&quot;&gt;How to contribute to Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/tutorial-series/an-introduction-to-open-source/&quot;&gt;Introduction to GitHub and Open Source Projects&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/what-is-open-source/&quot;&gt;What is Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/cheatsheets/how-to-use-git-a-reference-guide/&quot;&gt;How to use Git: A Reference Guide&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sharpen your skills&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://training.github.com/&quot;&gt;GitHub training kit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Understanding the &lt;a href=&quot;https://docs.github.com/en/get-started/using-github/github-flow/&quot;&gt;GitHub flow&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorial-series/an-introduction-to-open-source/&quot;&gt;Introduction to GitHub and Open-Source Projects&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://opensource.com/article/19/5/how-get-job-doing-open-source/&quot;&gt;How to advance your career by contributing to open source projects&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.blog/developer-skills/github/how-to-write-the-perfect-pull-request/&quot;&gt;How to write the perfect pull request&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.to/chrissiemhrk/git-commit-message-5e21/&quot;&gt;How to write a good commit message&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The “&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/&quot;&gt;improve a plugin tutorial&lt;/a&gt;” is an introduction to contributing to Jenkins.&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;maintainers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#maintainers&quot; /&gt;Maintainers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins plugin maintainers can prepare for Hacktoberfest contributions by following these best practices:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add the &quot;hacktoberfest&quot; topic to your repository to opt in to Hacktoberfest and indicate you’re looking for contributions.  Only add the &quot;hacktoberfest&quot; topic to your repository if you are willing to promptly review Hacktoberfest pull requests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a CONTRIBUTING.md file with contribution guidelines to your repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the &quot;good-first-issue&quot; label to &lt;a href=&quot;https://github.com/search?q=org%3Ajenkinsci+is%3Aissue+label%3Agood-first-issue+is%3Aopen&amp;amp;type=issues/&quot;&gt;GitHub issues&lt;/a&gt; you want contributors to help with in your GitHub project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the “newbie-friendly” label to &lt;a href=&quot;https://issues.jenkins.io/issues/?filter=20847/&quot;&gt;Jira issues&lt;/a&gt; that are well suited to new contributors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose issues that have a well-defined scope and are self-contained&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be ready to review pull requests, accepting those that are valid by merging them, leaving an overall approving review, or by adding the &quot;hacktoberfest-accepted&quot; label&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reject any spammy requests you receive by labeling them as &quot;spam&quot; and any other invalid contributions by closing them or labeling them as &quot;invalid&quot;&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/2025/08/31/aarav-mahajan-gsoc-gradle-convention-plugin-for-jenkins-plugin-development/</id>
<title>Introducing the Gradle Convention Plugin for Jenkins Plugin Development</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/08/31/aarav-mahajan-gsoc-gradle-convention-plugin-for-jenkins-plugin-development/" />
<author>
<name>aaravmahajanofficial</name>
</author>
<category term='jenkins'></category>
<category term='gradle'></category>
<category term='kotlin'></category>
<category term='dsl'></category>
<category term='plugin-development'></category>
<category term='build-tools'></category>
<category term='java'></category>
<category term='groovy'></category>
<category term='developer-tools'></category>
<category term='convention-plugin'></category>
<summary>
Building Jenkins plugins with Gradle just got easier!
Meet the modern, Kotlin-first, and convention-based Jenkins Gradle Convention Plugin. Plugin development made effortless 🏄‍♂️🏎️.
🌀 Try it today on the Gradle Plugin Portal


Today’s Jenkins Plugin Development Landscape


Apache Maven remains the primary and officially recommended build tool for Jenkins plugin development, powering the vast majority of plugins in the ecosystem. Its strong integration with the Jenkins plugin parent POM, extensive documentation, and mature lifecycle support make it the safest and default choice for most developers.


Gradle, while technically capable and widely adopted across the broader Java ecosystem, has seen limited adoption in the Jenkins community....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Building Jenkins plugins with Gradle just got easier!&lt;/strong&gt;&lt;br&gt;
Meet the modern, Kotlin-first, and convention-based Jenkins Gradle Convention Plugin. Plugin development made effortless 🏄‍♂️🏎️.&lt;br&gt;
🌀 Try it today on the &lt;a href=&quot;https://plugins.gradle.org/plugin/io.github.aaravmahajanofficial.jenkins-gradle-convention-plugin&quot;&gt;Gradle Plugin Portal&lt;/a&gt;&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;todays-jenkins-plugin-development-landscape&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#todays-jenkins-plugin-development-landscape&quot; /&gt;Today’s Jenkins Plugin Development Landscape&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Apache Maven remains the primary and officially recommended build tool for Jenkins plugin development, powering the vast majority of plugins in the ecosystem. Its strong integration with the Jenkins plugin parent POM, extensive documentation, and mature lifecycle support make it the safest and default choice for most developers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Gradle, while technically capable and widely adopted across the broader Java ecosystem, has seen limited adoption in the Jenkins community. It offers powerful advantages, including:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Extensible build logic defined in code rather than rigid XML.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Faster build times with incremental builds, caching, and the Gradle Daemon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A developer-friendly experience with Kotlin and Groovy DSLs, plus interactive tooling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.gradle.org/current/samples/sample_convention_plugins.html&quot;&gt;&lt;strong&gt;Convention Plugins&lt;/strong&gt;&lt;/a&gt; — a powerful way to share and reuse standardized build logic across projects. They can be combined like traits, much like multiple or diamond inheritance in OOP. In contrast, Maven’s parent POM model only allows a single parent (since Maven 3), forcing developers to rely on heavy profile usage and boilerplate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Despite these strengths, Jenkins plugin development continues to be dominated by Maven. The primary reasons are that the core build infrastructure, tooling ecosystem, and CI pipelines are deeply aligned with Maven conventions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following table highlights some key differences between Maven and Gradle in the context of Jenkins plugin development.&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/2025/08/aaravmahajan/jenkins-plugin-with-maven-vs-gradle.png&quot; alt=&quot;Comparison table showing differences between Maven and Gradle for Jenkins plugin development&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;motivation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#motivation&quot; /&gt;Motivation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In late 2022, the Jenkins community identified significant gaps in Gradle support for plugin hosting and automation. At that time, new open source Jenkins plugins using Gradle were even blocked from hosting until those requirements were addressed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This sparked discussions and community initiatives to close the gaps. The &lt;strong&gt;Jenkins Gradle Convention Plugin&lt;/strong&gt; is a direct outcome of that effort, providing a standardized and supported way to build Jenkins plugins with Gradle.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;where-the-gradle-jpi-plugin-falls-short&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-the-gradle-jpi-plugin-falls-short&quot; /&gt;Where the Gradle JPI Plugin falls short ?&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/jenkinsci/gradle-jpi-plugin&quot;&gt;Gradle JPI Plugin&lt;/a&gt; provides a Maven-free path for Jenkins plugin development, but it falls short in matching the full Maven-based experience. Key limitations include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-times&quot; title=&quot;Cross&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Non-compliance with Jenkins hosting requirements&lt;/strong&gt; → blocks acceptance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-times&quot; title=&quot;Cross&quot; /&gt;&lt;/span&gt; &lt;strong&gt;No &lt;a href=&quot;https://github.com/jenkinsci/plugin-compat-tester&quot;&gt;Plugin Compatibility Tester (PCT)&lt;/a&gt; support&lt;/strong&gt; → weak cross-version testing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-times&quot; title=&quot;Cross&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Dependency management &amp;amp; BOM gaps&lt;/strong&gt; → unreliable builds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-times&quot; title=&quot;Cross&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Outdated Groovy-based codebase&lt;/strong&gt; → harder to maintain&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-times&quot; title=&quot;Cross&quot; /&gt;&lt;/span&gt; &lt;strong&gt;No convention plugin&lt;/strong&gt; → developers face more configuration overhead&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;meet-the-jenkins-gradle-convention-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#meet-the-jenkins-gradle-convention-plugin&quot; /&gt;Meet the Jenkins Gradle Convention Plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A Kotlin-first, Gradle convention plugin that acts as the Maven Parent POM equivalent for Jenkins plugin development with Gradle. Built on top of the well-established &lt;code&gt;gradle-jpi-plugin&lt;/code&gt;, it provides a unified, opinionated foundation for building, testing, and publishing Jenkins plugins—standardizing best practices, automating quality checks, and eliminating boilerplate.&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;
A new “JPI2” variant of the Gradle JPI Plugin was introduced by Rahul and Steve, adding support for Gradle 8+, improved dependency handling, and a modern architecture. The gradle convention plugin is designed to be forward-compatible, once JPI2 APIs stabilize, we plan to migrate the convention plugin to leverage it for an even better experience.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Built by me, as part of &lt;strong&gt;Google Summer of Code (GSoC) 2025&lt;/strong&gt; in collaboration with &lt;strong&gt;Gradle&lt;/strong&gt;, &lt;strong&gt;Netflix&lt;/strong&gt;, and the &lt;strong&gt;Kotlin Foundation&lt;/strong&gt;, under the expert mentorship of &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;, &lt;a href=&quot;https://github.com/sghill&quot;&gt;Steve Hill&lt;/a&gt; and &lt;a href=&quot;https://github.com/rahulsom&quot;&gt;Rahul Somasunderam&lt;/a&gt;. Their mentorship has been invaluable, and the plugin continues to be actively maintained.&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-brings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-it-brings&quot; /&gt;What it brings ?&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;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-check&quot; title=&quot;Check&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Modern language standards enforcement&lt;/strong&gt;: Minimal/Zero configuration, maximum productivity for Java, Kotlin, and Groovy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-check&quot; title=&quot;Check&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Jenkins Hosting Compliance&lt;/strong&gt;: PCT support, metadata, and structure all handled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-check&quot; title=&quot;Check&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Smart dependency management&lt;/strong&gt;: Automatic BOM alignment and zero version conflicts -&lt;br&gt;
say goodbye to &lt;a href=&quot;https://en.wikipedia.org/wiki/Dependency_hell&quot;&gt;&lt;em&gt;Dependency Hell&lt;/em&gt;&lt;/a&gt;&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-check&quot; title=&quot;Check&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Quality gates &amp;amp; reporting&lt;/strong&gt;: Pre-configured tools with unified, CI-ready reports&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-check&quot; title=&quot;Check&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Modern testing ecosystem&lt;/strong&gt;: Ready-to-use test stack with optimized execution for reliable, fast Jenkins plugin testing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-check&quot; title=&quot;Check&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Configuration &amp;amp; extensibility&lt;/strong&gt;: Flexible DSL or properties-based setup for multi-module projects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-check&quot; title=&quot;Check&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Future-Proof&lt;/strong&gt;: Embraces Gradle 9 best practices like Configuration Cache, Version Catalogs, and caching&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;getting-started-in-seconds&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started-in-seconds&quot; /&gt;Getting started in seconds&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;Step 1&lt;/strong&gt;: Define the plugin in the project’s &lt;code&gt;libs.versions.toml&lt;/code&gt; file&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;toml&quot;&gt;&lt;span class=&quot;nn&quot;&gt;[versions]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;jenkinsConvention&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&amp;lt;LATEST_VERSION&amp;gt;&quot;&lt;/span&gt;

&lt;span class=&quot;nn&quot;&gt;[plugins]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;jenkinsConvention&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;py&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;io.github.aaravmahajanofficial.jenkins-gradle-convention-plugin&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;py&quot;&gt;version.ref&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;jenkinsConvention&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Configure the Version Catalog&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the root &lt;code&gt;settings.gradle.kts`&lt;/code&gt;, add the plugin’s version catalog:&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;kotlin&quot;&gt;&lt;span class=&quot;nf&quot;&gt;dependencyResolutionManagement&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;repositories&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;mavenCentral&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;versionCatalogs&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;baseLibs&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;io.github.aaravmahajanofficial:version-catalog:&amp;lt;LATEST_VERSION&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: Basic Build Script&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the root &lt;code&gt;build.gradle.kts&lt;/code&gt;, add the following:&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;kotlin&quot;&gt;&lt;span class=&quot;nf&quot;&gt;plugins&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;alias&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;libs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jenkinsConvention&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nf&quot;&gt;jenkinsConvention&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Only override the defaults that need to be customized for your plugin.&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Set the Jenkins version (default: as per version catalog).&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;jenkinsVersion&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;2.525&quot;&lt;/span&gt;
&lt;span class=&quot;p&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;That’s it! &lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-smile-o&quot; title=&quot;Smile&quot; /&gt;&lt;/span&gt; Enjoy pre-configured tools, synced BOMs, PCT support, and ready-to-go compliance checks.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;roadmap&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#roadmap&quot; /&gt;Roadmap&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next steps for plugin delivery and integration:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Support continuous delivery for Jenkins plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integrate seamlessly with Jenkins pipelines (e.g., &lt;a href=&quot;https://github.com/jenkins-infra/pipeline-library/blob/master/vars/buildPluginWithGradle.groovy&quot;&gt;&lt;code&gt;buildPluginWithGradle&lt;/code&gt;&lt;/a&gt; for CI)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Migrate to Gradle JPI2 Plugin once new APIs stabilize&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I invite all the Jenkins community developers - especially maintainers of Gradle-based plugins - to try it out, provide feedback, and help refine it into a stable toolchain that benefits all. Contributions, real-world testing, and discussions are very welcome &lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-coffee&quot; title=&quot;Coffee&quot; /&gt;&lt;/span&gt;.&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;&lt;a href=&quot;https://kotlinlang.org/docs/gsoc-2025.html#gradle-convention-plugin-for-developing-jenkins-plugins-easy-to-hard-90-hrs-to-350-hrs&quot;&gt;Project Idea Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://community.gradle.org/events/gsoc/2025/jenkins-plugins-toolchain&quot;&gt;My Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1W-_rDWrnHSgV3fGdQWSryOmym15e9TEoHlBvQJysJgw/edit?usp=sharing&quot;&gt;My Proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/aaravmahajanofficial/jenkins-gradle-convention-plugin&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Official Slack Channel - &lt;a href=&quot;https://gradle-community.slack.com/archives/C08S0GKMB5G&quot;&gt;&lt;strong&gt;&lt;code&gt;#jenkins-plugin-toolchain&lt;/code&gt;&lt;/strong&gt;&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;concluding-with-the-elephant&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#concluding-with-the-elephant&quot; /&gt;Concluding with the Elephant 🐘&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin isn’t just another build tool tweak—it’s about making Gradle a &lt;em&gt;first-class&lt;/em&gt; citizen in Jenkins plugin development. Let’s bring modern productivity engineering to the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Thanks for reading!&lt;/strong&gt; &lt;span class=&quot;icon&quot;&gt;&lt;i class=&quot;fa fa-star&quot; title=&quot;Star&quot; /&gt;&lt;/span&gt; &lt;strong&gt;Star or contribute to the repo if you found this useful.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/08/30/raunak-madan-gsoc-endterm-blog-post/</id>
<title>GSoC 2025 Endterm - Improving Plugin Modernizer</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-08-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/08/30/raunak-madan-gsoc-endterm-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2025-endterm'></category>
<category term='open-rewrite'></category>
<category term='plugin-modernization'></category>
<category term='metadata-storage'></category>
<summary>
Hello everyone,


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


Table of Contents




About the Project


Phase 1


Phase 2


Next Steps


Acknowledgements


Useful Links






About the Project


The project aims to extract modernization metadata, such as whether the modernization was successful and what PR it generated for the plugin, etc.
It helps to track the impact of the plugin-modernizer-tool, the success and failure rate of the modernization.


We aim to extract the metadata and push to a public repository with additional actions over there, validating the changes. Additionally, we...
</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-tool&quot;&gt;Plugin Modernizer Tool&lt;/a&gt; during Google Summer of Code 2025. For a detailed description of the project, please refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/plugin-modernizer-improvements/&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;#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;#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 project aims to extract modernization metadata, such as whether the modernization was successful and what PR it generated for the plugin, etc.
It helps to track the impact of the &lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-tool&quot;&gt;plugin-modernizer-tool&lt;/a&gt;, the success and failure rate of the modernization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We aim to extract the metadata and push to a public repository with additional actions over there, validating the changes. Additionally, we extract comprehensive reports on applied recipes and plugin migrations to provide a high-level overview.&lt;/p&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;In this phase, we accomplished the following tasks:&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;Automatic Extraction of Modernization Metadata:&lt;/strong&gt; Record migration status, pull request URL and status, check runs information, and more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Metadata Publishing:&lt;/strong&gt; Automatically pushes metadata to a public repository — &lt;a href=&quot;https://github.com/jenkins-infra/metadata-plugin-modernizer/&quot;&gt;metadata-plugin-modernizer&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub Action Workflows:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Validate incoming metadata and auto-merge PRs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dynamically update metadata.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Consolidate metadata for each plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate comprehensive reports on applied recipes and plugin migrations to provide a high-level overview.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out the demonstration of the tool from the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#gsoc-2025&quot;&gt;Jenkins in Google Summer of Code 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;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 this phase, we accomplished the following tasks:&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;Created and Improved Recipes:&lt;/strong&gt; Added new recipes such as &lt;code&gt;Migrate to Java 25&lt;/code&gt;, &lt;code&gt;Migrate Commons Lang 2 to Lang 3 and Commons Text&lt;/code&gt;, and improved the &lt;code&gt;Migrate to JUnit 5&lt;/code&gt; recipe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bug Fixes:&lt;/strong&gt; Resolved minor bugs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Updated the documentation to be more beginner-friendly.&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;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;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Push the consolidated metadata and the reports to the &lt;a href=&quot;https://reports.jenkins.io/&quot;&gt;Jenkins reports site&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Visualizing the metadata on the &lt;a href=&quot;https://stats.jenkins.io/&quot;&gt;Jenkins statistics site&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate Running Recipes on Plugins with Low Health Scores.&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/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/sridamul&quot;&gt;Sridhar Sivakumar&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/TheMeinerLP&quot;&gt;Phillipp Glanz&lt;/a&gt;, for their constant support, refining the approach, and timely reviews throughout the journey. They were a great reason for making this a success.&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 &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/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; for always checking in and offering help, your kindness and support mean a lot.&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://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 Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1QaEa4lvjdMi3JRXBOAN2eD2cjJkJ1-bfU-XHg4dlI0s/edit?tab=t.0&quot;&gt;Project Proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://cdeliveryfdn.slack.com/archives/C071YTZ807N&quot;&gt;Project Slack Channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sedate-marscapone-74c.notion.site/208fcbf0cc328028b936c73963de640b?v=208fcbf0cc3280dd8f94000c986ac3a3&quot;&gt;Weekly Meetings&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sedate-marscapone-74c.notion.site/GSoC-Jenkins-Improving-Plugin-Modernizer-206fcbf0cc328085b44ffefae8f232e8&quot;&gt;Daily Progress/Notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLN7ajX_VdyaM-aDF6haC55MT7mh_kyB_1&quot;&gt;Jenkins GSoC 2025 Playlist &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;Reflecting back it was a really great experience with Jenkins, which enabled me to learn new skills, mindset, and make meaningful contributions.
Looking forward to continue contributing at Jenkins in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/08/08/board-officer-election-announcement/</id>
<title>Jenkins Board and Officer Elections 2025 - Nominations Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-08-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/08/08/board-officer-election-announcement/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
We are excited to announce the 2025 Jenkins Governance Board and Officer elections!


Nominations


Nominations can be submitted for governance board positions and all officer positions (Security, Events, Release, Infrastructure, and Documentation).


During the registration period, we invite community members to nominate candidates by sending a message to the election-committee group.
In your message, please include the name of the nominee, the specific position and your reasons for nominating that person.
A tutorial is available that shows the steps to nominate a candidate.


The nomination period ends on September 22.
Nominees will be notified and asked to confirm that they are interested in running as a candidate.
The...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;We are excited to announce the 2025 Jenkins Governance Board and Officer elections!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;nominations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nominations&quot; /&gt;Nominations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominations can be submitted for &lt;a href=&quot;https://www.jenkins.io/project/board/&quot;&gt;governance board&lt;/a&gt; positions and all &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;officer&lt;/a&gt; positions (&lt;a href=&quot;https://www.jenkins.io/project/team-leads/#security&quot;&gt;Security&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#events&quot;&gt;Events&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#infrastructure&quot;&gt;Infrastructure&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the registration period, we invite community members to nominate candidates by sending a message to the &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election-committee&lt;/a&gt; group.
In your message, please include the name of the nominee, the specific position and your reasons for nominating that person.
A tutorial is available that shows the steps to &lt;a href=&quot;https://www.jenkins.io/project/election-walkthrough/#nominate-a-candidate&quot;&gt;nominate a candidate&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nomination period ends on &lt;strong&gt;September 22&lt;/strong&gt;.
Nominees will be notified and asked to confirm that they are interested in running as a candidate.
The list of candidates will be announced on September 23.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Anyone can nominate anyone as a candidate!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Mark Waite&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil/&quot;&gt;Basil Crow&lt;/a&gt; for serving on the &lt;a href=&quot;https://www.jenkins.io/project/board/&quot;&gt;Jenkins Governance Board&lt;/a&gt;.
We also want to thank &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal/&quot;&gt;Damien Duportal&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#infrastructure&quot;&gt;Infrastructure Officer&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck/&quot;&gt;Wadeck Follonier&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#security&quot;&gt;Security Officer&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat/&quot;&gt;Alyssa Tong&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#events&quot;&gt;Events Officer&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;Tim Jacomb&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27/&quot;&gt;Kevin Martens&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt; for all of their work over the last term.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-election-consists-of-4-phases&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-election-consists-of-4-phases&quot; /&gt;The election consists of 4 phases:&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;Nomination of candidates (August 8 - September 22)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voter registration (September 16 - October 31)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting (November 1 - November 30)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Results announcement (December 1)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;voting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voting&quot; /&gt;Voting&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Participation in the election process requires registering an account on the &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&lt;/a&gt; and at least one contribution made before September 1, 2025.
When registering, you can use an existing GitHub account or create a new account specifically for &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&lt;/a&gt;.
We ask all community members who are interested in voting and meet the requirements to join the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2025&quot;&gt;election-voter-2025&lt;/a&gt; group during the registration period.
Previous elections utilized their own groups, so joining the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2025&quot;&gt;election-voter-2025&lt;/a&gt; group is required for participation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have made the decision to trust participants and not require that you provide evidence of contribution as part of your voter registration.
We reserve the right to ban any account from the election process if we identify abuse.
Once registration is over, a list of email addresses will be sent to the &lt;a href=&quot;https://civs1.civs.us/&quot;&gt;Condorcet Internet Voting Service (CIVS)&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing&quot; /&gt;Contributing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As shown on the &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Participate and Contribute&lt;/a&gt; page, there are many different ways to contribute to Jenkins. You can contribute by:&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/participate/connect/&quot;&gt;Connecting with the community&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/meet/&quot;&gt;Joining or organizing a meetup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/code/&quot;&gt;Contributing code to Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/help/&quot;&gt;Helping Jenkins users&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/internationalization/&quot;&gt;Translating Jenkins resources&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/test/&quot;&gt;Testing Jenkins core and plugins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/document/&quot;&gt;Contributing to Jenkins documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/design/&quot;&gt;Creating art or updating the Jenkins UI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/review-changes/&quot;&gt;Reviewing open pull requests&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;Donating to Jenkins&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;All contributions to Jenkins and its community are welcome&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;election&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#election&quot; /&gt;Election&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Candidates will be announced September 23.
Voter registration closes on October 31.
Voting begins November 1.
Registered voters will be notified by email to participate using the &lt;a href=&quot;https://civs1.civs.us/&quot;&gt;Condorcet Internet Voting System&lt;/a&gt;.
All votes must be submitted by end of day November 30.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results&quot; /&gt;Results&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Election results will be published December 1.
The new term starts on December 1, when the newly elected members will transition to their roles.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates&quot; /&gt;Important Dates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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;Important Dates&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time&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;Nomination of candidates open&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;August 8&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;Voter registration opens&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 16&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;Nomination of candidates closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 22&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;Candidates announced&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 23&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;Voter registration closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;October 31&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;Voting starts&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;November 1&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;Voting closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;November 30&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;Results announced&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;December 1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#troubleshooting&quot; /&gt;Troubleshooting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are new to Jenkins elections, unfamiliar with the Condorcet Internet Voting Service (CIVS) or the community forums, or feel overwhelmed with the process, don’t worry, we’ve got you covered.
We published a &lt;a href=&quot;https://www.jenkins.io/project/election-walkthrough/&quot;&gt;step-by-step guide&lt;/a&gt;, outlining how to to join the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2025&quot;&gt;election-voter-2025&lt;/a&gt;, activate your CIVS account and cast your vote.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you encounter issues still or need assistance, don’t hesitate to contact the &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election committee&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you, as always, and don’t forget to register to vote by October 31!&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/2025/08/04/update-center-enforce-https/</id>
<title>Enforced HTTPS for Update Center</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-08-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/08/04/update-center-enforce-https/" />
<category term='infrastructure'></category>
<category term='update-center'></category>
<category term='updates.jenkins.io'></category>
<category term='jenkins'></category>
<summary>
Summary (TL;DR)


The service https://updates.jenkins.io will enforce HTTPS protocol beginning Wednesday 06 August 2025.


All Jenkins users are impacted but should not see any functional change.


Any plain-HTTP request made to the Jenkins update center will be redirected to the same location but upgraded to HTTPS scheme.




What is the "Update Center"?


Jenkins Update Center is a web server at the core of the Jenkins public infrastructure that distributes the plugins, tool installers, and versions index to all Jenkins servers across the world.


From the installation wizard to regular plugin updates, if you run Jenkins, then you use this service under the hood.


Today, it serves around...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-tldr&quot; /&gt;Summary (&lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:Too_long;_didn%27t_read&quot;&gt;TL;DR&lt;/a&gt;)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The service &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;https://updates.jenkins.io&lt;/a&gt; will enforce HTTPS protocol beginning Wednesday 06 August 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Jenkins users are impacted but should not see any functional change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Any plain-HTTP request made to the Jenkins update center will be redirected to the same location but upgraded to HTTPS scheme.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-update-center&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-update-center&quot; /&gt;What is the &quot;Update Center&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;Update Center&lt;/a&gt; is a web server at the core of the Jenkins public infrastructure that distributes the plugins, tool installers, and versions index to all Jenkins servers across the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the installation wizard to regular plugin updates, if you run Jenkins, then you use this service under the hood.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, it serves around 50 Tb of data (outbound bandwidth) each month from a network of mirrors spread across 3 cloud providers and 2 continents.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additional information is available in the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/4758&quot;&gt;GitHub issue&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;what-does-it-change-for-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-does-it-change-for-me&quot; /&gt;What Does It Change for Me?&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;Short answer: &lt;strong&gt;Nothing&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Since October 2024 with &lt;a href=&quot;https://www.jenkins.io/changelog-old/#v2.480&quot;&gt;Jenkins Weekly 2.480&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.479.1&quot;&gt;Jenkins LTS 2.479.1&lt;/a&gt;, Jenkins automatically migrates the Update Center URL from HTTP to HTTPS.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Long answer:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Your Jenkins controllers should already be using HTTPS for the Update Center since January 2025.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Any other tool or old configuration using the plain-HTTP requests will be redirected to HTTPS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are still using a Jenkins version released before 2025 with an old Update Center configuration:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In the Web Interface: browse to &quot;Manage Jenkins&quot; &amp;gt; &quot;Plugins&quot; &amp;gt; &quot;Advanced settings&quot; and click the &quot;Reset&quot; link in the &quot;Update site&quot; section to automatically update the outdated URL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Or replace &lt;code&gt;http://&lt;/code&gt; by &lt;code&gt;https://&lt;/code&gt; in your Jenkins Configuration as Code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/08/03/chirag-gupta-gsoc-community-bonding-blog-post/</id>
<title>GSoC 2025 Midterm - An AI Agent for Jenkins Failure Diagnosis</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-08-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/08/03/chirag-gupta-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2025-midterm'></category>
<category term='jenkins'></category>
<category term='llm'></category>
<category term='ai'></category>
<category term='agentic-systems'></category>
<category term='rag'></category>
<summary>
Hello, Jenkins Community!


I’m Chirag Gupta, and this is the midterm update for my Google Summer of Code 2025 project: "Domain-specific LLM based on actual Jenkins usage using ci.jenkins.io data. The project&#8217;s vision is to accelerate the often complex process of diagnosing build failures in Jenkins using AI.


For a detailed overview, 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




The Pivot: From Fine-Tuning to a Flexible Agentic System


Midterm Accomplishments: A Functional Prototype


What’s Next? The Road to the Target Architecture


Acknowledgements






The Pivot: From Fine-Tuning to a Flexible Agentic...
</summary>
<content type='html'>
&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;I’m Chirag Gupta, and this is the midterm update for my Google Summer of Code 2025 project: &lt;strong&gt;&quot;Domain-specific LLM based on actual Jenkins usage using ci.jenkins.io data&lt;/strong&gt;. The project’s vision is to accelerate the often complex process of diagnosing build failures in Jenkins using AI.&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/2025/projects/domain-specific-LLM-based-on-jenkins-usage-using-ci-jenkins-io-data/&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;#the-pivot-from-fine-tuning-to-a-flexible-agentic-system&quot;&gt;The Pivot: From Fine-Tuning to a Flexible Agentic System&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#midterm-accomplishments-a-functional-prototype&quot;&gt;Midterm Accomplishments: A Functional Prototype&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#whats-next-the-road-to-the-target-architecture&quot;&gt;What’s Next? The Road to the Target Architecture&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;the-pivot-from-fine-tuning-to-a-flexible-agentic-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-pivot-from-fine-tuning-to-a-flexible-agentic-system&quot; /&gt;The Pivot: From Fine-Tuning to a Flexible Agentic System&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most significant developments has been a pivot from the original goal of fine-tuning one or more LLMs, to building a more future-proof and universal agentic architecture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why the change?&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;Flexibility &amp;amp; User Choice:&lt;/strong&gt; A single fine-tuned model locks users in. Our new agentic framework allows users to plug in any capable LLM, from cloud services like OpenAI and Claude to self-hosted models.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Future-Proofing:&lt;/strong&gt; A specialized, fine-tuned model for Jenkins is still a future goal, but it can now be integrated as just one of many options within the agent, rather than being the entire system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extensibility:&lt;/strong&gt; The agent’s capabilities are now defined by its tools, not just its training data. This makes it far easier to add new functionalities over time, like interacting with live Jenkins instances.&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;midterm-accomplishments-a-functional-prototype&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#midterm-accomplishments-a-functional-prototype&quot; /&gt;Midterm Accomplishments: A Functional Prototype&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have successfully developed a fully functional prototype that establishes this new core architecture. This prototype proves the viability of the agent-based diagnosis model.&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;Interactive CLI:&lt;/strong&gt; We built a user-friendly command-line interface using &lt;code&gt;Typer&lt;/code&gt; and &lt;code&gt;Rich&lt;/code&gt;. It guides the user through the diagnosis process, handles file I/O, and presents the final report in an easy to read formatted way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multi-Agent Pipeline:&lt;/strong&gt; The core logic operates on a &quot;Chain of Responsibility&quot; model:&lt;/p&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;Router Agent&lt;/strong&gt; first classifies the failure type.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;Specialist Agent&lt;/strong&gt; then uses a suite of tools to perform an in-depth investigation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An optional &lt;strong&gt;Critic Agent&lt;/strong&gt; enables a self-correction loop, reviewing the diagnosis for quality and forcing a retry if the report is flawed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Advanced RAG Tool:&lt;/strong&gt; We integrated a sophisticated Retrieval-Augmented Generation (RAG) pipeline using &lt;code&gt;LightRAG&lt;/code&gt;. This tool provides the agent with external knowledge and features a hybrid stack of local &lt;code&gt;sentence-transformers&lt;/code&gt; for embeddings and &lt;code&gt;Cohere&lt;/code&gt; for high-quality reranking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Robust Logging &amp;amp; Sandboxing:&lt;/strong&gt; The CLI features a dual-logging system for both application debugging and detailed AI interaction auditing. For safety and reproducibility, each diagnosis runs in an isolated, timestamped directory, ensuring the user’s original workspace files are never touched.&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;whats-next-the-road-to-the-target-architecture&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next-the-road-to-the-target-architecture&quot; /&gt;What’s Next? The Road to the Target Architecture&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next phase will focus on evolving the prototype into the powerful, integrated system envisioned in our target architecture.&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;Expanding LLM Backend Support:&lt;/strong&gt; We will build out the provider-agnostic LLM adapter to include support for a wider range of backends. This will give users the freedom to choose their preferred provider based on cost, performance, or privacy needs, including direct integrations for &lt;strong&gt;OpenAI, Anthropic (Claude), and Groq&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RAG for Jenkins Knowledge:&lt;/strong&gt; Build a comprehensive vector store from the official Jenkins documentation, wikis, and community discussions to give the agent deep domain knowledge with different-different embeddings model to suit the users needs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Comprehensive Evaluation Framework:&lt;/strong&gt; Create a framework using techniques like &quot;LLM-as-a-Judge&quot; to rigorously test the quality of the diagnoses and produce valuable insights for the 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;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 heartfelt thank you to my mentors, Kris Stern, Shivay Lamba, Bruno Verachten, Harsh Pratap Singh, and Vutukuri Sreenivas. Their expertise, guidance, and timely reviews have been really helpful in refining the project’s technical roadmap and navigating the challenges.&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 Kris Stern, Bruno Verachten, and Alyssa Tong for always checking in and offering help; your kindness and support mean a lot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Excited for the second phase of the project!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Project Repository:&lt;/strong&gt; &lt;a href=&quot;https://github.com/chiruu12/jenkins-domain-LLM&quot;&gt;chiru12/jenkins-domain-LLM&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/07/28/raunak-madan-gsoc-midterm-blog-post/</id>
<title>GSoC 2025 Midterm - Improving Plugin Modernizer</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-07-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/07/28/raunak-madan-gsoc-midterm-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2025-midterm'></category>
<category term='open-rewrite'></category>
<category term='plugin-modernization'></category>
<summary>
Hello everyone,


I’m Raunak Madan, currently working on the Improving Plugin Modernizer project — a generic CLI tool designed to automate the modernization of Jenkins plugins.
It leverages OpenRewrite recipes to apply code transformations, validate the results, and create pull requests with the proposed changes.
For a detailed overview of the project, please refer to the project page.


Table of Contents




What we’ve accomplished so far?


What I’ve Learned?


What’s Next?


Acknowledgements


Useful Links




We’ve reached halfway and successfully completed the first phase of the project.




What we’ve accomplished so far?




Automatic Extraction of Modernization Metadata: Record migration status, related pull requests, and more.


Metadata Publishing: Automatically pushes metadata to a public GitHub...
</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 Raunak Madan, currently working on the &lt;a href=&quot;https://github.com/jenkins-infra/plugin-modernizer-tool&quot;&gt;Improving Plugin Modernizer&lt;/a&gt; project — a generic CLI tool designed to automate the modernization of Jenkins plugins.
It leverages OpenRewrite recipes to apply code transformations, validate the results, and create pull requests with the proposed changes.
For a detailed overview of the project, please refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/plugin-modernizer-improvements/&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;#what-weve-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;#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;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 class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve reached halfway and successfully completed the first phase 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;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;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatic Extraction of Modernization Metadata:&lt;/strong&gt; Record migration status, related pull requests, and more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Metadata Publishing:&lt;/strong&gt; Automatically pushes metadata to a public GitHub repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub Action Workflows&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Validate incoming metadata and auto-merge PRs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dynamically update metadata.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Consolidate metadata for each plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate comprehensive reports on applied recipes and plugin migrations to provide a high-level overview.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out the demonstration of the tool from the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#gsoc-2025&quot;&gt;Jenkins in Google Summer of Code 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;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 experience has been a great opportunity for learning by doing.
Beyond the technical skills, I think open source is not just about writing code, it’s about collaboration with the mentors and the community and having a shared growth mindset.
Asking for help publicly, supporting others, and contributing back are core aspects of this culture.&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;Automate running recipes on plugins with low health scores.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create and improve recipes (e.g., a recipe to migrate plugins to Java 25).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Push consolidated metadata and reports to &lt;a href=&quot;https://reports.jenkins.io/&quot;&gt;Jenkins reports site&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;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/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/sridamul&quot;&gt;Sridhar Sivakumar&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/TheMeinerLP&quot;&gt;Phillipp Glanz&lt;/a&gt;, for their constant support, responsiveness, and timely reviews throughout the journey.&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 &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/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; for always checking in and offering help, your kindness and support mean a lot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Excited for the second phase 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;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;paragraph&quot;&gt;
&lt;p&gt;You can find all the project-related notes and discussions 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://sedate-marscapone-74c.notion.site/208fcbf0cc328028b936c73963de640b?v=208fcbf0cc3280dd8f94000c986ac3a3&quot;&gt;Weekly Meetings&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sedate-marscapone-74c.notion.site/GSoC-Jenkins-Improving-Plugin-Modernizer-206fcbf0cc328085b44ffefae8f232e8&quot;&gt;Daily Progress/Notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLN7ajX_VdyaM-aDF6haC55MT7mh_kyB_1&quot;&gt;Jenkins GSoC 2025 Playlist &lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/07/28/maeve-ho-gsoc-midterm-update-post/</id>
<title>GSoC Midterm Update, Modernizing and Stabilizing the Jenkins Tekton Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-07-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/07/28/maeve-ho-gsoc-midterm-update-post/" />
<category term='gsoc'></category>
<category term='gsoc2025-midterm'></category>
<category term='jenkins'></category>
<category term='plugin'></category>
<category term='tekton'></category>
<category term='kubernetes'></category>
<category term='cicd'></category>
<summary>
Hello everyone!


I&#8217;m Maeve, a Computer Science student at Lehigh University, currently participating in Google Summer of Code 2025.
My project involves modernizing the Jenkins Tekton Plugin to create a stable, production-ready integration between Jenkins and Kubernetes-native Tekton pipelines.


As we reach the midpoint of the coding period, I wanted to share the progress and achievements from the first half of this exciting journey.


Major Achievements This Period


The work accomplished so far has focused on establishing a solid foundation for the plugin:


Technical Modernization

I&#8217;ve successfully upgraded the plugin&#8217;s core infrastructure from outdated Java 8 and Jenkins 4.18 to Java 17 and Jenkins 2.440+.
This modernization effort...
</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 Maeve, a Computer Science student at Lehigh University, currently participating in Google Summer of Code 2025.
My project involves &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/improving-tekton-client-plugin/&quot;&gt;modernizing the Jenkins Tekton Plugin&lt;/a&gt; to create a stable, production-ready integration between Jenkins and Kubernetes-native Tekton pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we reach the midpoint of the coding period, I wanted to share the progress and achievements from the first half of this exciting journey.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;major-achievements-this-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#major-achievements-this-period&quot; /&gt;Major Achievements This Period&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The work accomplished so far has focused on establishing a solid foundation for the plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;technical-modernization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#technical-modernization&quot; /&gt;Technical Modernization&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve successfully upgraded the plugin’s core infrastructure from outdated Java 8 and Jenkins &lt;code&gt;4.18&lt;/code&gt; to Java 17 and Jenkins &lt;code&gt;2.440+&lt;/code&gt;.
This modernization effort involved updating numerous dependencies and API calls to ensure the plugin works seamlessly with current Jenkins installations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;testing-revolution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-revolution&quot; /&gt;Testing Revolution&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The testing landscape has been completely transformed.
I migrated the entire test suite from JUnit 4 to JUnit 5, converting 21 existing unit tests while implementing modern testing patterns including parameterized tests and improved lifecycle management.
The broken test logic has been rewritten to align with current plugin behavior.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;end-to-end-testing-infrastructure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#end-to-end-testing-infrastructure&quot; /&gt;End-to-End Testing Infrastructure&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Perhaps the most significant achievement is the creation of comprehensive E2E testing capabilities.
I’ve built four new integration tests that automatically provision Kind Kubernetes clusters, install Tekton components, create Jenkins jobs, and verify complete workflow execution.
These tests run in our GitHub Actions pipeline and complete in just 3 - 4 minutes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;continuous-integration-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#continuous-integration-pipeline&quot; /&gt;Continuous Integration Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A robust CI/CD pipeline now powers the development process.
The GitHub Actions workflow handles everything from environment setup to test execution and reporting, providing immediate feedback on every code change.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;code-quality-monitoring&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-quality-monitoring&quot; /&gt;Code Quality Monitoring&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JaCoCo integration now provides detailed code coverage insights.
While we’re at 12% overall coverage, certain critical packages like the build module achieve 73% coverage, giving us clear visibility into testing priorities.&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;technical-insights-and-learning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#technical-insights-and-learning&quot; /&gt;Technical Insights and Learning&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Working on this project has provided deep insights into the challenges of maintaining compatibility between different CI/CD paradigms.
The integration between Jenkins&#39; traditional approach and Kubernetes-native Tekton execution requires careful consideration of resource management, authentication, and error propagation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The E2E testing approach has proven particularly valuable - these tests catch integration issues that would be impossible to detect through unit testing alone.
Watching real Tekton TaskRuns and PipelineRuns execute in our test clusters provides confidence that the plugin works correctly in real-world scenarios.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;upcoming-development-focus&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upcoming-development-focus&quot; /&gt;Upcoming Development Focus&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The remaining coding period will concentrate on several key areas:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dynamic-crd-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dynamic-crd-support&quot; /&gt;Dynamic CRD Support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Implementing support for dynamic Tekton Custom Resource Definitions will enable users to leverage advanced Tekton features and create more flexible integration patterns.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;enhanced-user-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhanced-user-experience&quot; /&gt;Enhanced User Experience&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Focus will shift toward improving error handling, expanding documentation, and providing clear examples for common use cases to make the plugin more accessible to users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;performance-and-scalability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#performance-and-scalability&quot; /&gt;Performance and Scalability&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Optimizations for large-scale Kubernetes deployments and improved resource management will ensure the plugin performs well in enterprise environments.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;migration-path-development&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#migration-path-development&quot; /&gt;Migration Path Development&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building tools and documentation to help teams transition from traditional Jenkins pipelines to cloud-native Tekton workflows represents a crucial long-term goal.&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;community-and-mentorship&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-and-mentorship&quot; /&gt;Community and Mentorship&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This experience has highlighted the value of open-source collaboration.
Working with experienced Jenkins community members has provided insights not just into technical implementation, but into the broader ecosystem considerations that make plugins successful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The mentorship aspect of GSoC has been particularly enriching - having access to experts who understand both the Jenkins plugin architecture and Kubernetes ecosystem nuances has accelerated the learning process significantly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;midterm-demonstration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#midterm-demonstration&quot; /&gt;Midterm Demonstration&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During our recent midterm presentation, I demonstrated the current capabilities, including the automated testing pipeline and real-world integration scenarios.
For those interested in the technical details of our testing strategy and modernization approach, the presentation recording is available on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#gsoc-2025&quot;&gt;Jenkins in Google Summer of Code 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;project-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-repository&quot; /&gt;Project Repository&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Development progress can be tracked at: &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The foundation is now solid, and I’m energized to continue building features that will help development teams seamlessly integrate cloud-native CI/CD practices into their existing Jenkins workflows!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/07/24/redesigning-jenkins-part-two/</id>
<title>Redesigning Jenkins (Part Two)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-07-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/07/24/redesigning-jenkins-part-two/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<summary>
:root {
      --aurora:
              radial-gradient(at 81% 35%, var(--orange) 0, transparent 50%),
              radial-gradient(at 80% 84%, var(--cyan) 0, transparent 50%),
              radial-gradient(at 88% 31%, var(--purple) 0, transparent 50%),
              radial-gradient(at 94% 32%, var(--pink) 0, transparent 50%),
            ...
</summary>
<content type='html'>
&lt;style&gt;
    :root {
      --aurora:
              radial-gradient(at 81% 35%, var(--orange) 0, transparent 50%),
              radial-gradient(at 80% 84%, var(--cyan) 0, transparent 50%),
              radial-gradient(at 88% 31%, var(--purple) 0, transparent 50%),
              radial-gradient(at 94% 32%, var(--pink) 0, transparent 50%),
              radial-gradient(at 49% 21%, var(--brown) 0, transparent 50%),
              radial-gradient(at 31% 46%, var(--teal) 0, transparent 50%),
              radial-gradient(at 90% 16%, var(--red) 0, transparent 50%),
              radial-gradient(at 0% 88%, var(--yellow) 0, transparent 50%),
              radial-gradient(at 42% 63%, var(--brown) 0, transparent 50%),
              radial-gradient(at 96% 0%, var(--yellow) 0, transparent 50%);
    }

    .app-blog-image--masthead {
      overflow: clip !important;
      perspective: 600px;

      .app-jenkins-preview {
        position: absolute;
        inset: 50%;
        translate: -50% -25%;
        transform-style: preserve-3d;
        backdrop-filter: blur(10px);
        background-color: color-mix(in srgb, white 80%, transparent);
        box-shadow: 0 0 30px rgba(0, 0, 0, 0.15);
        border-radius: 12px;
        width: 85%;
        aspect-ratio: 2938 / 1376;

        &amp;amp;::after {
          content: &quot;&quot;;
          position: absolute;
          inset: 0;
          background-image: url(&quot;/images/post-images/2025/07/24/preview.png&quot;);
          background-size: contain;
          background-position: top;
        }
      }

      .app-jenkins-preview:nth-child(1) {
        z-index: 3;
        transform: rotateX(var(--masthead-rotation-1)) translateY(110px);
      }

      .app-jenkins-preview:nth-child(2) {
        z-index: 2;
        transform: rotateX(var(--masthead-rotation-2)) translateY(50px) scale(0.9);
        background-color: color-mix(in srgb, white 70%, transparent);

        &amp;amp;::after {
          opacity: 0.9;
        }
      }

      .app-jenkins-preview:nth-child(3) {
        z-index: 1;
        transform: rotateX(var(--masthead-rotation-3)) translateY(-5px) scale(0.8);
        background-color: color-mix(in srgb, white 50%, transparent);

        &amp;amp;::after {
          opacity: 0.6;
        }
      }

      .app-jenkins-preview:nth-child(4) {
        z-index: 0;
        transform: rotateX(var(--masthead-rotation-4)) translateY(-55px) scale(0.7);
        background-color: color-mix(in srgb, white 30%, transparent);

        &amp;amp;::after {
          opacity: 0.3;
        }
      }

      .app-jenkins-preview:nth-child(5) {
        z-index: -1;
        transform: rotateX(var(--masthead-rotation-5)) translateY(-100px) scale(0.6);
        background-color: color-mix(in srgb, white 10%, transparent);

        &amp;amp;::after {
          opacity: 0.1;
        }
      }
    }

    .app-blog-image {
      position: relative;
      aspect-ratio: 1800 / 630;
      margin: 0 0 1.5rem 0 !important;
      border-radius: 10px;
      overflow: hidden;
      z-index: 0;
      background-color: rgba(255, 255, 255, 0.5);

      &amp;amp;::before {
        content: &quot;&quot;;
        position: absolute;
        inset: 0;
        background-attachment: fixed;
        background-color: var(--pink);
        background-image: var(--aurora);
        opacity: 0.35;
        z-index: -1;
      }

      &amp;amp;::after {
        content: &quot;&quot;;
        position: absolute;
        inset: 0;
        border: 1.5px solid color-mix(in srgb, var(--color) 5%, transparent);
        border-radius: 10px;
        z-index: 10;
      }
    }

    .developer-exp {
      display: flex;
      align-items: center;
      justify-content: center;
      gap: 40px;

      img {
        width: 90px;
        height: 90px;

        &amp;amp;:nth-of-type(3) {
          scale: 0.9;
        }

        &amp;amp;:nth-of-type(even) {
          width: 40px;
          height: 40px;
          rotate: 45deg;
          mix-blend-mode: overlay;
        }
      }
    }
&lt;/style&gt;

&lt;div class=&quot;app-blog-image app-blog-image--masthead&quot;&gt;
    &lt;div class=&quot;app-jenkins-preview&quot; /&gt;
    &lt;div class=&quot;app-jenkins-preview&quot; /&gt;
    &lt;div class=&quot;app-jenkins-preview&quot; /&gt;
    &lt;div class=&quot;app-jenkins-preview&quot; /&gt;
    &lt;div class=&quot;app-jenkins-preview&quot; /&gt;
&lt;/div&gt;

&lt;script&gt;
(function () {
  const startDeg = [-12, -9, -8, -7, -6];
  const maxShift = -20;
  const expFactor = 0.5;
  const scrollSpeed = 0.004;
  const maxDelay = 100; // max scroll delay in px for the first layer

  const endDeg = startDeg.map(
    (s, i) =&amp;gt; +(s + maxShift * Math.pow(expFactor, i)).toFixed(2)
  );

  const delay = startDeg.map(
    (_, i) =&amp;gt; +(maxDelay * Math.pow(expFactor, i)).toFixed(2)
  );

  const diffs = startDeg.map((s, i) =&amp;gt; Math.abs(endDeg[i] - s));
  const maxDiff = Math.max(...diffs);
  const lerp = (a, b, t) =&amp;gt; a + (b - a) * t;

  function updateVars() {
    startDeg.forEach((start, i) =&amp;gt; {
      const effectiveScroll = Math.max(window.scrollY - delay[i], 0);
      const base = effectiveScroll * scrollSpeed;
      const t = Math.min(base * (maxDiff / diffs[i]), 1);
      const rot = lerp(start, endDeg[i], t).toFixed(2);
      document.body.style.setProperty(`--masthead-rotation-${i + 1}`, `${rot}deg`);
    });
  }

  updateVars();
  window.addEventListener(&#39;scroll&#39;, updateVars, { passive: true });
})();
&lt;/script&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.jenkins.io/blog/2025/03/26/design-post/&quot;&gt;Part One&lt;/a&gt; we discussed the motivation behind redesigning Jenkins,
the most used CI/CD platform in the world, and the technical challenges that come with such an effort.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, we’ll dive deeper into the design decisions behind some of the new UI features, how we’re improving the developer
experience, and what we’re doing to ensure compatibility across the plugin ecosystem without slowing down progress.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;part-two-lift-off&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#part-two-lift-off&quot; /&gt;Part Two - Lift-off&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Jenkins 2.516.1, we’ve reworked large amounts of the Jenkins user interface - the result of years of dedicated work
by the community. This release marks a major milestone in the evolution of Jenkins, with nearly every part of the
interface having been refined for clarity and usability. From the navigation and theming to pipeline visualization
and customization, the entire experience has been reimagined to better serve both new and old users.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;refined-interface&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#refined-interface&quot; /&gt;Refined interface&lt;/h3&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;500&quot; src=&quot;https://www.youtube.com/embed/xLbkNo-Pwac&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most noticeable changes in Jenkins 2.516.1 is the introduction of the redesigned header. This new header
merges the traditional top bar and breadcrumb navigation into a single, streamlined component. The result is a cleaner,
more modern interface that not only looks better but also improves usability by saving valuable vertical
space - approximately &lt;em&gt;60 pixels&lt;/em&gt; per page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond its appearance, the new header is fully responsive. Breadcrumbs and actions dynamically adjust to different
screen sizes. Additionally, global actions like &lt;em&gt;Manage Jenkins&lt;/em&gt;, which were previously only accessible from the
dashboard, are now embedded directly into the header, making them accessible from any page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Redesigning a platform as extensible as Jenkins means every change must be carefully considered for its impact on the
plugin ecosystem. Throughout the ongoing redesign, maintaining compatibility with existing plugins has been prioritised.
This involved extensive testing, clear deprecation paths, and providing migration guides for plugin authors. The goal is
to do as much heavy lifting for plugin developers as possible, so that only small tweaks would be needed by plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Accessibility was a core focus of the redesign. We improved color contrast ratios across the interface, making Jenkins
easier to use for everyone, including those with visual impairments. Interactive elements now have more contrast,
and we’ve enhanced keyboard navigation throughout the UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve also introduced new border variables that developers can use: &lt;code&gt;--jenkins-border&lt;/code&gt; and &lt;code&gt;--jenkins-border—​subtle&lt;/code&gt;.
These borders automatically change size and color depending on context, ensuring that they are always visible and
accessible. When your system is set to increased contrast mode, borders automatically adapt - ensuring components
remain visible and easy to distinguish throughout Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;revamped-pipeline-visualisation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#revamped-pipeline-visualisation&quot; /&gt;Revamped pipeline visualisation&lt;/h3&gt;
&lt;div class=&quot;app-blog-image&quot;&gt;
    &lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/07/24/pipeline-graph-view.png&quot; alt=&quot;Pipeline Graph View plugin&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipelines are central to how Jenkins automates the process of building, testing, and deploying software. They outline
the entire workflow from code commit to production. As these pipelines become more complex, it can be challenging to
track progress or identify issues. This is where pipeline visualization becomes essential - turning a series of
abstract steps into a clear, interactive flow.&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/pipeline-graph-view&quot;&gt;Pipeline Graph View&lt;/a&gt; plugin does just that, displaying each
stage of a run in a clean, intuitive graph. It’s designed to help users quickly grasp the structure and status of their
pipelines at a glance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, the plugin has been completely rebuilt, and the response from the community has been &lt;em&gt;fantastic&lt;/em&gt;. We’ve moved
the plugin from Webpack to Rspack and Vite, and replaced class components with functional ones. This cleanup removed
thousands of lines of code, improving performance and maintainability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new interface, based on the &lt;a href=&quot;https://weekly.ci.jenkins.io/design-library/&quot;&gt;Jenkins Design Library&lt;/a&gt;, now supports
full-page scrolling, sticky headings, and pan-and-zoom capabilities for the pipeline graph. New animations, loading
skeletons, and clear stage progress indicators create a smoother, more responsive user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A unified view brings together the pipeline graph, stage details, and logs into a single layout, so you can now track
execution and output in one place. The layout is customizable - the graph can be moved and columns resized or hidden.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, performance has been significantly boosted. The plugin loads faster, scrolls more smoothly, and
handles large pipelines more efficiently than ever before.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Want to learn more about Pipeline Graph View? Read our &lt;a href=&quot;https://www.jenkins.io/blog/2025/05/02/pipeline-graph-view/&quot;&gt;previous article&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-ways-to-customize-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-ways-to-customize-jenkins&quot; /&gt;New ways to customize Jenkins&lt;/h3&gt;
&lt;div class=&quot;app-blog-image&quot;&gt;
    &lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/07/24/themes.png&quot; alt=&quot;Themes&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.516.1 is the most customizable version of Jenkins yet. There’s more themes than ever before, and a whole new
way of changing themes on the fly. Just hover over your user account icon to get access to the new theme picker.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Make Jenkins your own with a variety of themes:&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;Want to create your own theme? We’ve made it simple with a brand-new Maven archetype –
&lt;a href=&quot;https://github.com/jenkinsci/archetypes&quot;&gt;check it out&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On top of that, there’s the &lt;a href=&quot;https://plugins.jenkins.io/customizable-header&quot;&gt;Customizable Header Plugin&lt;/a&gt;. This
lets you fully customize the new header - change the logo, links, or actions to tailor Jenkins to your organization’s
workflow and brand.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;evolving-the-developer-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#evolving-the-developer-experience&quot; /&gt;Evolving the developer experience&lt;/h3&gt;
&lt;div class=&quot;app-blog-image developer-exp&quot;&gt;
    &lt;img src=&quot;https://www.jenkins.io/images/logos/jenkins/jenkins.svg&quot; alt=&quot;Jenkins logo&quot; /&gt;
    &lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/07/24/plus.svg&quot; alt=&quot;Plus&quot; /&gt;
    &lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/07/24/design-library.svg&quot; alt=&quot;Jenkins Design Library icon&quot; /&gt;
    &lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/07/24/plus.svg&quot; alt=&quot;Plus&quot; /&gt;
    &lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/07/24/intellij.png&quot; alt=&quot;IntelliJ icon&quot; /&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is powered by hundreds of contributors, but working with its proprietary technologies – particularly Jelly and
Stapler – can be a challenge for newcomers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jenkins-design-library&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-design-library&quot; /&gt;Jenkins Design Library&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the end of last year, &lt;a href=&quot;https://weekly.ci.jenkins.io/design-library/&quot;&gt;Jenkins Design Library 3&lt;/a&gt; was
introduced - a major step forward in modernizing the Jenkins UI and improving the development experience. Jenkins Design
Library is a comprehensive system of reusable UI components, layout patterns, and style guidelines tailored
specifically for Jenkins. It standardizes how interfaces are built, ensuring consistency across plugins and core
features while aligning with modern web practices and accessibility standards.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For contributors, this means a more efficient and reliable way to build user interfaces. Instead of
creating components from scratch or reverse-engineering existing ones, contributors can rely on a shared set of
well-documented, pre-tested elements. This not only speeds up development and reduces bugs, but also makes it easier
for new contributors to get started and follow established UI conventions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;plugin-for-intellij&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-for-intellij&quot; /&gt;Plugin for IntelliJ&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To help lower the barrier to entry, the Jenkins community offers an
&lt;a href=&quot;https://plugins.jetbrains.com/plugin/1885-jenkins-development-support&quot;&gt;IntelliJ IDEA plugin&lt;/a&gt;. The plugin streamlines
Jenkins development in various ways, such as offering autocompletion and inline documentation for Jelly tags, as well as
autocomplete for &lt;a href=&quot;https://weekly.ci.jenkins.io/design-library/symbols/&quot;&gt;Jenkins Symbols&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;get-involved&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-involved&quot; /&gt;Get involved&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has come a long way in the last few years, and we’re incredibly excited for what the future holds.&lt;/p&gt;
&lt;/div&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;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/07/24/giovanni-vaccarino-gsoc-midterm-post/</id>
<title>GSoC Midterm Update, Building an AI-Powered Chatbot</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-07-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/07/24/giovanni-vaccarino-gsoc-midterm-post/" />
<category term='gsoc'></category>
<category term='gsoc2025-midterm'></category>
<category term='jenkins'></category>
<category term='chatbot'></category>
<category term='ai'></category>
<category term='natural-language-processing'></category>
<category term='jenkins-plugin'></category>
<category term='open-source'></category>
<summary>
Hello everyone!


I&#8217;m Giovanni Vaccarino, and I’m working on the AI-Powered Chatbot for Quick Access to Jenkins Resources project as part of Google Summer of Code 2025. This project focuses on developing a Jenkins plugin that integrates an AI chatbot to help users quickly find relevant Jenkins documentation, plugins, and community resources.


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


What I&#8217;ve Accomplished So Far


Here are the major milestones I&#8217;ve achieved in this period:




Built the complete data pipeline for the RAG-based chatbot, from data collection to embedding and vector storage


Implemented a REST API...
</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 Giovanni Vaccarino, and I’m working on the &lt;strong&gt;AI-Powered Chatbot for Quick Access to Jenkins Resources&lt;/strong&gt; project as part of Google Summer of Code 2025. This project focuses on developing a Jenkins plugin that integrates an AI chatbot to help users quickly find relevant Jenkins documentation, plugins, and community resources.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve just crossed the midpoint of July, 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;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;Here are the major milestones I’ve achieved in this period:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Built the complete &lt;strong&gt;data pipeline&lt;/strong&gt; for the RAG-based chatbot, from data collection to embedding and vector storage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implemented a &lt;strong&gt;REST API&lt;/strong&gt; to serve the chatbot functionalities&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Developed the &lt;strong&gt;plugin UI&lt;/strong&gt;, which was integrated into the Jenkins user interface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Written unit and integration &lt;strong&gt;tests&lt;/strong&gt; for both the backend and frontend components&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continuously update the project &lt;strong&gt;documentation&lt;/strong&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;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;While this journey has been full of technical growth, GSoC has been about much more than just writing code. It’s been about having meaningful discussions, valuable mentorship, and collaboration by exchanging ideas and opinions.&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;With several weeks still ahead, I’m fully committed to continue the work on the project. The second phase will focus on enhancing the quality of the chatbot’s responses. I plan to explore agentic approaches and develop more complex chains and flows, all while keeping the response time constraints in mind.&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;strong&gt;Vutukuri Sreenivas&lt;/strong&gt;, &lt;strong&gt;Kris Stern&lt;/strong&gt;, &lt;strong&gt;Bervianto Leo Pratama&lt;/strong&gt;, and &lt;strong&gt;Bruno Verachten&lt;/strong&gt; for their constant availability, quick responses, code reviews, and thoughtful guidance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, a big shout-out to the Jenkins org admins &lt;strong&gt;Kris Stern&lt;/strong&gt;, &lt;strong&gt;Bruno Verachten&lt;/strong&gt;, and &lt;strong&gt;Alyssa Tong&lt;/strong&gt; for their continuous support throughout 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;midterm-presentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#midterm-presentation&quot; /&gt;Midterm Presentation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve recently completed the GSoC midterm presentation for the project, where I walked through the current status, key features and future plans. If you are interested in a more detailed overview, &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#gsoc-2025&quot;&gt;the recording is available on the GSoC 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;want-to-track-the-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#want-to-track-the-project&quot; /&gt;Want to Track the Project?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Follow the plugin’s development: &lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin&quot;&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m excited for the weeks ahead and to keep building with the Jenkins community!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/07/24/birajit-saikia-gsoc-midterm-update-blog-post/</id>
<title>GSoC 2025 Midterm: Complete Build Retooling of jenkins.io</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-07-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/07/24/birajit-saikia-gsoc-midterm-update-blog-post/" />
<author>
<name>biru-codeastromer</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2025-midterm'></category>
<category term='jenkins.io'></category>
<category term='jenkins-infra'></category>
<category term='documentation'></category>
<category term='vitejs'></category>
<category term='antora'></category>
<summary>
This post details the progress made during the first half of Google Summer of Code 2025 on the Complete Build Retooling of jenkins.io project, which aims to modernize the Jenkins documentation infrastructure.


Table of Contents




Project Objectives


Technical Implementation



Architecture Components


Migration Approach





Progress Highlights



Documentation System (Antora)


Web Platform (Vite.js)





Challenges Overcome


Roadmap Ahead


Acknowledgments


Project Resources






Project Objectives


The initiative focuses on three core improvements to the Jenkins documentation system:




Modernization: Transitioning from legacy tools to contemporary solutions


Performance: Implementing faster build processes


Organization: Establishing clear separation between:



Versioned content (tied to LTS releases)


Non-versioned content (general documentation)









Technical Implementation


Architecture Components



Antora: Chosen for versioned documentation management


Vite.js: Selected for non-versioned content after evaluating Gatsby


Material UI: Implementing modern UI components


YAML:...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC Logo&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post details the progress made during the first half of Google Summer of Code 2025 on the &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/complete-alternative-jenkins-io-build-retooling/&quot;&gt;Complete Build Retooling of jenkins.io&lt;/a&gt;&lt;/strong&gt; project, which aims to modernize the Jenkins documentation infrastructure.&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;#project-objectives&quot;&gt;Project Objectives&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#technical-implementation&quot;&gt;Technical Implementation&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;#architecture-components&quot;&gt;Architecture Components&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#migration-approach&quot;&gt;Migration Approach&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-highlights&quot;&gt;Progress Highlights&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;#documentation-system-antora&quot;&gt;Documentation System (Antora)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#web-platform-vite-js&quot;&gt;Web Platform (Vite.js)&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;#challenges-overcome&quot;&gt;Challenges Overcome&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#roadmap-ahead&quot;&gt;Roadmap Ahead&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgments&quot;&gt;Acknowledgments&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#project-resources&quot;&gt;Project Resources&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;project-objectives&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-objectives&quot; /&gt;Project Objectives&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The initiative focuses on three core improvements to the Jenkins documentation system:&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;&lt;strong&gt;Modernization&lt;/strong&gt;: Transitioning from legacy tools to contemporary solutions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Implementing faster build processes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organization&lt;/strong&gt;: Establishing clear separation between:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Versioned content (tied to LTS releases)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Non-versioned content (general documentation)&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;technical-implementation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#technical-implementation&quot; /&gt;Technical Implementation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;architecture-components&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#architecture-components&quot; /&gt;Architecture Components&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Antora&lt;/strong&gt;: Chosen for versioned documentation management&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Vite.js&lt;/strong&gt;: Selected for non-versioned content after evaluating Gatsby&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Material UI&lt;/strong&gt;: Implementing modern UI components&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;YAML&lt;/strong&gt;: Structured content management for dynamic pages&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;migration-approach&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#migration-approach&quot; /&gt;Migration Approach&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The transition strategy involved:&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;&lt;strong&gt;Content Analysis&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Comprehensive audit of existing documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Identification of versioned vs. non-versioned content&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Toolchain Implementation&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Automated content synchronization via Python scripts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Visual diff verification using Beyond Compare&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Incremental page migration to ensure stability&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&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;progress-highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#progress-highlights&quot; /&gt;Progress Highlights&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;documentation-system-antora&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-system-antora&quot; /&gt;Documentation System (Antora)&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Successfully synchronized the docs.jenkins.io repository with current content of jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Resolved many broken navigation links across the documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Established LTS 2.504x as the new branch with changes up to 25 June&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removed deprecated Gatsby infrastructure&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;web-platform-vite-js&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#web-platform-vite-js&quot; /&gt;Web Platform (Vite.js)&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Implemented a modern Vite.js foundation with:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Preview deployment capabilities&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automated branch protection&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integrated issue tracking&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Migrated core pages including:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Roadmap&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chat&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Participate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Books&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Awards&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avatars&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Conduct&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mailing Lists&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Achieved near-perfect visual parity with the current jenkins.io site&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Introduced system-aware dark/light mode&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;challenges-overcome&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges-overcome&quot; /&gt;Challenges Overcome&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The migration presented several technical hurdles:&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;Content Structure&lt;/strong&gt;: Maintaining accurate inter-document relationships during transition&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tooling Transition&lt;/strong&gt;: Smooth migration from Gatsby to Vite.js mid-project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UI Consistency&lt;/strong&gt;: Ensuring pixel-perfect alignment with existing design&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Workflow Management&lt;/strong&gt;: Coordinating multiple interdependent PRs&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;roadmap-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#roadmap-ahead&quot; /&gt;Roadmap Ahead&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final phase will focus on:&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;Completing the migration of remaining components:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Security advisories&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Changelogs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blog&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Home page&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Performance optimization:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Build time improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Asset delivery optimization&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final integration:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Unified platform architecture&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comprehensive SEO implementation&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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project’s progress owes much to the exceptional guidance from my mentors: &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/iamrajiv&quot;&gt;Rajiv Singh&lt;/a&gt;&lt;/strong&gt;. Their technical expertise and strategic advice have been instrumental in navigating the project’s complexities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me, the learning has been immense — not only in terms of technical depth, but also in strengthening collaboration, communication, and open-source best practices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additional thanks to the Jenkins GSoC org admins for their support and for fostering such a collaborative open-source environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;midterm-presentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#midterm-presentation&quot; /&gt;Midterm Presentation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We recently completed our midterm presentations, where I delivered a high-level overview of the work that has been completed so far and what the rest of the project timeline will look like.
You can check out my presentation, as well as the others, &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#gsoc-2025&quot;&gt;on the Jenkins in Google Summer of Code&lt;/a&gt; page.&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;project-resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-resources&quot; /&gt;Project Resources&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://github.com/jenkins-infra/docs.jenkins.io&quot;&gt;Documentation Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/docs.jenkins.io-vite.js-site&quot;&gt;Vite.js Implementation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/My-GSoC-Jenkins-2025&quot;&gt;Project Journal&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 second half of GSoC promises exciting developments as we work toward delivering a modern, high-performance documentation platform for the Jenkins community.&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/07/11/aws-sponsorship/</id>
<title>Amazon donates $60,000 to Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-07-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/07/11/aws-sponsorship/" />
<category term='infrastructure'></category>
<summary>
Amazon Web Services has graciously donated $60,000 in cloud credits to the Jenkins project.
Their continued support of the Jenkins project is massively important for several services and functions.
AWS' support for Jenkins over the years has enabled the Jenkins project to run its infrastructure and services efficiently.


AWS provides the central distribution point for Jenkins core and Jenkins plugin downloads through the Jenkins update center.
We&#8217;ve used AWS Graviton servers (Arm architecture) and AWS Intel servers with the Amazon Elastic Kubernetes Service and as Elastic Compute Cloud virtual machines.


In addition to these services, ci.jenkins.io was recently migrated to AWS through the work of...
</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/2024/07/24/2024-07-24-amazon-donates-to-jenkins.png&quot; alt=&quot;image&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Amazon Web Services has graciously donated $60,000 in cloud credits to the Jenkins project.
Their continued support of the Jenkins project is massively important for several services and functions.
AWS&#39; support for Jenkins over the years has enabled the Jenkins project to run its infrastructure and services efficiently.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AWS provides the central distribution point for Jenkins core and Jenkins plugin downloads through the Jenkins update center.
We’ve used &lt;a href=&quot;https://docs.aws.amazon.com/whitepapers/latest/aws-graviton-performance-testing/what-is-aws-graviton.html&quot;&gt;AWS Graviton servers&lt;/a&gt; (Arm architecture) and AWS Intel servers with the Amazon &lt;a href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html&quot;&gt;Elastic Kubernetes Service&lt;/a&gt; and as &lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html&quot;&gt;Elastic Compute Cloud&lt;/a&gt; virtual machines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to these services, &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/4688&quot;&gt;ci.jenkins.io was recently migrated to AWS&lt;/a&gt; through the work of the Jenkins infrastructure team.
This migration was necessary so that Jenkins can continue to provide a stable and reliable environment for its users and community.
This was no small task, involving many moving parts and requiring careful planning and execution to ensure a smooth transition.
Without the support and sponsorship of AWS, this migration would not have been possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are sincerely grateful for Amazon’s most recent contribution to the Jenkins project and thank them for their continued support of open-source software.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/07/10/yourkit-sponsorship/</id>
<title>YourKit sponsors the Jenkins project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-07-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/07/10/yourkit-sponsorship/" />
<category term='jenkins'></category>
<category term='sponsor'></category>
<category term='yourkit'></category>
<summary>
We’re proud to welcome YourKit as a new sponsor of the Jenkins project!


YourKit has generously provided free licenses for the YourKit Java Profiler to Jenkins core maintainers and active contributors.
This tool is a powerful asset when analyzing performance regressions, debugging memory leaks, or resolving concurrency issues in Jenkins core and plugin code.





YourKit supports open source projects with innovative and intelligent tools for monitoring and profiling Java and .NET applications.
YourKit is the creator of YourKit Java Profiler, YourKit .NET Profiler, and YourKit YouMonitor.


While YourKit offers a suite of tools, this sponsorship specifically provides licenses for the YourKit Java Profiler to eligible...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re proud to welcome &lt;strong&gt;YourKit&lt;/strong&gt; as a new sponsor of the Jenkins project!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;YourKit has generously provided free licenses for the &lt;strong&gt;YourKit Java Profiler&lt;/strong&gt; to Jenkins core maintainers and active contributors.
This tool is a powerful asset when analyzing performance regressions, debugging memory leaks, or resolving concurrency issues in Jenkins core and plugin code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.yourkit.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/07/yourkit-logo.svg&quot; alt=&quot;Yourkit&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;YourKit supports open source projects with innovative and intelligent tools for monitoring and profiling Java and .NET applications.
YourKit is the creator of &lt;a href=&quot;https://www.yourkit.com/java/profiler/&quot;&gt;YourKit Java Profiler&lt;/a&gt;, &lt;a href=&quot;https://www.yourkit.com/dotnet-profiler/&quot;&gt;YourKit .NET Profiler&lt;/a&gt;, and &lt;a href=&quot;https://www.yourkit.com/youmonitor/&quot;&gt;YourKit YouMonitor&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While YourKit offers a suite of tools, this sponsorship specifically provides licenses for the &lt;strong&gt;YourKit Java Profiler&lt;/strong&gt; to eligible Jenkins contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-to-request-a-license&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-request-a-license&quot; /&gt;How to Request a License&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re actively contributing to Jenkins and would benefit from a YourKit Java Profiler license, please contact Alexander Brandes (@NotMyFault) via email.
His contact information are available on his GitHub profile: &lt;a href=&quot;https://github.com/NotMyFault&quot; class=&quot;bare&quot;&gt;https://github.com/NotMyFault&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Include your GitHub handle and a short note indicating your interest in a YourKit license.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;thank-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thank-you&quot; /&gt;Thank You&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re incredibly grateful to YourKit for supporting the Jenkins project and enabling our contributors to go deeper into performance tuning and diagnostics.
Their support strengthens the quality and reliability of Jenkins for everyone.&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/07/10/jetbrains-sponsorship/</id>
<title>JetBrains sponsors the Jenkins project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-07-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/07/10/jetbrains-sponsorship/" />
<category term='jenkins'></category>
<category term='sponsor'></category>
<category term='jetbrains'></category>
<summary>
We’re excited to welcome JetBrains as a new sponsor of the Jenkins project!


JetBrains has generously provided free annual All Products Pack subscriptions to Jenkins core maintainers and active contributors.
This subscription grants access to the full suite of JetBrains IDEs, including IntelliJ IDEA Ultimate Edition, which is widely used by Jenkins developers for writing, debugging, and maintaining the project’s codebase.


JetBrains: Tools that Support Jenkins Development





JetBrains develops a comprehensive set of development tools that cover many programming languages and workflows.
IntelliJ IDEA Ultimate Edition, in particular, is a popular choice among Jenkins contributors for its advanced code analysis, refactoring tools, and seamless integration...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re excited to welcome &lt;strong&gt;JetBrains&lt;/strong&gt; as a new sponsor of the Jenkins project!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JetBrains has generously provided free annual &lt;strong&gt;All Products Pack&lt;/strong&gt; subscriptions to Jenkins core maintainers and active contributors.
This subscription grants access to the full suite of JetBrains IDEs, including IntelliJ IDEA Ultimate Edition, which is widely used by Jenkins developers for writing, debugging, and maintaining the project’s codebase.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jetbrains-tools-that-support-jenkins-development&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jetbrains-tools-that-support-jenkins-development&quot; /&gt;JetBrains: Tools that Support Jenkins Development&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&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://jb.gg/OpenSource&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/07/jetbrains-logo.svg&quot; alt=&quot;JetBrains logo&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JetBrains develops a comprehensive set of development tools that cover many programming languages and workflows.
IntelliJ IDEA Ultimate Edition, in particular, is a popular choice among Jenkins contributors for its advanced code analysis, refactoring tools, and seamless integration with build and test systems.&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-request-a-license&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-request-a-license&quot; /&gt;How to Request a License&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re a core maintainer or active contributor to Jenkins and would like to receive a JetBrains All Products Pack subscription, please contact Alexander Brandes (@NotMyFault) via email.
His contact details are available on his GitHub profile: &lt;a href=&quot;https://github.com/NotMyFault&quot; class=&quot;bare&quot;&gt;https://github.com/NotMyFault&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Include your GitHub handle and a brief note indicating your interest in a JetBrains subscription for the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;thank-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thank-you&quot; /&gt;Thank You&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We sincerely thank JetBrains for their generous support of the Jenkins project.
Their sponsorship helps us continue to improve Jenkins, making it a better tool for our users worldwide.&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/06/25/Celebrating-the-2025-Jenkins-Contributor-Award-Winners/</id>
<title>🌟 Celebrating the 2025 Jenkins Contributor Award Winners</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-06-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/06/25/Celebrating-the-2025-Jenkins-Contributor-Award-Winners/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='awards'></category>
<category term='cdcon'></category>
<category term='cdf'></category>
<summary>
At cdCon 2025 in Colorado this week, we proudly recognized outstanding contributions within both the Continuous Delivery Foundation (CDF) and the Jenkins community. These awards celebrate exceptional ambassadors, contributors, documentation champions, and users who drive CI/CD excellence.


🎖️ Jenkins Project Honors


Jenkins presented three distinguished awards:




Jenkins Security MVP


Most Valuable Jenkins Contributor


Most Valuable Jenkins Advocate




🏅 Award Recipients


 Most Valuable Contributor: Jan Faracik


Jan has made tremendous contributions to the UI/UX front of the Jenkins project as the UI/UX SIG Lead, not just this year but throughout the years, and for helping to foster a collaborative environment especially in helping newcomers of the Jenkins ecosystem...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At &lt;a href=&quot;https://www.jenkins.io//cd.foundation/cdcon-2025/&quot;&gt;cdCon 2025 in Colorado&lt;/a&gt; this week, we proudly recognized outstanding contributions within both the Continuous Delivery Foundation (CDF) and the Jenkins community. These awards celebrate exceptional ambassadors, contributors, documentation champions, and users who drive CI/CD excellence.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;🎖️ Jenkins Project Honors&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins presented three distinguished awards:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Security MVP&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;Most Valuable Jenkins Advocate&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;🏅 Award Recipients&lt;/strong&gt;&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/janfaracik.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/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jan has made tremendous contributions to the UI/UX front of the Jenkins project as the UI/UX SIG Lead, not just this year but throughout the years, and for helping to foster a collaborative environment especially in helping newcomers of the Jenkins ecosystem via code reviews.&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/2023/05/16/2023-05-16-jenkins-2023-award-winners/image3.png&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/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Daniel brought skills and thorough efforts to maintain and improve the security of Jenkins. His code reviews for Jenkins core are great examples of attention to detail and awareness of impact. He reviews security threats carefully and keeps himself current on recent security topics. He works well with release leads when delivering Jenkins security releases and works well with the Jenkins infrastructure team in many different areas.&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/2024/04/19/stefan-spieker.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/StefanSpieker&quot;&gt;Stefan Spieker&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stefan has made continuous efforts in advocating Jenkins in his company with excellent explanations and showcases. He organized Hacktoberfest, and encouraged other colleagues to contribute to Open Source, specifically Jenkins.  He speaks at conferences to advocate for Jenkins. He also wrote a successful book where he shared his insights on the open source and Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;📌 Closing Thoughts&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These award winners exemplify the collaborative spirit that drives the Jenkins community forward. By spotlighting their achievements, we shine a light on security vigilance, code craftsmanship, educational outreach, and unwavering community support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every nominee deserves a huge thank you and congratulations - your contributions are felt through the performance and reliability Jenkins provides users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to every voter, and participant who submitted nominations - your involvement continues to make Jenkins thrive.&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/06/11/chirag-gupta-gsoc-community-bonding-blog-post/</id>
<title>Meet Chirag Gupta, GSoC 2025 Contributor Building an LLM for Jenkins Failure Diagnosis</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-06-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/06/11/chirag-gupta-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2025'></category>
<category term='jenkins'></category>
<category term='LLM'></category>
<category term='AI'></category>
<category term='fine-tuning'></category>
<category term='RAG'></category>
<category term='open-source'></category>
<summary>
Hello, Jenkins Community!


I&#8217;m Chirag Gupta, and I&#8217;m incredibly excited to announce that I&#8217;ve been selected for the Google Summer of Code 2025 program to work with the Jenkins project! It&#8217;s an honor to contribute to such a cornerstone of the open-source CI/CD landscape.


My project, "Domain-specific LLM based on actual Jenkins usage using ci.jenkins.io data," aims to create a specialized Large Language Model (LLM) to assist Jenkins users in diagnosing build failures more effectively. The core idea is to leverage the wealth of real-world data from ci.jenkins.io to fine-tune an LLM, making it adept at understanding Jenkins-specific issues. You can check...
</summary>
<content type='html'>
&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;I’m Chirag Gupta, and I’m incredibly excited to announce that I’ve been selected for the Google Summer of Code 2025 program to work with the Jenkins project! It’s an honor to contribute to such a cornerstone of the open-source CI/CD landscape.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My project, &lt;strong&gt;&quot;Domain-specific LLM based on actual Jenkins usage using ci.jenkins.io data,&quot;&lt;/strong&gt; aims to create a specialized Large Language Model (LLM) to assist Jenkins users in diagnosing build failures more effectively. The core idea is to leverage the wealth of real-world data from &lt;code&gt;ci.jenkins.io&lt;/code&gt; to fine-tune an LLM, making it adept at understanding Jenkins-specific issues. You can check out &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/domain-specific-LLM-based-on-jenkins-usage-using-ci-jenkins-io-data/&quot;&gt;my project&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;diving-in-the-community-bonding-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#diving-in-the-community-bonding-period&quot; /&gt;Diving In: The Community Bonding Period&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The past few weeks of the community bonding period have been an invaluable learning experience, focused on laying a solid foundation for the coding phases ahead:&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;Deep Dive into ci.jenkins.io Data:&lt;/strong&gt; The dataset is the lifeblood of the project. I’ve been exploring its structure, which includes a vast array of build logs, XML metadata (&lt;code&gt;build.xml&lt;/code&gt;, &lt;code&gt;changelog.xml&lt;/code&gt;, &lt;code&gt;config.xml&lt;/code&gt;), and other artifacts. Understanding the sheer scale (approx. 400,000 files!) and the diversity within this data is crucial. My initial analysis, as outlined in my proposal, has focused on identifying key characteristics, potential challenges (like log noise and token inflation), and patterns that will inform our data preprocessing and fine-tuning strategies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Understanding the Jenkins Ecosystem:&lt;/strong&gt; Beyond the data, I’ve been deepening my understanding of Jenkins CI/CD principles, common failure scenarios, and existing tools like the Build Failure Analyzer and Log Parser. This broader context is essential for building a truly useful LLM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Collaboration with Mentors:&lt;/strong&gt; I’ve had insightful discussions with my mentors, Kris Stern, Shivay Lamba, Bruno Verachten, Harsh Pratap Singh, and Vutukuri Sreenivas. Their expertise and guidance have been instrumental in refining the project’s technical roadmap, from model selection (exploring options like Phi-4 and Qwen) to planning our evaluation strategies.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The bonding period has truly highlighted the importance of high-quality, structured data for effective LLM training. The &lt;code&gt;ci.jenkins.io&lt;/code&gt; dataset, with its real-world complexities, offers both a significant challenge and a fantastic opportunity.&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;As we transition into the coding period, the immediate focus will be on:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Implementing robust log cleaning and preprocessing pipelines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Systematically parsing metadata to create a comprehensive index of builds and their outcomes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beginning the critical task of structuring the data into a format suitable for fine-tuning our chosen LLM, including generating QA pairs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Preparing for and executing the initial fine-tuning runs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m incredibly excited to move forward and start bringing this project to life. I believe that an LLM tailored for Jenkins can significantly enhance the user experience by providing more intuitive and actionable insights into build issues, and also reduce the time taken by people to parse their build failures.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A heartfelt thank you to my mentors and the entire Jenkins community for this amazing opportunity and for the warm welcome. I’m eager to learn, contribute, and share my progress with all of you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s build a smarter Jenkins together!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/06/06/raunak-madan-gsoc-community-bonding-blog-post/</id>
<title>Meet Raunak Madan – GSoC 2025 Contributor Working on Improving Plugin Modernizer Tool</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-06-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/06/06/raunak-madan-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2025'></category>
<category term='open-rewrite'></category>
<category term='plugin-modernization'></category>
<summary>
Hey everyone, I am Raunak Madan, currently in my sophomore year pursuing my Bachelor&#8217;s in Computer Applications.
It’s been fun and engaging working with such an amazing community in the past couple of weeks.


Table of Contents




About the Plugin Modernizer Tool


What I did in the Community Bonding Period?


What lies ahead (Coding Period)?


Acknowledgements


Useful Links






About the Plugin Modernizer Tool


The Plugin Modernizer Tool is a generic CLI tool designed to automate the modernization of Jenkins plugins.
It utilizes OpenRewrite recipes to apply transformations to the plugin, validating the applied transformations and creating pull requests with the results. For a detailed description of the project, please refer...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hey everyone, I am Raunak Madan, currently in my sophomore year pursuing my Bachelor’s in Computer Applications.
It’s been fun and engaging working with such an amazing community in the past couple of weeks.&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-plugin-modernizer-tool&quot;&gt;About the Plugin Modernizer Tool&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-coding-period&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-plugin-modernizer-tool&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-plugin-modernizer-tool&quot; /&gt;About the Plugin Modernizer Tool&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; is a generic CLI tool designed to automate the modernization of Jenkins plugins.
It utilizes OpenRewrite recipes to apply transformations to the plugin, validating the applied transformations and creating pull requests with the results. For a detailed description of the project, please refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/plugin-modernizer-improvements/&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why is This Tool Important?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With over 2000+ plugins in Jenkins, keeping them updated manually is a daunting task. The Plugin Modernizer Tool automates much of this work, ensuring:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Plugins stay up to date with modern Jenkins practices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compatibility with the latest Java and Jenkins versions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reduced technical debt for plugin maintainers.&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;Contributions:&lt;/strong&gt; I worked on enhancing the existing recipes, such as &lt;code&gt;MigrateToJUnit5&lt;/code&gt;, adding new recipes - &lt;code&gt;AddThrowsExceptionWhereAssertThrows&lt;/code&gt;, fixing bugs, and addressing chore issues like updating the OpenRewrite BOM version and updating test coverage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Documenting Everything:&lt;/strong&gt; Maintaining a record of the work done each day on tools like Notion, which helps to track daily progress and ensures transparency, as everyone can see your work and give feedback to improve. It also helps future contributors to see what work has been done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Communication is key:&lt;/strong&gt; One of the mentors, &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt; taught me that there is no such thing as “overcommunicating”, definitely asking questions without doing your research is not good, but if you feel there is anything your mentors should know or can help you out, feel free to reach out to them. Communication prevents roadblocks early on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Planning and Scheduling:&lt;/strong&gt; Plan the following weeks and months, discussing the proposal’s phases to gain more clarity, and communicate any time commitments, such as exams, to adjust the schedule accordingly.&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;Storing metadata about the modernization process on the &lt;a href=&quot;https://reports.jenkins.io/&quot;&gt;Jenkins reports site&lt;/a&gt; or maybe on an open-source repository for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Making REST API endpoints to access the modernization metadata.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automating Running Recipes on Plugins with Low Health Scores.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Visualizing the metadata on the &lt;a href=&quot;https://stats.jenkins.io/&quot;&gt;Jenkins Statistics Site&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implementing more recipes that help in the modernization of plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By automating modernization on plugins with low health scores and providing APIs to access the metadata, we can measure the impact of this tool in the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This tool can reduce a lot of technical debt, and with the vast Jenkins Ecosystem, it surely has the potential to create a lot of impact; that’s what is amazing about this project. It will be fun working this summer on the plugin modernizer tool with my amazing team.&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/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/sridamul&quot;&gt;Sridhar Sivakumar&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/TheMeinerLP&quot;&gt;Phillipp Glanz&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;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;paragraph&quot;&gt;
&lt;p&gt;You can find all the project-related notes and discussions 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://sedate-marscapone-74c.notion.site/208fcbf0cc328028b936c73963de640b?v=208fcbf0cc3280dd8f94000c986ac3a3&quot;&gt;Weekly Meetings&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sedate-marscapone-74c.notion.site/GSoC-Jenkins-Improving-Plugin-Modernizer-206fcbf0cc328085b44ffefae8f232e8&quot;&gt;Daily Progress/Notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/06/06/giovanni-vaccarino-gsoc-community-bonding-blog-post/</id>
<title>Meet Giovanni Vaccarino GSoC 2025 Contributor Working on AI-Powered Chatbot for Quick Access to Jenkins Resources</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-06-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/06/06/giovanni-vaccarino-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2025'></category>
<category term='jenkins'></category>
<category term='chatbot'></category>
<category term='ai'></category>
<category term='natural-language-processing'></category>
<category term='jenkins-plugin'></category>
<category term='open-source'></category>
<summary>
Hello everyone!


I&#8217;m Giovanni Vaccarino, and I’m excited to be part of Google Summer of Code 2025 as a contributor to the Jenkins project. This summer, I’ll be working on building an AI-Powered Chatbot for Quick Access to Jenkins Resources, a project aimed at creating a Jenkins plugin that integrates an AI chatbot that helps users to quickly find relevant Jenkins documentation, plugins, and other community resources.


Kicking Off the Journey


Just a day after the official GSoC announcements, we had a warm welcome session with all Jenkins mentors and mentees. We had the opportunity to introduce ourselves and break the ice. Seeing...
</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 Giovanni Vaccarino, and I’m excited to be part of Google Summer of Code 2025 as a contributor to the Jenkins project. This summer, I’ll be working on building an &lt;strong&gt;AI-Powered Chatbot for Quick Access to Jenkins Resources&lt;/strong&gt;, a project aimed at creating a Jenkins plugin that integrates an AI chatbot that helps users to quickly find relevant Jenkins documentation, plugins, and other community resources.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;kicking-off-the-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#kicking-off-the-journey&quot; /&gt;Kicking Off the Journey&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just a day after the official GSoC announcements, we had a warm welcome session with all Jenkins mentors and mentees. We had the opportunity to introduce ourselves and break the ice. Seeing how dedicated the other mentees are to their projects and how supportive the community it has been fantastic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few days after, I had my first dedicated project meeting, where I got to connect with my mentors. That’s when things started moving fast as my mentors proposed to start coding immediately, with the idea of delivering an MVP by the start 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;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;The project aims to support the Jenkins users by providing an intuitive, conversational assistant embedded directly into the Jenkins UI, via a plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It will use a Retrieval-Augmented Generation (RAG) architecture to search through official documentation, Discourse threads, and StackOverflow posts. The backend will be powered by a locally hosted quantized LLM served via FastAPI, while the frontend, built with React and TypeScript, will provide a modern and quick-access to the assistant.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;community-bonding-period-works&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-bonding-period-works&quot; /&gt;Community Bonding Period Works&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 onboarding and introductory call with Jenkins GSoC mentors and org admins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attended a couple of meetings with mentors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maintained a daily diary document to track my tasks, considerations, and questions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up the development environment, forking the plugin repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Worked on the RAG pipeline, initial user interface, and API integration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Opened and merged:
&lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin/pull/1&quot;&gt;#1&lt;/a&gt; (data collection),
&lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin/pull/3&quot;&gt;#3&lt;/a&gt; (data preprocessing),
&lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin/pull/6&quot;&gt;#6&lt;/a&gt; (chunking),
&lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin/pull/8&quot;&gt;#8&lt;/a&gt; (standardized logging).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Opened (under review):
&lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin/pull/7&quot;&gt;#7&lt;/a&gt; (user interface),
&lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin/pull/9&quot;&gt;#9&lt;/a&gt; (embedding &amp;amp; storage),
&lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin/pull/10&quot;&gt;#10&lt;/a&gt; (API integration).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Performed additional research to maximize RAG performance.&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-so-far&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-ive-learned-so-far&quot; /&gt;What I’ve Learned So Far&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first few weeks taught me a lot about working in a production-scale environment. In particular, my top three takeaways so far 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;Communicating&lt;/strong&gt; clearly and consistently, in PRs, issues, and chat discussions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thinking like a &lt;strong&gt;maintainer&lt;/strong&gt;, taking care of future supported versions, and writing clear documentation for future contributors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The importance of &lt;strong&gt;attention to details&lt;/strong&gt;, especially when handling edge cases, and producing significative, helpful logs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Without any doubts there’s still a lot to learn, but I’m happy of the progress made 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;my-gsoc-coding-period-goals&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#my-gsoc-coding-period-goals&quot; /&gt;My GSoC Coding Period Goals&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the starting point built during the bonding period, I’m going to focus on deeper development in key areas:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Maximize RAG performance, exploring searching techniques.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work on prompt engineering and apply evaluation strategies such as LLM-as-a-Judge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enhance the user interface, improving both functionality and user experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide testing coverage across frontend and backend components.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Writing contributor documentation and usage guides to facilitate community involvement.&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;Post GSoC, I plan to continue contributing to Jenkins. In particular I would love to continue improving the plugin I’m building, proposing and implementing future improvements.&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;strong&gt;Vutukuri Sreenivas&lt;/strong&gt;, &lt;strong&gt;Kris Stern&lt;/strong&gt;, &lt;strong&gt;Bervianto Leo Pratama&lt;/strong&gt;, and &lt;strong&gt;Bruno Verachten&lt;/strong&gt;— for their support and guidance. I’m especially grateful for their quick and active involvement in reviewing my pull requests, which has allowed me to move forward quickly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, a big thanks to the Jenkins org admins — &lt;strong&gt;Kris Stern&lt;/strong&gt;, &lt;strong&gt;Bruno Verachten&lt;/strong&gt;, and &lt;strong&gt;Alyssa Tong&lt;/strong&gt; — for the opportunity and for having such a welcoming, vibrant community.&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;Take a look at the plugin’s repository: &lt;a href=&quot;https://github.com/jenkinsci/resources-ai-chatbot-plugin&quot;&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;
&lt;/div&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/giovanni-vaccarino-931686258/&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/giovanni-vaccarino&quot;&gt;GitHub&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;I’m excited for the summer months ahead and to keep building with the Jenkins community!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/06/04/maeve-ho-gsoc-community-bonding-blog-post/</id>
<title>Introducing Maeve Ho – GSoC 2025 Contributor Enhancing Tekton Integration in Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-06-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/06/04/maeve-ho-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2025'></category>
<category term='jenkins'></category>
<category term='plugin'></category>
<category term='tekton'></category>
<category term='kubernetes'></category>
<category term='cicd'></category>
<summary>
Hi everyone! 👋


I&#8217;m Maeve Ho, a GSoC 2025 contributor working with the Jenkins community to enhance the Tekton Client Plugin. My project focuses on delivering full CRUD (Create, Read, Update, Delete) capabilities for Tekton resources from within Jenkins — a step forward in unifying Jenkins pipelines with Kubernetes-native CI/CD automation.


Project Description


Tekton is a powerful framework for cloud-native CI/CD, but Jenkins users currently face limitations when managing Tekton resources — only basic creation and deletion are supported. My goal is to fill that gap by implementing full lifecycle operations, enabling Jenkins to interact deeply with:




Tasks and ClusterTasks


Pipelines


PipelineRuns and TaskRuns


Triggers, TriggerBindings, 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/gsoc/jenkins-gsoc-transparent.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&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 Maeve Ho, a GSoC 2025 contributor working with the Jenkins community to enhance the &lt;strong&gt;Tekton Client Plugin&lt;/strong&gt;. My project focuses on delivering full CRUD (Create, Read, Update, Delete) capabilities for Tekton resources from within Jenkins — a step forward in unifying Jenkins pipelines with Kubernetes-native CI/CD automation.&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;Tekton is a powerful framework for cloud-native CI/CD, but Jenkins users currently face limitations when managing Tekton resources — only basic creation and deletion are supported. My goal is to fill that gap by implementing full lifecycle operations, enabling Jenkins to interact deeply with:&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;Tasks&lt;/code&gt; and &lt;code&gt;ClusterTasks&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Pipelines&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;PipelineRuns&lt;/code&gt; and &lt;code&gt;TaskRuns&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Triggers&lt;/code&gt;, &lt;code&gt;TriggerBindings&lt;/code&gt;, and &lt;code&gt;TriggerTemplates&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;These enhancements will allow teams to visualize, modify, and automate Tekton workflows directly in Jenkins, helping reduce tool fragmentation and streamline Kubernetes CI/CD adoption.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;community-bonding-period-works&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-bonding-period-works&quot; /&gt;Community Bonding Period Works&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The community bonding phase gave me a valuable opportunity to understand the ecosystem and set a strong technical foundation. I:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set up a local Jenkins + Minikube environment for full-stack plugin testing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Explored the current plugin codebase and documented its architecture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reviewed Kubernetes client methods and Tekton CRD structures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Collaborated with mentors (&lt;strong&gt;@krisstern&lt;/strong&gt;, &lt;strong&gt;@gounthar&lt;/strong&gt;, &lt;strong&gt;@waveywaves&lt;/strong&gt;) to finalize feature scope and workflow design.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Drafted a comprehensive technical plan outlining the API extensions, validation logic, and Jenkins pipeline step design.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Opened &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/pull/390&quot;&gt;#390&lt;/a&gt; to upgrade the plugin to Java 17 and Jenkins 2.492.3, resolving Maven enforcer violations, removing legacy dependencies, and verifying runtime compatibility via &lt;code&gt;mvn hpi:run&lt;/code&gt; and Jenkins UI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ran successful builds and confirmed &lt;code&gt;.hpi&lt;/code&gt; generation; currently triaging 9 failing tests and reviewing CI failures (SpotBugs, Javadoc, junit).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These early efforts ensure that the coding phase starts with clarity and purpose.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;my-gsoc-coding-period-goals&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#my-gsoc-coding-period-goals&quot; /&gt;My GSoC Coding Period Goals&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout the summer, my deliverables will include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fully functional CRUD methods for Tekton resources with type-safe model classes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read and update logic using Kubernetes API conventions (&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;PATCH&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Secure integration with Jenkins credentials for Kubernetes auth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YAML/JSON parsing and serialization support for Tekton resource specs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins pipeline steps (e.g. &lt;code&gt;tektonRead&lt;/code&gt;, &lt;code&gt;tektonUpdate&lt;/code&gt;) exposed via DSL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unit and integration tests against a local Kubernetes cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example pipelines and user documentation to guide adoption.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These improvements aim to make Jenkins a more powerful tool in Kubernetes-native CI/CD environments, where teams often rely on both Jenkins and Tekton together.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-plan&quot; /&gt;Future Plan&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After GSoC, I plan to stay active in the Jenkins community — maintaining the Tekton Client Plugin, addressing user feedback, and possibly extending the plugin with user interface features like visual task/pipeline run inspectors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m currently studying Computer Science at Lehigh University, Pennsylvania, US. My past experience includes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Deploying CI/CD pipelines with Jenkins and Kubernetes at VNPT.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Designing high-throughput data pipelines and HPC workflows using SLURM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Developing REST APIs with strong error handling and credential isolation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Building open-source projects involving AI, vector search, and caching systems.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I enjoy projects at the intersection of infrastructure, cloud-native tooling, and developer experience — and this GSoC project is the perfect fit.&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;Huge thanks to my mentors – &lt;strong&gt;@krisstern&lt;/strong&gt;, &lt;strong&gt;@gounthar&lt;/strong&gt;, and &lt;strong&gt;@waveywaves&lt;/strong&gt; – for their clear guidance, timely feedback, and thoughtful technical advice. I also appreciate the support from the Jenkins GSoC admin team and wider community for making this program welcoming and impactful.&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;I maintain a public work log documenting technical notes, progress milestones, and debugging steps throughout the project 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://hackmd.io/@GSoC25-tekton-plugin/S1qKUCuWlg&quot;&gt;HackMD Project Log&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;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://github.com/maeveho25&quot;&gt;My 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/maeve-ho/&quot;&gt;My LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;mailto:maeveho25@gmail.com&quot;&gt;My Email&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;I’m excited to keep learning and building with you all this summer!&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/06/03/birajit-saikia-gsoc-community-bonding-blog-post/</id>
<title>Meet Birajit Saikia GSoC 2025 Contributor Working on Complete Build Retooling of jenkins.io</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-06-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/06/03/birajit-saikia-gsoc-community-bonding-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2025'></category>
<category term='jenkins.io'></category>
<category term='jenkins'></category>
<category term='documentation'></category>
<category term='tools'></category>
<category term='development'></category>
<category term='ui'></category>
<summary>
Hello everyone!


I&#8217;m Birajit Saikia, and I’m thrilled to be a Google Summer of Code 2025 contributor with Jenkins. This summer, I’ll be working on the Complete Build Retooling of jenkins.io project, which focuses on modernizing and reorganizing the Jenkins documentation infrastructure and updating the tech stack with UI/UX changes.


Project Description


This project focuses on reworking and improving the Jenkins documentation system to make it more structured, modern, and easier to maintain. The documentation will be split between versioned and non-versioned formats using Antora and Gatsby, respectively. Alongside the migration, we’ll also implement improvements in SEO, metadata, site usability, and a modern...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&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 Birajit Saikia, and I’m thrilled to be a Google Summer of Code 2025 contributor with Jenkins. This summer, I’ll be working on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/projects/complete-alternative-jenkins-io-build-retooling/&quot;&gt;Complete Build Retooling of jenkins.io&lt;/a&gt; project, which focuses on modernizing and reorganizing the Jenkins documentation infrastructure and updating the tech stack with UI/UX changes.&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 focuses on reworking and improving the Jenkins documentation system to make it more structured, modern, and easier to maintain. The documentation will be split between versioned and non-versioned formats using Antora and Gatsby, respectively. Alongside the migration, we’ll also implement improvements in SEO, metadata, site usability, and a modern UI/UX built on an updated tech stack to ensure a better experience for contributors and end users alike.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;community-bonding-period-works&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-bonding-period-works&quot; /&gt;Community Bonding Period Works&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;Worked on multiple issues to improve documentation, fix broken links on jenkins.io repo.&lt;/p&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/pull/8095&quot;&gt;#8095&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/8103&quot;&gt;#8103&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/8109&quot;&gt;#8109&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/8110&quot;&gt;#8110&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/8113&quot;&gt;#8113&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/8116&quot;&gt;#8116&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/8135&quot;&gt;#8135&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/8136&quot;&gt;#8136&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/8150&quot;&gt;#8150&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/8151&quot;&gt;#8151&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Created a PR to resolve the React dependency issue: &lt;a href=&quot;https://github.com/jenkins-infra/docs.jenkins.io/pull/285&quot;&gt;#285&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initiated the process of syncing the docs.jenkins.io repository with the latest file structure and content from the jenkins.io repository to ensure consistency and up-to-date information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Had our first weekly meeting on the 20th of May.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Created a detailed task-tracking checklist in Notion based on meeting discussions and shared it with the mentors to streamline ongoing and upcoming work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Opened a GitHub issue to track metadata/SEO enhancement for docs.jenkins.io.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Part 1 &lt;a href=&quot;https://github.com/jenkins-infra/docs.jenkins.io/pull/296&quot;&gt;#296&lt;/a&gt;, part 2 &lt;a href=&quot;https://github.com/jenkins-infra/docs.jenkins.io/pull/299&quot;&gt;#299&lt;/a&gt;, part 3 &lt;a href=&quot;https://github.com/jenkins-infra/docs.jenkins.io/pull/300&quot;&gt;#300&lt;/a&gt;, part 4 &lt;a href=&quot;https://github.com/jenkins-infra/docs.jenkins.io/pull/302&quot;&gt;#302&lt;/a&gt;, and image addition part 1 &lt;a href=&quot;https://github.com/jenkins-infra/docs.jenkins.io/pull/303&quot;&gt;#303&lt;/a&gt; of updating the docs.jenkins.io are created&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Created the basic Gatsby new site repo GATSBY SITE.&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;my-gsoc-coding-period-goals&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#my-gsoc-coding-period-goals&quot; /&gt;My GSoC Coding Period Goals&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;Complete syncing of content from jenkins.io to docs.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build the new Gatsby.js site&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Define a clean separation of versioned and non-versioned documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up and test Antora and Gatsby builds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add basic SEO/meta configurations and plan long-term enhancements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make UI improvements that align with a modern developer experience&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;After GSoC, I plan to continue contributing to Jenkins, particularly around documentation, web development, and UI improvements. I’d also love to contribute as a mentor in the future and help newcomers get started with open-source just like I did. Beyond documentation, I also plan to explore more plugin development work within Jenkins as I deepen my understanding of advanced Java.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m currently a first-year B.Tech student in CSE (AI &amp;amp; ML) at Newton School of Technology, India. I started contributing to open-source through Jenkins in Nov 2024 and gradually learned the ropes of collaboration, version control, documentation systems, and web development. My interests lie in full-stack development, documentation, and developer tooling. Over time, I’ve contributed across both jenkinsci and jenkins-infra repositories.
Software development is where I see my future, and this opportunity with GSoC is a major step in that direction.&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 big thank you to my mentors - &lt;strong&gt;Kris Stern&lt;/strong&gt;, &lt;strong&gt;Bruno Verachten&lt;/strong&gt;, &lt;strong&gt;Kevin Martens&lt;/strong&gt;, and &lt;strong&gt;Rajiv Singh&lt;/strong&gt; for their guidance and encouragement. Their insights have been instrumental even in the bonding period, and I’m excited to build with their support throughout the summer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, thanks to the org admins - &lt;strong&gt;Kris Stern&lt;/strong&gt;, &lt;strong&gt;Bruno Verachten&lt;/strong&gt;, and &lt;strong&gt;Alyssa Tong&lt;/strong&gt; for giving me this wonderful opportunity to work on this project.&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;Being a part of GSoC 2025 is both an honor and a responsibility. It’s not just about writing code; it’s about learning, collaborating, and contributing to something that benefits developers worldwide. I’m eager to grow through this journey and give back to the Jenkins community in every way I can. This is just the beginning, and I’m looking forward to the challenges and learning that lie 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;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/biru-codeastromer/My-GSoC-Jenkins-2025&quot;&gt;My GSoC 2025 GitHub Repo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/birajit-saikia-08125030a/&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/biru-codeastromer&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/birajit_dev&quot;&gt;Twitter&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 a productive summer with the Jenkins community!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to reach out to me via the Jenkins GSoC Gitter channel (@biru-codeastromer:gitter.im) or on the Jenkins Discourse forum (@biru-codeastromer).&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/05/22/jenkins-on-android/</id>
<title>Android and Jenkins: What Is the Limit? Part Two.</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-05-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/05/22/jenkins-on-android/" />
<category term='jenkins'></category>
<category term='android'></category>
<category term='aarch64'></category>
<category term='termux'></category>
<summary>
I know it&#8217;s been over two years since the first article of this series, but hey, life happens!
I&#8217;ve been juggling quite a few things that are more important for the Jenkins project.
Let&#8217;s face it, nobody&#8217;s losing sleep over running Jenkins on Android.
But hey, sometimes you just gotta indulge in a bit of tech whimsy, am I right?


So, here we are, diving back into this almost frivolous experiment to see just how far we can push the Jenkins-Android interaction.
There are essentially two ways to stretch the boundaries with Jenkins and Android:




Building Android apps with Jenkins


Running Jenkins on an Android device




Now, the...
</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/2025/05/22/2025-05-22-jenkins-on-android/love-part-2-16-9.png&quot; alt=&quot;jenkins hugging bugdroid&quot; width=&quot;500&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I know it’s been over two years since &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/30/android-and-jenkins/&quot;&gt;the first article&lt;/a&gt; of this series, but hey, life happens!
I’ve been juggling quite a few things that are more important for the Jenkins project.
Let’s face it, nobody’s losing sleep over running Jenkins on Android.
But hey, sometimes you just gotta indulge in a bit of tech whimsy, am I right?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, here we are, diving back into this almost frivolous experiment to see just how far we can push the Jenkins-Android interaction.
There are essentially two ways to stretch the boundaries with Jenkins and Android:&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;Building Android apps with Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Running Jenkins on an Android device&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, the first option has already had its moment in the spotlight in another series of articles, so we’re turning our attention to the latter.
Why, you might ask?
Well, because why not? Because we’re tech enthusiasts, and if there’s a crazy idea floating around, we’re going to give it a try!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;setting-up-a-jenkins-controller-on-android&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-up-a-jenkins-controller-on-android&quot; /&gt;Setting up a Jenkins controller on Android&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/30/android-and-jenkins/&quot;&gt;the previous article&lt;/a&gt;, we already laid the groundwork for running a Jenkins agent on Android.
We installed &lt;a href=&quot;https://wiki.termux.com/&quot;&gt;Termux&lt;/a&gt;, &lt;a href=&quot;https://www.openssh.com/&quot;&gt;OpenSSH&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/30/android-and-jenkins/#installing-java-on-termux&quot;&gt;Java&lt;/a&gt; on the Android device, and confirmed that the agent could be reached from a grown-up Jenkins controller.
We even got it to run a FreeStyle pipeline that spat out the result of the &lt;code&gt;uname -a&lt;/code&gt; command.&lt;br&gt;
Quite the achievement, huh?&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this experiment, we’re sticking with my old Redmi Note 7, still chugging along with Android 10.
Now, keep in mind, this device got benched because it couldn’t keep up with my daily pace, so it’s not exactly a powerhouse for Jenkins.
Sure, I could’ve slapped Linux on it instead, but where’s the fun in taking the easy route, right?
Let’s see if we can kickstart a Jenkins controller on this bad boy!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;launching-the-controller-via-java-command&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#launching-the-controller-via-java-command&quot; /&gt;Launching the controller via Java command&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, I’ve dabbled with memory-constrained devices before, and I know a Jenkins controller can work with a measly 1GB of RAM.
I have no clue how much of that sweet memory pie the Android system will serve up to Termux, or how much Termux will pass along to the JVM, but hey, let’s roll the dice!
When I SSH in from my PC, here’s what I see:&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;☎  Jenkins@localhost:~ &lt;span class=&quot;nv&quot;&gt;$free&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-h&lt;/span&gt;
               total        used        free      shared  buff/cache   available
Mem:           3.6Gi       2.1Gi        80Mi       3.0Mi       1.5Gi       1.3Gi
Swap:          2.2Gi       1.6Gi       623Mi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looks like we’re sitting on a cozy 3.6GB of RAM, which should be just about enough to wrangle a Jenkins controller into submission.
Let’s fire it up using the trusty &lt;code&gt;jenkins.war&lt;/code&gt; file, the lazy dev’s best friend!&lt;br&gt;
But first, a quick pit stop to grab the &lt;a href=&quot;https://get.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest LTS version of Jenkins&lt;/a&gt;.&lt;br&gt;
&lt;a href=&quot;https://www.jenkins.io/download/#downloading-jenkins&quot;&gt;The official documentation&lt;/a&gt; says it’s &lt;code&gt;2.504.1&lt;/code&gt; at the time of writing, but, you know, details.&lt;/br&gt;
&lt;/br&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;pkg &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;curl&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, with our newfound love for curl, let’s snag that &lt;code&gt;jenkins.war&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;bash&quot;&gt;curl &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; https://get.jenkins.io/war-stable/latest/jenkins.war&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next step is to grab a newer version of Java, as things have changed quite a lot since our first experiment!&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;pkg &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;fontconfig freetype openjdk-21 ttf-dejavu&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Installing fonts with your JDK may feel like inviting a violinist to a rock concert — but Jenkins insists.
Without them, it simply refuses to show up.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the file safely in our grasp, it’s showtime!
Let’s unleash Jenkins upon this unsuspecting Android device:&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;java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; jenkins.war&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The familiar lines start flowing:&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;☎  Jenkins@localhost:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; jenkins.war
Running from: /data/data/com.termux/files/home/jenkins.war
webroot: /data/data/com.termux/files/home/.jenkins/war
2025-05-20 20:09:14.289+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    winstone.Logger#logInternal: Beginning extraction from war file
2025-05-20 20:09:16.517+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     WARNING o.e.j.ee9.nested.ContextHandler#setContextPath: Empty contextPath
2025-05-20 20:09:16.697+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    org.eclipse.jetty.server.Server#doStart: jetty-12.0.19&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; built: 2025-04-01T13:28:40.005Z&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; git: 23436cd577b4238238eb192683dfc2b1476c6b87&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; jvm 21.0.7
2025-05-20 20:09:18.588+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    o.e.j.e.w.StandardDescriptorProcessor#visitServlet: NO JSP Support &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; /, did not find org.eclipse.jetty.ee9.jsp.JettyJspServlet
2025-05-20 20:09:18.752+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    o.e.j.s.DefaultSessionIdManager#doStart: Session &lt;span class=&quot;nv&quot;&gt;workerName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;node0
2025-05-20 20:09:20.372+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    hudson.WebAppMain#contextInitialized: Jenkins home directory: /data/data/com.termux/files/home/.jenkins found at: &lt;span class=&quot;nv&quot;&gt;$user&lt;/span&gt;.home/.jenkins
2025-05-20 20:09:21.099+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    o.e.j.s.handler.ContextHandler#doStart: Started oeje9n.ContextHandler&lt;span class=&quot;nv&quot;&gt;$CoreContextHandler&lt;/span&gt;@1ff55ff&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;Jenkins v2.504.1,/,b&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;file:///data/data/com.termux/files/home/.jenkins/war/,a&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;AVAILABLE,h&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;oeje9n.ContextHandler&lt;span class=&quot;nv&quot;&gt;$CoreContextHandler$CoreToNestedHandler&lt;/span&gt;@351f2244&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;STARTED&lt;span class=&quot;o&quot;&gt;}}&lt;/span&gt;
2025-05-20 20:09:21.133+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    o.e.j.server.AbstractConnector#doStart: Started ServerConnector@38a1a26&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;HTTP/1.1, &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;http/1.1&lt;span class=&quot;o&quot;&gt;)}{&lt;/span&gt;0.0.0.0:8080&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
2025-05-20 20:09:21.185+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    org.eclipse.jetty.server.Server#doStart: Started oejs.Server@3b0c9195&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;STARTING&lt;span class=&quot;o&quot;&gt;}[&lt;/span&gt;12.0.19,sto&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0] @9778ms
2025-05-20 20:09:21.189+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;37]    INFO    winstone.Logger#logInternal: Winstone Servlet Engine running: &lt;span class=&quot;nv&quot;&gt;controlPort&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;disabled
2025-05-20 20:09:21.632+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;36]    INFO    jenkins.model.Jenkins#&amp;lt;init&amp;gt;: Starting version 2.504.1
2025-05-20 20:09:22.307+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;45]    INFO    jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Started initialization&lt;/span&gt;
2025-05-20 20:09:22.408+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;52]    INFO    jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Listed all plugins&lt;/span&gt;
2025-05-20 20:09:25.596+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;52]    INFO    jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Prepared all plugins&lt;/span&gt;
2025-05-20 20:09:25.612+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;52]    INFO    jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Started all plugins&lt;/span&gt;
2025-05-20 20:09:25.622+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;45]    INFO    jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Augmented all extensions&lt;/span&gt;
2025-05-20 20:09:26.201+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;49]    INFO    jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: System config loaded&lt;/span&gt;
2025-05-20 20:09:26.204+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;56]    INFO    jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: System config adapted&lt;/span&gt;
2025-05-20 20:09:26.207+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;56]    INFO    jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Loaded all jobs&lt;/span&gt;
2025-05-20 20:09:26.215+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;48]    INFO    jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Configuration for all jobs updated&lt;/span&gt;
2025-05-20 20:09:26.312+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;72]    INFO    hudson.util.Retrier#start: Attempt &lt;span class=&quot;c&quot;&gt;#1 to do the action check updates server&lt;/span&gt;
2025-05-20 20:09:27.062+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;54]    INFO    jenkins.install.SetupWizard#init:

&lt;span class=&quot;k&quot;&gt;*************************************************************&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;*************************************************************&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;*************************************************************&lt;/span&gt;

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

a20b27ff6f684fa3bdf05d909e0bf1e4

This may also be found at: /data/data/com.termux/files/home/.jenkins/secrets/initialAdminPassword

&lt;span class=&quot;k&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 web page is also looking familiar, except for the path where the password is stored:&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/2025/05/22/2025-05-22-jenkins-on-android/unlock-jenkins.png&quot; alt=&quot;standard first Jenkins screen&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All seems well, until Jenkins throws a tantrum about the absence of a &lt;code&gt;/tmp&lt;/code&gt; dir:&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;/tmp does not exist.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins throws a fit when it can’t find &lt;code&gt;/tmp&lt;/code&gt;.
We’ll avoid the drama by setting &lt;code&gt;$PREFIX/tmp&lt;/code&gt; as its temp playground later on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Minor hiccup aside, the installation chugs along smoothly, and the default plugins find their cozy little corner.&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/2025/05/22/2025-05-22-jenkins-on-android/plugins-install.png&quot; alt=&quot;standard plugins install&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The journey nears its end, punctuated by the customary security warning about the use of the built-in node.
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/05/22/2025-05-22-jenkins-on-android/security-issue.png&quot; alt=&quot;standard security warning&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nothing to do with Termux, but we’ll iron out the kinks later.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll want to show off a bit later, so let’s get the &lt;a href=&quot;https://plugins.jenkins.io/platformlabeler&quot;&gt;Platform Labeler&lt;/a&gt; plugin ready.
Go to &quot;&lt;em&gt;Manage Jenkins&lt;/em&gt;&quot; &amp;gt; &quot;&lt;em&gt;Plugins&lt;/em&gt;&quot; &amp;gt; &quot;&lt;em&gt;Available Plugins&lt;/em&gt;&quot;, search for it, check the box, and select the blue &quot;Install&quot; button. Yes, it’s that easy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now go back to your console, and &lt;kbd&gt;Ctrl+C&lt;/kbd&gt; so you firmly ask Jenkins to shut down.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quite the milestone, huh?&lt;br&gt;
We’ve proven that we can kickstart a Jenkins controller using Termux on an Android device.&lt;br&gt;
But hold onto your hats, folks!
We’re not done just yet.&lt;br&gt;
Next up, we’ll ensure this Jenkins controller can strut its stuff as a service, and then, we’ll tweak it to kick off automatically at boot time.&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-is-a-service-and-why-do-we-need-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-a-service-and-why-do-we-need-it&quot; /&gt;What is a service, and why do we need it?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, we could just let Jenkins lurk in the shadows, but where’s the fun in that?
What if Android decides to play the ultimate prank and terminate Termux, or the device throws a fit and decides to reboot?
We’d be stuck manually resurrecting Jenkins every single time, and that’s just not the cricket we signed up for.&lt;br&gt;
So, let’s give Jenkins a promotion, shall we? Time to turn it into a proper service!&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The standard Jenkins installation &lt;a href=&quot;https://www.jenkins.io/blog/2022/03/25/systemd-migration/&quot;&gt;migrated from &lt;code&gt;init&lt;/code&gt; to &lt;code&gt;systemd&lt;/code&gt;&lt;/a&gt; a while back.
Unfortunately, Termux isn’t in on the &lt;code&gt;systemd&lt;/code&gt; party, so we’ll have to make do with the tools it offers.&lt;br&gt;
Enter &lt;a href=&quot;https://wiki.termux.com/wiki/Termux-services&quot;&gt;termux-services&lt;/a&gt;, a handy collection of scripts for service wrangling.&lt;br&gt;
Instead of cluttering up &lt;code&gt;~/.bashrc&lt;/code&gt; or &lt;code&gt;~/.bash_profile&lt;/code&gt;, we can now start and stop services with a flick of the wrist, thanks to termux-services.&lt;br&gt;
There’s already a smorgasbord of existing services ready to roll, and just like with &lt;code&gt;systemd&lt;/code&gt;, there’s nothing stopping us from crafting a bespoke service for our beloved Jenkins.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To get termux-services up and running, execute:&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;pkg &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;termux-services runit
service-daemon start&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, give Termux a gentle nudge so that the service-daemon springs to life.&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;exit&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;Next up, to unleash the power of a service, fire off:&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;sv-enable &amp;lt;service&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re in the mood for a one-off joyride, a simple:&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;sv up &amp;lt;service&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;will suffice.&lt;br&gt;
And when it’s time to hit the brakes, just tap into your inner traffic cop with:&lt;/br&gt;
&lt;/p&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;sv down &amp;lt;service&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or, if you’re feeling particularly ruthless, disable it altogether:&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;sv-disable &amp;lt;service&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A service is like a restless spirit shackled to this mortal realm if &lt;code&gt;$PREFIX/var/service/&amp;lt;service&amp;gt;/down&lt;/code&gt; exists, so the &lt;code&gt;sv-enable&lt;/code&gt; and &lt;code&gt;sv-disable&lt;/code&gt; scripts play a little game of touch-and-go with this file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under the hood, termux-services taps into the mighty &lt;a href=&quot;http://smarden.org/runit/&quot;&gt;runit&lt;/a&gt; to reign in the chaos of services.&lt;br&gt;
You’ll find a treasure trove of example scripts on the &lt;a href=&quot;http://smarden.org/runit/runscripts.html&quot;&gt;runit website&lt;/a&gt;.&lt;br&gt;
If you spot a script you fancy, or if you’re feeling particularly creative, just follow these steps:&lt;/br&gt;
&lt;/br&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;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$PREFIX&lt;/span&gt;/var/service/&amp;lt;PKG&amp;gt;/log
&lt;span class=&quot;nb&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-sf&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$PREFIX&lt;/span&gt;/share/termux-services/svlogger &lt;span class=&quot;nv&quot;&gt;$PREFIX&lt;/span&gt;/var/service/&amp;lt;PKG&amp;gt;/log/run&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, tuck your run script snugly into &lt;code&gt;$PREFIX/var/service/&amp;lt;PKG&amp;gt;/run&lt;/code&gt;, making sure it’s ready for its close-up.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can then run&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;sv up &amp;lt;PKG&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;to breathe life into your creation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The log files for these services bask in the limelight at &lt;code&gt;$PREFIX/var/log/sv/&amp;lt;PKG&amp;gt;/&lt;/code&gt;, with the star of the show bearing the name &quot;current&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;turning-jenkins-into-a-service-for-smooth-sailing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#turning-jenkins-into-a-service-for-smooth-sailing&quot; /&gt;Turning Jenkins into a service for smooth sailing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that we’ve mastered the art of creating and deploying services with Termux, let’s give our Jenkins controller a promotion.&lt;br&gt;
First up, we need to whip up a script to kickstart Jenkins as a service.
Let’s call it &lt;code&gt;run&lt;/code&gt; and tuck it snugly into the &lt;code&gt;$PREFIX/var/service/jenkins/&lt;/code&gt; directory.&lt;/br&gt;
&lt;/p&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;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$PREFIX&lt;/span&gt;/var/service/jenkins
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$PREFIX&lt;/span&gt;/var/service/jenkins
&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; run &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;EOF&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;
#!&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PREFIX&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;/usr/bin/bash
JENKINS_LOG=/data/data/com.termux/files/home/.jenkins/logs/jenkins.log
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PREFIX&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;/usr/bin/java -Djava.io.tmpdir=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PREFIX&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;/tmp -jar &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;/jenkins.war --logfile=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JENKINS_LOG&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;EOF
&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;chmod&lt;/span&gt; +x run
&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.jenkins/logs
&lt;span class=&quot;nb&quot;&gt;touch&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.jenkins/logs/jenkins.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With our script ready, let’s test if Jenkins plays nice as a service:&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;sv-enable jenkins
sv up jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Time to peek under the hood and see if Jenkins is revving up by checking the logs:&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;tail&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.jenkins/logs/jenkins.log&amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voilà! Standard Jenkins logs, just like we’re accustomed to seeing on a run-of-the-mill server.&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;2025-05-18 14:13:27.380+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
2025-05-18 14:13:27.446+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    org.eclipse.jetty.server.Server#doStart: jetty-10.0.20&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; built: 2024-01-29T20:46:45.278Z&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; git: 3a745c71c23682146f262b99f4ddc4c1bc41630c&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; jvm 17-internal+0-adhoc..src
2025-05-18 14:13:27.727+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2025-05-18 14:13:27.780+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    o.e.j.s.s.DefaultSessionIdManager#doStart: Session &lt;span class=&quot;nv&quot;&gt;workerName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;node0
2025-05-18 14:13:28.355+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    hudson.WebAppMain#contextInitialized: Jenkins home directory: /data/data/com.termux/files/home/.jenkins found at: &lt;span class=&quot;nv&quot;&gt;$user&lt;/span&gt;.home/.jenkins
2025-05-18 14:13:28.524+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    o.e.j.s.handler.ContextHandler#doStart: Started w.@216914&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;Jenkins v2.504.1,/,file:///data/data/com.termux/files/home/.jenkins/war/,AVAILABLE&lt;span class=&quot;o&quot;&gt;}{&lt;/span&gt;/data/data/com.termux/files/home/.jenkins/war&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
2025-05-18 14:13:28.538+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    o.e.j.server.AbstractConnector#doStart: Started ServerConnector@395b56bb&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;HTTP/1.1, &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;http/1.1&lt;span class=&quot;o&quot;&gt;)}{&lt;/span&gt;0.0.0.0:8080&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
2025-05-18 14:13:28.570+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    org.eclipse.jetty.server.Server#doStart: Started Server@13f17eb4&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;STARTING&lt;span class=&quot;o&quot;&gt;}[&lt;/span&gt;10.0.20,sto&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0] @2771ms&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Jenkins now up and about, you can access it at the port 8080 on your trusty Android device.
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/05/22/2025-05-22-jenkins-on-android/jenkins-home.png&quot; alt=&quot;standard Jenkins home page&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;ensuring-availability-from-boot-for-uninterrupted-service&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ensuring-availability-from-boot-for-uninterrupted-service&quot; /&gt;Ensuring availability from boot for uninterrupted service&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve hit two major milestones:&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;Getting a Jenkins controller up and running on an Android device.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Successfully running Jenkins as a service on the Android device whenever we fire up Termux.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pretty cool, right?&lt;br&gt;
But what if the device decides to throw a curveball and reboots?
I know, this whole experiment is just a tech whimsy, but let’s push the boundaries and see how far we can take it.
Frankly, even if I’m just treating this as a fun experiment, I’d rather not deal with the hassle of launching Termux every time I reboot the device.&lt;br&gt;
So what’s the logical next step?
Adding the Jenkins service to the roster of auto-starting services when the device boots up.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;installation-of-termuxboot&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installation-of-termuxboot&quot; /&gt;Installation of Termux:Boot&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First things first, let’s get our hands on the Termux:Boot add-on from &lt;a href=&quot;https://f-droid.org/packages/com.termux.boot/&quot;&gt;F-Droid&lt;/a&gt;.
Important note: Keep your installations of Termux and add-ons strictly from one source, either Google Play or F-Droid.
Mixing them up can lead to compatibility issues due to different key-signing methods.&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;Install the Termux:Boot app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Head over to your Android settings and give Termux and Termux:Boot the green light by turning off battery optimizations for these apps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Give the Termux:Boot app a friendly tap to start it up.
This ensures it gets the memo to kick into action at boot time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ready for some directory magic?
Let’s create the &lt;code&gt;~/.termux/boot/&lt;/code&gt; directory: This is where you’ll stash all the scripts you want to fire up on boot.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;mkdir -p ~/.termux/boot/&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve got a bunch of scripts, fear not — they’ll line up and execute in a nice, orderly fashion.
&lt;strong&gt;Pro tip&lt;/strong&gt;: Keep your device wide awake by running &lt;code&gt;termux-wake-lock&lt;/code&gt; right off the bat.
For example, to kickstart an sshd server and keep your device bright-eyed and bushy-tailed at boot, craft a little script like this one at &lt;code&gt;~/.termux/boot/start-sshd&lt;/code&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;c&quot;&gt;#!/data/data/com.termux/files/usr/bin/sh&lt;/span&gt;
termux-wake-lock
sshd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t you forget to make it executable:&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;chmod &lt;/span&gt;755 ~/.termux/boot/start-sshd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And if you’re itching to have Termux-services do their thing at boot time, simply throw in:&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;c&quot;&gt;#!/data/data/com.termux/files/usr/bin/sh&lt;/span&gt;
termux-wake-lock
&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$PREFIX&lt;/span&gt;/etc/profile&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This nifty snippet will unleash all the services that are raring to go in termux-services.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;adding-jenkins-to-the-list-of-services-that-start-automatically&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adding-jenkins-to-the-list-of-services-that-start-automatically&quot; /&gt;Adding Jenkins to the list of services that start automatically&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, let’s add Jenkins to the list of services that start automatically when the device boots up.
Craft a script named &lt;code&gt;~/.termux/boot/start-jenkins&lt;/code&gt; and give it the following content:&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;c&quot;&gt;#!/data/data/com.termux/files/usr/bin/sh&lt;/span&gt;
termux-wake-lock
sv up jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Without &lt;code&gt;chmod +x&lt;/code&gt;, your &lt;code&gt;start-jenkins&lt;/code&gt; script is just a very well-written suggestion.
Run it, or Jenkins won’t be there when you reboot.&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;chmod &lt;/span&gt;755 &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.termux/boot/start-jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And there you have it!
Jenkins is now part of the elite club of services that kick off automatically when the device boots up.
Now, you can rest easy knowing that your Jenkins controller will be up and running, ready to tackle any task you throw its way.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;checking-jenkins-boot-up-performance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#checking-jenkins-boot-up-performance&quot; /&gt;Checking Jenkins&#39; boot-up performance&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To ensure that Jenkins is indeed strutting its stuff when the device boots up, let’s put it to the test — give that device a good old reboot.&lt;br&gt;
But before you hit that restart button, make sure you’ve given termux-boot a hearty handshake at least once and sorted out all the necessary permissions.&lt;br&gt;
That means letting it run in the background and disabling battery optimization.
And if you’re rocking a phone with MIUI, well, hold onto your hats — you might need to do a little extra dance to get things grooving smoothly.&lt;br&gt;
Head on over to the settings, and summon the magic word &quot;background&quot;.
Hunt down an item called &quot;Background autostart&quot; and flip the switch for termux-boot and termux.&lt;br&gt;
Et voilà! You’ve just unleashed the boot-time prowess of termux on MIUI.&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;adding-a-jenkins-agent-on-android&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adding-a-jenkins-agent-on-android&quot; /&gt;Adding a Jenkins agent on Android&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, Jenkins on Android is strutting its stuff, but it’s throwing a fit about missing its sidekick, the agent.
Can’t have Jenkins sulking; let’s get that agent up and running on Android, shall we?
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/05/22/2025-05-22-jenkins-on-android/jenkins-complaining.png&quot; alt=&quot;Jenkins complaining about the absence of an agent&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;establishing-ssh-connection-for-agent-integration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#establishing-ssh-connection-for-agent-integration&quot; /&gt;Establishing SSH connection for agent integration.&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remember when we &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/30/android-and-jenkins/#setting-up-public-key-authentication&quot;&gt;conjured up an SSH key pair&lt;/a&gt; for our Android device?
Well, we’re going to do it again for the agent.
Time to add the public key to the &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; file on the Android device.&lt;br&gt;
Get ready to unleash some command-line magic:&lt;/br&gt;
&lt;/p&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;☎  Jenkins@localhost:~ &lt;span class=&quot;nv&quot;&gt;$ssh&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-keygen&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; rsa &lt;span class=&quot;nt&quot;&gt;-b&lt;/span&gt; 4096 &lt;span class=&quot;nt&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;jenkins-agent&quot;&lt;/span&gt;
Enter file &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;which to save the key &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;/data/data/com.termux/files/home/.ssh/id_rsa&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;:
Enter passphrase &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;empty &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;no passphrase&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;:
Enter same passphrase again:
Your identification has been saved &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; /data/data/com.termux/files/home/.ssh/id_rsa
Your public key has been saved &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; /data/data/com.termux/files/home/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:rpaD/RohRXJsXAYTOahQWpIsih9vhzgl7G9PO23MujI jenkins-agent
The key&lt;span class=&quot;s1&quot;&gt;&#39;s randomart image is:
+---[RSA 4096]----+
|ooo .+*=o        |
|+=  .+*o         |
|=o . ...         |
|o = ..           |
| o *... S        |
|  = +..o         |
|   + +o=.        |
|    E.*+=        |
|   . =BO.        |
+----[SHA256]-----+
☎  Jenkins@localhost:~ $cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCb+j8eUrnWLh4DWSY8C9t5iNa9AtcIn2oShDUi4ATLKcyPINAmCcDVw19uzhFd+J836iKEFScx9Qw7zuv9iNWEjxEERXyFHXt8A9lMf78aeK4dvDei60JEN5+28YO7ctlQ39+wzHXIMtrFiBTeIFpIjPqM1EskKqTq8ySty+TrozCySXnFgbceP9NN+KZSzqyoYpjgMgYVtUTMSbnggFuWxfQms9a7tBLqv2GJzLoYJnWajXtrRokctQ/JyRFCZND7zhCF4cjyoI505tRgBUp7E3KV7CYiETV+7gQ92dV7K9Lf0u0OVQ== jenkins-agent&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;To add the generated public key to the authorized keys file, we can use the &lt;code&gt;cat&lt;/code&gt; command to append the public key to the &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; file.
Here’s how we can do 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;nb&quot;&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This command will add the contents of the &lt;code&gt;id_rsa.pub&lt;/code&gt; file (which is our public key) to the &lt;code&gt;authorized_keys&lt;/code&gt; file.
If the &lt;code&gt;authorized_keys&lt;/code&gt; file doesn’t exist, no worries – it’ll be conjured into existence for us.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, before we get too carried away with our newfound access, let’s ensure our digital fortress is properly fortified.
The &lt;code&gt;~/.ssh&lt;/code&gt; directory should flaunt permissions worthy of a royal decree: &lt;code&gt;700 (drwx------)&lt;/code&gt;.
Meanwhile, the &lt;code&gt;authorized_keys&lt;/code&gt; file should be wrapped in the impenetrable cloak of &lt;code&gt;600 (-rw-------)&lt;/code&gt; permissions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re feeling particularly wizardly, you can set these permissions using the &lt;code&gt;chmod&lt;/code&gt; 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;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;700 ~/.ssh
&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;600 ~/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s infuse this with a touch of levity:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re still getting the password runaround when attempting to connect, there’s a chance our SSH server isn’t keen on our public key party trick.&lt;br&gt;
Time to play detective!
Navigate to the &lt;code&gt;$PREFIX/etc/ssh/sshd_config&lt;/code&gt; file and make sure it hasn’t ghosted us.
Look for a line that reads like the magic incantation we need:&lt;/br&gt;
&lt;/p&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;PubkeyAuthentication &lt;span class=&quot;nb&quot;&gt;yes&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;If you’ve been tinkering with the &lt;code&gt;sshd_config&lt;/code&gt; file, remember to give the SSH service a friendly nudge to let it know about the changes.
Now that we’ve got the key to the kingdom, it’s time to set up a VIP pass for Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Take a stroll over to the Jenkins controller and swing by &quot;&lt;em&gt;Manage Jenkins&lt;/em&gt;&quot; &amp;gt; &quot;&lt;em&gt;Credentials&lt;/em&gt;&quot; &amp;gt; &quot;&lt;em&gt;System&lt;/em&gt;&quot;.
Next, hover over &quot;&lt;em&gt;Global credentials (unrestricted)&lt;/em&gt;&quot; like a champ, select the down arrow, and select &quot;&lt;em&gt;Add Credentials&lt;/em&gt;&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, choose &quot;&lt;em&gt;SSH Username with private key&lt;/em&gt;&quot; as the type of credential, and let’s fill in the details:&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;&lt;em&gt;Username&lt;/em&gt;: &lt;code&gt;&amp;lt;your termux user name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Private Key&lt;/em&gt;: &lt;em&gt;Enter directly&lt;/em&gt;, and paste the content of the private key file &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Passphrase&lt;/em&gt;: Leave it empty.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;ID&lt;/em&gt;: &lt;code&gt;jenkins-agent&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Description&lt;/em&gt;: &lt;code&gt;Jenkins Agent SSH Key&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Select the white on blue &quot;&lt;em&gt;Create&lt;/em&gt;&quot; button, and voilà!
You should now be the proud owner of a brand spanking new credential named &quot;jenkins-agent&quot;.
Jenkins is now armed with this secret handshake to chat with the Android device (which, let’s be honest, is basically chatting with itself).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configuring-the-agent-to-communicate-with-the-controller&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuring-the-agent-to-communicate-with-the-controller&quot; /&gt;Configuring the agent to communicate with the controller&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alright, back in the driver’s seat at &quot;&lt;em&gt;Manage Jenkins&lt;/em&gt;&quot;, let’s give that shiny blue &quot;&lt;em&gt;Set up agent&lt;/em&gt;&quot; button a good ol&#39; click and dive into the adventure!&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/2025/05/22/2025-05-22-jenkins-on-android/jenkins-complaining.png&quot; alt=&quot;Jenkins complaining about the absence of an agent&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Time to give our agent a name – I went with &lt;code&gt;Myself&lt;/code&gt; because, well, it’s cozy in here with the Android machine.
Select &quot;&lt;em&gt;Permanent Agent&lt;/em&gt;&quot; as the mode.
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/05/22/2025-05-22-jenkins-on-android/set-up-agent.png&quot; alt=&quot;Jenkins asking to set up an agent&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, hit &quot;&lt;em&gt;Create&lt;/em&gt;&quot;. You should now see a gazillion fields to fill in.
For the description, I went with something like &lt;code&gt;The smartphone itself&lt;/code&gt; because, why not?
For the number of executors, I settled on &lt;code&gt;1&lt;/code&gt;, but feel free to tweak it based on your machine’s prowess.&lt;br&gt;
The remote root directory is set to &lt;code&gt;/data/data/com.termux/files/home&lt;/code&gt; – that’s our agent’s humble abode, the Termux user’s home turf.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As for labels, I went with &lt;code&gt;aarch64, android&lt;/code&gt; – gotta give our Android buddy some identity, right?
And for usage, let’s go with &quot;&lt;em&gt;Use this node as much as possible&lt;/em&gt;&quot; – it’s eager to help!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, for the grand finale, choose &quot;&lt;em&gt;Launch agent via SSH&lt;/em&gt;&quot; as the launch method.&lt;br&gt;
Host?&lt;br&gt;
Oh, just good ol&#39; &lt;code&gt;localhost&lt;/code&gt;, and for credentials, select our trusty &lt;code&gt;jenkins-agent&lt;/code&gt; from earlier.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Oh, but wait!
Before we select that final &quot;&lt;em&gt;Save&lt;/em&gt;&quot; button, we’re diving into the &quot;&lt;em&gt;Advanced&lt;/em&gt;&quot; settings because, well, we’re adventurers!
Change the port to &lt;code&gt;8022&lt;/code&gt; and remember to update the &quot;&lt;em&gt;JavaPath&lt;/em&gt;&quot; to &lt;code&gt;/data/data/com.termux/files/usr/bin/java&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, sprinkle in some digits – &lt;code&gt;60&lt;/code&gt; for &quot;&lt;em&gt;Connection Timeout in Seconds&lt;/em&gt;&quot;, &lt;code&gt;10&lt;/code&gt; for &quot;&lt;em&gt;Maximum Number of Retries&lt;/em&gt;&quot;, and &lt;code&gt;10&lt;/code&gt; for &quot;&lt;em&gt;Seconds To Wait Between Retries&lt;/em&gt;&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, with a dramatic flourish, select &quot;&lt;em&gt;Save&lt;/em&gt;&quot; and let the magic unfold!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a bit of anticipation, select &quot;&lt;em&gt;Nodes&lt;/em&gt;&quot; on the left, select &quot;&lt;em&gt;Myself&lt;/em&gt;&quot;, and give that &quot;&lt;em&gt;Log&lt;/em&gt;&quot; button a tap and voilà!
You should see something like 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;bash&quot;&gt;Remoting version: 3301.v4363ddcca_4e7
Launcher: SSHLauncher
Communication Protocol: Standard &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt;/out
This is a Unix agent
Agent successfully connected and online&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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/2025/05/22/2025-05-22-jenkins-on-android/agent-connected.png&quot; alt=&quot;Jenkins agent connected&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, the agent is connected, despite being on the same machine as the controller and running on top of Android.&lt;br&gt;
Now, you can use this agent to run your builds on the Android device itself.
But…​ there is still a problem with our configuration and we have some ameliorations to make.&lt;br&gt;
On the top right, you can still see a red warning:&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building on the built-in node can be a security issue. You should set the number of executors on the built-in node to 0.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll have to address this issue.&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cleaning-up-the-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cleaning-up-the-configuration&quot; /&gt;Cleaning up the configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alright, time to tackle that pesky security issue!
Hop on over to &quot;&lt;em&gt;Manage Jenkins&lt;/em&gt;&quot; &amp;gt; &quot;&lt;em&gt;Nodes&lt;/em&gt;&quot;, and give a friendly selection to &quot;&lt;em&gt;Built-in Node&lt;/em&gt;&quot;.&lt;br&gt;
Once there, mosey on over to the left and hit up &quot;&lt;em&gt;Configure&lt;/em&gt;&quot;. Now, set the number of executors to a solid &lt;code&gt;0&lt;/code&gt;.
Then, seal the deal with a satisfying selection of &quot;&lt;em&gt;Save&lt;/em&gt;&quot;.&lt;br&gt;
Voilà! Watch that red warning vanish into thin air like it’s pulling a magic act!
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/05/22/2025-05-22-jenkins-on-android/no-more-warning.png&quot; alt=&quot;No more warning about the built-in node&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve officially squashed that security bug and are all set to strut our stuff with our agent, free from any worries.&lt;/p&gt;
&lt;/div&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;creating-a-pipeline-from-a-github-repo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-a-pipeline-from-a-github-repo&quot; /&gt;Creating a Pipeline from a GitHub repo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that Jenkins is up and running, let’s make it earn its keep.
Think of Jenkins as your no-nonsense assistant — not much for small talk, but always ready to fetch your code and run your builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re going to create a new pipeline job via the classic UI, connect it to a GitHub repo, and have Jenkins fetch and build your code whenever you push changes.
Automation magic?
Absolutely.
Sorcery?
Maybe just a little.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;installing-the-necessary-prerequisites&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installing-the-necessary-prerequisites&quot; /&gt;Installing the necessary prerequisites&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Your butler won’t lift a finger until the pantry is stocked.
Let’s install the bare essentials:&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;pkg &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;git maven&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;setting-up-the-jenkins-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-up-the-jenkins-pipeline&quot; /&gt;Setting Up the Jenkins Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s convince Jenkins to do our bidding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the dashboard:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;em&gt;New Item&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Name it something like &lt;code&gt;my-awesome-pipeline&lt;/code&gt; (creativity optional)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;em&gt;Pipeline&lt;/em&gt; as the type&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;em&gt;OK&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now scroll to the &lt;em&gt;Pipeline&lt;/em&gt; section and decide your scripting fate: &lt;em&gt;Inline script&lt;/em&gt;, or &lt;em&gt;Jenkinsfile from SCM&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;option-1-inline-scripted-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#option-1-inline-scripted-pipeline&quot; /&gt;Option 1: Inline (Scripted) Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Need quick results?
Choose &lt;em&gt;Pipeline script&lt;/em&gt; from the &lt;em&gt;Definition&lt;/em&gt; dropdown and paste something like 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;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;Hello&#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;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Hello from Jenkins!&#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 class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hit &lt;strong&gt;Save&lt;/strong&gt;, then &lt;strong&gt;Build Now&lt;/strong&gt;.
Jenkins will do its thing — you’ll see a glorious Console Output filled with log lines, warnings, and possibly a tiny existential crisis.&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/2025/05/22/2025-05-22-jenkins-on-android/first-console-output.png&quot; alt=&quot;first Jenkins output console&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;option-2-jenkinsfile-pipeline-from-scm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#option-2-jenkinsfile-pipeline-from-scm&quot; /&gt;Option 2: Jenkinsfile (Pipeline from SCM)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re playing for keeps, store your pipeline code in your Git repo.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Create a &lt;code&gt;Jenkinsfile&lt;/code&gt; at the root (or wherever makes sense), then:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set &lt;em&gt;Definition&lt;/em&gt; to &lt;em&gt;Pipeline script from SCM&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose &lt;em&gt;Git&lt;/em&gt; as the SCM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter your GitHub repo URL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the &lt;em&gt;Script Path&lt;/em&gt; (defaults to &lt;code&gt;Jenkinsfile&lt;/code&gt;, or &lt;code&gt;jenkins/Jenkinsfile&lt;/code&gt; if it’s nested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now every time Jenkins builds, it’ll grab the latest code and follow the recipe in your Jenkinsfile like a dutiful butler consulting a particularly grumpy cookbook.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Too abstract?
Fear not — we’ll now use a real-world-ish example from the friendly folks at the &lt;em&gt;jenkins-docs&lt;/em&gt; organization.&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;building-a-real-project-from-github&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#building-a-real-project-from-github&quot; /&gt;Building a real project from GitHub&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;confirming-mavens-existence&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#confirming-mavens-existence&quot; /&gt;Confirming Maven’s existence&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We already have Java and Maven on board (thanks to our earlier setup). Let’s double-check:&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;mvn &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;

Apache Maven 3.9.9 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;8e8579a9e76f7d015ee5ec7bfcdc97d260186937&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Maven home: /data/data/com.termux/files/home/.sdkman/candidates/maven/current
Java version: 21.0.7, vendor: Termux, runtime: /data/data/com.termux/files/usr/lib/jvm/java-21-openjdk
Default locale: en, platform encoding: UTF-8
OS name: &lt;span class=&quot;s2&quot;&gt;&quot;linux&quot;&lt;/span&gt;, version: &lt;span class=&quot;s2&quot;&gt;&quot;5.4.274-qgki-gfffde3ec8864&quot;&lt;/span&gt;, &lt;span class=&quot;nb&quot;&gt;arch&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;aarch64&quot;&lt;/span&gt;, family: &lt;span class=&quot;s2&quot;&gt;&quot;unix&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;If Maven doesn’t respond, it’s either shy or not installed.
Assuming it talks back, you’re good to go.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;creating-the-tutorial-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-the-tutorial-project&quot; /&gt;Creating the tutorial project&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s use this GitHub repo: &lt;a href=&quot;https://github.com/jenkins-docs/simple-java-maven-app&quot; class=&quot;bare&quot;&gt;https://github.com/jenkins-docs/simple-java-maven-app&lt;/a&gt;
It even includes a &lt;code&gt;Jenkinsfile&lt;/code&gt; tucked away in the &lt;code&gt;jenkins/&lt;/code&gt; directory — classy.&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;options&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;skipStagesAfterUnstable&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;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;Build&#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;s1&quot;&gt;&#39;mvn -B -DskipTests clean package&#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;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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn test&#39;&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;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;target/surefire-reports/*.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;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;Deliver&#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;s1&quot;&gt;&#39;./jenkins/scripts/deliver.sh&#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 class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, let’s hook that into Jenkins:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;em&gt;+ New Item&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Name it something like &lt;code&gt;Maven Project&lt;/code&gt; (or go wild)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;em&gt;Pipeline&lt;/em&gt; and select &lt;em&gt;OK&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the next window:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;em&gt;Pipeline&lt;/em&gt; on the left&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;em&gt;Definition&lt;/em&gt;, choose &lt;em&gt;Pipeline script from SCM&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set &lt;em&gt;SCM&lt;/em&gt; to &lt;em&gt;Git&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Paste &lt;code&gt;&lt;a href=&quot;https://github.com/jenkins-docs/simple-java-maven-app&quot; class=&quot;bare&quot;&gt;https://github.com/jenkins-docs/simple-java-maven-app&lt;/a&gt;&lt;/code&gt; in the &lt;em&gt;Repository URL&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set &lt;em&gt;Script Path&lt;/em&gt; to &lt;code&gt;jenkins/Jenkinsfile&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hit &lt;em&gt;Save&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And finally — drumroll — select &lt;em&gt;Build Now&lt;/em&gt;.
Double-check you’re not on a metered connection unless you really want to download half the internet via Maven.&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/2025/05/22/2025-05-22-jenkins-on-android/first-maven-build.png&quot; alt=&quot;first Maven build&quot; width=&quot;860&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And there you have it!
A full Jenkins build triggered from your Android phone, which, let’s be honest, used to spend its days just doomscrolling and charging.
High five, mate!&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;reflecting-on-our-pipeline-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reflecting-on-our-pipeline-journey&quot; /&gt;Reflecting on our Pipeline journey&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well done, adventurer! Your Jenkins pipeline is now alive and kicking.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Your phone has turned from a useless paperweight into a superhero for your code.
You might not hear applause, but trust us, your future self is silently hero-worshipping you every time a green checkmark appears.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;onward-to-the-next-adventure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#onward-to-the-next-adventure&quot; /&gt;Onward to the next adventure…&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you thought hooking Jenkins to GitHub was fun, just wait.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next up, maybe we’ll teach Jenkins to brew coffee when the build fails — because caffeine and CI go hand-in-hand, right?
Or maybe we’ll set it up to flash the flashlight in Morse code to tell us the build status.
The future is weird, and we’re here for it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins learning kung-fu? Unlikely. Jenkins writing poetry in YAML? Worryingly plausible.
One thing’s for sure: we’ve officially crossed into “I didn’t know I could do that on a phone” territory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So go ahead, pat yourself on the back (gently — we don’t want to smudge the screen), and rest easy knowing that you’ve wrangled Jenkins into running, building, and deploying from the palm of your hand.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now close Termux, lock your phone, and whisper to yourself:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;&quot;I am the pipeline now.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Until next time, brave tinkerer.&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;/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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&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/2025/05/15/jenkins-contributor-awards-cast-your-vote/</id>
<title>Jenkins Contributor Awards: Cast Your Vote</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-05-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/05/15/jenkins-contributor-awards-cast-your-vote/" />
<author>
<name>alyssat</name>
</author>
<category term='jenkins'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='awards'></category>
<category term='cdcon'></category>
<summary>
🎉 Voting is Now Open for the 2025 Jenkins Awards! 🎉


The voting period for the 2025 Jenkins Awards is open, and it&#8217;s time to cast your votes!
Voting is open now through Monday, June 16, and the winners will be revealed during this year’s cdCon, happening June 23 - 25, 2025.




🏆 2025 Award Categories and Nominees


We are recognizing excellence in three categories:




Most Valuable Jenkins Advocate



Kris Stern


Stefan Spieker


Bruno Verachten





Most Valuable Jenkins Contributor



Basil Crow


Kris Stern


Jan Faracik





Jenkins Security MVP



Yaroslav Afenkin


Shlomo Dahan


Daniel Beck


Chenwei Jiang and Yue Yang









🗳️ How to Vote


Cast your vote using the official Jenkins Awards Voting Form.


Please note: this form is for Jenkins...
</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/2025/03/community-awards-2025-jenkins.png&quot; alt=&quot;community awards 2025 jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;voting-is-now-open-for-the-2025-jenkins-awards&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voting-is-now-open-for-the-2025-jenkins-awards&quot; /&gt;🎉 Voting is Now Open for the 2025 Jenkins Awards! 🎉&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The voting period for the 2025 Jenkins Awards is open, and it’s time to &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLSdQgQDcNJCgSZV5jUUjgh8J4P4JA2PuiQAgHlYzlFUx0BDWVw/viewform&quot;&gt;cast your votes&lt;/a&gt;!
Voting is open now through Monday, June 16, and the winners will be revealed during this year’s &lt;a href=&quot;https://cd.foundation/cdcon-2025/&quot;&gt;cdCon&lt;/a&gt;, happening June 23 - 25, 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;2025-award-categories-and-nominees&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2025-award-categories-and-nominees&quot; /&gt;🏆 2025 Award Categories and Nominees&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are recognizing excellence in three 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/7981&quot;&gt;&lt;strong&gt;Most Valuable Jenkins Advocate&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/krisstern&quot;&gt;Kris Stern&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/StefanSpieker&quot;&gt;Stefan Spieker&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/7979&quot;&gt;&lt;strong&gt;Most Valuable Jenkins Contributor&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/basil&quot;&gt;Basil Crow&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/krisstern&quot;&gt;Kris Stern&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/7980&quot;&gt;&lt;strong&gt;Jenkins Security MVP&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/yaroslavafenkin&quot;&gt;Yaroslav Afenkin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jiangchenwei&quot;&gt;Chenwei Jiang&lt;/a&gt; and &lt;a href=&quot;https://github.com/yangyue&quot;&gt;Yue Yang&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;️-how-to-vote&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#️-how-to-vote&quot; /&gt;🗳️ How to Vote&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cast your vote using the official &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLSdQgQDcNJCgSZV5jUUjgh8J4P4JA2PuiQAgHlYzlFUx0BDWVw/viewform&quot;&gt;Jenkins Awards Voting Form&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Please note: this form is for Jenkins Awards only.
Other CD Foundation projects may have separate voting processes.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;awards-timeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#awards-timeline&quot; /&gt;📅 Awards Timeline&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;Nominations Closed: March 3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting Opened: April 22&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting Closes: June 16&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Winners Announced: June 23 – 25 at &lt;a href=&quot;https://cd.foundation/blog/2025/04/03/cdcon-2025-program-announced/&quot;&gt;cdCon&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;🥇 Congratulations to all nominees!
Your contributions are instrumental to the continued success and improvement of 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/2025/05/02/pipeline-graph-view/</id>
<title>Revamped Pipeline visualization in Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-05-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/05/02/pipeline-graph-view/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<category term='pipeline'></category>
<summary>
We&#8217;re excited to announce a major update to the Pipeline Graph View
plugin - a complete redesign that introduces a modern, user-focused interface that enhances pipeline visualization,
customization, and performance.



So what&#8217;s new?

Rewritten and redesigned


The plugin has been completely rebuilt with a clean, modern interface using the latest version of React.
We&#8217;ve put a lot of effort into simplifying the plugin&#8217;s structure - switching from Webpack to Rspack, moving to Vite, and replacing class-based components with modern function components.
These changes made the codebase easier to maintain and work with, and we removed thousands of lines of code along the way to boost both maintainability...
</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/2025/05/2025-05-02-pipeline-graph-view/opengraph.png&quot; alt=&quot;opengraph&quot;&gt;
&lt;/img&gt;
&lt;/div&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/pipeline-graph-view/&quot;&gt;Pipeline Graph View&lt;/a&gt;
plugin - a complete redesign that introduces a modern, user-focused interface that enhances pipeline visualization,
customization, and performance.&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;The plugin has been completely rebuilt with a clean, modern interface using the latest version of React.
We’ve put a lot of effort into simplifying the plugin’s structure - switching from Webpack to Rspack, moving to Vite, and replacing class-based components with modern function components.
These changes made the codebase easier to maintain and work with, and we removed thousands of lines of code along the way to boost both maintainability and performance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The interface, with new components from the &lt;a href=&quot;https://www.jenkins.io/blog/2025/01/10/design-library/&quot;&gt;Jenkins Design Library&lt;/a&gt;, has been
thoughtfully redesigned to offer a smoother, more intuitive experience.
The plugin now supports full-page scrolling - eliminating the need for nested scroll areas - along with sticky headings for better context.
The pipeline graph can be panned and zoomed, allowing users to explore complex pipelines with ease.
Subtle, delightful animations enhance usability without getting in the way.
Stage progress is now clearly visible, and loading skeletons provide immediate
visual feedback, resulting in a more stable and responsive experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Unified view&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new interface combines the Pipeline graph, stages, and logs into a single, streamlined layout.
You can inspect a stage, follow its execution, and read its output - all in one place.&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;The Pipeline graph appears on top by default, but you can move it to the left to better suit ultrawide displays.
Columns can be resized and hidden, and layout preferences are saved automatically.&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/2025/05/2025-05-02-pipeline-graph-view/sidebar.png&quot; alt=&quot;sidebar&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Performance improvements&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve made significant behind-the-scenes improvements to how stages and logs are fetched and rendered.
The new plugin loads faster, scrolls smoother, and handles larger pipelines more gracefully.&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 new Pipeline Graph View is available now for users on Jenkins 2.479.3 and later.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you haven’t installed the plugin already, be sure to download it through the Plugins section of your Jenkins controller to experience the update.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See it in action in the &lt;a href=&quot;https://ci.jenkins.io/job/Core/job/jenkins/job/master/lastSuccessfulBuild/pipeline-console/&quot;&gt;Jenkins core build on ci.jenkins.io&lt;/a&gt;.&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/2025/03/26/design-post/</id>
<title>Redesigning Jenkins (Part One)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-03-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/03/26/design-post/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<summary>
Jenkins is the most used CI/CD platform in the world. It&#8217;s one of the oldest, most mature systems in
continuous integration and delivery, and it powers software pipelines across critical industries like finance,
healthcare, and government.
With over a million lines of code, more than 2,000 plugins, and millions of users,
Jenkins is less a "tool" and more of a global infrastructure backbone.


And because of all that - making changes is hard. Really hard.


Part One - The Problem


The web has evolved significantly since Jenkins' inception - and as a result of that we&#8217;ve been carrying a lot of
legacy technology along the way.


We’ve carried forward...
</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/2025/03/2025-03-26-design-post/banner.png&quot; alt=&quot;banner&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is the most used CI/CD platform in the world. It’s one of the oldest, most mature systems in
continuous integration and delivery, and it powers software pipelines across critical industries like finance,
healthcare, and government.
With over a million lines of code, more than 2,000 plugins, and millions of users,
Jenkins is less a &quot;tool&quot; and more of a global infrastructure backbone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And because of all that - making changes is hard. Really hard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;part-one-the-problem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#part-one-the-problem&quot; /&gt;Part One - The Problem&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The web has evolved significantly since Jenkins&#39; inception - and as a result of that we’ve been carrying a lot of
legacy technology along the way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve carried forward legacy technologies like &lt;a href=&quot;http://prototypejs.org&quot;&gt;Prototype.js&lt;/a&gt;, &lt;a href=&quot;https://yui.github.io/yui2/&quot;&gt;YUI 2&lt;/a&gt;,
&lt;a href=&quot;https://lesscss.org&quot;&gt;LESS&lt;/a&gt;, fragments of &lt;a href=&quot;https://jquery.com&quot;&gt;early jQuery&lt;/a&gt;, and a patchwork of UI components from
different eras of frontend development. The result? A frontend stack that’s tough to maintain, painful to extend, and a
real barrier for contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s not a knock on Jenkins - it’s just the reality of any large, long-lived platform.
Over time, the ground shifts beneath you.
What was best practice in 2005 becomes technical debt in 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, we knew something had to change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;maintaining-compatibility&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#maintaining-compatibility&quot; /&gt;Maintaining compatibility&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In modernizing the Jenkins frontend, our foremost priority has been to preserve backwards compatibility,
maintain platform stability, and ensure that no production pipelines are disrupted as a result of UI or
framework changes.
Given Jenkins&#39; role in powering mission-critical CI/CD workflows across global
enterprises, even small regressions can have far-reaching impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To achieve this, our approach has been pragmatic, cautious, and highly incremental.
Rather than introducing disruptive overhauls, we have focused on gradually modernizing the codebase over a period
of several years, ensuring each change is thoroughly tested and validated in real-world use cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All enhancements are subject to comprehensive automated testing, including compatibility checks against
Jenkins&#39; vast plugin ecosystem.
In addition, our weekly release cycle provides early visibility into changes and allows us to gather feedback
from a broad subset of users before changes are widely adopted.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;resetting-the-foundations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resetting-the-foundations&quot; /&gt;Resetting the foundations&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before we could take on the bigger challenges, we needed to start with the basics.
A major part of this work has involved modernizing the foundations of the Jenkins frontend - removing outdated
technologies, cleaning up legacy code, and laying the groundwork for a more flexible, maintainable, and
future-proof platform.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first significant milestone in the modernization of the Jenkins frontend was the removal of Prototype.js, a
legacy JavaScript framework that had long been a constraint on adopting modern JavaScript syntax and practices.
Prototype.js had been deeply intertwined with core components of the Jenkins UI, acting as a technical barrier
to progress and modernization. Its removal, as outlined in
&lt;a href=&quot;https://www.jenkins.io/blog/2023/05/12/removing-prototype-from-jenkins/&quot;&gt;Basil’s blog post&lt;/a&gt;, marked the end of a major blocker and
unlocked the ability to implement long-awaited updates and improvements.
This change has not only improved code readability and maintainability but also enabled the Jenkins frontend to
embrace more contemporary JavaScript standards, fostering a cleaner and more robust development environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most impactful changes was the removal of Yahoo User Interface (YUI), a legacy JavaScript library that had
been &lt;em&gt;deeply&lt;/em&gt; embedded throughout various areas of the Jenkins UI and its plugins.
YUI’s presence significantly complicated the frontend architecture and asset management. Removing it was a
substantial undertaking, but it drastically streamlined the asset tree and reduced technical debt across the codebase. As of &lt;a href=&quot;https://www.jenkins.io/changelog/2.492.1/&quot;&gt;Jenkins 2.492.1&lt;/a&gt;, YUI is now disabled by default.
This effort culminated in a major cleanup of the codebase, with &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/10135&quot;&gt;over &lt;em&gt;85,000 lines of code removed&lt;/em&gt;&lt;/a&gt;, significantly simplifying the platform and paving the
way for more modern, maintainable development practices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another important step in modernizing the Jenkins frontend has been the migration from
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/7850&quot;&gt;LESS to SCSS&lt;/a&gt;, a small but meaningful improvement in our styling
architecture.
SCSS offers better language features, stronger community support, and better compatibility with modern
tooling.
We’ve also been modularizing our legacy CSS into discrete, maintainable style modules, making it easier to
enforce consistency, isolate concerns, and improve reusability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have also undertaken a broader initiative to standardize the use of modern JavaScript across the Jenkins codebase,
embracing ES6+ syntax, modular architecture, and improved use of browser-native APIs.
This shift has been pivotal in improving code readability, maintainability, and performance. Legacy inline scripts and
globally scoped functions are gradually being replaced with well-structured, reusable JavaScript modules, bringing the
frontend architecture in line with modern development practices.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-approach&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-approach&quot; /&gt;The approach&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve deliberately avoided introducing new complex frameworks and heavyweight dependencies.
Modern JavaScript - just plain, native JS - is more than capable these days.
With modern JavaScript we can write expressive, maintainable code without any additional overhead.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That doesn’t mean we’re afraid of modern tooling - just that we’re selective.
The goal is to lower the barrier to entry for contributors, not raise it. Jenkins has hundreds of people around the
world contributing in all kinds of ways - we don’t want our frontend stack to be a gatekeeper.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every one of these changes helps reduce complexity, improve maintainability, and pave the way for more ambitious
UI improvements.
Some of these changes might seem small from the outside, but collectively they’ve laid a new foundation
for Jenkins.
This is the groundwork that makes future UX improvements possible - things like cleaner plugin integration,
improved accessibility, better navigation, and modern UI components.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s next&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Part Two, we’ll dive deeper into the design decisions behind some of the new UI features, how we’re improving the
developer experience, and what we’re doing to ensure compatibility across the plugin ecosystem without slowing
down progress.&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;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/03/18/jenkins-contributor-awards-2025-nomination-is-open/</id>
<title>Jenkins Contributor Awards 2025 - Nominations are Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-03-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/03/18/jenkins-contributor-awards-2025-nomination-is-open/" />
<category term='community'></category>
<category term='events'></category>
<summary>
The Jenkins Contributor Awards for 2025 are being hosted by the Continuous Delivery Foundation (CDF), alongside other prestigious CDF Community Awards.


Nominate Outstanding Contributors


Nominations are now open and any contributor is eligible for recognition! To ensure transparency, nominations are being accepted via GitHub issues.
Be sure to submit your nominations before the deadline on April 14, 2025.




Cast Your Vote


Voting begins on April 22 and closes on June 5, 2025.
Once voting opens, make your voice heard by voting through the official Google form, which include all award categories and nominees.




Jenkins Award Categories


Support and celebrate the Jenkins community by nominating or voting for 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/2025/03/community-awards-2025-jenkins.png&quot; alt=&quot;community awards 2025 jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor Awards for 2025 are being hosted by the Continuous Delivery Foundation (CDF), alongside other prestigious 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 any contributor is eligible for recognition! To ensure transparency, nominations are being accepted via GitHub issues.
Be sure to submit your nominations before the deadline on April 14, 2025.&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;Voting begins on April 22 and closes on June 5, 2025.
Once voting opens, make your voice heard by voting through the official &lt;a href=&quot;https://forms.gle/TjFR6kgYoasrUrFF9&quot;&gt;Google form&lt;/a&gt;, which include all award categories and nominees.&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;Support and celebrate the Jenkins community by nominating or voting for contributors in the following 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/7979&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/7981&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/7980&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;Winners will be officially announced at &lt;a href=&quot;https://cd.foundation/cdcon-2025/&quot;&gt;cdCon 2025&lt;/a&gt;, taking place from June 23 - 25, 2025.&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;Beyond Jenkins-specific awards, you can also recognize community members on a broader scale with categories such as:&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;For full details on all awards and the nomination process, visit the &lt;a href=&quot;https://cd.foundation/awards-2025/&quot;&gt;CDF Award Page&lt;/a&gt;. Help us recognize and honor the contributors who make an impact!&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/03/05/Jenkins-in-Google-Summer-of-Code-2025/</id>
<title>Jenkins in Google Summer of Code 2025</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-03-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/03/05/Jenkins-in-Google-Summer-of-Code-2025/" />
<category term='gsoc'></category>
<category term='gsoc2025'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
We are excited to have been accepted to Google Summer of Code (GSoC) 2025! This marks our ninth year participating as a mentoring organization in the program. Thank you Google!


GSoC is more than just a mentoring program; it is an opportunity to welcome and engage new contributors in open-source development. By dedicating time to mentor and guide GSoC contributors, we help shape the future of both the individuals involved and the broader Jenkins community. The impact of these contributions extends beyond the program, benefiting countless Jenkins users worldwide.


We eagerly welcome new GSoC contributors to the Jenkins family! This journey will...
</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/2025/03/GSoC2025_opengraph.png&quot; alt=&quot;GSoC2025 opengraph&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to have been accepted to &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code (GSoC) 2025&lt;/a&gt;! This marks our ninth year participating as a mentoring organization in the program. Thank you Google!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC is more than just a mentoring program; it is an opportunity to welcome and engage new contributors in open-source development. By dedicating time to mentor and guide GSoC contributors, we help shape the future of both the individuals involved and the broader Jenkins community. The impact of these contributions extends beyond the program, benefiting countless Jenkins users worldwide.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We eagerly welcome new GSoC contributors to the Jenkins family! This journey will provide invaluable hands-on experience, technical skill enhancement, and insight into the workings of an active open-source community. Most importantly, participants will have the chance to learn from passionate mentors dedicated to making a meaningful difference—for both individual contributors and the Jenkins project as a whole.&lt;/p&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;Refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors/&quot;&gt;information for contributors&lt;/a&gt; page for full application guidelines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Join these webinars for a walk through of project ideas: &lt;a href=&quot;https://www.meetup.com/jenkins-online-meetup/events/306446006/?eventOrigin=group_upcoming_events&quot;&gt;March 5&lt;/a&gt; and &lt;a href=&quot;https://www.meetup.com/jenkins-online-meetup/events/306446080/?eventOrigin=group_upcoming_events&quot;&gt;March 6&lt;/a&gt;. Recording will be available after each session.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Submit your draft proposal for review/feedback by mentors. Use &lt;a href=&quot;https://forms.gle/i8Gv9AcfgNiB1xAW8&quot;&gt;this form&lt;/a&gt; to submit your draft proposal for review. The deadline is April 1.&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?tab=t.0&quot;&gt;this template&lt;/a&gt; to write 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;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/2025/02/05/command-palette/</id>
<title>A new way to search in Jenkins 2.492.1</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-02-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/02/05/command-palette/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<summary>
We’re happy to announce that Jenkins 2.492.1 comes with a
brand-new search experience. We&#8217;re calling it Command Palette and it&#8217;s a one-stop shop for
searching across everything in Jenkins.


Whether you’re searching for jobs, builds, or settings, Command Palette makes it faster
and easier than ever to find exactly what you need.


Command Palette is a full-screen search experience, giving you more room to view results and
access richer, more detailed information. Results are now presented with clear and helpful icons,
improving visibility and making it easier to identify what you’re looking for at a glance.


Command Palette is also incredibly accessible - just press CMD+K (on macOS)
or...
</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/2025/02/2025-02-05-command-palette/opengraph.png&quot; alt=&quot;opengraph&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re happy to announce that &lt;a href=&quot;https://www.jenkins.io/changelog-stable/2.492.1&quot;&gt;Jenkins 2.492.1&lt;/a&gt; comes with a
brand-new search experience. We’re calling it &lt;strong&gt;Command Palette&lt;/strong&gt; and it’s a one-stop shop for
searching across &lt;em&gt;everything&lt;/em&gt; in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whether you’re searching for jobs, builds, or settings, Command Palette makes it faster
and easier than ever to find exactly what you need.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Command Palette is a full-screen search experience, giving you more room to view results and
access richer, more detailed information. Results are now presented with clear and helpful icons,
improving visibility and making it easier to identify what you’re looking for at a glance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Command Palette is also incredibly accessible - just press &lt;code&gt;CMD+K&lt;/code&gt; (on macOS)
or &lt;code&gt;CTRL+K&lt;/code&gt; (on Windows/Linux) from any page to open it instantly. Alternatively, you can find it
located in the navigation bar.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature and more are now available as part of the latest Jenkins release.
To learn more about all the exciting changes included in this version,
&lt;a href=&quot;https://www.jenkins.io/changelog-stable/2.492.1&quot;&gt;view the changelog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/01/16/jenkins-csp-project-update/</id>
<title>December Update: Momentum in Jenkins Content Security Policy Project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-01-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/01/16/jenkins-csp-project-update/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='open-source'></category>
<category term='security'></category>
<category term='csp'></category>
<category term='alpha-omega'></category>
<category term='plugins'></category>
<summary>
December Update: Wrapping Up the Jenkins Content Security Policy Project


The final month of 2024 has seen the Jenkins Content Security Policy (CSP) Project progressing towards a strong conclusion.
Let&#8217;s reflect on the developments of December and wrap up the outcomes of this pivotal security initiative.


A Strong Finish

December marked the end of an intensive push to refine CSP across the Jenkins ecosystem.
Our team faced a mixture of challenges and successes, which ultimately led to significant advancements in securing our plugins.


Key Developments:




Multiple Plugin Releases:
The month saw the closure of several crucial projects,
with the successful release of the Claim, Email Extension,
Last Changes, Pipeline Aggregator...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;december-update-wrapping-up-the-jenkins-content-security-policy-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#december-update-wrapping-up-the-jenkins-content-security-policy-project&quot; /&gt;December Update: Wrapping Up the Jenkins Content Security Policy Project&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final month of 2024 has seen the Jenkins Content Security Policy (CSP) Project progressing towards a strong conclusion.
Let’s reflect on the developments of December and wrap up the outcomes of this pivotal security initiative.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-strong-finish&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-strong-finish&quot; /&gt;A Strong Finish&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;December marked the end of an intensive push to refine CSP across the Jenkins ecosystem.
Our team faced a mixture of challenges and successes, which ultimately led to significant advancements in securing our plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Key Developments:&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;strong&gt;Multiple Plugin Releases:&lt;/strong&gt;
The month saw the closure of several crucial projects,
with the successful release of the &lt;a href=&quot;https://plugins.jenkins.io/claim&quot;&gt;Claim&lt;/a&gt;, &lt;a href=&quot;https://plugins.jenkins.io/email-ext&quot;&gt;Email Extension&lt;/a&gt;,
&lt;a href=&quot;https://plugins.jenkins.io/last-changes&quot;&gt;Last Changes&lt;/a&gt;, &lt;a href=&quot;https://plugins.jenkins.io/pipeline-aggregator-view&quot;&gt;Pipeline Aggregator View&lt;/a&gt;,
&lt;a href=&quot;https://plugins.jenkins.io/pollscm&quot;&gt;Poll SCM&lt;/a&gt;, and &lt;a href=&quot;https://plugins.jenkins.io/port-allocator&quot;&gt;Port Allocator&lt;/a&gt; plugins.
These updates are critical in ensuring compatibility and enhancing security standards in the Jenkins environment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continued Modernization:&lt;/strong&gt; Efforts to update the plugins, particularly those with a higher number of installations, were augmented.
This included addressing outdated plugins that required substantial reworks beyond the primary CSP concerns.&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;Technical Challenges:&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;Our shift to targeting less frequently used plugins brought about unique challenges, particularly in dealing with outdated plugins and unresponsive maintainers.
This slowed our PR review and merge processes, but taught us valuable lessons in managing large-scale open-source projects.&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;looking-back-at-the-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-back-at-the-journey&quot; /&gt;Looking Back at the Journey&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The CSP Project has not only focused on immediate security needs, but also laid a foundation for future improvements.
Here’s a summary of the journey over the past three months:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In October, we initiated the process by identifying critical vulnerabilities and establishing early groundwork.
Collaborative actions paved the way for subsequent enhancements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;November saw a more aggressive push towards resolving identified vulnerabilities and integrating CSP into a broader range of plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;By December, our efforts coalesced into a strong culmination with enhanced CSP implementation and lessons learned addressing broader community needs.&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;Collaboration and Community:&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;The collaboration between our developers and the broader Jenkins community was instrumental in navigating through the project.
We are grateful to all contributors, especially the core team members &lt;a href=&quot;https://www.jenkins.io/blog/authors/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt; and &lt;a href=&quot;https://github.com/yaroslavafenkin&quot;&gt;Yaroslav Afenkin&lt;/a&gt;, under the guidance of &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&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;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s Next?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we move into 2025, the experiences and insights gained from the CSP Project will guide further security enhancements in Jenkins:&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;Expanded CSP Integration:&lt;/strong&gt; Based on the project’s findings, expanded CSP integration into the Jenkins core is planned, aiming to provide a more robust defense mechanism against various web security threats.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous Community Engagement:&lt;/strong&gt; We encourage the community to remain involved, provide feedback and participate in ongoing security initiatives.&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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We extend our deepest thanks to everyone who contributed to this project’s success. Your dedication ensures Jenkins remains secure and reliable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for future updates, and continue supporting a safer Jenkins!&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/01/16/jenkins-2024-recap/</id>
<title>Jenkins 2024 in Review</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-01-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/01/16/jenkins-2024-recap/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
As we welcome 2025, we take a moment to reflect on the past year and celebrate some of our most memorable achievements, impactful projects, and significant changes over the last 366 days.
Every contribution, no matter its form, plays a vital role in shaping the Jenkins project. Without the collective efforts of our contributors, supporters, and community members, Jenkins wouldn&#8217;t be what it is today.
From every pull request to the grants and donations that enable Jenkins to meet the evolving needs of our community, we extend our heartfelt gratitude and deepest appreciation.
Thank you for being part of our journey!


Jenkins 2024 By...
</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/2025/01/16/2024-recap.png&quot; alt=&quot;Jenkins 2024 recap&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we welcome 2025, we take a moment to reflect on the past year and celebrate some of our most memorable achievements, impactful projects, and significant changes over the last 366 days.
Every contribution, no matter its form, plays a vital role in shaping the Jenkins project. Without the collective efforts of our contributors, supporters, and community members, Jenkins wouldn’t be what it is today.
From every pull request to the grants and donations that enable Jenkins to meet the evolving needs of our community, we extend our heartfelt gratitude and deepest appreciation.
Thank you for being part of our journey!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2024 By the Numbers from &lt;a href=&quot;https://stats.jenkins.io/statistics&quot;&gt;stats.jenkins.io&lt;/a&gt;:
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2025/01/16/jenkins-by-the-numbers.png&quot; alt=&quot;Jenkins 2024 by the numbers&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project was also announced as the winner of the 2024 DevOps Dozen award for Most Innovative Open Source Project.
This follows up our win from 2023 and helps illustrate that the Jenkins project is always looking forward.
Thanks to all those who voted for Jenkins and the users of Jenkins that foster an environment of innovation for all.&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/2025/01/16/devops-dozen-2024-award.png&quot; alt=&quot;Jenkins announced as the winner of the DevOps Dozen 2024 award for Most Innovative Open Source Project.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div id=&quot;infrastructure&quot; 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/2025/01/16/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the efforts of the Jenkins infrastructure team, the Jenkins update center has been migrated to a new mirror-based architecture, which is 10x more cost-effective and is &lt;a href=&quot;https://www.jenkins.io/blog/2024/11/16/new-update-center/&quot;&gt;now in production&lt;/a&gt;.
Over several months, Jenkins Infra performed multiple brownouts to test the services and ensure that the migration would be smooth.
The tests were successful, and they were able to detect issues that would have caused major headaches for users.
Thankfully, these issues were resolved, and while there were a few bumps post-migration, the update center has been doing very well over the last few weeks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout the year, the Jenkins infrastructure team has been working on several areas to reduce operating costs all around.
This has taken the form of converting the spending and usage in some areas to others, migrating the update center, and finding new ways to alleviate the spending, all while increasing the overall Jenkins job count.
As a result, their cost reduction work amounted to an over 50% decrease from 2023’s Azure CDF operating costs.
Additionally, thanks to improvements and measures implemented in December, there was an over 40% decrease in AWS (via CloudBees) operating costs.
Despite the second time frame being so short, this large of a change is indicative of the impact this will have for the Jenkins project going forward.
These are massive wins in terms of their impact and reflect the hard work needed to achieve such results.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;security&quot; 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/2025/01/16/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the beginning of 2024, &lt;a href=&quot;https://www.jenkins.io/blog/2024/01/25/sonar-vulnerability-report/&quot;&gt;Sonar worked with the Jenkins security team&lt;/a&gt; to address a previously unnoticed vulnerability.
The issue was very niche and would only execute given a specific set of circumstances and permissions, so there was no larger threat here.
However, the existence of this vulnerability was enough reason for Jenkins security and Sonar to collaborate and resolve this issue.
Thanks to their in-depth work and tenacity in removing the vulnerability, Jenkins continues to be a secure and well-maintained DevOps platform.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, thanks to Alpha Omega for their &lt;a href=&quot;https://www.jenkins.io/blog/2024/10/04/content-security-policy-grant/&quot;&gt;grant and collaboration&lt;/a&gt;, we have been able to make a concerted effort to update the CSP for Jenkins.
Their grant has allowed us to bring in two key contributors to take on the work of this project and their work has been nothing short of incredible.
From the very start of the project, Shlomo Dahan and Yaroslav Afenkin, under the guidance of Basil Crow, have been working furiously to help improve the CSP of Jenkins and bring some of the most important plugins up to speed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By the numbers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Published 6 security advisories for Jenkins core&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Published 8 security advisories for 33 Jenkins plugins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the collaboration with Sonar, the Jenkins Security team has worked constantly throughout 2024 to ensure that security issues are acknowledged and resolved whether they are for Jenkins core or plugins within the ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2025/01/16/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the summer, the Jenkins weekly release line made the move to &lt;a href=&quot;https://www.jenkins.io/blog/2024/06/11/require-java-17/&quot;&gt;require Java 17&lt;/a&gt; as a baseline.
This was an important update to keep up with current usage and start the process of dropping support for Java 11.
Thanks to the hard work and dedication of Jenkins developers, the transition was successful and we saw a steady rise in JDK 17 installation and usage.
By the end of the October LTS release, the Java 17 requirement had been thoroughly tested and used over the preceding months, ensuring that its inclusion would be safe.
Since the October release of LTS 2.479.1, we have not seen any major issues with Java 17 usage.
While there have been some hiccups when it comes to upgrading plugins alongside the Jenkins LTS, these have been addressed as they come up and typically can be resolved by ensuring the plugin is updated before and after upgrading Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the move to Java 17, Jenkins developers worked tirelessly to upgrade to Spring Security and Framework 6, Eclipse Jetty 12, and Jakarta EE 9.
These upgrades were crucial to ensuring that Jenkins is keeping up with current trends and usage of the platform.
They are also major updates in security, ensuring that the Jenkins project is doing everything it can to protect its users during development.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2025/01/16/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve completed one full year of &lt;a href=&quot;https://contributors.jenkins.io/&quot;&gt;Contributor Spotlight&lt;/a&gt; posts, highlighting the different backgrounds, skills, and work that make up the Jenkins community.
This space has allowed us to show appreciation for those who keep Jenkins fresh, strong, and viable so consistently.
From long-time contributors and early adopters of Jenkins to recent Google Summer of Code participants, there are all kinds of stories to tell and efforts to acknowledge.
Thanks to all the contributors who have collaborated with us for the contributor spotlight and for allowing us to share their stories.
Additionally, new contributors have been welcomed to Jenkins through community projects, including Hacktoberfest and another successful Google Summer of Code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Through these partnerships and community projects, we have been able to expand the Jenkins community by welcoming new contributors to the project, regardless of the size of their contributions.
By providing exposure to open-source practices and expectations, we have enriched the project and open-source community as a whole.
While participating in these events, contributors have helped update areas of Jenkins documentation and the creation of &lt;a href=&quot;https://stats.jenkins.io/&quot;&gt;stats.jenkins.io&lt;/a&gt;.
Even though our Google Summer of Code projects are specific to Jenkins, how to work with an open-source project and engage with the community are invaluable experiences that will expand these contributors&#39; skills beyond Jenkins.
Both Hacktoberfest and GSoC have become yearly events for Jenkins and we thank them for allowing us to collaborate and to the contributors who help Jenkins continue to be an ever-growing project.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2025/01/16/outreach-and-advocacy.png&quot; alt=&quot;Outreach and Advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout 2024, there were several events that Jenkins participated in that allowed us to connect with the Jenkins and extended open-source communities.
We started the year by gathering in Brussels for FOSDEM and a hugely successful &lt;a href=&quot;https://www.jenkins.io/blog/2024/02/28/jenkins-contributor-summit-and-fosdem-recap/&quot;&gt;Jenkins contributor summit&lt;/a&gt;.
The contributor summit provided a space for Jenkins contributors to meet and connect in person, get updates and roadmap plans from Jenkins officers, and work on a handful of different projects together.
It is not often that we are all able to meet in person, so these events are hugely invaluable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to DevOps World and FOSDEM, Jenkins had a presence at the Open Source Summit Europe, where &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt; gave a talk detailing how and why the &lt;a href=&quot;https://www.jenkins.io/blog/2024/10/25/jenkins-tutorial-revamp/&quot;&gt;Jenkins tutorial revamp&lt;/a&gt; has been needed and successful.
He shared details about how incorporating Docker Compose makes the tutorial experience more simplified and beneficial to the user overall, and how it is safer than using the previous Docker-in-Docker method.
Users benefit from both the comfort of knowing their build is secure and a more straightforward example, allowing them to get started faster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last event of the year that involved Jenkins was an &lt;a href=&quot;https://techstrong.tv/videos/cd-pipeline/behind-the-code-jenkins-upgrades-challenges-and-evolution-the-cd-pipeline-ep15&quot;&gt;episode of Techstrong TV&lt;/a&gt; that featured &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, where they discussed the challenges and successes of the ever-evolving Jenkins project.
They discussed how upgrades and the constantly changing landscape of development influence the Jenkins project’s direction and what it takes to manage a large project like Jenkins.
Thanks to Techstrong TV for having Jenkins on and to the Jenkins representatives for sharing their insights and anecdotes about the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2025/01/16/ui-ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were also presentations from &lt;a href=&quot;https://www.jenkins.io/blog/2024/08/29/jenkins-design/&quot;&gt;Jenkins contributors at the virtual DevOps World event&lt;/a&gt;, showcasing some of the UI/UX updates and enhancements that have been implemented in the last year.
This includes everything from buttons and menu items being refreshed, to more modern page design, and enhancements intended to make the Jenkins user experience more smooth and inviting overall.
There have been additional UI updates since the talk, such as providing the help text within Jenkins directly, instead of hiding it in an extra button.
This allowed us to showcase the work and effort that goes into refining the Jenkins experience even further.
Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt; for delivering this talk and providing so many great updates to the Jenkins UI/UX.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Constantly working to enhance the Jenkins user experience, the folks working on UI/UX have a passion for making Jenkins more sleek and modern.
One of the bigger UI enhancements completed in 2024 was &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/73539&quot;&gt;moving away from Yahoo! User Interface&lt;/a&gt; for the project as a whole.
This is the culmination of a lot of work by done by multiple contributors, all with the goal of eventually removing YUI from Jenkins completely.
Several components have been updated using alternative frameworks, proving that this is both possible and the right path forward for Jenkins UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Build History widget was also revamped, to modernize and clean up the UI while retaining the functionalities that users have come to rely on.
This is another great example of the UI being enhanced with the help of community feedback.
The Jenkins community is always able to share their thoughts on work being done within Jenkins, as having feedback helps guide any work that can or will affect users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Design Library also underwent &lt;a href=&quot;https://github.com/jenkinsci/design-library-plugin/pull/359&quot;&gt;a major UI overhaul&lt;/a&gt;.
Prior to this, the Design Library had grown quite a bit and was not consistent across multiple areas.
The work done makes the Design Library UI consistent, provides more clarity for grouped samples, includes multiple functionalities such as page editing, tab switching, and searching, and increases the overall usefulness of the Design Library.
The modernization of the Design Library is further outlined in the above link and lists just how many changes went into this work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributors have also modernized Jenkins menus and pages, &lt;a href=&quot;https://www.jenkins.io/blog/2024/12/02/pr-titles/&quot;&gt;incorporated user-generated requests&lt;/a&gt;, and implemented several changes to refine the UI, such as overhauling the search function.
Jenkins is now over 13 years old, but it has received more than just a fresh coat of paint over the years, and the UI/UX SIG has played a critical role in making sure that Jenkins is as appealing as it is powerful.
Additional thanks to all those who help enhance the Jenkins UX/UI through their efforts to provide the best experience possible.
The following image illustrates some more specific examples of UI enhancements done over the past year.&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/2025/01/16/UI-changes.png&quot; alt=&quot;UI changes visualized collage.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div id=&quot;grants-and-sponsorships&quot; 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/2025/01/16/sponsor-contributions.png&quot; alt=&quot;Grants and Sponsors&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the last year, we have received several grants and sponsorships that allow the project to not only continue to function but improve in ways that benefit all users and developers.
We have used &lt;a href=&quot;https://www.jenkins.io/blog/2024/07/24/amazon-donates-to-jenkins/&quot;&gt;AWS&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/2024/07/26/microsoft-donates-to-jenkins/&quot;&gt;Microsoft Azure&lt;/a&gt; to provide many different services over the years, and their continued support allows us to continue to do so.
From download points to powering the controllers that build Jenkins, their donations help ensure Jenkins&#39; lights stay on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to all of our sponsors, for supporting Jenkins throughout the year in so many ways and places.
From providing infrastructure support, financial support, or making it possible for Jenkins to reach further globally, we would be remiss if we did not share our appreciation for all that you provide:&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/2025/01/16/jenkins-sponsors-2024.png&quot; alt=&quot;Jenkins sponsors in their various levels collage.&quot; /&gt;&lt;/span&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2025/01/10/design-library/</id>
<title>Introducing Jenkins Design Library 3</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2025-01-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2025/01/10/design-library/" />
<category term='jenkins'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<summary>
We’re thrilled to announce that the Jenkins Design Library 3 is now live! 🎉


With this release, we’ve refined every aspect of the library to provide better documentation for plugin developers and ensure a more consistent,
accessible, and intuitive experience.



So what&#8217;s new?

A new consistent design


Every page has been refined to maintain a cohesive look and feel, making it easier than ever to work with Jenkins Design Library.
All samples are now grouped into two clear categories — Components and Patterns — ensuring you can quickly find what you need.
We&#8217;ve also introduced interactive examples, such as the new Spacing sample, which will make it...
</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/2025/01/2025-01-10-design-library/opengraph.png&quot; alt=&quot;opengraph&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re thrilled to announce that the &lt;a href=&quot;https://weekly.ci.jenkins.io/design-library&quot;&gt;&lt;strong&gt;Jenkins Design Library 3&lt;/strong&gt;&lt;/a&gt; is now live! 🎉&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this release, we’ve refined every aspect of the library to provide better documentation for plugin developers and ensure a more consistent,
accessible, and intuitive experience.&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;A new consistent design&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every page has been refined to maintain a cohesive look and feel, making it easier than ever to work with Jenkins Design Library.
All samples are now grouped into two clear categories — Components and Patterns — ensuring you can quickly find what you need.
We’ve also introduced interactive examples, such as the new &lt;a href=&quot;https://weekly.ci.jenkins.io/design-library/spacing&quot;&gt;Spacing&lt;/a&gt; sample, which will make it easier than ever to find the component or pattern best suited for your needs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;New ‘Edit this page’ button&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Want to contribute or suggest improvements?
The new &#39;Edit this page&#39; button makes it easy to jump in and collaborate.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Accessibility improvements&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The library now respects user preferences for contrast (prefers-contrast) and motion (prefers-reduced-motion), making it more accessible to everyone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pages can now declare which Long-Term Support (LTS) release they’re compatible with, so you always know where the latest components are available.&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;Jenkins Design Library 3 is ready for plugin developers to explore and use.
Head over to &lt;a href=&quot;https://weekly.ci.jenkins.io/design-library&quot;&gt;Jenkins Design Library&lt;/a&gt; to dive in and see all the updates in action.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Thanks to the community 🎉&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A huge thank you to everyone who contributed to this effort.
Happy coding!&lt;/p&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/2024/12/16/google-summer-of-code-2025-volunteers-needed-to-mentor-future-jenkins-contributors/</id>
<title>Google Summer of Code 2025: Volunteers Needed to Mentor Future Jenkins Contributors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-12-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/12/16/google-summer-of-code-2025-volunteers-needed-to-mentor-future-jenkins-contributors/" />
<author>
<name>alyssat</name>
</author>
<category term='gsoc2025'></category>
<category term='contribute'></category>
<category term='community'></category>
<summary>
TL,DR:

Jenkins is preparing to participate in its ninth (9th) 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 contributors work on a 10-22 weeks-long...
</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 ninth (9th) 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/2025/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 contributors work on a 10-22 weeks-long programming project with the guidance of mentors from their respective open source organizations.
During GSoC, accepted contributors are paired with mentors from participating open-source organizations of their choice, gaining exposure to real-world software development techniques.
These GSoC contributors will get to learn from experienced open-source developers while writing code for real-world projects!
A small stipend is provided as an incentive to support 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;Mentor interaction is a vital part of GSoC.
Mentoring is a great opportunity to improve your management and people (or general “soft”) skills while giving back to the community.
In return for mentoring, a GSoC contributor works on your project full-time for 10-22 weeks.
Think about the projects that you’ve always wanted to do but never had the time to complete.
GSoC is a fantastic program and the Jenkins project is looking forward to participating in it again in 2025, potentially with your participation!&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;.
Note that being a GSoC mentor does not require expert knowledge of Jenkins.
Mentors do not work alone.
We make sure that every project has at least two mentors.
GSoC org admins will be there to help to find technical advisers, so you can study together with your GSoC contributor.
Mentoring takes about 5 to 8 hours of work per week (more at the start, less at the end).
Mentors provide guidance, coaching, and sometimes a bit of cheerleading.
They review GSoC contributor proposals, pull-requests, and contributor presentations at the evaluation phase.
They fill in 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 GSoC contributors are expected to accomplish in about 10-22 weeks.
The coding projects can be new features, plugins, test frameworks, infrastructure, graphical interface, etc.
If you don’t have a specific project idea, please consider being a mentor for one of &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2025/project-ideas/&quot;&gt;these project ideas&lt;/a&gt;.
If you have a specific project in mind, please send us your project ideas before the beginning of February, so they can get a proper review by the GSoC committee and by the community.
Of course, we would love it if you were the mentor for your 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 .adoc file in the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/tree/master/content/projects/gsoc/2025/project-ideas&quot;&gt;project ideas&lt;/a&gt;.
It is not necessary to submit a Google Doc, but it will still work if you want to do that.
Refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;instructions&lt;/a&gt; on submitting ideas, which include an .adoc template and some 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;Case in point, 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;.
A GSoC project idea that started in the summer of 2022, and was implemented in the summer of 2023 for millions of Jenkins users to benefit from!&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 2025!&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/2024/12/05/jenkins-csp-project-update/</id>
<title>November Update: Momentum in Jenkins Content Security Policy Project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-12-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/12/05/jenkins-csp-project-update/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='open-source'></category>
<category term='security'></category>
<category term='csp'></category>
<category term='alpha-omega'></category>
<category term='plugins'></category>
<summary>
The Jenkins Content Security Policy (CSP) project has been bustling with activity.
November saw many initiatives aimed at refining and enhancing the security framework for the vast spectrum of Jenkins plugins, extending upon the notable advancements achieved in October.


October in Review


October laid the foundation with a lot of enhancement in CSP plugin capabilities, theorizing for eventual widespread deployment without friction.
The month was dominated by aggressive modernization that started with more than 20 plugins, an essential step to mitigate security risks and perform good compliance with ever-evolving standards.




November Advancements


Plugin Updates and Progress

In November, the team tackled more than twenty complex plugin updates,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Content Security Policy (CSP) project has been bustling with activity.
November saw many initiatives aimed at refining and enhancing the security framework for the vast spectrum of Jenkins plugins, extending upon the notable advancements achieved in October.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;october-in-review&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#october-in-review&quot; /&gt;October in Review&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;October laid the foundation with a lot of enhancement in CSP plugin capabilities, theorizing for eventual widespread deployment without friction.
The month was dominated by aggressive modernization that started with more than 20 plugins, an essential step to mitigate security risks and perform good compliance with ever-evolving standards.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;november-advancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#november-advancements&quot; /&gt;November Advancements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;plugin-updates-and-progress&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-updates-and-progress&quot; /&gt;Plugin Updates and Progress&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In November, the team tackled more than twenty complex plugin updates, implementing strategic fixes and exploring innovative solutions for CSP adoption:&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;Build Pipeline Plugin&lt;/strong&gt;: The team consolidated multiple changes into a single PR, targeting enhanced stability across interconnected updates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://plugins.jenkins.io/htmlpublisher&quot;&gt;HTML Publisher&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/subversion&quot;&gt;Subversion&lt;/a&gt; Plugins&lt;/strong&gt;: Both plugins saw active development, with the former having multiple open PRs, highlighting a dynamic push towards modernization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Milestone Targets&lt;/strong&gt;: The team has made significant inroads by updating plugins with installation ranges hitting 22k, pushing next to the 10k installation range.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://plugins.jenkins.io/uno-choice&quot;&gt;Active Choices&lt;/a&gt; Plugin&lt;/strong&gt;: Notable progress with responsive maintenance and Selenium testing catching browser-specific quirks which ATH might overlook.&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;intensive-focus-areas&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#intensive-focus-areas&quot; /&gt;Intensive Focus Areas&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Many plugins, such as the &lt;a href=&quot;https://plugins.jenkins.io/sonar&quot;&gt;Sonar&lt;/a&gt;, &lt;a href=&quot;https://plugins.jenkins.io/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;, and &lt;a href=&quot;https://plugins.jenkins.io/artifactory&quot;&gt;Artifactory&lt;/a&gt; plugins have posed unique challenges, ranging from external CI management hurdles to complex local installation and testing environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Future updates aim for comprehensive modernization of plugins deemed outdated yet still in use, like the &lt;a href=&quot;https://plugins.jenkins.io/ivy&quot;&gt;IVY&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/cvs&quot;&gt;CVS&lt;/a&gt; plugins, along with ambitious plans for the &lt;a href=&quot;https://plugins.jenkins.io/build-timestamp&quot;&gt;Build Timestamp&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/build-monitor-plugin&quot;&gt;Build Monitor&lt;/a&gt; plugins.&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;automation-and-modernization-initiatives&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automation-and-modernization-initiatives&quot; /&gt;Automation and Modernization Initiatives&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The aim to automate the modernization process will provide a significant thrust forward, alleviating manual burdens and expediting the transformation to adhere to contemporary security protocols for older plugins, such as the &lt;a href=&quot;https://plugins.jenkins.io/dynamic_extended_choice_parameter&quot;&gt;Dynamic Extended Choice Parameter&lt;/a&gt; plugin.&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-opportunities&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges-and-opportunities&quot; /&gt;Challenges and Opportunities&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While progress has been strong, challenges remain:&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;Complex Dependencies:&lt;/strong&gt; Plugins like &lt;a href=&quot;https://plugins.jenkins.io/build-pipeline-plugin&quot;&gt;Build Pipeline&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/delivery-pipeline-plugin&quot;&gt;Delivery Pipeline&lt;/a&gt; require extensive modernization due to their intricate interdependencies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Legacy Patterns:&lt;/strong&gt; JavaScript-generated HTML and inline event handlers continue to pose hurdles, requiring tailored approaches for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maintainer Collaboration:&lt;/strong&gt; Certain plugins face slower updates due to maintainer availability, highlighting the importance of community involvement.&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 sharp focus will continue to be on sustaining the momentum to refine the CSP implementation processes.
The vision for December includes:&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;Resolving the last CSP violations&lt;/strong&gt; and finalizing updates for priority plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enhancing CSP scanning tools&lt;/strong&gt; to support maintainers and users in identifying potential issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Crucial Plugin Modernization&lt;/strong&gt;: Tackling plugins with intricate security implications like the Active Choices plugin exemplifies the targeted approach to enhance plugins that intersect closely with security norms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CSP Header Enhancements&lt;/strong&gt;: Plans are in place to converge on a strategy for implementing CSP headers seamlessly across Jenkins core.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;engaging-the-community&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#engaging-the-community&quot; /&gt;Engaging the Community&lt;/h3&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;Community engagement continues to be a cornerstone of the CSP project.
We encourage the Jenkins community to take an active role in ongoing initiatives by participating in testing,
contributing to discussions, and suggesting improvements.
Your input is invaluable!&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more detailed insights or to dive deeper into our project, visit our &lt;a href=&quot;https://www.jenkins.io/doc/developer/security/csp/&quot;&gt;CSP documentation page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As this project moves forward, we remain committed to bolstering the security foundations of Jenkins, ensuring a secure and resilient environment for all its users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re incredibly grateful to &lt;a href=&quot;https://www.jenkins.io/blog/authors/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt;, &lt;a href=&quot;https://github.com/yaroslavafenkin&quot;&gt;Yaroslav Afenkin&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt;, and everyone who has contributed to this effort. Together, we’re building a safer Jenkins for everyone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for the December update, where we’ll review the final outcomes of this exciting journey!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/12/03/election-results/</id>
<title>2024 Jenkins Board and Officer Election Results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-12-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/12/03/election-results/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
The Jenkins community has completed the 2024 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:




Alexander Brandes, Valentin Delaye, and Alex Earl join Basil Crow and Mark Waite on the Jenkins Governance Board


Tim Jacomb will continue as Release Officer


Alyssa Tong will continue as Events Officer (uncontested)


Damien Duportal will continue as Infrastructure Officer (uncontested)


Wadeck Follonier will continue as Security Officer (uncontested)


Kevin Martens will continue as Documentation Officer (uncontested)




The board positions and officer roles are an essential part of the Jenkins project...
</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/2024/opengraph.png&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 2024 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/2024/10/03/jenkins-election-candidates/#NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/2024/10/03/jenkins-election-candidates/#jonesbusy&quot;&gt;Valentin Delaye&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/2024/10/03/jenkins-election-candidates/#slide_o_mix-board&quot;&gt;Alex Earl&lt;/a&gt; join &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil/&quot;&gt;Basil Crow&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Mark Waite&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/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;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat/&quot;&gt;Alyssa Tong&lt;/a&gt; will continue 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/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/kmartens27/&quot;&gt;Kevin Martens&lt;/a&gt; will continue as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt; (uncontested)&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 &lt;a href=&quot;https://www.jenkins.io/blog/2024/10/03/jenkins-election-candidates/#board-candidates&quot;&gt;six candidates&lt;/a&gt; for the Jenkins Governance Board and &lt;a href=&quot;https://www.jenkins.io/blog/2024/10/03/jenkins-election-candidates/#officer-candidates&quot;&gt;two candidates&lt;/a&gt; for Release 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;This year elected 3 governance board members, including a replacement for &lt;a href=&quot;https://www.jenkins.io/blog/authors/kohsuke/&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; after his many years of service to Jenkins.
We used the &lt;a href=&quot;https://civs.cs.cornell.edu/&quot;&gt;Condorcet Internet Voting Service&lt;/a&gt; that allows voters to rank their choices rather than just picking their one favorite choice.
You can find voting results in the &lt;a href=&quot;https://civs1.civs.us/cgi-bin/results.pl?id=E_f287a2e101977dc8&quot;&gt;governance board poll&lt;/a&gt; and the &lt;a href=&quot;https://civs1.civs.us/cgi-bin/results.pl?id=E_4c3443416941563c&quot;&gt;release officer poll&lt;/a&gt;.&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 1, 2026.&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 1, 2025.
After the initial review of nominations and confirmations with potential candidates, 4 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;Alyssa Tong&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;li&gt;
&lt;p&gt;&lt;strong&gt;Kevin Martens&lt;/strong&gt; - &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;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 81 registered voters and around 60 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 send an email to 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>
<entry>
<id>https://www.jenkins.io/blog/2024/12/02/pr-titles/</id>
<title>Pull request titles now show directly in Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-12-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/12/02/pr-titles/" />
<category term='jenkins'></category>
<category term='github'></category>
<category term='gitlab'></category>
<category term='bitbucket'></category>
<category term='user-experience'></category>
<category term='ux'></category>
<summary>
We are happy to share that with the latest version of Branch API, you can now view pull request titles directly in Jenkins.


This feature was one of the most requested improvements from our community, and it&#8217;s great to see it live.
We recently ran a poll on what users want to see on the Jenkins dashboard and this was the number one request.


This update is part of our ongoing effort to migrate features from BlueOcean and revamp the Jenkins experience.
If you’re interested in how we’re shaping Jenkins' future, be sure to check out our DevOps World 2024 talk.


Thanks to everyone involved...
</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/2024/12/02/2024-12-02-pr-titles/opengraph.png&quot; alt=&quot;opengraph&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to share that with the latest version of &lt;a href=&quot;https://plugins.jenkins.io/branch-api/&quot;&gt;Branch API&lt;/a&gt;, you can now view pull request titles directly in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature was one of the most requested improvements from our community, and it’s great to see it live.
We recently ran a poll on what users want to see on the Jenkins dashboard and this was the number one request.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This update is part of our ongoing effort to migrate features from BlueOcean and revamp the Jenkins experience.
If you’re interested in how we’re shaping Jenkins&#39; future, be sure to check out our &lt;a href=&quot;https://www.devopsworld.com/2024-virtual&quot;&gt;DevOps World 2024&lt;/a&gt; talk.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to everyone involved in getting this shipped.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/11/16/new-update-center/</id>
<title>New Update Center (updates.jenkins.io) Architecture in Production:
 18 November 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-11-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/11/16/new-update-center/" />
<category term='jenkins'></category>
<category term='jenkins-infra'></category>
<category term='update-center'></category>
<summary>
Summary (TL;DR)


Note: this is a follow up of the 07 and 08 November 2024 24-hour brownout.


The service https://updates.jenkins.io will switch its implementation to the new system, on Monday 18 November 2024 at 09:00 am UTC.


All Jenkins users are impacted but should not see any functional change.


⚠️ Please check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.




What is the "Update Center"?


Jenkins Update Center is a web server at the core of the Jenkins public infrastructure that distributes the plugins, tool installers, and version index to all Jenkins servers worldwide.


From the...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-tldr&quot; /&gt;Summary (&lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:Too_long;_didn%27t_read&quot;&gt;TL;DR&lt;/a&gt;)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note: this is a follow up of &lt;a href=&quot;https://www.jenkins.io/blog/2024/11/07/update-center-brownouts-6/&quot;&gt;the 07 and 08 November 2024 24-hour brownout&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The service &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;https://updates.jenkins.io&lt;/a&gt; will switch its implementation to the new system, on Monday 18 November 2024 at 09:00 am UTC.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Jenkins users are impacted but should not see any functional change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;⚠️ Please check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-update-center&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-update-center&quot; /&gt;What is the &quot;Update Center&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;Update Center&lt;/a&gt; is a web server at the core of the Jenkins public infrastructure that distributes the plugins, tool installers, and version index to all Jenkins servers worldwide.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the installation wizard to regular plugin updates, if you run Jenkins, then you use this service under the hood.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, it serves around 50 TB of data (outbound bandwidth) each month from a single virtual machine on AWS, which costs around $6,000 per month.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins infrastructure team has worked relentlessly over the past years to implement a new sustainable implementation for this service in order to sustain and improve it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new Update Center implementation features a highly available system that redirects user requests to a download mirror close to their location.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additional information is available in the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;GitHub issue&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;what-happens&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-happens&quot; /&gt;What Happens?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After running 6 brownouts (e.g. using the new system in production from 1 to 24 hours),
we are confident we ran out of things to break (©&lt;a href=&quot;https://www.jenkins.io/blog/authors/basil/&quot;&gt;Basil Crow&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll simply switch the DNS entry &lt;code&gt;updates.jenkins.io&lt;/code&gt; to this new service and continue monitoring it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 1 month, if no major issue arises, we’ll start decommissioning the old service on the VM which was used for years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;helpdesk ticket&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/11/13/hacktoberfest/</id>
<title>Jenkins&#39; Participation in Hacktoberfest 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-11-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/11/13/hacktoberfest/" />
<author>
<name>gounthar</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<category term='newcomer'></category>
<category term='outreach-programs'></category>
<summary>
The Jenkins community is pleased to have participated in this year’s Hacktoberfest, an event focused on fostering open-source contributions and welcoming new contributors to our ecosystem.


As Hacktoberfest 2024 has come to a close, we&#8217;re happy to reflect on the community&#8217;s participation:


Jenkins’ Contribution to Hacktoberfest


This year, we saw an increase in community engagement, with contributions including 1,174 pull requests across the jenkinsci, jenkins-infra, and jenkins-docs GitHub organizations.
Notably, 243 pull requests were part of the Hacktoberfest initiative, contributed by 67 unique participants.


Out of these submissions, 223 pull requests were successfully merged, demonstrating the collaborative efforts and commitment of our contributors and maintainers...
</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/hacktoberfest/hacktoberfest_2024_logo.svg&quot; alt=&quot;Hacktoberfest&quot; width=&quot;75%&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community is pleased to have participated in this year’s Hacktoberfest, an event focused on fostering open-source contributions and welcoming new contributors to our ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Hacktoberfest 2024 has come to a close, we’re happy to reflect on the community’s participation:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-contribution-to-hacktoberfest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-contribution-to-hacktoberfest&quot; /&gt;Jenkins’ Contribution to Hacktoberfest&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, we saw an increase in community engagement, with contributions including &lt;strong&gt;1,174 pull requests&lt;/strong&gt; across the &lt;code&gt;jenkinsci&lt;/code&gt;, &lt;code&gt;jenkins-infra&lt;/code&gt;, and &lt;code&gt;jenkins-docs&lt;/code&gt; GitHub organizations.
Notably, &lt;strong&gt;243 pull requests&lt;/strong&gt; were part of the Hacktoberfest initiative, contributed by &lt;strong&gt;67 unique participants&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Out of these submissions, &lt;strong&gt;223 pull requests were successfully merged&lt;/strong&gt;, demonstrating the collaborative efforts and commitment of our contributors and maintainers alike, achieving an impressive 92% acceptance rate.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;encouraging-newcomers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#encouraging-newcomers&quot; /&gt;Encouraging Newcomers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of our primary objectives during Hacktoberfest is to welcome and support new open-source contributors.
The Jenkins community provided resources and guidance, assisting newcomers in understanding the procedures and standards for quality contributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are proud of all our participants, with special recognition for our seasoned contributors who continue to provide valuable input year after year.
Notable contributions from some of our well-established members include:&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/jonesbusy&quot;&gt;&lt;strong&gt;jonesbusy&lt;/strong&gt;&lt;/a&gt;, submitting &lt;strong&gt;41 validated pull requests&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;&lt;strong&gt;basil&lt;/strong&gt;&lt;/a&gt;, contributing &lt;strong&gt;14 pull requests&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;&lt;strong&gt;kmartens27&lt;/strong&gt;&lt;/a&gt;, adding &lt;strong&gt;11 pull requests&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;Each of these individuals has consistently demonstrated their commitment to enhancing the Jenkins project, contributing their expertise to advance our goals, and mentoring and supporting new contributors along the way.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;supporting-our-maintainers-and-community&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#supporting-our-maintainers-and-community&quot; /&gt;Supporting Our Maintainers and Community&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The proactive involvement of our project maintainers has been instrumental in the success of Hacktoberfest this year.
Their dedication to preparing repositories by adding relevant topics and tags to ensure clear, accessible contribution guidelines has been crucial.
Our heartfelt thanks go out to all maintainers for fostering a supportive environment for our contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;looking-forward-to-hacktoberfest-2025&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-forward-to-hacktoberfest-2025&quot; /&gt;Looking Forward to Hacktoberfest 2025&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With an eye towards next year’s Hacktoberfest, we are keen to build on our success and continue improving our engagement with both long-standing community members and those new to the world of open source.
We hope to keep enriching our processes and support frameworks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community is proud of what we’ve achieved together and looks forward to welcoming more individuals into our ongoing open-source projects.
If you are interested in &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;contributing&lt;/a&gt; or learning more about our activities, we encourage you to engage with us.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://community.jenkins.io/t/hacktoberfest-2024/20812&quot;&gt;Join our discussions&lt;/a&gt; and help shape the future of Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/11/07/update-center-brownouts-6/</id>
<title>Brownout on Update Center (updates.jenkins.io):
 07 and 08 November 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-11-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/11/07/update-center-brownouts-6/" />
<category term='jenkins'></category>
<category term='jenkins-infra'></category>
<category term='update-center'></category>
<summary>
Summary (TL;DR)


Note: this is a follow up of the 24 and 25 October 2024 24 hours brownout.


The service https://updates.jenkins.io will switch its implementation to a new system during 1 day:




From Thursday 7 November 2024 09:00 am UTC until Friday 8 November 2024 09:00 am UTC




All Jenkins users are impacted but should not see any functional change.


⚠️ Please check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.


Under the hood, any HTTP request made to this service will be redirected to a mirror close to the users' location during these brownouts.




What...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-tldr&quot; /&gt;Summary (&lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:Too_long;_didn%27t_read&quot;&gt;TL;DR&lt;/a&gt;)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note: this is a follow up of &lt;a href=&quot;https://www.jenkins.io/blog/2024/10/24/update-center-brownouts-5/&quot;&gt;the 24 and 25 October 2024 24 hours brownout&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The service &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;https://updates.jenkins.io&lt;/a&gt; will switch its implementation to a new system during 1 day:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;From Thursday 7 November 2024 09:00 am UTC until Friday 8 November 2024 09:00 am UTC&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Jenkins users are impacted but should not see any functional change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;⚠️ Please check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under the hood, any HTTP request made to this service will be redirected to a mirror close to the users&#39; location during these brownouts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-update-center&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-update-center&quot; /&gt;What is the &quot;Update Center&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;Update Center&lt;/a&gt; is a web server at the core of the Jenkins public infrastructure that distributes the plugins, tool installers, and versions index to all Jenkins servers across the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the installation wizard to regular plugin updates, if you run Jenkins, then you use this service under the hood.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, it serves around 50 Tb of data (outbound bandwidth) each month from a single virtual machine on AWS, which costs around $6,000 per month.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins infrastructure team has worked relentlessly over the past years to implement a new sustainable implementation for this service in order to sustain and improve it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new Update Center implementation features a highly available system that redirects user requests to a download mirror close to their location.
Additional information is available in the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;GitHub issue&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-this-sixth-brownout&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-this-sixth-brownout&quot; /&gt;Why this Sixth &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Brownout_(electricity)&quot;&gt;Brownout&lt;/a&gt;&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our functional tests and performance tests are meeting our expectations after the initial work and the five brownouts we ran.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However the previous (fifth) brownout raised 2 issues:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We miss some directory listings that are present on the current infra and are not available on mirrors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We’ve also added log retain from Cloudflare to Datadog that should help if HTTP/404 errors still occur after 8-9 hours or production usage due to network file share (SMB/CIFS) issues with Apache. The service is self-healing but we are trying to fine-tune this: if it fails, then we’ll have to update the Apache architecture to stop using a network file share. See &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/4312&quot; class=&quot;bare&quot;&gt;https://github.com/jenkins-infra/helpdesk/issues/4312&lt;/a&gt; for details.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As such, a sixth brownout serves to verify the above (minor) problems are solved under a production workload, this should be the last brownout.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We plan a full migration to this new infrastructure for Monday 18 November, more information on this to come.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how&quot; /&gt;How&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both current and new Update Centers are updated at the same time and serve the same index.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting 12 weeks ago, the Jenkins infrastructure has been using the new Update Center (&lt;a href=&quot;https://azure.updates.jenkins.io&quot;&gt;azure.updates.jenkins.io&lt;/a&gt;) with a client-side DNS override (&lt;code&gt;updates.jenkins.io&lt;/code&gt; hostname points to this new service).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this brownout, we’ll simply switch the DNS entry &lt;code&gt;updates.jenkins.io&lt;/code&gt; to this new service and watch for the logs and error rate.
At the end, we’ll switch DNS back to the normal service and then analyze metrics and logs to see how the system behaved.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are confident the new system will perform as expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;helpdesk ticket&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/11/01/jenkins-csp-project-update/</id>
<title>Advancing Security: Jenkins Content Security Policy (CSP) Project Progress</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-11-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/11/01/jenkins-csp-project-update/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='open-source'></category>
<category term='security'></category>
<category term='csp'></category>
<category term='alpha-omega'></category>
<category term='plugins'></category>
<summary>
Security is a core focus at Jenkins, and through the Content Security Policy (CSP) grant from the Alpha-Omega Foundation, we&#8217;re reinforcing our commitment to the stability and safety of our community.
After weeks of progress, collaboration, and technical challenges, it&#8217;s time to share where we are and what’s next.


Why CSP Matters


With Jenkins as a crucial tool for thousands worldwide, securing its ecosystem is essential.
CSP, a modern web security protocol, helps shield applications from injection attacks like cross-site scripting (XSS).
This project, supported by Alpha-Omega, represents a three-month push to integrate and enhance CSP across Jenkins, thanks to the dedication of developers Shlomo...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Security is a core focus at Jenkins, and through the &lt;a href=&quot;https://www.jenkins.io/blog/2024/10/04/content-security-policy-grant/&quot;&gt;Content Security Policy (CSP) grant&lt;/a&gt; from the Alpha-Omega Foundation, we’re reinforcing our commitment to the stability and safety of our community.
After weeks of progress, collaboration, and technical challenges, it’s time to share where we are and what’s next.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-csp-matters&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-csp-matters&quot; /&gt;Why CSP Matters&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Jenkins as a crucial tool for thousands worldwide, securing its ecosystem is essential.
&lt;a href=&quot;https://content-security-policy.com/&quot;&gt;CSP&lt;/a&gt;, a modern web security protocol, helps shield applications from injection attacks like cross-site scripting (XSS).
This project, supported by Alpha-Omega, represents a three-month push to integrate and enhance CSP across Jenkins, thanks to the dedication of developers &lt;a href=&quot;https://www.jenkins.io/blog/authors/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt; and &lt;a href=&quot;https://github.com/yaroslavafenkin&quot;&gt;Yaroslav Afenkin&lt;/a&gt;, and the oversight of &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; and myself.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;milestones-and-achievements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#milestones-and-achievements&quot; /&gt;Milestones and Achievements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;acceptance-testing-success&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acceptance-testing-success&quot; /&gt;Acceptance Testing Success&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of our most significant milestones has been the dramatic improvement in our Acceptance Test Harness (ATH) results.
Starting from a challenging position, we’ve achieved remarkable progress:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Initial CSP compatibility testing showed numerous issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Current status: Only 5 remaining failures in restrictive mode.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Represents a major step toward full CSP implementation.&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;plugin-modernization-campaign&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-modernization-campaign&quot; /&gt;Plugin Modernization Campaign&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our team has systematically worked through the Jenkins plugin ecosystem, modernizing and securing critical components.
Key highlights include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;high-impact-releases&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#high-impact-releases&quot; /&gt;High-Impact Releases&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve successfully updated and released over 20 widely used plugins with improved CSP compatibility, including:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Core plugins like &lt;a href=&quot;https://plugins.jenkins.io/maven-plugin/&quot;&gt;Maven&lt;/a&gt;, &lt;a href=&quot;https://plugins.jenkins.io/subversion/&quot;&gt;Subversion&lt;/a&gt;, and &lt;a href=&quot;https://plugins.jenkins.io/junit/&quot;&gt;JUnit&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Critical workflow components such as the &lt;a href=&quot;https://plugins.jenkins.io/branch-api/&quot;&gt;Branch API&lt;/a&gt;and &lt;a href=&quot;https://plugins.jenkins.io/workflow-support/&quot;&gt;Workflow Support&lt;/a&gt; plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Popular visualization tools like the &lt;a href=&quot;https://plugins.jenkins.io/echarts-api/&quot;&gt;ECharts API&lt;/a&gt; plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jquery-modernization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jquery-modernization&quot; /&gt;jQuery Modernization&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A special focus has been placed on modernizing jQuery usage across plugins, with notable improvements:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Upgrading plugins from jQuery 1.x to 3.x.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removing inline JavaScript.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implementing modern event-handling patterns.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;community-impact&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-impact&quot; /&gt;Community Impact&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This initiative isn’t just about code changes — it’s about building a more secure foundation for the entire Jenkins community.
Our work has:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Enhanced security for thousands of Jenkins installations worldwide.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provided a clear path forward for plugin maintainers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Created examples for future CSP implementations.&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;looking-forward&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#looking-forward&quot; /&gt;Looking Forward&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we move into the second phase of this project, we’re focusing on:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Completing the remaining critical plugin updates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finalizing CSP scanner tooling for automated vulnerability detection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating comprehensive documentation for maintainers and users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Preparing for a potential expanded project in 2025.&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;get-involved&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-involved&quot; /&gt;Get Involved&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We welcome community participation in this important security initiative.
You can help by:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Testing your plugins with CSP enabled.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reporting any CSP-related issues you encounter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contributing to plugin modernization efforts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information about the CSP implementation project or to get involved, visit our &lt;a href=&quot;https://www.jenkins.io/doc/developer/security/csp/&quot;&gt;CSP documentation page&lt;/a&gt;.&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;Special thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; for technical leadership, &lt;a href=&quot;https://www.jenkins.io/blog/authors/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt; and &lt;a href=&quot;https://github.com/yaroslavafenkin&quot;&gt;Yaroslav Afenkin&lt;/a&gt; for the hard work, &lt;a href=&quot;https://www.jenkins.io/blog/authors/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt; for his &lt;a href=&quot;https://github.com/daniel-beck/csp-scanner&quot;&gt;CSP-flaw-finding tool&lt;/a&gt;, and the Alpha-Omega Foundation for making this work possible through their generous grant.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/10/25/jenkins-tutorial-revamp/</id>
<title>Revamping Jenkins Tutorials: A Journey to Simplicity and Inclusivity</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-10-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/10/25/jenkins-tutorial-revamp/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='vienna'></category>
<category term='cdf'></category>
<category term='open-source'></category>
<category term='outreach'></category>
<category term='cdf'></category>
<category term='docker'></category>
<category term='tutorials'></category>
<summary>
Introduction: Transforming Jenkins tutorials


Technical tutorials often present challenges to developers, particularly when learning complex systems like Jenkins.
The existing Jenkins tutorials, while comprehensive, had become a significant barrier to entry for many developers, especially those new to continuous integration and deployment.


During the Open Source Summit Europe 2024, the Continuous Delivery Foundation (CDF) organized a mini summit.
The CFP committee accepted our presentation on the Jenkins tutorials modernization project, which was completed during Google Summer of Code 2023.
This initiative was presented alongside other valuable contributions from various CDF projects.
We are grateful to the CDF for providing this platform to share our work.


This blog...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introduction-transforming-jenkins-tutorials&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introduction-transforming-jenkins-tutorials&quot; /&gt;Introduction: Transforming Jenkins tutorials&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Technical tutorials often present challenges to developers, particularly when learning complex systems like Jenkins.
The existing Jenkins tutorials, while comprehensive, had become a significant barrier to entry for many developers, especially those new to continuous integration and deployment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the &lt;a href=&quot;https://events.linuxfoundation.org/archive/2024/open-source-summit-europe/&quot;&gt;Open Source Summit Europe 2024&lt;/a&gt;, the Continuous Delivery Foundation (CDF) organized a &lt;a href=&quot;https://cd.foundation/cd-mini-summit-vienna/&quot;&gt;mini summit&lt;/a&gt;.
The CFP committee accepted our presentation on the Jenkins tutorials modernization project, which was completed during Google Summer of Code 2023.
This initiative was presented alongside &lt;a href=&quot;https://cd.foundation/cd-mini-summit-vienna/program/&quot;&gt;other valuable contributions&lt;/a&gt; from various CDF projects.
We are grateful to the &lt;a href=&quot;https://cd.foundation&quot;&gt;CDF&lt;/a&gt; for providing this platform to share our work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post accompanies that presentation and details our systematic approach to redesigning the Jenkins tutorials.
We’ll examine how we transformed complex setup procedures into streamlined, accessible guides using modern tooling and best practices.
The discussion will cover the challenges we encountered, the technical solutions we implemented, and the measurable improvements achieved through these changes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-problem-old-jenkins-tutorials&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-problem-old-jenkins-tutorials&quot; /&gt;The Problem: Old Jenkins tutorials&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-visual-comparison&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-visual-comparison&quot; /&gt;A visual comparison&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before we dive into the specifics, let’s take a visual journey through the old and new tutorial experiences:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; src=&quot;https://www.youtube.com/embed/jVOpNnOXr_s?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Did you notice how much scrolling was required on the right side?
It was like a never-ending story.
And did you see the amount of code users had to copy-paste?
While we’ll always need a certain quantity of code for the Jenkins pipeline itself, the setup process should be as simple as possible.
That wasn’t the case with the old tutorials.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;breaking-down-the-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#breaking-down-the-issues&quot; /&gt;Breaking down the issues&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our old tutorials, while comprehensive, presented several significant challenges:&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;&lt;strong&gt;Overwhelming complexity&lt;/strong&gt;: Users were bombarded with Docker commands before they could even start learning about Jenkins.
The tutorial assumed users were Docker gurus, throwing commands at them like there’s no tomorrow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assumptions about user knowledge&lt;/strong&gt;: The tutorials assumed a high level of Docker expertise.
But let me ask you this: how many of you knew Docker really well the first time you tried Jenkins?
That’s not a fair expectation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lengthy setup process&lt;/strong&gt;: A significant portion of the tutorial was dedicated to setup rather than learning Jenkins itself.
We were spending more time with Docker than with Jenkins!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reliance on outdated tools&lt;/strong&gt;: We were heavily dependent on the deprecated Blue Ocean plugin, which was no longer recommended.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker in Docker&lt;/strong&gt;: The old tutorial used Docker in Docker, which is considered a bad practice from a security standpoint.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lack of context&lt;/strong&gt;: The tutorials often lacked explanations for why certain steps were necessary, leaving users to blindly follow instructions without understanding.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a snippet from the old Maven tutorial to illustrate these points:&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;docker network create jenkins
docker run &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; jenkins-docker &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--rm&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--detach&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--privileged&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--network&lt;/span&gt; jenkins &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--network-alias&lt;/span&gt; docker &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--env&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;DOCKER_TLS_CERTDIR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/certs &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--volume&lt;/span&gt; jenkins-docker-certs:/certs/client &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--volume&lt;/span&gt; jenkins-data:/var/jenkins_home &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--publish&lt;/span&gt; 2376:2376 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  docker:dind &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--storage-driver&lt;/span&gt; overlay2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This command, while functional, is overwhelming for beginners and lacks context.
Why do we need a Docker network?
Why are we running Docker in Docker?
These questions were left unanswered.&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;the-solution-revamping-with-docker-compose&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-solution-revamping-with-docker-compose&quot; /&gt;The Solution: Revamping with Docker Compose&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After much deliberation and feedback, we decided to leverage &lt;a href=&quot;https://docs.docker.com/compose/intro/compose-application-model/&quot;&gt;Docker Compose&lt;/a&gt; to simplify the entire setup process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-docker-compose&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-docker-compose&quot; /&gt;Why Docker Compose?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Docker Compose can encapsulate complex multi-container setups into a single, easy-to-understand file.
It is the only tool that can handle the complexity of the Jenkins controller and agent setup while making it accessible to newcomers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s an example of how Docker Compose simplifies things:&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;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkins/jenkins:lts&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&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;8080:8080&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&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;s&quot;&gt;jenkins_home:/var/jenkins_home&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;agent&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkins/ssh-agent:jdk17&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&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;s&quot;&gt;JENKINS_AGENT_SSH_PUBKEY=&amp;lt;your_public_key&amp;gt;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;jenkins_home&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;With this setup, users can start Jenkins and an agent with a single command: &lt;code&gt;docker compose up -d&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;key-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-improvements&quot; /&gt;Key improvements&lt;/h3&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;Simplified setup&lt;/strong&gt;: Instead of a series of complex Docker commands, users can now get started with a single Docker Compose command.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reduced assumptions&lt;/strong&gt;: By encapsulating the setup in Docker Compose, we removed the need for extensive Docker knowledge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Focus on Jenkins&lt;/strong&gt;: With a streamlined setup, users can dive into learning Jenkins faster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modernized tools&lt;/strong&gt;: We replaced outdated plugins like Blue Ocean with more current solutions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Elimination of Docker in Docker&lt;/strong&gt;: Our new setup avoids this security risk entirely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contextual guidance&lt;/strong&gt;: We’ve added explanations for each step, helping users understand why they’re performing certain actions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-process-collaboration-and-innovation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-process-collaboration-and-innovation&quot; /&gt;The Process: Collaboration and innovation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This revamp was a collaborative effort, with significant contributions from our Google Summer of Code participant, &lt;a href=&quot;https://www.jenkins.io/blog/authors/ash-sxn&quot;&gt;Ashutosh Saxena&lt;/a&gt;.
His fresh perspective as a newcomer to Jenkins was invaluable in identifying pain points that we, as experienced developers, had overlooked.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;key-innovations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-innovations&quot; /&gt;Key innovations&lt;/h3&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;Multi-architecture support&lt;/strong&gt;: We ensured our Docker images work on both &lt;code&gt;x86_64&lt;/code&gt; and &lt;code&gt;ARM64&lt;/code&gt; architectures.
This was a significant challenge that Ashutosh tackled using Docker’s &lt;code&gt;buildx&lt;/code&gt; tool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitPod integration&lt;/strong&gt;: We made Jenkins accessible directly from the browser, reducing hardware barriers to entry.
This was particularly important for users with less powerful machines or those in environments with limited resources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker Compose profiles&lt;/strong&gt;: We introduced profiles for different languages and technologies, making it easy to switch between setups.
For example, users can start a Maven-specific setup with &lt;code&gt;docker compose --profile maven up -d&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automated updates&lt;/strong&gt;: We implemented automation to keep our Docker images up-to-date, using tools like &lt;a href=&quot;https://docs.github.com/en/code-security/dependabot&quot;&gt;Dependabot&lt;/a&gt; and &lt;a href=&quot;https://www.updatecli.io/&quot;&gt;UpdateCLI&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-result-a-more-inclusive-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-result-a-more-inclusive-jenkins&quot; /&gt;The Result: A More inclusive Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The outcome of our efforts is a Jenkins experience that’s more inclusive than ever.
Let’s break down the key improvements:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-simplified-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-simplified-setup&quot; /&gt;1. Simplified setup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users can now get Jenkins running with a single command. Here’s how straightforward it is:&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;Clone the repository: &lt;code&gt;git clone &lt;a href=&quot;https://github.com/jenkins-docs/quickstart-tutorials.git&quot; class=&quot;bare&quot;&gt;https://github.com/jenkins-docs/quickstart-tutorials.git&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the directory: &lt;code&gt;cd quickstart-tutorials&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start Jenkins: &lt;code&gt;docker compose --profile &amp;lt;tutorial_name&amp;gt; up -d&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s it! No more complex Docker commands or manual configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-browser-based-access-with-gitpod&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-browser-based-access-with-gitpod&quot; /&gt;2. Browser-based access with GitPod&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to GitPod integration, Jenkins is now just a click away, even on less powerful devices.
This cloud-based approach brings several key advantages for accessibility and ease of use:&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;&lt;em&gt;*One-Click Setup*&lt;/em&gt;: The repository’s &lt;code&gt;README&lt;/code&gt; contains a &lt;a href=&quot;https://gitpod.io/#https://github.com/jenkins-docs/quickstart-tutorials&quot;&gt;GitPod link&lt;/a&gt; that launches Jenkins instantly.
With the GitPod Chrome extension installed, you’ll see a prominent green button that makes the process even smoother.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;*Resource-Friendly*&lt;/em&gt;: GitPod provides 50 hours of free monthly usage, making Jenkins accessible to users regardless of their local hardware capabilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;*Bandwidth Optimization*&lt;/em&gt;: Since GitPod handles the heavy lifting of downloading Docker images, users can get started quickly even with limited internet connectivity - whether they’re working from a train, a remote location, or a region with restricted bandwidth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;*Familiar Development Environment*&lt;/em&gt;: Users get instant access to a Visual Studio Code-like IDE and terminal, complete with clear instructions for their chosen tutorial.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a quick demonstration of the GitPod integration in action:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; src=&quot;https://www.youtube.com/embed/WsH7yL5chow?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, users have some instructions and a command to copy-paste in the terminal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After pasting the command in the terminal, the setup process begins automatically.
Docker images are pulled efficiently through GitPod’s infrastructure, preserving your local bandwidth.
The Jenkins controller and agent containers are launched, and a browser tab automatically opens to display the Jenkins interface.
The entire process takes less than a minute - a significant improvement over traditional setup methods.
Since we’ve streamlined the authentication process, you can log in immediately using the credentials (&lt;code&gt;admin&lt;/code&gt;/&lt;code&gt;admin&lt;/code&gt;) and begin your Jenkins journey.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; src=&quot;https://www.youtube.com/embed/oEcreaxR6MQ?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Expanding the window reveals the full Jenkins interface.
Upon logging in with the tutorial credentials (&lt;code&gt;admin&lt;/code&gt;/&lt;code&gt;admin&lt;/code&gt;), you’ll immediately notice several key features: a pre-configured job and an active agent visible in the left sidebar.
This job, while simple, serves an important purpose — it demonstrates that both your Jenkins controller is operational and the agent is properly connected.
Navigating to &quot;&lt;em&gt;`Manage Jenkins`&lt;/em&gt;&quot; shows that all plugins are current, eliminating any need for initial administrative setup.
The bottom right corner displays the current Jenkins LTS version (&lt;code&gt;2.462.2&lt;/code&gt; at the time of recording), confirming you’re working with the latest stable release.
This streamlined environment allows users to focus entirely on learning Jenkins, without getting caught up in configuration details.
The entire setup process, from start to finish, takes less than two minutes and requires no local installation — perfectly aligned with our goal of making Jenkins more accessible to everyone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; src=&quot;https://www.youtube.com/embed/pEaWpCm1xLU?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The GitPod terminal output illustrates another key innovation: our implementation of Docker Compose profiles for various programming languages and technologies.
This feature exemplifies our commitment to simplicity — switching between different technology stacks, whether Maven, Python, or Node.js, requires only a single command: &lt;code&gt;docker compose --profile maven up -d&lt;/code&gt;.
The system handles all the complexity behind the scenes, delivering a seamless experience that lets developers focus on learning Jenkins rather than wrestling with configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This streamlined approach reflects our broader commitment to inclusivity.
Through multi-architecture support and browser-based accessibility via GitPod, we’ve created an environment where developers of all experience levels and technical resources can engage with Jenkins effectively.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;3-flexible-configurations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-flexible-configurations&quot; /&gt;3. Flexible configurations&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Docker Compose profiles allow easy switching between different tech stacks.
Whether you’re working with Maven, Python, or Node.js, you can start the appropriate environment with a simple profile switch.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;4-up-to-date-and-secure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#4-up-to-date-and-secure&quot; /&gt;4. Up-to-date and secure&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By eliminating Docker in Docker and implementing automated updates, we’ve made the tutorials more secure and easier to maintain.&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;the-impact-before-and-after&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-impact-before-and-after&quot; /&gt;The Impact: Before and after&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The impact of these changes has been significant and far-reaching:&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;&lt;strong&gt;Increased adoption&lt;/strong&gt;: Our Docker images have been downloaded over 26,000 times since launch.
We’ve seen multiple forks of the project, with people using it to create their own Jenkins instances for other technologies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Educational benefits&lt;/strong&gt;: University professors have incorporated these tutorials into their CI/CD curricula.
One teacher reported that his students, most of whom had never used Jenkins before, were able to get up and running in minutes.
The simplification helped them focus on learning Jenkins rather than fighting with the setup process.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community engagement&lt;/strong&gt;: We’ve seen regular clones and forks of the repository, indicating active use of our tutorials.
Referrals come not just from jenkins.io, but also from Reddit, Medium, and Google searches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unexpected benefits&lt;/strong&gt;: The new setup has even facilitated testing of major Jenkins upgrades.
For example, it’s being used to test the ongoing migration to Spring Security 6.x and Spring Framework 6.x.
This allows anyone to launch transitional versions of Jenkins with one command and provide valuable feedback on the progress.&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;the-future-call-to-action&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-future-call-to-action&quot; /&gt;The Future: Call to action&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we’ve made significant strides, our work is far from over.
We’re constantly looking for ways to improve Jenkins, and that’s where you come in.
Whether you’re a seasoned developer or a complete newcomer, your feedback and contributions are invaluable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage you to:&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;Try out &lt;a href=&quot;https://www.jenkins.io/doc/tutorials/#tools&quot;&gt;the new tutorials&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-docs/quickstart-tutorials/issues&quot;&gt;Provide feedback&lt;/a&gt; on your experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contribute ideas or code to further improve the tutorials.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://community.jenkins.io/&quot;&gt;Share your experience&lt;/a&gt; with the community.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remember, Jenkins is a community-driven project.
Your input shapes its future!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;upcoming-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upcoming-improvements&quot; /&gt;Upcoming improvements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re already planning the next phase of improvements:&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;Expanding the range of technology-specific profiles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Further refining the GitPod experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exploring integration with other cloud development environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continuously updating our documentation to reflect best practices.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&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;The Jenkins tutorials modernization project has significantly transformed the onboarding experience for new users.
Through careful redesign and modern tooling, we’ve created a more accessible and efficient learning environment that accommodates developers across all experience levels.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The implementation of Docker Compose, GitPod integration, and comprehensive documentation has established a robust foundation for future Jenkins users.
These improvements serve our core mission of making continuous integration and deployment accessible to all developers, regardless of their prior experience with DevOps tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We invite you to experience these improvements firsthand by exploring our updated tutorials.
Your feedback and contributions will help shape the future of Jenkins documentation and training resources.
For a detailed overview of this modernization effort, you can view the complete presentation from the CDF Summit here: &lt;a href=&quot;https://www.youtube.com/watch?v=8rHtgzZGNLY&amp;amp;list=PL2KXbZ9-EY9R_boit2YAwAiCPdcI0Y44J&amp;amp;index=5&amp;amp;ab_channel=ContinuousDeliveryFoundation&quot;&gt;presentation recording&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/10/24/update-center-brownouts-5/</id>
<title>Brownout on Update Center (updates.jenkins.io):
 24 and 25 October 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-10-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/10/24/update-center-brownouts-5/" />
<category term='jenkins'></category>
<category term='jenkins-infra'></category>
<category term='update-center'></category>
<summary>
Summary (TL;DR)


Note: this is a follow up of the 26 and 27 September 24 hours brownout.


The service https://updates.jenkins.io will switch its implementation to a new system during 1 day:




From Thursday 24 October 2024 from 10:00am UTC until Friday 25 October 2024 10:00am UTC




All Jenkins users are impacted but should not see any functional change.


⚠️ Please, check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.


Under the hood, any HTTP request made to this service will be redirected to a mirror close to user locations during these brownouts.




What is the "Update...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-tldr&quot; /&gt;Summary (&lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:Too_long;_didn%27t_read&quot;&gt;TL;DR&lt;/a&gt;)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note: this is a follow up of &lt;a href=&quot;https://www.jenkins.io/blog/2024/09/25/update-center-brownouts-4/&quot;&gt;the 26 and 27 September 24 hours brownout&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The service &lt;a href=&quot;https://updates.jenkins.io&quot; class=&quot;bare&quot;&gt;https://updates.jenkins.io&lt;/a&gt; will switch its implementation to a new system during 1 day:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;From Thursday 24 October 2024 from 10:00am UTC until Friday 25 October 2024 10:00am UTC&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Jenkins users are impacted but should not see any functional change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;⚠️ Please, check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under the hood, any HTTP request made to this service will be redirected to a mirror close to user locations during these brownouts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-update-center&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-update-center&quot; /&gt;What is the &quot;Update Center&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;Update Center&lt;/a&gt; is a web server at the core of the Jenkins public infrastructure which distributes the plugins, tool installers, and versions index to all Jenkins servers across the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the installation wizard to regular plugin updates, if you run Jenkins, then you use this service under the hood.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, it serves around 50 Tb of data (outbound bandwidth) each month from a single virtual machine on AWS, which costs around $6,000 per month.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to sustain this service and improve it, the Jenkins infrastructure team has worked relentlessly during the past years to have a new sustainable implementation for this service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new Update Center implementation features a highly available system that redirects user requests to a download mirror close to their location.
Additional information is available in the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;GitHub issue&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-this-fifth-brownout&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-this-fifth-brownout&quot; /&gt;Why this Fifth &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Brownout_(electricity)&quot;&gt;Brownout&lt;/a&gt;&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our functional tests and performance tests are meeting our expectations after the initial work and the four brownouts we ran.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However the previous (fourth) brownout raised 2 issues:
- We’ve seen (and were reported) HTTP/404 errors due to broken links in some HTML pages (not used a lot) and missing endpoints used for healthchecks in &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/4311&quot; class=&quot;bare&quot;&gt;https://github.com/jenkins-infra/helpdesk/issues/4311&lt;/a&gt;
- We’ve also seen HTTP/404 errors after 8-9 hours or production usage due to network file share (SMB/CIFS) issues with Apache. The service is self-healing but we are trying to fine tune this: if it fails, then we’ll have to update the Apache architecture to stop using a network file share. See &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/4312&quot; class=&quot;bare&quot;&gt;https://github.com/jenkins-infra/helpdesk/issues/4312&lt;/a&gt; for details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As such, a fifth brownout serves to verify the above (minor) problems are solved under a production workload.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how&quot; /&gt;How&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both current and new Update Centers are updated at the same time and serve the same index.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting 12 weeks ago, the Jenkins infrastructure has been using the new Update Center (&lt;a href=&quot;https://azure.updates.jenkins.io&quot;&gt;azure.updates.jenkins.io&lt;/a&gt;) with a client-side DNS override (&lt;code&gt;updates.jenkins.io&lt;/code&gt; hostname points to this new service).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this brownout, we’ll simply switch the DNS entry &lt;code&gt;updates.jenkins.io&lt;/code&gt; to this new service and watch for the logs and error rate.
At the end, we’ll switch DNS back to the normal service and then analyze metrics and logs to see how the system behaved.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are confident the new system will perform as expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;helpdesk ticket&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/10/04/content-security-policy-grant/</id>
<title>Alpha Omega Foundation Content Security Policy Grant</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-10-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/10/04/content-security-policy-grant/" />
<category term='donation'></category>
<summary>
Alpha-Omega has provided a grant for three months of full-time work to improve the Jenkins implementation of Content Security Policy.
The improvements will be implemented in October, November, and December of 2024.
Shlomo Dahan is implementing the improvements with technical guidance from Basil Crow and project management support from Bruno Verachten.


Alpha-Omega is an associated project of the OpenSSF, established in February 2022, funded by Microsoft, Google, and Amazon.
The mission of Alpha-Omega is to protect society by catalyzing sustainable security improvements to the most critical open-source software projects and ecosystems.
Alpha-Omega has funded security improvements in major open-source projects like the Linux Kernel, Rust...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alpha-Omega has provided a grant for three months of full-time work to improve the &lt;a href=&quot;https://www.jenkins.io/doc/developer/security/csp/&quot;&gt;Jenkins implementation&lt;/a&gt; of &lt;a href=&quot;https://content-security-policy.com/&quot;&gt;Content Security Policy&lt;/a&gt;.
The improvements will be implemented in October, November, and December of 2024.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt; is implementing the improvements with technical guidance from &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; and project management support from &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://alpha-omega.dev/&quot;&gt;Alpha-Omega&lt;/a&gt; is an associated project of the OpenSSF, established in February 2022, funded by Microsoft, Google, and Amazon.
The mission of Alpha-Omega is to protect society by catalyzing sustainable security improvements to the most critical open-source software projects and ecosystems.
Alpha-Omega has &lt;a href=&quot;https://alpha-omega.dev/grants/grantrecipients/&quot;&gt;funded security improvements&lt;/a&gt; in major open-source projects like the Linux Kernel, Rust Foundation, FreeBSD, Node.js, Ruby Central, and the Eclipse Foundation.
We are sincerely grateful for this grant to the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-content-security-policy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-content-security-policy&quot; /&gt;What is Content Security Policy?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From &lt;a href=&quot;https://content-security-policy.com/&quot;&gt;content-security-policy.com&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Content-Security-Policy&lt;/em&gt; is the name of a HTTP response header that modern browsers use to enhance the security of the document (or web page). The Content-Security-Policy header allows you to restrict which resources (such as JavaScript, CSS, Images, etc.) can be loaded and the URLs that they can be loaded from.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using Content-Security-Policy (CSP), injection attacks like cross-site scripting can be prevented.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-a-grant-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-a-grant-for-jenkins&quot; /&gt;Why a grant for Jenkins?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is the leading open-source automation server.
It provides critical capabilities to organizations around the world as they create, test, and deploy software.
Improving the security of the Jenkins project aligns very well with the Alpha-Omega mission for &quot;sustainable security improvements to the most critical open source software projects&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We hope that the successful completion of this 3-month project will result in additional funding and an expanded project in 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;who-is-working-on-the-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#who-is-working-on-the-project&quot; /&gt;Who is working on the project?&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://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; is the technical lead of the project. He’ll provide guidance, mentoring, and assistance for the implementation.&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/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt; is the project manager. He’ll provide regular progress reports to Alpha-Omega.&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/authors/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt; is the developer who will implement the improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/10/03/jenkins-election-candidates/</id>
<title>2024 Jenkins Election Candidate Statements</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-10-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/10/03/jenkins-election-candidates/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
Candidate nominations for the 2024 Jenkins elections are now complete.
Thanks to everyone who submitted nominations and to the candidates that have accepted the nominations.


Register to vote


Voters must register an account on the Jenkins community forums and must have made at least one contribution to Jenkins before September 1, 2024.
You can use an existing GitHub account or create a new account specifically for Jenkins community forums.







Candidate statements


This announcement shares the election candidates and their statements.
Nominees for the Jenkins governance board include:




Alex Earl


Alexander Brandes


Kris Stern


Oleg Nenashev


Stefan Spieker


Valentin Delaye




Nominees for the Jenkins release officer include:




Alex Earl


Tim Jacomb




As in years past, when a particular...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Candidate nominations for the 2024 Jenkins elections are now complete.
Thanks to everyone who submitted nominations and to the candidates that have accepted the nominations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;register-to-vote&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#register-to-vote&quot; /&gt;Register to vote&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voters must register an account on the &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&lt;/a&gt; and must have made at least one contribution to Jenkins before September 1, 2024.
You can use an existing GitHub account or create a new account specifically for &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&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;a class=&quot;image&quot; href=&quot;https://community.jenkins.io/g/election-voter-2024&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/register-button.png&quot; alt=&quot;register button&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;candidate-statements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#candidate-statements&quot; /&gt;Candidate statements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This announcement shares the election candidates and their statements.
Nominees for the Jenkins governance board include:&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;#slide_o_mix-board&quot;&gt;Alex Earl&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#krisstern&quot;&gt;Kris Stern&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#oleg_nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#stefan_spieker&quot;&gt;Stefan Spieker&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#jonesbusy&quot;&gt;Valentin Delaye&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;Nominees for the Jenkins release officer include:&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;#slide_o_mix-officer&quot;&gt;Alex Earl&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#timja&quot;&gt;Tim Jacomb&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;As in years past, when a particular role receives only one nomination, an election is not required.
Officers that do not require an election include:&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/alyssat/&quot;&gt;Alyssa Tong&lt;/a&gt; - Events Officer&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; - Infrastructure Officer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27/&quot;&gt;Kevin Martens&lt;/a&gt; - Documentation Officer&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; - Security Officer&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;board-candidates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#board-candidates&quot; /&gt;Board Candidates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;slide_o_mix-board&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#slide_o_mix-board&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/slide_o_mix/&quot;&gt;Alex Earl&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been involved with Jenkins for many years, going back to the Hudson days.
I got involved in the great community by making some changes that I needed at my company to one of the plugins.
I then became maintainer of that plugin and continued to participate in the IRC channels and discussion forums to help improve Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The community of Jenkins is one of the best features, in my opinion.
The people are helpful, want to provide a great thing to the world, and are so invested in making Jenkins the best it can be.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a member of the Jenkins Governance Board, I would love to continue pushing that community and excellence.
Getting more people involved in development and helping is something I would like to focus on.
A lot of people are intimidated by open source and contributing.
I would like to work on that idea and help lower the barriers for others to get involved, learn, and contribute.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Arm Ltd.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile pages:
&lt;a href=&quot;https://github.com/slide&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/alex-earl-109b091/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/alex-earl/&quot;&gt;Contributor spotlight&lt;/a&gt;,
&lt;a href=&quot;https://community.jenkins.io/u/slide_o_mix/summary&quot;&gt;Jenkins community&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;NotMyFault&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#NotMyFault&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault/&quot;&gt;Alexander Brandes&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been a passionate Jenkins user for almost a decade and have had the privilege of contributing to the project since 2020.
Since 2022, I’ve been serving as a board member, and I’m also part of the release team, a core maintainer, as well as a maintainer of various plugins.
Additionally, I’m involved in the hosting team, where I review and onboard new plugins into the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of my personal highlights this year was participating as a mentor in Google Summer of Code 2024, where I successfully onboarded two students to the Jenkins project.
I ensured their projects were a success, further strengthening the future of the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a board member, I’ve attended various in-person events to represent the Jenkins project and spread the word about our vibrant community.
From FOSDEM 2023 and 2024 to KubeCon 2023, CdCon 2023, and a GSoC meetup in Munich and Sunnyvale, I’ve built strong connections with fellow community members and like-minded individuals.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I firmly believe in the future of Jenkins, especially with the ongoing and upcoming UI/UX rework and the efforts to ensure Jenkins stays ahead of modern technology.
One of our key focuses is ensuring Jenkins can run seamlessly out of the box on platforms like Java 22.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout my time on the project, I’ve documented various in-house workflows, including the LTS release process, and introduced numerous automations to reduce human input.
These efforts help keep Jenkins agile and efficient as we move forward into the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Card4Vend&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/NotMyFault&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/alexander-brandes/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/alexander-brandes/&quot;&gt;Contributor spotlight&lt;/a&gt;,
&lt;a href=&quot;https://community.jenkins.io/u/NotMyFault/summary&quot;&gt;Jenkins community&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stefan_spieker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stefan_spieker&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/stefan_spieker/&quot;&gt;Stefan Spieker&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started contributing regularly in 2019, with a focus on improving quality.
I’m also keeping up with some older plugins that are still really popular, like the &lt;a href=&quot;https://plugins.jenkins.io/thinBackup&quot;&gt;Thin Backup&lt;/a&gt; plugin and the &lt;a href=&quot;https://plugins.jenkins.io/jobConfigHistory&quot;&gt;Job Configuration History&lt;/a&gt; plugin.
The community helped me to bring these back up to standard and I learned a lot along the way. Furthermore, I use these lessons to make regular improvements to the developer documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my day job, I’m a solution architect in a central team that provides Jenkins and DevOps consulting within a big automotive and industrial company.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m already honored to be nominated, but if elected and allowed to serve on the Jenkins Board, I’d love to bring the perspective of bigger enterprises using Jenkins.
I also plan to improve the developer documentation to make it easier for new maintainers to adopt abandoned plugins and keep the Jenkins ecosystem as diverse as it is today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Schaeffler&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile Links:
&lt;a href=&quot;https://github.com/StefanSpieker&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/stefan-spieker-446168161/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/stefan-spieker/&quot;&gt;Contributor spotlight&lt;/a&gt;,
&lt;a href=&quot;https://community.jenkins.io/u/stefanspieker/summary&quot;&gt;Jenkins community&lt;/a&gt;,
&lt;a href=&quot;https://stackoverflow.com/users/1287864/s-spieker&quot;&gt;Stackoverflow&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jonesbusy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jonesbusy&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/jonesbusy/&quot;&gt;Valentin Delaye&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been a Jenkins user since it’s inception in 2011 and contributor since 2018.
As of today I maintain more than 35 plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting of this year I got even more involved in the Jenkins community, by participating as a mentor for the Google Summer of Code to work on the Jenkins Plugin Modernizer Tool, which is a CLI to update plugins at scale using OpenRewrite.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m particularly interested in the &quot;cloud ready&quot; aspect of Jenkins including deployments, packaging (like Jenkinsfile Runner), or distributed storage.
A recent contribution on this topic is the &lt;a href=&quot;https://plugins.jenkins.io/artifactory-artifact-manager/&quot;&gt;Artifactory Artifact Manager plugin&lt;/a&gt; that I authored and maintain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If I’m elected on the Jenkins governance board those will be my subjects of choice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: ELCA Cloud Services&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile Links:
&lt;a href=&quot;https://github.com/jonesbusy&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/valentindelaye/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/valentin-delaye/&quot;&gt;Contributor spotlight&lt;/a&gt;,
&lt;a href=&quot;https://community.jenkins.io/u/jonesbusy/summary&quot;&gt;Jenkins community&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;krisstern&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#krisstern&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern/&quot;&gt;Kris Stern&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been a Jenkins contributor since 2021.
Currently I am a maintainer of four plugins, have been a GSoC org admin and mentor for Jenkins for three years, and continue to be a Jenkins Release Team member.
Academically I have been trained as an observational astrophysicist and obtained my PhD degree from the University of Hong Kong (HKU) in 2021.
I have worked professionally as a software engineer since late 2019, currently working in a AiFi startup.
Currently I am also a part-time MCIT Online student at UPenn.
I am passionate about open source and would like to share my love of open-source software with the others.
I feel grateful to be nominated. If elected, I would love to bring with me a startup mindset to help keep Jenkins perpetually youthful and relevant as well as a welcoming community to newcomers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: GAIB.ai&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile Links:
&lt;a href=&quot;https://github.com/krisstern&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/kris-stern/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/kris-stern/&quot;&gt;Contributor spotlight&lt;/a&gt;,
&lt;a href=&quot;https://community.jenkins.io/u/krisstern/summary&quot;&gt;Jenkins community&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;oleg_nenashev&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#oleg_nenashev&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev/&quot;&gt;Oleg Nenashev&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve participated in Jenkins since 2012, including being a core maintainer since 2014.
I was a governance board member from 2019 for two terms (Dec 2019-2023) and also represented Jenkins on the Continuous Delivery Foundation TOC and the board.
During my work on Jenkins, I participated in many projects including JCasC, pluggable storage, and Jenkinsfile Runner. I also created or maintained around 30 plugins for Jenkins.
Many community programs, including GSoC and Hacktoberfest participation, were initially started by me.
In 2022, I took a sabbatical as a core and plugin maintainer due to the war in Ukraine, but I plan to return to the maintainer roles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me, Jenkins has one of the strongest open source communities, and I am proud to be a part of it.
Should I be elected to the board, my focus will be community growth via onboarding new contributors, improving contributor/developer experience for Jenkins, and facilitating technical partnerships.
The ecosystem evolves and Jenkins should be changing and growing along with that.
For me, the priorities would be adopting open standards,
integrations with the key projects and services in the cloud-native, CI/CD, and Java space, and continuing Jenkins&#39; evolution as a multi-purpose automation framework.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Gradle Inc., CNCF/CDF, API Neuchatel, Independent&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile Links:
&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/onenashev/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://sessionize.com/onenashev&quot;&gt;Sessionize&lt;/a&gt;
&lt;a href=&quot;https://community.jenkins.io/u/oleg-nenashev/summary&quot;&gt;Jenkins community&lt;/a&gt;&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;officer-candidates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#officer-candidates&quot; /&gt;Officer Candidates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;slide_o_mix-officer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#slide_o_mix-officer&quot; /&gt;Release Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/slide_o_mix/&quot;&gt;Alex Earl&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been involved with Jenkins for many years, going back to the Hudson days.
I got involved in the great community by making some changes that I needed at my company to one of the plugins.
I then became maintainer of that plugin and continued to participate in the IRC channels and discussion forums to help improve Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The community of Jenkins is one of the best features, in my opinion.
The people are helpful, want to provide a great thing to the world, and are so invested in making Jenkins the best it can be.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a member of the Jenkins Governance Board, I would love to continue pushing that community and excellence.
Getting more people involved in development and helping is something I would like to focus on.
A lot of people are intimidated by open source and contributing.
I would like to work on that idea and help lower the barriers for others to get involved, learn and contribute.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Arm Ltd.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile pages:
&lt;a href=&quot;https://github.com/slide&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/alex-earl-109b091/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/alex-earl/&quot;&gt;Contributor spotlight&lt;/a&gt;,
&lt;a href=&quot;https://community.jenkins.io/u/slide_o_mix/summary&quot;&gt;Jenkins community&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;timja&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#timja&quot; /&gt;Release Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;Tim Jacomb&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been a user of Jenkins for the last 14 years and a regular contributor since 2018.
I began with maintaining the Slack plugin, and over the last couple of years, I have expanded my experience with several more plugins and Jenkins core.
These are some of the components I maintain when I have time: Slack, Azure Key Vault, Junit, most of the Database plugins, Dark theme, Plugin installation manager, Jenkins Helm chart, and the Configuration as code plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am a member of the Jenkins infrastructure team.
I was involved in the release automation project and the mirrors modernisation effort, along with the day to day support helping people regain access to accounts etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Release Officer, I would like to increase automation, ease onboarding of new contributors to the release team, and ensure that responsibilities rotate among people so that I won’t be a bottleneck for any task.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Kainos&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile pages:
&lt;a href=&quot;https://github.com/timja&quot;&gt;Github&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/tim-jacomb/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/tim-jacomb/&quot;&gt;Contributor spotlight&lt;/a&gt;,
&lt;a href=&quot;https://community.jenkins.io/u/timja/summary&quot;&gt;Jenkins community&lt;/a&gt;&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/2024/09/30/hacktoberfest/</id>
<title>Hacktoberfest 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-09-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/09/30/hacktoberfest/" />
<author>
<name>markewaite</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<category term='newcomer'></category>
<category term='outreach-programs'></category>
<summary>
Hacktoberfest is back!
Join us as we celebrate and support open-source during October.
Contributors can earn badges and improve their open source contribution skills.


The Jenkins community will participate once again in the event.
We invite you to contribute to Jenkins projects but also, as maintainers, to welcome and help newcomers.


Contributors


This is what contributors need to know to participate and complete Hacktoberfest:




Register anytime between September 23 and October 31


Pull requests can be made in any jenkinsci or jenkins-infra GitHub project that&#8217;s participating in Hacktoberfest (look for the "hacktoberfest" topic)


Project maintainers must accept your pull requests for them to count toward your total


Have 4 pull...
</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/hacktoberfest/hacktoberfest_2024_logo.svg&quot; alt=&quot;Hacktoberfest&quot; width=&quot;75%&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://hacktoberfest.com&quot;&gt;Hacktoberfest&lt;/a&gt; is back!
Join us as we celebrate and support open-source during October.
Contributors can earn badges and improve their open source contribution skills.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community will participate once again in the event.
We invite you to contribute to Jenkins projects but also, as maintainers, to welcome and help newcomers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is what &lt;strong&gt;contributors&lt;/strong&gt; need to know to participate and complete Hacktoberfest:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Register anytime between September 23 and October 31&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull requests can be made in any &lt;a href=&quot;https://github.com/orgs/jenkinsci/repositories?q=hacktoberfest&quot;&gt;jenkinsci&lt;/a&gt; or &lt;a href=&quot;https://github.com/orgs/jenkins-infra/repositories?q=hacktoberfest&quot;&gt;jenkins-infra&lt;/a&gt; GitHub project that’s participating in Hacktoberfest (look for the &quot;hacktoberfest&quot; topic)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Project maintainers must accept your pull requests for them to count toward your total&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Have 4 pull requests accepted between October 1 and October 31 to complete Hacktoberfest&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins specific details can be found on the &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest&quot;&gt;Jenkins Hacktoberfest page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some good resources for beginners can be found here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Intro to Open Source&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/tutorial_series/an-introduction-to-open-source&quot;&gt;Introduction to GitHub and Open Source projects&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://opensource.guide/how-to-contribute/&quot;&gt;How to contribute to Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/what-is-open-source&quot;&gt;What is Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/cheatsheets/how-to-use-git-a-reference-guide&quot;&gt;How to use Git&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sharpen your skills&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.github.com/training-kit/&quot;&gt;GitHub training kit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://guides.github.com/introduction/flow/&quot;&gt;Understanding the GitHub flow&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorial_series/an-introduction-to-open-source&quot;&gt;An introduction to Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://opensource.com/article/19/5/how-get-job-doing-open-source&quot;&gt;How Open Source contributions can boost your career&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.blog/2015-01-21-how-to-write-the-perfect-pull-request/&quot;&gt;How to write the perfect Pull Request&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.to/chrissiemhrk/git-commit-message-5e21&quot;&gt;How to write a good commit message&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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://www.jenkins.io/doc/developer/tutorial-improve/&quot;&gt;improve a plugin tutorial&lt;/a&gt; is a video introduction to Jenkins contribution.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;maintainers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#maintainers&quot; /&gt;Maintainers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins plugin &lt;strong&gt;maintainers&lt;/strong&gt; can prepare for Hacktoberfest contributions by following these best practices:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add the &quot;hacktoberfest&quot; topic to your repository to OPT-IN TO HACKTOBERFEST and indicate you’re looking for contributions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the &quot;good first issue&quot; label to issues you want contributors to help with in your GitHub project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a CONTRIBUTING.md file with contribution guidelines to your repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose issues that have a well-defined scope and are self-contained&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be ready to review pull requests, accepting those that are valid by merging them, leaving an overall approving review, or by adding the &quot;hacktoberfest-accepted&quot; label&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reject any spammy requests you receive by labeling them as &quot;spam&quot; and any other invalid contributions by closing them or labeling them as &quot;invalid&quot;&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/2024/09/25/update-center-brownouts-4/</id>
<title>Brownout on Update Center (updates.jenkins.io):
 26 and 27 September 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-09-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/09/25/update-center-brownouts-4/" />
<category term='jenkins'></category>
<category term='jenkins-infra'></category>
<category term='update-center'></category>
<summary>
Summary (TL;DR)


Note: this is a follow up of the 11 and 12 September 24 hours brownout.


The service https://updates.jenkins.io will switch its implementation to a new system during 1 day:




From Thursday 26 September 2024 from 07:00am UTC until Friday 27 September 2024 07:00am UTC




All Jenkins users are impacted but should not see any functional change as we removed the HTTP to HTTPS forced redirection which caused disruptions during the previous brownout.


⚠️ Please, check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.


Under the hood, any HTTP request made to this service...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-tldr&quot; /&gt;Summary (&lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:Too_long;_didn%27t_read&quot;&gt;TL;DR&lt;/a&gt;)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note: this is a follow up of &lt;a href=&quot;https://www.jenkins.io/blog/2024/09/10/update-center-brownouts-3/&quot;&gt;the 11 and 12 September 24 hours brownout&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The service &lt;a href=&quot;https://updates.jenkins.io&quot; class=&quot;bare&quot;&gt;https://updates.jenkins.io&lt;/a&gt; will switch its implementation to a new system during 1 day:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;From Thursday 26 September 2024 from 07:00am UTC until Friday 27 September 2024 07:00am UTC&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Jenkins users are impacted but should not see any functional change as we removed the HTTP to HTTPS forced redirection &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/73760&quot;&gt;which caused disruptions during the previous brownout&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;⚠️ Please, check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under the hood, any HTTP request made to this service will be redirected to a mirror close to user locations during these brownouts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-update-center&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-update-center&quot; /&gt;What is the &quot;Update Center&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;Update Center&lt;/a&gt; is a web server at the core of the Jenkins public infrastructure which distributes the plugins, tool installers, and versions index to all Jenkins servers across the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the installation wizard to regular plugin updates, if you run Jenkins, then you use this service under the hood.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, it serves around 50 Tb of data (outbound bandwidth) each month from a single virtual machine on AWS, which costs around $6,000 per month.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to sustain this service and improve it, the Jenkins infrastructure team has worked relentlessly during the past years to have a new sustainable implementation for this service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new Update Center implementation features a highly available system that redirects user requests to a download mirror close to their location.
Additional information is available in the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;GitHub issue&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-this-fourth-brownout&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-this-fourth-brownout&quot; /&gt;Why this Fourth &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Brownout_(electricity)&quot;&gt;Brownout&lt;/a&gt;&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our functional tests and performance tests are meeting our expectations as described in &lt;a href=&quot;blog/2024/09/10/update-center-brownouts-3/#why-this-brownout&quot;&gt;&quot;Why this brownout&quot; section of previous blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However the previous brownout taught us that enforcing HTTP to HTTPS redirections &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/73760&quot;&gt;caused disruptions for users &lt;/a&gt;.
We decided to support full HTTP temporarily to avoid bad surprises: users are (and will be) encouraged to use the HTTPS URL in the future but let’s do one step at a time!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As such, the fourth brownout serves to verify we don’t have last minute bad surprises.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how&quot; /&gt;How&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both current and new Update Centers are updated at the same time and serve the same index.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting 7 weeks ago, the Jenkins infrastructure has been using the new Update Center (link:https://azure.updates.jenkins.io) with a client-side DNS override (&lt;code&gt;updates.jenkins.io&lt;/code&gt; hostname points to this new service).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this brownout, we’ll simply switch the DNS entry &lt;code&gt;updates.jenkins.io&lt;/code&gt; to this new service and watch for the logs and error rate.
At the end, we’ll switch DNS back to the normal service and then analyze metrics and logs to see how the system behaved.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are confident the new system will perform as expected&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;helpdesk ticket&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/09/25/board-officer-election-announcement/</id>
<title>Voter Registration for Jenkins Board and Officer Elections 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-09-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/09/25/board-officer-election-announcement/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
Voter registration has started for the 2024 Jenkins Governance Board and Officer elections!


Voter registration


Nominations for the 2024 Jenkins Governance Board and Officer elections have finished.
Voter registration opened September 16, 2024 and closes on October 31, 2024.


Participation in the election process requires registering an account on the Jenkins community forums and at least one contribution made before September 1, 2024.
When registering, you can use an existing GitHub account or create a new account specifically for Jenkins community forums.





All community members who meet the requirements and are interested in voting should join the election-voter-2024 group during the registration period.
Previous elections utilized their...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Voter registration has started for the 2024 Jenkins Governance Board and Officer elections!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;voter-registration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voter-registration&quot; /&gt;Voter registration&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominations for the 2024 Jenkins Governance Board and Officer elections have finished.
Voter registration opened September 16, 2024 and closes on October 31, 2024.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Participation in the election process requires registering an account on the &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&lt;/a&gt; and at least one contribution made before September 1, 2024.
When registering, you can use an existing GitHub account or create a new account specifically for &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&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;a class=&quot;image&quot; href=&quot;https://community.jenkins.io/g/election-voter-2024&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/register-button.png&quot; alt=&quot;register button&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All community members who meet the requirements and are interested in voting should join the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2024&quot;&gt;election-voter-2024&lt;/a&gt; group during the registration period.
Previous elections utilized their own groups, so joining the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2024&quot;&gt;election-voter-2024&lt;/a&gt; group is required for participation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://www.jenkins.io/project/election-walkthrough/#join-the-annual-election-group&quot;&gt;voter registration tutorial&lt;/a&gt; for detailed registration steps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have made the decision to trust participants and not require that you provide evidence of contribution as part of your voter registration.
We reserve the right to ban any account from the election process if we identify abuse.
Once registration is over, a list of email addresses will be sent to the &lt;a href=&quot;https://civs1.civs.us/&quot;&gt;Condorcet Internet Voting Service (CIVS)&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;nominees&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nominees&quot; /&gt;Nominees&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will be electing three members of the Jenkins Governance Board from among six candidates.
The six candidates for the Jenkins Governance Board are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Alex Earl - &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/alex-earl/&quot;&gt;contributor spotlight&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/slide_o_mix/&quot;&gt;author biography&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alexander Brandes - &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/alexander-brandes/&quot;&gt;contributor spotlight&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault/&quot;&gt;author biography&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kris Stern - &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/kris-stern/&quot;&gt;contributor spotlight&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern/&quot;&gt;author biography&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oleg Nenashev - &lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev/&quot;&gt;author biography&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stefan Spieker - &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/stefan-spieker/&quot;&gt;contributor spotlight&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Valentin Delaye - &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/valentin-delaye/&quot;&gt;contributor spotlight&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;We will be electing the Jenkins Release Officer from among two candidates:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Alex Earl - &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/alex-earl/&quot;&gt;contributor spotlight&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/slide_o_mix/&quot;&gt;author biography&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tim Jacomb - &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/tim-jacomb/&quot;&gt;contributor spotlight&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;author biography&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;Candidate statements, affiliations, and profile links will be provided later.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following officer positions are uncontested, so no election is needed for:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Damien Duportal - Jenkins Infrastructure Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal/&quot;&gt;author biography&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wadeck Follonier - Jenkins Security Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck/&quot;&gt;author biography&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alyssa Tong - Jenkins Events Officer - &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/alyssa-tong/&quot;&gt;contributor spotlight&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat/&quot;&gt;author biography&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kevin Martens - Jenkins Documentation Officer - &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/kevin-martens/&quot;&gt;contributor spotlight&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27/&quot;&gt;author biography&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing&quot; /&gt;Contributing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As shown on the &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Participate and Contribute&lt;/a&gt; page, there are many different ways to contribute to 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://www.jenkins.io/participate/connect/&quot;&gt;Connect with the community&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/meet/&quot;&gt;Join or organize a meetup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/code/&quot;&gt;Contribute code to Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/help/&quot;&gt;Help Jenkins users&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/internationalization/&quot;&gt;Translate Jenkins resources&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/test/&quot;&gt;Test Jenkins core and plugins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/document/&quot;&gt;Contribute to Jenkins documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/design/&quot;&gt;Create art or update the Jenkins UI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/review-changes/&quot;&gt;Review open pull requests&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;Donate to Jenkins&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;All contributions to Jenkins and its community are welcome.&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;election&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#election&quot; /&gt;Election&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voter registration closes on October 31.
Voting begins November 1.
Registered voters will be notified by email to participate using the &lt;a href=&quot;https://civs1.civs.us/&quot;&gt;Condorcet Internet Voting System&lt;/a&gt;.
All votes must be submitted by end of day November 30.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results&quot; /&gt;Results&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Election results will be published December 1.
The new term starts on December 1, when the newly elected members will transition to their roles.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates&quot; /&gt;Important Dates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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;Important Dates&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time&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;Nomination of candidates open&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;August 1&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;Nomination of candidates closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 15&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;Voter registration opens and candidates announced&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 16&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;Voter registration closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;October 31&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;Voting starts&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;November 1&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;Voting closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;November 30&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;Results announced&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;December 1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#troubleshooting&quot; /&gt;Troubleshooting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are new to Jenkins elections, unfamiliar with the Condorcet Internet Voting Service (CIVS) or the community forums, or feel overwhelmed with the process, don’t worry, we’ve got you covered.
We published a &lt;a href=&quot;https://www.jenkins.io/project/election-walkthrough/&quot;&gt;step-by-step guide&lt;/a&gt;, outlining how to to join the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2024&quot;&gt;election-voter-2024&lt;/a&gt; group, activate your CIVS account and cast your vote.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you encounter issues still or need assistance, don’t hesitate to contact the &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election committee&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you, as always, and don’t forget to register to vote by October 31!&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/2024/09/10/update-center-brownouts-3/</id>
<title>Brownout on Update Center (updates.jenkins.io):
 11 and 12 September 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-09-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/09/10/update-center-brownouts-3/" />
<category term='jenkins'></category>
<category term='jenkins-infra'></category>
<category term='update-center'></category>
<summary>
Summary (TL;DR)


Note: this is a follow up of the 6 and 9 September brownouts.


The service https://updates.jenkins.io will switch its implementation to a new system during 1 day:




Wednesday 11 September 2024 from 02:00pm UTC until Thursday 12 September 2024 02:00pm UTC




All Jenkins users are impacted but should not see any functional change.


⚠️ Please, check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.


Under the hood, any HTTP request made to this service will be redirected to a mirror close to user locations during these brownouts.




What is the "Update Center"?


Jenkins Update Center...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-tldr&quot; /&gt;Summary (&lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:Too_long;_didn%27t_read&quot;&gt;TL;DR&lt;/a&gt;)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note: this is a follow up of &lt;a href=&quot;https://www.jenkins.io/blog/2024/09/04/update-center-brownouts/&quot;&gt;the 6 and 9 September brownouts&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The service &lt;a href=&quot;https://updates.jenkins.io&quot; class=&quot;bare&quot;&gt;https://updates.jenkins.io&lt;/a&gt; will switch its implementation to a new system during 1 day:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Wednesday 11 September 2024 from 02:00pm UTC until Thursday 12 September 2024 02:00pm UTC&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Jenkins users are impacted but should not see any functional change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;⚠️ Please, check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer than expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under the hood, any HTTP request made to this service will be redirected to a mirror close to user locations during these brownouts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-update-center&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-update-center&quot; /&gt;What is the &quot;Update Center&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;Update Center&lt;/a&gt; is a web server at the core of the Jenkins public infrastructure which distributes the plugins, tool installers, and versions index to all Jenkins servers across the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the installation wizard to regular plugin updates, if you run Jenkins, then you use this service under the hood.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, it serves around 50 Tb of data (outbound bandwidth) each month from a single virtual machine on AWS, which costs around $6,000 per month.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to sustain this service and improve it, the Jenkins infrastructure team has worked relentlessly during the past years to have a new sustainable implementation for this service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new Update Center implementation features a highly available system that redirects user requests to a download mirror close to their location.
Additional information is available in the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;GitHub issue&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-this-brownout&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-this-brownout&quot; /&gt;Why this &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Brownout_(electricity)&quot;&gt;Brownout&lt;/a&gt;&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our functional tests and performance tests are meeting our expectations:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;All of our Jenkins controllers are using the new Update Center implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We are using the new update center (with DNS override) in our own networks in different geo-locations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All of our Jenkins Docker images are using the new system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our initial performance tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After &lt;a href=&quot;https://www.jenkins.io/blog/2024/09/04/update-center-brownouts/&quot;&gt;2 successful 1-hour brownouts&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;how&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how&quot; /&gt;How&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both current and new Update Centers are updated at the same time and serve the same index.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting 5 weeks ago, the Jenkins infrastructure has been using the new Update Center (link:https://azure.updates.jenkins.io) with a client-side DNS override (&lt;code&gt;updates.jenkins.io&lt;/code&gt; hostname points to this new service).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this brownout, we’ll simply switch the DNS entry &lt;code&gt;updates.jenkins.io&lt;/code&gt; to this new service and watch for the logs and error rate.
At the end, we’ll switch DNS back to the normal service and then analyze metrics and logs to see how the system behaved.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are confident the new system will perform as expected. We now want to execute a 1-day brownout.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;helpdesk ticket&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/09/04/update-center-brownouts/</id>
<title>Brownout on Update Center (updates.jenkins.io):
 6 and 9 September 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-09-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/09/04/update-center-brownouts/" />
<category term='jenkins'></category>
<category term='jenkins-infra'></category>
<category term='update-center'></category>
<summary>
Summary (TL;DR)


The service https://updates.jenkins.io will switch its implementation to a new system during 1 hour twice:




Friday 6 September 2024 from 07:00am UTC until 08:00am UTC


Monday 9 September 2024 from 02:00pm UTC until 03:00pm UTC




All Jenkins users are impacted but should not see any functional change.


⚠️ Please, check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer that expected.


Under the hood, any HTTP request made to this service will be redirected to a mirror close to user locations during these brownouts.




What is the "Update Center"?


Jenkins Update Center is a web server at the...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-tldr&quot; /&gt;Summary (&lt;a href=&quot;https://en.wikipedia.org/wiki/Wikipedia:Too_long;_didn%27t_read&quot;&gt;TL;DR&lt;/a&gt;)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The service &lt;a href=&quot;https://updates.jenkins.io&quot; class=&quot;bare&quot;&gt;https://updates.jenkins.io&lt;/a&gt; will switch its implementation to a new system during 1 hour twice:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Friday 6 September 2024 from 07:00am UTC until 08:00am UTC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Monday 9 September 2024 from 02:00pm UTC until 03:00pm UTC&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Jenkins users are impacted but should not see any functional change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;⚠️ Please, check that your organization respects the advertised DNS TTL or you might be stuck in the brownout longer that expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under the hood, any HTTP request made to this service will be redirected to a mirror close to user locations during these brownouts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-update-center&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-update-center&quot; /&gt;What is the &quot;Update Center&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins &lt;a href=&quot;https://updates.jenkins.io&quot;&gt;Update Center&lt;/a&gt; is a web server at the core of the Jenkins public infrastructure which distributes the plugins, tool installers, and versions index to all Jenkins servers all across the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the Wizard installation to regular plugin updates, if you run Jenkins then you use this service under the hood.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, it serves around 50 Tb of data (outbound bandwidth) each month from a single Virtual Machine on AWS, which costs around $6,000 per month.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to sustain this service and improve it, the Jenkins infrastructure team has worked relentlessly during the past years to have a new sustainable implementation for this service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new Update Center implementation features a highly available system, which redirects user requests to a download mirror close to their location.
There is lots of details and additional information that you can read further about in the following &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;GitHub issue&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-this-brownout&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-this-brownout&quot; /&gt;Why this &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Brownout_(electricity)&quot;&gt;Brownout&lt;/a&gt;&quot;?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have reached the point where our functional/performance tests are meeting our expectation:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;All of our Jenkins controllers are using the new Update Center implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We are using the new updates center (with DNS override) in our own networks in different geo-locations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All of our Jenkins Docker image are using the new system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our initial performance tests&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But as the adage says: &quot;No plan survives first contact&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s why we are planning these brownouts of one hour each to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Validate our system beyond the tests we already ran to increase trust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run a real life (production!) workload against the new system while limiting any unforeseen impact due to the short time window.&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;how&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how&quot; /&gt;How&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both current and new Update Centers are updated at the same time and serve the same index.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting 4 weeks ago, the Jenkins infrastructure has been using the new Update Center (&lt;a href=&quot;https://azure.updates.jenkins.io&quot; class=&quot;bare&quot;&gt;https://azure.updates.jenkins.io&lt;/a&gt;) with a client-side DNS override (&lt;code&gt;updates.jenkins.io&lt;/code&gt; hostname points to this new service).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the brownouts, we’ll simply switch the DNS entry &lt;code&gt;updates.jenkins.io&lt;/code&gt; to this new service and watch for the logs and error rate.
At the end of each brownout, we’ll switch DNS back to the normal service and then analyze metrics and logs to see how the system behaved.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If no major problem is detected then we’ll plan a 24 hours brownout soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otherwise we’ll analyze the discovered problem and plan solutions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first brownout covers Asia + Europe &quot;activity&quot; timezones while the second covers US + Europe so we can have 2 distinct set of usages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/2649&quot;&gt;helpdesk ticket&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/08/29/jenkins-design/</id>
<title>See what&#39;s next for the Jenkins user interface - DevOps World 2024</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-08-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/08/29/jenkins-design/" />
<category term='events'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='user-experience'></category>
<category term='devopsworld'></category>
<category term='devopsworld2024'></category>
<category term='ux'></category>
<summary>
This is a speaker blogpost for a DevOps World 2024 talk.





We last gave a talk about the Jenkins user experience at DevOps World 2022. Two short years later, we’re back to showcase what’s new and upcoming in the world of Jenkins UX.


We’ll discuss how we’re bringing the best of BlueOcean back to Jenkins, a redesigned builds widget, a new search experience, and more. Expect to hear about the lessons we’ve learned and the challenges we’re tackling as we update Jenkins for the modern web.


We can’t wait to show you what’s next.


Register online to join us virtually at 1:30pm ET on...
</summary>
<content type='html'>
&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;
This is a speaker blogpost for a &lt;a href=&quot;https://www.devopsworld.com&quot;&gt;DevOps World 2024&lt;/a&gt; talk.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We last gave a talk about the Jenkins user experience at DevOps World 2022. Two short years later, we’re back to showcase what’s new and upcoming in the world of Jenkins UX.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll discuss how we’re bringing the best of BlueOcean back to Jenkins, a redesigned builds widget, a new search experience, and more. Expect to hear about the lessons we’ve learned and the challenges we’re tackling as we update Jenkins for the modern web.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can’t wait to show you what’s next.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.devopsworld.com/#register-now&quot;&gt;Register online&lt;/a&gt; to join us virtually at 1:30pm ET on September 17th, 2024.&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/08/26/gsoc-using-openrewrite-for-plugin-modernization/</id>
<title>Using OpenRewrite Recipes for Plugin Modernization</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-08-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/08/26/gsoc-using-openrewrite-for-plugin-modernization/" />
<author>
<name>sridamul</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2024'></category>
<category term='open-rewrite'></category>
<category term='plugin-modernization'></category>
<summary>
This blog showcases the work done on the Plugin Modernizer Tool during the Google Summer of Code 2024.
For a detailed description of the project, please refer to the project page.





Table of Contents




About the Project


Phase 1


Phase 2


Next Steps


Acknowledgments


Useful Links






About the Project


This project aims to build a generic tool to automate the modernization of Jenkins plugins using OpenRewrite.


This tool allows us to apply OpenRewrite recipe transformations across Jenkins plugins, validate the changes, and create pull requests in the respective plugin repositories.


This tool also extracts and stores essential metadata that can be consumed by Plugin-Health-Scoring for building more probes. For example, it can...
</summary>
<content type='html'>
&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/jenkinsci/plugin-modernizer-tool&quot;&gt;Plugin Modernizer Tool&lt;/a&gt; during the Google Summer of Code 2024.
For a detailed description of the project, please refer to the &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;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;#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;#acknowledgments&quot;&gt;Acknowledgments&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;This project aims to build a generic tool to automate the modernization of Jenkins plugins using &lt;a href=&quot;https://docs.openrewrite.org/&quot;&gt;OpenRewrite&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This tool allows us to apply &lt;a href=&quot;https://docs.openrewrite.org/recipes&quot;&gt;OpenRewrite recipe&lt;/a&gt; transformations across Jenkins plugins, validate the changes, and create pull requests in the respective plugin repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This tool also extracts and stores essential metadata that can be consumed by &lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring&quot;&gt;Plugin-Health-Scoring&lt;/a&gt; for building more probes. For example, it can identify transitive dependencies and issue warnings if a plugin doesn’t use an API plugin as recommended.&lt;/p&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;In this phase, we accomplished following tasks:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Developed a CLI module to parse arguments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Created a &lt;a href=&quot;https://docs.openrewrite.org/changelog/earlier-releases/8-1-2-release#what-is-a-scanningrecipe&quot;&gt;scanning recipe&lt;/a&gt; to extract metadata.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Developed a core module using &lt;a href=&quot;https://maven.apache.org/shared/maven-invoker/&quot;&gt;Maven invoker&lt;/a&gt; to apply recipes across plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to watch the demonstration of the tool in the &lt;a href=&quot;https://youtu.be/2OSxGp301C8?si=4GiMezOAHEquzIHo&amp;amp;t=1714&quot;&gt;Midterm Presentation&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;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 this phase, we accomplished the following tasks:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Developed a GitHub service for forking, cloning, committing, and creating pull requests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integrated OpenRewrite recipes to the tool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added a caching mechanism.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved the tests and documentation.&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;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;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Integrating more recipes into the tool, allowing us to apply a wide range of changes across the Jenkins ecosystem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Storing the extracted metadata in a common location so that it can be used by other projects, such as &lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring&quot;&gt;Plugin Health Scoring&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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I extend my sincere thanks 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/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/iamrajiv&quot;&gt;Rajiv Ranjan Singh&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/berviantoleo&quot;&gt;Bervianto Leo Pratama&lt;/a&gt; as well as the organization admins, for their invaluable guidance, support, and patience throughout this journey.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I also want to thank &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; for introducing the initial project idea titled &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/project-ideas/automating-plugin-buildmetadata-updates/&quot;&gt;Automating plugin build metadata updates&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;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://github.com/jenkinsci/plugin-modernizer-tool&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1AWv6aEL9NU5hVW_CJl81ethsguVqqL2e7H0PYOUXnR8/edit?usp=sharing&quot;&gt;Project specific office hours meeting notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://cdeliveryfdn.slack.com/archives/C071YTZ807N&quot;&gt;Slack Channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1e1QkprPN6fLpFXk_QqBUQlJhZrAl9RvXbOXOiJ-gAuY/edit?usp=sharing&quot;&gt;Project Proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.openrewrite.org/&quot;&gt;OpenRewrite Documentation&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/2024/08/26/gsoc-manage-github-permissions/</id>
<title>GSOC Manage jenkinsci GitHub permissions as code</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-08-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/08/26/gsoc-manage-github-permissions/" />
<category term='gsoc'></category>
<category term='gsoc2024'></category>
<summary>
This blog showcases all the work done in the Manage jenkinsci GitHub permissions as code project during Google Summer of Code 2024.




About the Project


This project aims to create a solution that allows the Repository Permission Updater (RPU) to manage jenkinsci GitHub permissions as code. RPU is a vital tool used by Jenkins to manage artifactory permissions, bridge discrepancies between Jira and GitHub issues, and enable automatic releases. Currently, RPU oversees over 2600 GitHub teams, with all team modifications handled manually by the hosting team. Automating these processes aims to significantly enhance productivity by reducing the manual workload.


In Jenkins, there is...
</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;This blog showcases all the work done in the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/automating-rpu-for-jenkinsci-organization/&quot;&gt;Manage jenkinsci GitHub permissions as code&lt;/a&gt; project during Google Summer of Code 2024.&lt;/p&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 create a solution that allows the Repository Permission Updater (RPU) to manage &lt;code&gt;jenkinsci&lt;/code&gt; GitHub permissions as code. RPU is a vital tool used by Jenkins to manage artifactory permissions, bridge discrepancies between Jira and GitHub issues, and enable automatic releases. Currently, RPU oversees over 2600 GitHub teams, with all team modifications handled manually by the hosting team. Automating these processes aims to significantly enhance productivity by reducing the manual workload.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Jenkins, there is a strategy of using teams to manage permissions effectively. Teams are categorized into two types:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Repository Teams&lt;/strong&gt; are directly linked to specific repositories. The names of these teams typically follow the format &lt;code&gt;$repo_name + Developers&lt;/code&gt; and they automatically assume the admin role. The developers in these teams are managed within the &quot;permissions&quot; section.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Additional GitHub Teams&lt;/strong&gt;, in contrast to repository teams, oversee multiple repositories without being attached to any particular one. The roles of these teams can vary, depending on the needs of the repositories they manage. The developers in these teams are organized within the &quot;teams&quot; section.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To enhance the management of these two distinct team types, it is necessary to modify the current YAML structure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;changes-to-yaml-structure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#changes-to-yaml-structure&quot; /&gt;Changes to YAML structure:&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;before&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#before&quot; /&gt;Before:&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;permissions/*.yml&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;nn&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;developers&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;user1&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;user2&quot;&lt;/span&gt;
&lt;span class=&quot;nn&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;teams/*.yml&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;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&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;core&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;developers&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;user1&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;user2&quot;&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;after&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#after&quot; /&gt;After:&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;permissions/*.yml&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;nn&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;developers&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;ldap&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;user1&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;github&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;user1&quot;&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ldap&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;user2&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;github&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;github_user2&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;repository_team&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;example-repo&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Developers&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;additional_github_teams&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;name&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;core_team&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;role&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;admin&quot;&lt;/span&gt;
&lt;span class=&quot;nn&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;teams/*.yml&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;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&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;ux&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;github_team_name&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;sig-ux&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;developers&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;ldap&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;user1&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;github&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;user1&quot;&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ldap&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;user2&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;github&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;github_user2&quot;&lt;/span&gt;
&lt;span class=&quot;nn&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&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;Successfully implemented the foundational goals outlined in the proposal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;yaml-structure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-structure&quot; /&gt;YAML structure:&lt;/h3&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;nn&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;developers&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;user1&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;user2&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;github_team&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;example-repo&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Developers&quot;&lt;/span&gt;&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;skills-developed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#skills-developed&quot; /&gt;Skills Developed:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SnackYAML&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkinsfile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker&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;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;After initial implementations, I engaged in discussions with the hosting team to address real-world challenges and adapt our project accordingly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;yaml-structure-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-structure-2&quot; /&gt;YAML structure:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;permissions/*.yml&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;nn&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;developers&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;user1&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;user2&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;repository_team&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;example-repo&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Developers&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;additional_github_teams&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;name&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;core_team&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;role&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;admin&quot;&lt;/span&gt;
&lt;span class=&quot;nn&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;teams/*.yml&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;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&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;ux&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;github_team_name&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;sig-ux&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;developers&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;user1&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;user2&quot;&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;&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;skills-developed-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#skills-developed-2&quot; /&gt;Skills Developed:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GitHub Actions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java GitHub API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Testing with Mockito and JUnit&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Introductory Terraform&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;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;The development of this project has followed a complex path, shaped by real-world challenges encountered in Phase 2 that diverged from our initial plans. As we progress, several improvements remain to be addressed to ensure that our solutions effectively meet real-world needs.&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;Due to potential discrepancies between &lt;strong&gt;LDAP and GitHub usernames&lt;/strong&gt;, the YAML structure has been adjusted to include both.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Terraform&lt;/strong&gt; will be integrated to bolster security and streamline management across GitHub workflows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;strong&gt;one-off backfill&lt;/strong&gt; process will be implemented to synchronize data from GitHub with YAML configurations before the initial deployment, ensuring consistency.&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;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://docs.google.com/document/d/17QfpBgqGglhTTS_VLv5PKxXn-UYLlTq14GPwYJZ79Zg/edit?usp=sharing&quot;&gt;Project Proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/automating-rpu-for-jenkinsci-organization/&quot;&gt;Project Selection Post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://matrix.to/#/#gsoc2024-rpu:matrix.org&quot;&gt;Gitter Channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/repository-permissions-updater/pull/3998&quot;&gt;PR Review&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;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;I am grateful for the opportunity to be a part of this project; without it, my amazing journey at Jenkins would not have been possible. Special thanks to my mentor &lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault&quot;&gt;Alexander Brandes&lt;/a&gt; for his support throughout the process. I also owe a lot to the org admins, particularly &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, who not only adjusted her schedule to overcome time zone differences but also provided invaluable guidance in project management, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt; was always there to assist with development challenges, offering as much help as she could, and lastly, thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt; for his support.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/08/25/gsoc-enhancing-llm/</id>
<title>Enhancing an Existing LLM Model with Domain-specific Jenkins Knowledge</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-08-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/08/25/gsoc-enhancing-llm/" />
<author>
<name>nouralmulhem</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2024'></category>
<category term='llm'></category>
<category term='llama2'></category>
<category term='machinelearning'></category>
<category term='documentation'></category>
<summary>
Table of Contents




About the Project


Milestones


JenAI as a System


Next Steps


Acknowledgments


Useful Links






About the Project


JenAI is a pioneering chatbot that is trained specifically to answer users' queries about Jenkins technology, which enhances the accessibility and usability of software.


We aim to provide faster and more reliable assistance to our users. The model is integrated with a friendly UI to ensure a better user experience.


The project outcomes are:




Collected datasets from different sources, like Jenkins blogs, community questions, and other external sources.


Preprocessing this dataset to make sure it is clean and not confusing the model.


Fine-tuning llama2 on this data and providing a new open-source fine-tuned model.


Creating...
</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/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;#milestones&quot;&gt;Milestones&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#jenai-as-a-system&quot;&gt;JenAI as a System&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;#acknowledgments&quot;&gt;Acknowledgments&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;JenAI is a pioneering chatbot that is trained specifically to answer users&#39; queries about Jenkins technology, which enhances the accessibility and usability of software.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We aim to provide faster and more reliable assistance to our users. The model is integrated with a friendly UI to ensure a better user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project outcomes are:&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;Collected datasets from different sources, like &lt;a href=&quot;https://www.jenkins.io/blog/&quot;&gt;Jenkins blogs&lt;/a&gt;, &lt;a href=&quot;https://community.jenkins.io/c/using-jenkins/7&quot;&gt;community questions&lt;/a&gt;, and other external sources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Preprocessing this dataset to make sure it is clean and not confusing the model.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fine-tuning llama2 on this data and providing a new open-source fine-tuned model.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating a user interface with a small server to interact with the model.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Providing documentation of all the work done and a user guide to use our chatbot locally on your machine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-jenai&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-jenai&quot; /&gt;Why JenAI:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins currently does not have AI-driven assistive technology to help new Jenkins users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This project combines Jenkins knowledge with AI to assist all users with the knowledge that a Jenkins expert usually has, providing a complete solution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We empower users to interact with this knowledge through a smooth UI instead of looking for your answer here and there.&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;milestones&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#milestones&quot; /&gt;Milestones&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project included several stages that we have gone through:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stage-1-data-collection&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-1-data-collection&quot; /&gt;Stage #1: data collection&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Different sources were used to collect Jenkins knowledge, including &lt;a href=&quot;https://www.jenkins.io/doc/book/getting-started/&quot;&gt;Jenkins documentation&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/&quot;&gt;blog posts&lt;/a&gt;, &lt;a href=&quot;https://community.jenkins.io/c/using-jenkins/7&quot;&gt;discourse community questions&lt;/a&gt;, and many external sources like &lt;a href=&quot;https://stackoverflow.com/&quot;&gt;Stack Overflow&lt;/a&gt;, &lt;a href=&quot;https://askubuntu.com/&quot;&gt;ask Ubuntu&lt;/a&gt;, and &lt;a href=&quot;https://stackexchange.com/&quot;&gt;Stack Exchange&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stage-2-data-preprocessing-and-refinement&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-2-data-preprocessing-and-refinement&quot; /&gt;Stage #2: data preprocessing and refinement&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This stage consisted of 3 parts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The first part is utilizing another large language model to help us generate question-answer pairs out of Jenkins documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The second part is using Stack Exchange queries to get datasets of questions and correct solutions asked on Stack Overflow and many other platforms. We could define a score threshold for those questions and answers to ensure the reliability of the dataset we are collecting. The dataset generated includes HTML tags like paragraph code and many un-useful blocks or urls, so further processing was done to remove all useless information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The last part of this is utilizing the community questions available on Discourse, where we could use &lt;a href=&quot;https://docs.discourse.org/&quot;&gt;discourse apis&lt;/a&gt; to prune Jenkins posts and retrieve ones with approved solutions, then we could do another request to retrieve those posts and their answers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All those parts are automated, and the notebooks for creating the datasets are provided on our repository. In doing so, we managed to collect around 4100 pairs; a bunch of which were used to fine-tune our model on.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stage-3-jenai-as-a-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-3-jenai-as-a-system&quot; /&gt;Stage #3: JenAI as a system&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This stage was about creating software with a friendly user interface as part of this project to interact with the model. We used ReactJS, Typescript, and MUI components to help us create the interface.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also used Flask to create a small server with only one endpoint (so far) to interact with the model through Rest API and ensure smooth communication.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stage-4-fine-tuning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-4-fine-tuning&quot; /&gt;Stage #4: Fine-tuning&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The core of our project, the effort of fine-tuning, was iterative and repeated until we made sure of its performance. A lot of research is conducted here to ensure the optimal parameters and the best approach to fine-tuning the model and obtaining accurate results.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We were using Colab and Kaggle free resources to fine-tune our model as they provide a T4 GPU with around 16 gigabytes of VRAM, which is powerful enough to load and fine-tune our model.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Details of fine-tuning, the approach, and parameters are provided in our &lt;a href=&quot;https://github.com/nouralmulhem/Enhancing-LLM-with-Jenkins-Knowledge/blob/main/JenAi%20Final%20Document.pdf&quot;&gt;Final Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stage-5-convert-the-model-to-ggml-format-and-quantization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-5-convert-the-model-to-ggml-format-and-quantization&quot; /&gt;Stage #5: Convert the model to GGML format and quantization&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to achieve our objective, we need users to be able to run the model on their local machines using only CPUs instead of hosting it. To achieve this, we used llama.cpp to convert the model to a GGML binary format (using &lt;code&gt;convert_hf_to_gguf.py&lt;/code&gt;) that can be loaded and run on CPU.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Part of the appeal of the GGML library is being able to quantize this binary model into smaller models that can be run even faster. There is a tool called quantize in the Llama.cpp repo that can be used to convert the model to different quantization levels. We used the quantize tool to shrink our model to &lt;code&gt;q8_0&lt;/code&gt;.&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;jenai-as-a-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenai-as-a-system&quot; /&gt;JenAI as a System&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;JenAI landing page in dark mode&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/2024/08/llm-landing-dark.png&quot; alt=&quot;LLM Landing Page Dark Mode&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JenAI landing page in light mode&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/2024/08/llm-landing-white.png&quot; alt=&quot;LLM Landing Page White Mode&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JenAI chat page&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/2024/08/llm-chat-page.png&quot; alt=&quot;LLM Chat 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;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;This idea can be enhanced more, and many approaches are provided to achieve the same goal:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Using retrieval-augmented generation (RAG) that combines the strengths of databases or traditional information retrieval systems with the capabilities of large language models.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Llama3 that has been pre-trained on over 15 trillion tokens, with a dataset used in training 7 times larger than the one used for training Llama2, which can make it outperform Llama2 when fine-tuning on Jenkins knowledge.&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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I want to take this chance and extend my gratitude to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Google Summer of Code for organizing this and their mentors who provided help throughout the program.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins and GSoC org admins for having me contribute to this challenging problem and thank you for your flexibility along the way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My team mentors &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern/&quot;&gt;Kris Stern&lt;/a&gt;(as a lead mentor), &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar/&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/harsh-ps-2003/&quot;&gt;Harsh Pratap Singh&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/shivaylamba/&quot;&gt;Shivay Lamba&lt;/a&gt; for their continuous support and guidance throughout the project, answering my questions, and pointing out some great ideas so we are not left with something incomplete. They were a great reason for making this a success.&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;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://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code portal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/enhancing-an-existing-llm-model-with-domain-specific-jenkins-knowledge/&quot;&gt;LLM Project Selection Post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nouralmulhem/Enhancing-LLM-with-Jenkins-Knowledge&quot;&gt;Our Github Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/users/nouralmulhem/projects/1&quot;&gt;Our Github Kanban&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/nouralmulhem/&quot;&gt;Personal Information&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1Ri24koZto5iSj5HIQF-8VK66PX-2cZRxzZEJNvg_GXY/edit?usp=sharing&quot;&gt;Out weekly instance meeting notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/nouralmulhem/Llama-2-7b-chat-finetune&quot;&gt;Fine-tuned model on Hugging Face&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/nouralmulhem/Llama-2-7b-finetune-q8&quot;&gt;Our GGML version of the model&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;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;In conclusion, being a part of GSoC 2024 was an amazing experience that enabled me to gain new skills and make meaningful contributions to an open-source project. I am excited to continue contributing at Jenkins in the future.&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/2024/08/01/board-officer-election-announcement/</id>
<title>Jenkins Board and Officer Elections 2024 - Nominations Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-08-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/08/01/board-officer-election-announcement/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
We are excited to announce the 2024 Jenkins Governance Board and Officer elections!


Nominations


Nominations can be submitted for governance board positions and all officer positions (Security, Events, Release, Infrastructure, and Documentation).


During the registration period, we invite community members to nominate candidates by sending a message to the election-committee group.
In your message, please include the name of the nominee, the specific position and your reasons for nominating that person.
A tutorial is available that shows the steps to nominate a candidate.


The nomination period ends on September 15.
Nominees will be notified and asked to confirm that they are interested in running as a candidate.
The...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;We are excited to announce the 2024 Jenkins Governance Board and Officer elections!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;nominations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nominations&quot; /&gt;Nominations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominations can be submitted for &lt;a href=&quot;https://www.jenkins.io/project/board/&quot;&gt;governance board&lt;/a&gt; positions and all &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;officer&lt;/a&gt; positions (&lt;a href=&quot;https://www.jenkins.io/project/team-leads/#security&quot;&gt;Security&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#events&quot;&gt;Events&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#infrastructure&quot;&gt;Infrastructure&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the registration period, we invite community members to nominate candidates by sending a message to the &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election-committee&lt;/a&gt; group.
In your message, please include the name of the nominee, the specific position and your reasons for nominating that person.
A tutorial is available that shows the steps to &lt;a href=&quot;https://www.jenkins.io/project/election-walkthrough/#nominate-a-candidate&quot;&gt;nominate a candidate&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nomination period ends on &lt;strong&gt;September 15&lt;/strong&gt;.
Nominees will be notified and asked to confirm that they are interested in running as a candidate.
The list of candidates will be announced on September 16.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Anyone can nominate anyone as a candidate!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/uhafner/&quot;&gt;Dr. Ullrich Hafner&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault/&quot;&gt;Alexander Brandes&lt;/a&gt; for serving on the &lt;a href=&quot;https://www.jenkins.io/project/board/&quot;&gt;Jenkins Governance Board&lt;/a&gt;.
We also want to thank &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal/&quot;&gt;Damien Duportal&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#infrastructure&quot;&gt;Infrastructure Officer&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck/&quot;&gt;Wadeck Follonier&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#security&quot;&gt;Security Officer&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat/&quot;&gt;Alyssa Tong&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#events&quot;&gt;Events Officer&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;Tim Jacomb&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27/&quot;&gt;Kevin Martens&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt; for all of their work over the last term.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-election-consists-of-4-phases&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-election-consists-of-4-phases&quot; /&gt;The election consists of 4 phases:&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;Nomination of candidates (August 1 - September 15)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voter registration (September 16 - October 31)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting (November 1 - November 30)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Results announcement (December 1)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;voting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voting&quot; /&gt;Voting&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Participation in the election process requires registering an account on the &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&lt;/a&gt; and at least one contribution made before September 1, 2024.
When registering, you can use an existing GitHub account or create a new account specifically for &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&lt;/a&gt;.
We ask all community members who are interested in voting and meet the requirements to join the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2024&quot;&gt;election-voter-2024&lt;/a&gt; group during the registration period.
Previous elections utilized their own groups, so joining the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2024&quot;&gt;election-voter-2024&lt;/a&gt; group is required for participation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have made the decision to trust participants and not require that you provide evidence of contribution as part of your voter registration.
We reserve the right to ban any account from the election process if we identify abuse.
Once registration is over, a list of email addresses will be sent to the &lt;a href=&quot;https://civs1.civs.us/&quot;&gt;Condorcet Internet Voting Service (CIVS)&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing&quot; /&gt;Contributing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As shown on the &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Participate and Contribute&lt;/a&gt; page, there are many different ways to contribute to Jenkins. You can contribute by:&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/participate/connect/&quot;&gt;Connecting with the community&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/meet/&quot;&gt;Joining or organizing a meetup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/code/&quot;&gt;Contributing code to Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/help/&quot;&gt;Helping Jenkins users&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/internationalization/&quot;&gt;Translating Jenkins resources&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/test/&quot;&gt;Testing Jenkins core and plugins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/document/&quot;&gt;Contributing to Jenkins documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/design/&quot;&gt;Creating art or updating the Jenkins UI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/review-changes/&quot;&gt;Reviewing open pull requests&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;Donating to Jenkins&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;All contributions to Jenkins and its community are welcome&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;election&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#election&quot; /&gt;Election&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Candidates will be announced September 16.
Voter registration closes on October 31.
Voting begins November 1.
Registered voters will be notified by email to participate using the &lt;a href=&quot;https://civs1.civs.us/&quot;&gt;Condorcet Internet Voting System&lt;/a&gt;.
All votes must be submitted by end of day November 30.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results&quot; /&gt;Results&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Election results will be published December 1.
The new term starts on December 1, when the newly elected members will transition to their roles.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates&quot; /&gt;Important Dates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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;Important Dates&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time&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;Nomination of candidates open&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;August 1&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;Nomination of candidates closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 15&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;Voter registration opens and candidates announced&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 16&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;Voter registration closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;October 31&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;Voting starts&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;November 1&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;Voting closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;November 30&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;Results announced&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;December 1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#troubleshooting&quot; /&gt;Troubleshooting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are new to Jenkins elections, unfamiliar with the Condorcet Internet Voting Service (CIVS) or the community forums, or feel overwhelmed with the process, don’t worry, we’ve got you covered.
We published a &lt;a href=&quot;https://www.jenkins.io/project/election-walkthrough/&quot;&gt;step-by-step guide&lt;/a&gt;, outlining how to to join the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2024&quot;&gt;election-voter-2024&lt;/a&gt;, activate your CIVS account and cast your vote.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you encounter issues still or need assistance, don’t hesitate to contact the &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election committee&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you, as always, and don’t forget to register to vote by October 31!&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/2024/07/26/microsoft-donates-to-jenkins/</id>
<title>Microsoft donates $60,000 to Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-07-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/07/26/microsoft-donates-to-jenkins/" />
<category term='infrastructure'></category>
<summary>
Microsoft Azure has donated $60,000 in cloud credits to the Jenkins project.
We thank them most sincerely for their donation and for their continuing support of open source software projects like Jenkins.


The Jenkins project uses Microsoft Azure cloud to provide a wide range of services, including all the Jenkins controllers that build Jenkins core, Jenkins components, and over 1000 Jenkins plugins.
Microsoft Azure provides scalable and resilient services for Jenkins continuous integration and continuous delivery processes through Azure Kubernetes Service (AKS) and Azure Container Instances (ACI).


The Jenkins project also uses Microsoft Azure hosted database services including Azure Cache for Redis, Azure Database...
</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/2024/07/26/2024-07-26-microsoft-donates-to-jenkins.png&quot; alt=&quot;image&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://azure.microsoft.com/&quot;&gt;Microsoft Azure&lt;/a&gt; has donated $60,000 in cloud credits to the Jenkins project.
We thank them most sincerely for their donation and for their continuing support of open source software projects like Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project uses Microsoft Azure cloud to provide a wide range of services, including all the Jenkins controllers that build Jenkins core, Jenkins components, and over 1000 Jenkins plugins.
Microsoft Azure provides scalable and resilient services for Jenkins continuous integration and continuous delivery processes through &lt;a href=&quot;https://azure.microsoft.com/products/kubernetes-service/&quot;&gt;Azure Kubernetes Service (AKS)&lt;/a&gt; and &lt;a href=&quot;https://azure.microsoft.com/products/container-instances/&quot;&gt;Azure Container Instances (ACI)&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project also uses Microsoft Azure hosted database services including &lt;a href=&quot;https://learn.microsoft.com/azure/azure-cache-for-redis/cache-overview&quot;&gt;Azure Cache for Redis&lt;/a&gt;, &lt;a href=&quot;https://azure.microsoft.com/products/postgresql&quot;&gt;Azure Database for PostgreSQL&lt;/a&gt;, and &lt;a href=&quot;https://azure.microsoft.com/products/mysql&quot;&gt;Azure Database for MySQL&lt;/a&gt;.
We use both Intel based servers and Arm based servers and rely on Microsoft premium file storage and multi-zone storage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re sincerely grateful for Microsoft’s most recent contribution to the Jenkins project and thank them for their support of open source software.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/07/24/amazon-donates-to-jenkins/</id>
<title>Amazon donates $60,000 to Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-07-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/07/24/amazon-donates-to-jenkins/" />
<category term='infrastructure'></category>
<summary>
Amazon Web Services has donated $60,000 in cloud credits to the Jenkins project.
We are especially grateful for their donation and their support of Jenkins.


The Jenkins project has used AWS for many years to provide a wide range of services.
AWS provides the central distribution point for Jenkins core and Jenkins plugin downloads through the Jenkins update center.
We&#8217;ve used AWS Graviton servers (Arm architecture) and AWS Intel servers with the Amazon Elastic Kubernetes Service and as Elastic Compute Cloud virtual machines.
AWS has provided consistent, reliable, and scalable services for Jenkins for many years.


We are sincerely grateful for Amazon&#8217;s most recent contribution to...
</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/2024/07/24/2024-07-24-amazon-donates-to-jenkins.png&quot; alt=&quot;image&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Amazon Web Services has donated $60,000 in cloud credits to the Jenkins project.
We are especially grateful for their donation and their support of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has used AWS for many years to provide a wide range of services.
AWS provides the central distribution point for Jenkins core and Jenkins plugin downloads through the Jenkins update center.
We’ve used &lt;a href=&quot;https://docs.aws.amazon.com/whitepapers/latest/aws-graviton-performance-testing/what-is-aws-graviton.html&quot;&gt;AWS Graviton servers&lt;/a&gt; (Arm architecture) and AWS Intel servers with the Amazon &lt;a href=&quot;https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html&quot;&gt;Elastic Kubernetes Service&lt;/a&gt; and as &lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html&quot;&gt;Elastic Compute Cloud&lt;/a&gt; virtual machines.
AWS has provided consistent, reliable, and scalable services for Jenkins for many years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are sincerely grateful for Amazon’s most recent contribution to the Jenkins project and thank them for their support of open source software.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/06/13/thanks-mirror-sponsors/</id>
<title>Thanks to the Jenkins mirror providers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-06-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/06/13/thanks-mirror-sponsors/" />
<author>
<name>dduportal</name>
</author>
<category term='community'></category>
<category term='infrastructure'></category>
<category term='sponsors'></category>
<category term='mirrors'></category>
<category term='supporters'></category>
<summary>
Jenkins downloads are provided by mirror servers of organizations that support the Jenkins project.


You can see the list from the mirror status page.


We&#8217;re really grateful for all the support provided by the organizations behind the curtain, namely:




Oregon State University Open Source Lab in USA


Tsinghua University in China


XMission in USA


Belnet in Belgium


RWTH Aachen University in Germany


The Yamagata University in Japan


FreeDif open source hosting in Singapore


Servana in Singapore




In particular, we are happy to add a new sponsored mirror from Hostico.
This new mirror covers Eastern Europe and Russia.


Many thanks to Hostico and to the administrators of the RWTH Aachen University mirror for their...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins downloads are provided by mirror servers of organizations that support the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can see the list from the &lt;a href=&quot;https://get.jenkins.io/index.html?mirrorstats&quot;&gt;mirror status page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re really grateful for all the support provided by the organizations behind the curtain, namely:&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://osuosl.org&quot;&gt;Oregon State University Open Source Lab&lt;/a&gt; in USA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.tsinghua.edu.cn&quot;&gt;Tsinghua University&lt;/a&gt; in China&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://xmission.com&quot;&gt;XMission&lt;/a&gt; in USA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://belnet.be/&quot;&gt;Belnet&lt;/a&gt; in Belgium&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.rwth-aachen.de/&quot;&gt;RWTH Aachen University&lt;/a&gt; in Germany&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.yamagata-u.ac.jp/en/&quot;&gt;The Yamagata University&lt;/a&gt; in Japan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://freedif.org/&quot;&gt;FreeDif open source hosting&lt;/a&gt; in Singapore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://servanamanaged.com/&quot;&gt;Servana&lt;/a&gt; in Singapore&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In particular, we are happy to add a new sponsored mirror from &lt;a href=&quot;https://hostico.ro/&quot;&gt;Hostico&lt;/a&gt;.
This new mirror covers Eastern Europe and Russia.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many thanks to Hostico and to the administrators of the &lt;a href=&quot;https://www.rwth-aachen.de/&quot;&gt;RWTH Aachen University&lt;/a&gt; mirror for their great help in the past weeks!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/06/11/require-java-17/</id>
<title>Jenkins requires Java 17 or newer</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-06-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/06/11/require-java-17/" />
<author>
<name>basil</name>
</author>
<category term='announcement'></category>
<category term='core'></category>
<category term='developer'></category>
<category term='jenkins'></category>
<summary>
Summary





Beginning with the Jenkins 2.463 weekly release (scheduled for release on June 18, 2024), Jenkins requires Java 17 or newer.
The Jenkins 2.452.x LTS line will continue to require Java 11 or newer,
as will the LTS line (possibly 2.462.1) that is scheduled for release on July 24, 2024,
whose baseline will be 2.462 (the last weekly release to support Java 11) or earlier.
The first LTS release to require Java 17 or newer will ship at the end of October 2024.


The Jenkins core team generally recommends that all users adopt Java 17 or Java 21.
In recent months, usage of Java 17 has almost...
</summary>
<content type='html'>
&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;&lt;span class=&quot;image right center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/06/java17.png&quot; alt=&quot;Jenkins requires Java 17&quot; width=&quot;400px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Beginning with the Jenkins 2.463 weekly release (scheduled for release on June 18, 2024), Jenkins requires Java 17 or newer.&lt;/strong&gt;
The Jenkins 2.452.x LTS line will continue to require Java 11 or newer,
as will the LTS line (possibly 2.462.1) that is scheduled for release on July 24, 2024,
whose baseline will be 2.462 (the last weekly release to support Java 11) or earlier.
The first LTS release to require Java 17 or newer will ship at the end of October 2024.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins core team generally recommends that all users adopt Java 17 or Java 21.
In recent months, usage of Java 17 has almost surpassed usage of Java 11, and usage of Java 21 is rapidly increasing:&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/2024/06/jvms.png&quot; alt=&quot;JVMs by Date&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Weekly releases will require Java 17 or newer earlier than a previously announced date.
The motivating factor for this change of schedule is &lt;a href=&quot;https://spring.io/blog/2024/03/01/support-timeline-announcement-for-spring-framework-6-0-x-and-5-3-x&quot;&gt;the August 31, 2024 EOL of the Spring Framework 5.3.x line&lt;/a&gt;.
Jenkins relies heavily on Spring Security, and upgrading to the 6.x line necessitates a slew of breaking changes, including migrating to Java 17, Jetty 12, and Jakarta EE 9.
In order to mitigate risk, we are beginning the rollout of Java 17 in the June 18, 2024 weekly release.
Further details about the migration to Jetty 12 and Jakarta EE 9 are forthcoming.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;upgrading-to-java-17-or-21&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrading-to-java-17-or-21&quot; /&gt;Upgrading to Java 17 or 21&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning with the Jenkins 2.463 weekly release (scheduled for release on June 18, 2024),
Jenkins requires Java 17 or newer on both the controller JVM (i.e., the JVM running &lt;code&gt;jenkins.war&lt;/code&gt;) and agent JVMs (i.e., JVMs running &lt;code&gt;remoting.jar&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This does not imply that you need to build your application with the same version of Java.
You can continue to use any desired JDK to build your application,
as long as the JVM used for running Jenkins itself is version 17 or newer.
For example, the &lt;strong&gt;Global Tool Configuration&lt;/strong&gt; page can still be used to provide a JDK 8 or 11 installation for building your application.
Similarly, you can set up ephemeral or static agents with two installations of Java:
Java 17 or newer to run &lt;code&gt;remoting.jar&lt;/code&gt; for Jenkins and Java 8 or 11 to build your application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have supported running the controller on Java 17 since the Jenkins 2.355 weekly release,
and we have supported running the controller on Java 21 since the Jenkins 2.419 weekly release.
Prior to the Jenkins 2.463 weekly release, running the controller on Java 17 and agents on Java 11, though not recommended, did not result in errors.
Beginning with the Jenkins 2.463 weekly release, running the controller on Java 17 and agents on Java 11 will result in the following error:&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;java.lang.UnsupportedClassVersionError: hudson/slaves/SlaveComputer$SlaveVersion has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1022)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:883)
	at hudson.remoting.RemoteClassLoader.loadClassFile(RemoteClassLoader.java:473)
        ... 24 more&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Therefore, it is critical to upgrade both the controller &lt;em&gt;and&lt;/em&gt; agents to Java 17 or newer prior to upgrading Jenkins to the 2.463 weekly release.
Use the &lt;a href=&quot;https://plugins.jenkins.io/versioncolumn/&quot;&gt;Versions Node Monitors&lt;/a&gt; plugin to verify that agents are running a compatible version of Java.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;docker-images&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-images&quot; /&gt;Docker images&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The official Jenkins Docker images for &lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins/&quot;&gt;the controller&lt;/a&gt; and &lt;a href=&quot;https://hub.docker.com/r/jenkins/inbound-agent/&quot;&gt;agents&lt;/a&gt; have been based on Java 17 for many months,
with Java 11 available as a fallback.
Beginning with the Jenkins 2.462 weekly release, the Java 11 images will be retired.
(Java 11 images will remain available for the LTS line until October 2024.)
Users of the official Jenkins Docker images need not install or configure Java on their own, as it comes preinstalled in the image.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are using a Docker image to run both the agent Java process (i.e., &lt;code&gt;remoting.jar&lt;/code&gt;) and your own application build and your application build still requires Java 8 or 11,
you will need to provide a Java 17 or newer runtime for the Jenkins agent process and a Java 8 or 11 environment for your application build.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;os-packages&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#os-packages&quot; /&gt;OS packages&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users of the &lt;a href=&quot;https://www.jenkins.io/download/&quot;&gt;official Jenkins OS packages for Debian, Red Hat, and SUSE Linux distributions&lt;/a&gt; should note that these packages are agnostic to the Java vendor.
In other words, you must bring your own Java package.
One straightforward way to do this is to install Java 17 from your Linux distribution, as described on the package download site:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/debian/&quot;&gt;Debian&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;apt-get install fontconfig openjdk-17-jre&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/redhat/&quot;&gt;Red Hat&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;yum install fontconfig java-17-openjdk&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/opensuse/&quot;&gt;openSUSE&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;zypper install dejavu-fonts fontconfig java-17-openjdk&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By virtue of not requiring any custom repositories, this is certainly the simplest method (and the one used by the Jenkins project’s &lt;a href=&quot;https://github.com/jenkinsci/packaging/tree/7c74bdb1dc0e8f4790c4c8af3e3a4bf9bc6ee38a/molecule/default&quot;&gt;packaging tests&lt;/a&gt;),
but it does not give the user a high degree of control over the Java runtime environment.
As mentioned previously, the official Jenkins Docker images use Adoptium/Eclipse Temurin (as does the Jenkins infrastructure project).
Enthusiastic users may wish to install Java from Adoptium or another vendor.
Since 2021, Adoptium has provided Linux installation packages, as described in &lt;a href=&quot;https://blog.adoptium.net/2021/12/eclipse-temurin-linux-installers-available/&quot;&gt;a piece by George Adams&lt;/a&gt;.
Ultimately, the choice of which Java vendor to use is your own, as long as that vendor provides Java 17 or Java 21.
Refer to your chosen Java vendor for installation instructions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you have installed a suitable version of Java, configure Jenkins to use that Java runtime.
The most straightforward way is to configure that version of Java as the default version of Java at the operating system (OS) level:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/debian/&quot;&gt;Debian&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;update-alternatives --config java&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/redhat/&quot;&gt;Red Hat&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;alternatives --config java&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/opensuse/&quot;&gt;openSUSE&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;update-alternatives --config java&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alternatively, users who do not wish to change the default version of Java can customize the &lt;code&gt;JAVA_HOME&lt;/code&gt; or &lt;code&gt;JENKINS_JAVA_CMD&lt;/code&gt; environment variable as part of the Jenkins &lt;code&gt;systemd(1)&lt;/code&gt; service unit.
Refer to the &lt;a href=&quot;https://www.jenkins.io/doc/book/system-administration/systemd-services/&quot;&gt;Managing systemd services&lt;/a&gt; section of the Jenkins documentation for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reporting-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporting-issues&quot; /&gt;Reporting issues&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you find a regression in a plugin, please file a bug report in Jira:&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://issue-redirect.jenkins.io/issue/67907&quot;&gt;JENKINS-67907: Java 17 Phase 3: Require Java 17 or newer&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;When reporting an issue, include the following information:&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;Use the &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/67907&quot;&gt;JENKINS-67907&lt;/a&gt; epic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the output of &lt;code&gt;java -version&lt;/code&gt; (e.g., OpenJDK 64-Bit Server VM Temurin-21.0.3+9 build 21.0.3+9-LTS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the name, version, and architecture of the operating system you are using (e.g., Ubuntu 24.04.1 LTS x86_64).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the &lt;em&gt;complete&lt;/em&gt; list of installed plugins as suggested in the &lt;a href=&quot;https://www.jenkins.io/doc/book/troubleshooting/diagnosing-errors/#how-to-report-a-bug&quot;&gt;bug reporting guidelines&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the &lt;em&gt;complete&lt;/em&gt; stack trace, if relevant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide steps to reproduce the issue &lt;em&gt;from scratch&lt;/em&gt; on a minimal Jenkins installation; the scenario should fail on Jenkins 2.462 or earlier when the steps are followed on Java 17 or Java 21 and pass when the steps are followed on Java 11.&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;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;We expect to see a bit of disruption from the migration to Java 17, Jetty 12, and Jakarta EE 9,
but we hope that in the long term these changes will be in the best interests of the Jenkins community.
Please reach out on the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;developers&#39; list&lt;/a&gt; with any questions or suggestions.&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/2024/06/04/jenkins-in-google-summer-of-code-community-bonding-contributors-takeaways/</id>
<title>Jenkins in Google Summer of Code Community Bonding, Contributors&#39; Takeaways</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-06-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/06/04/jenkins-in-google-summer-of-code-community-bonding-contributors-takeaways/" />
<author>
<name>alyssat</name>
</author>
<category term='gsoc2024'></category>
<category term='community'></category>
<category term='events'></category>
<summary>
The community bonding period is the three weeks between GSoC contributor acceptance and the start of the coding date.
This is a vital time for mentors and org admins to engage with GSoC contributors and set them up for success.
This is the time to set expectations and milestones, welcome the contributors to the community, and give them access to the tools they need to succeed during the coding period.


Given that May 26, 2024, marked the end of the bonding period, we asked the GSoC contributors to share their key takeaways from this period.
Here’s what they had to say:




Implementing UI for Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The community bonding period is the three weeks between GSoC contributor acceptance and the start of the coding date.
This is a vital time for mentors and org admins to engage with GSoC contributors and set them up for success.
This is the time to set expectations and milestones, welcome the contributors to the community, and give them access to the tools they need to succeed during the coding period.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Given that May 26, 2024, marked the end of the bonding period, we asked the GSoC contributors to share their key takeaways from this period.
Here’s what they had to say:&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;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/implementing-ui-for-jenkins-infra-statistics/&quot;&gt;Implementing UI for Jenkins Infra Statistics&lt;/a&gt;&lt;/strong&gt; | contributor:  &lt;a href=&quot;https://www.jenkins.io/blog/authors/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt;&lt;/p&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;Establish a communication schedule:&lt;/strong&gt; Set up regular meetings with mentors early on.
Knowing how often to meet and discuss progress will help keep you on track and ensure you are receiving timely feedback.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Understand the codebase:&lt;/strong&gt; Understanding the project’s codebase and infrastructure is crucial.
This will help you make informed decisions when you are planning out your roadmap.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a project roadmap:&lt;/strong&gt; Having a clear roadmap will ensure that you stay organized throughout your coding period.
Set specific milestones and deliverables to always have a tangible goal to work towards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Utilize downtime efficiently:&lt;/strong&gt; Don’t get stuck waiting for answers.
Mentors are often busy and might not always respond immediately.
In the meantime, work on other tasks to ensure you always have multiple items to tackle.
This approach will keep your project moving forward.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/automating-rpu-for-jenkinsci-organization/&quot;&gt;Manage Jenkinsci GitHub Permissions as Code&lt;/a&gt;&lt;/strong&gt; |  contributor: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alaurant&quot;&gt;Danyang Zhao&lt;/a&gt;&lt;/p&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;Use various communication tools:&lt;/strong&gt; Don’t rely solely on weekly meetings.
Keep the dialogue open through emails, Gitter, or other accessible communication platforms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Seek help:&lt;/strong&gt; If you encounter a challenging issue, seeking help is a good strategy.
Reach out to your mentor, co-mentor, or even other community members.
They are all willing to assist.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Communicate schedules clearly:&lt;/strong&gt; If unexpected commitments arise, such as exams, inform your mentor.
Communication is important.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/improving-maintainability-of-rpu/&quot;&gt;Improve Maintainability for the Repository Permission Updater&lt;/a&gt;&lt;/strong&gt; | contributor: &lt;a href=&quot;https://www.jenkins.io/blog/authors/themeinerlp&quot;&gt;Phillipp Glanz&lt;/a&gt;&lt;/p&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;Be aware of scheduling:&lt;/strong&gt; It is important to communicate in order to be able to plan better in the event of scheduling conflicts or exams.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Communication is key:&lt;/strong&gt; Open and direct communication is necessary to get feedback at an early stage, as this prevents duplication of work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deliberate planning helps organize work:&lt;/strong&gt; Precise agreement on who does what and precise delimitations make the process much more efficient.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/enhancing-an-existing-llm-model-with-domain-specific-jenkins-knowledge/&quot;&gt;Enhancing an Existing LLM Model with Domain-specific Jenkins knowledge&lt;/a&gt;&lt;/strong&gt; | contributor: &lt;a href=&quot;https://www.jenkins.io/blog/authors/nouralmulhem&quot;&gt;Nour Ziad Almulhem&lt;/a&gt;&lt;/p&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;Enhanced understanding of project goals and tools:&lt;/strong&gt; We spent time comprehending the scope and objectives of the project.
I learned how to effectively use tools to collect a dataset of Jenkins-specific knowledge provided by stack exchange, community questions, and &lt;a href=&quot;https://www.jenkins.io/doc/book/getting-started/&quot;&gt;Jenkins documents&lt;/a&gt;.
This foundational knowledge is crucial for the successful implementation of the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community engagement and support:&lt;/strong&gt; I experienced the importance of community interaction.
Engaging with mentors and organization admins helped me feel supported.
This engagement provided me with the confidence and motivation to tackle the project, discuss my contribution during the final exams, and speak out loud about the help I need at any time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preparation and planning:&lt;/strong&gt; The bonding period allowed me to prepare and plan for the coding phase effectively with mentors and define our goals and milestones.
We focused on data collection, processing strategies, and discussing various approaches to achieve the objective of the project.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&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;&lt;/strong&gt; | contributor: &lt;a href=&quot;https://www.jenkins.io/blog/authors/sridamul&quot;&gt;Sridhar Sivakumar&lt;/a&gt;&lt;/p&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;Define expectations and goals:&lt;/strong&gt; Refine the proposal and prepare clear expectations and goals for the project, such as defining the project’s scope, setting milestones, and outlining the deliveries.
This will significantly aid in preparing the roadmap.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bonding with the community:&lt;/strong&gt; The bonding period is not only to interact with the mentors but also with other community members.
It is always good to share your thought process and ideas with other community members via blog posts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Report your blockers:&lt;/strong&gt; Communication is the key to a successful project. Discuss any obstacles you encounter, such as exams or other personal issues with the mentors or Org Admins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/05/01/google-summer-of-code-congrats-and-welcome/</id>
<title>Congrats and Welcome to Jenkins in Google Summer of Code 2024 Contributors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-05-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/05/01/google-summer-of-code-congrats-and-welcome/" />
<author>
<name>alyssat</name>
</author>
<category term='gsoc2024'></category>
<category term='community'></category>
<category term='events'></category>
<summary>
This year, we received numerous outstanding Google Summer of Code (GSoC) proposals for Jenkins with just as many compelling ideas.
Many thanks to all who submitted their proposal(s) previously.
Due to a very limited number of mentors available, we could only accept a small number of submissions.
Congratulations go out to Danyang Zhao, Sridhar S, Shlomo Dahan, Nour Almulhem, and Phillipp Glanz for having been selected for Jenkins in GSoC 2024.
It is now time to roll up our sleeves and get to the heart of why we’re doing this: to help make Jenkins a better project for all users.


In the next few weeks,...
</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/2024/05/welcome-gsoc-2024-contributors.png&quot; alt=&quot;Congratulations and welcome GSoc 2024 Contributors&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, we received numerous outstanding &lt;a href=&quot;https://summerofcode.withgoogle.com/programs/2024/organizations/jenkins-wp&quot;&gt;Google Summer of Code&lt;/a&gt; (GSoC) proposals for Jenkins with just as many compelling ideas.
Many thanks to all who submitted their proposal(s) previously.
Due to a very limited number of mentors available, we could only accept a small number of submissions.
Congratulations go out to &lt;a href=&quot;https://github.com/Alaurant&quot;&gt;Danyang Zhao&lt;/a&gt;, &lt;a href=&quot;https://github.com/sridamul&quot;&gt;Sridhar S&lt;/a&gt;, &lt;a href=&quot;https://github.com/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt;, &lt;a href=&quot;https://github.com/nouralmulhem&quot;&gt;Nour Almulhem&lt;/a&gt;, and &lt;a href=&quot;https://github.com/TheMeinerLP&quot;&gt;Phillipp Glanz&lt;/a&gt; for having been selected for Jenkins in GSoC 2024.
It is now time to roll up our sleeves and get to the heart of why we’re doing this: to help make Jenkins a better project for all users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the next few weeks, contributors and project mentors will begin the “Bonding Period” to establish connections with the Jenkins community and to lay out the plans and framework for what is to come in the next 12 weeks.
We are excited to have them on board and can’t wait to see their progress!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2024 Jenkins in GSoC projects are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;1) &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/project-ideas/automating-rpu-for-jenkinsci-organization/&quot;&gt;Manage Jenkinsci GitHub Permissions as Code&lt;/a&gt; - Automating the management of GitHub permissions for the Jenkinsci organization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentors: &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/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC contributor: &lt;a href=&quot;https://github.com/Alaurant&quot;&gt;Danyang Zhao&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2) &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/project-ideas/using-openrewrite-recipes-for-plugin-modernization-or-automation-plugin-build-metadata-updates/&quot;&gt;Using OpenRewrite Recipes for Plugin Modernization&lt;/a&gt; - Explore the ways OpenRewrite recipes can be used for Jenkins plugin modernization or automation of plugin build metadata updates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;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/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/berviantoleo&quot;&gt;Bervianto Leo Pratama&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/iamrajiv&quot;&gt;Rajiv Singh&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC contributor: &lt;a href=&quot;https://github.com/sridamul&quot;&gt;Sridhar S&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3) &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/project-ideas/implementing-ui-for-jenkins-infra-statistics/&quot;&gt;Implementing UI for Jenkins Infra Statistics&lt;/a&gt; - To build upon the current GitHub Pages based UI into a user-friendly and full-featured website for showcasing Jenkins Infra statistics.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;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/vandit1604&quot;&gt;Vandit Signh&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/hlemeur&quot;&gt;Herve Le Meur&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC contributor: &lt;a href=&quot;https://github.com/shlomomdahan&quot;&gt;Shlomo Dahan&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;4) &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/project-ideas/enhancing-an-existing-llm-model-with-domain-specific-jenkins-knowledge/&quot;&gt;Enhancing an Existing LLM Model with Domain-specific Jenkins Knowledge&lt;/a&gt; - To develop an app using an existing open-source LLM model with data collected for domain-specific Jenkins knowledge that can be fine-tuned locally and set up with a proper UI for the user to interact with.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;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/harsh-ps-2003&quot;&gt;Harsh Pratap Singh&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/shivaylamba&quot;&gt;Shivay Lamba&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/laulopezreal&quot;&gt;Laura Lopez Real&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC contributor: &lt;a href=&quot;https://github.com/nouralmulhem&quot;&gt;Nour Almulhem&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;5) &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/projects/improving-maintainability-of-rpu/&quot;&gt;Improve Maintainability for the Repository Permission Updater&lt;/a&gt; - Automating the management of GitHub permissions to improve maintainability for the Repository Permission Updater for Jenkinsci.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentors: &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/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/iamrajiv&quot;&gt;Rajiv Singh&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC contributor: &lt;a href=&quot;https://github.com/TheMeinerLP&quot;&gt;Phillipp Glanz&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/04/19/jenkins-community-award-winners/</id>
<title>Jenkins 2024 Community Award Winners</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-04-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/04/19/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 2024 just wrapped up in Seattle 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 everyone who nominated candidates and voted for the awards, these would not be possible without your participation.
Furthermore, thanks to all the nominees for their work in Jenkins.
The project thrives on the work...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;cdCon 2024 just wrapped up in Seattle 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 everyone who nominated candidates and voted for the awards, these would not be possible without your participation.
Furthermore, thanks to all the nominees for their work in Jenkins.
The project thrives on the work of the community, and the award winners definitely represent this idea.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2024 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/Yaniv-git.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/yaniv-git&quot;&gt;Yaniv Nizry&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yaniv reported two critical vulnerabilities towards the end of 2023 that the security team was able to utilize and publish fixes for.
Yaniv’s reporting, response, and collaboration was exemplary for the Security team in addressing the issues and ensuring the fixes were complete and thoroughly tested.
Without Yaniv’s work, these vulnerabilities could have lingered around longer than we would have liked.
However, thanks to the efforts of both the Jenkins Security team and Yaniv, we were able to address and reassure users of the resolution.&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/2024/04/19/stefan-spieker.png&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/StefanSpieker&quot;&gt;Stefan Spieker&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stefan has been a fantastic contributor to the Jenkins project and wonderful member of the Jenkins community for quite some time now.
His contributions are numerous and can be felt through the performance and reliability Jenkins provides users.
He has also worked to clean up older/deprecated code warnings, even helping Jenkins get to zero open SpotBugs issues.
Stefan was also &lt;a href=&quot;https://contributors.jenkins.io/pages/contributors/stefan-spieker/&quot;&gt;recently featured&lt;/a&gt; as part of the Contributor Spotlight, providing some further background on who he is and his work in the project.&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/darinpope.jpg&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/darinpope&quot;&gt;Darin Pope&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Darin has provided hundreds of video tutorials for Jenkins users, with his Jenkins tutorials playlist on CloudBees TV covering over 300 topics of interest to Jenkins users.
Many of the videos have been included in Jenkins documentation, including &lt;a href=&quot;https://youtu.be/2-L0WohfsqY&quot;&gt;Installing on Red Hat Enterprise Linux&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/XuMrEDA8cAI&quot;&gt;Installing on Microsoft Windows&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/IOUm1lw7F58&quot;&gt;Why Pipeline?&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/Wj-weFEsTb0&quot;&gt;Extending Pipelines with Shared Libraries&lt;/a&gt;, and &lt;a href=&quot;https://youtu.be/mbeQWBNaNKQ&quot;&gt;Pipeline best practices&lt;/a&gt;.
Darin is the co-author of the &lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/&quot;&gt;Improve a plugin tutorial&lt;/a&gt; for Jenkins maintainers, which has been used to modernize many Jenkins plugins.
Darin also hosts the &lt;a href=&quot;https://www.youtube.com/playlist?list=PLvBBnHmZuNQJeznYL2F-MpZYBUeLIXYEe&quot;&gt;&quot;What’s new in Jenkins LTS&quot;&lt;/a&gt; series that introduces the key features in each Jenkins long term support release.&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/alyssat.jpg&quot; alt=&quot;image&quot; width=&quot;99&quot; height=&quot;99&quot; /&gt; &lt;strong&gt;CDF Continuous Enthusiast: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, we want to announce that Alyssa Tong has won the CDF Community Award for Continuous Enthusiast.
Alyssa has been attending the CDF Outreach meetings for years and helps drive important initiatives like Google Summer of Code for Jenkins, while also taking the time to share that knowledge with the rest of the CDF community.
Alyssa is always advocating for and supporting the open-source community, representing the enthusiasm for CI/CD that pushes open source and Jenkins forward.&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/2024/04/04/gsoc-2024-contributor-application-period-concludes/</id>
<title>The GSoC 2024 contributor application has ended. What happens next?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-04-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/04/04/gsoc-2024-contributor-application-period-concludes/" />
<category term='gsoc'></category>
<category term='gsoc2024'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
The Google Summer of Code 2024 contributor application period has ended and we are excited to have received over 75 valid applications from potential contributors, interested in contributing to Jenkins via this program.
We are grateful to all the students who applied and look forward to reviewing their applications over the next few weeks.


Between March 18, 2024, when the contributor application period opened, and the end of the application period on April 2, 2024, the Jenkins project has been busy fielding candidate questions about the program, as well as reviewing some 40-odd draft proposals for GSoC hopefuls who have expressed interest...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Google Summer of Code 2024 contributor application period has ended and we are excited to have received over 75 valid applications from potential contributors, interested in contributing to Jenkins via this program.
We are grateful to all the students who applied and look forward to reviewing their applications over the next few weeks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Between March 18, 2024, when the contributor application period opened, and the end of the application period on April 2, 2024, the Jenkins project has been busy fielding candidate questions about the program, as well as reviewing some 40-odd draft proposals for GSoC hopefuls who have expressed interest in applying for the program.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we cannot share every detail about the ranking process, we can share some insights into the process in general.
Normally, all potential mentors are invited to grade each of the submitted proposals on a scale of one to five, with one being a strong rejection and five being a strong acceptance.
The Jenkins GSoC org admins then take the average of all the scores for each proposal and use that to rank the proposals.
The top ranked proposals are then nominated by Jenkins to Google for further consideration.
There might be some slight variations in this process, in that we also consider how applicants interact with each other during the application period and beyond, as well as how they engage with the Jenkins community in general.
Ultimately, the ideal applicant would be someone with an excellent proposal, usually one with a global grade of between four and five, who has shown a willingness to engage with the Jenkins community, and who has shown a willingness to learn and grow as a contributor.
Essentially, we would like to select the proposals that will have a high likelihood of succeeding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would like to take this opportunity to thank all applicants who have expressed an interest in applying for GSoC 2024 with Jenkins this year.
Your contributions to the project are invaluable and have enhanced the community in many ways.
We are looking forward to reviewing your proposals and working with the selected contributors over the summer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would also like to thank all the mentors who have volunteered to help with the program this year.
We are grateful for your time and dedication to the Jenkins project.
We are also grateful to the Jenkins community for their support and encouragement of the program.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/02/28/jenkins-contributor-summit-and-fosdem-recap/</id>
<title>Jenkins Contributor Summit and FOSDEM Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-02-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/02/28/jenkins-contributor-summit-and-fosdem-recap/" />
<category term='contributor-summit'></category>
<category term='fosdem'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
The previous in-person Jenkins Contributor Summit took place in 2020, just prior to the lockdowns and precautions that would change the world.
Thankfully, on February 2, 2024, just prior to this year&#8217;s FOSDEM conference, we were able to gather again, in Brussels, so that we could have an in-person Jenkins Contributor Summit.


The return to in-person meant that not only could we gather in one location, but we were also able to collaborate and work together directly, something that is not normally possible due to the global spread of the Jenkins community.
To make things even better, all of the Jenkins Officers and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The previous in-person Jenkins Contributor Summit took place in 2020, just prior to the lockdowns and precautions that would change the world.
Thankfully, on February 2, 2024, just prior to this year’s FOSDEM conference, we were able to gather again, in Brussels, so that we could have an in-person Jenkins Contributor Summit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The return to in-person meant that not only could we gather in one location, but we were also able to collaborate and work together directly, something that is not normally possible due to the global spread of the Jenkins community.
To make things even better, all of the Jenkins Officers and four of the five board members were able to travel to Brussels for the summit!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Massive thanks to &lt;a href=&quot;https://www.betacowork.com/&quot;&gt;Betacowork&lt;/a&gt; for providing a space that could hold the Contributor Summit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to follow along, we are including a link to the &lt;a href=&quot;https://docs.google.com/presentation/d/1tbsjqtA20yVxLhFSkCFVLyOzd2u6ucFmV2IME_Igf5c/edit?usp=sharing&quot;&gt;Contributor Summit slide deck&lt;/a&gt; to view the presentation at any time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The day started with &lt;a href=&quot;https://www.jenkins.io/blog/authors/jmmeessen&quot;&gt;Jean-Marc Meessen&lt;/a&gt; providing an overview of the agenda.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/jean-marc-summit-intro.jpg&quot; alt=&quot;Jean-Marc Meessen provides an introduction for the Jenkins Contributor Summit.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt; then provided a review of the current state of Jenkins as a project.
This covered everything from user and maintainer statistics to what the future of Jenkins will hopefully look like.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/mark-state-of-jenkins.jpg&quot; alt=&quot;Mark Waite provides an overview of the state of Jenkins.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following Mark, the Jenkins SIG leaders and Officers provided insights into their various areas of knowledge.&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/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;, the Infrastructure Officer, presented first, reviewing how Jenkins Infrastructure has evolved over the last year and what we are looking forward to in 2024.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/damien-infra-update.jpg&quot; alt=&quot;Damien Duportal provides an overview of the Jenkins infrastructure over 2023 and the goals for 2024.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next up was &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, the Release Officer, shared the successes and innovation that the project has experienced throughout 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/tim-release-update.jpg&quot; alt=&quot;Tim Jacomb reviews the Jenkins release updates over 2023 and hopes for 2024.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After Tim wrapped up his section of the presentation, &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;, the Documentation Officer, shared what we hope 2024 will look like for Jenkins documentation and Jenkins.io.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/kevin-docs-update.jpg&quot; alt=&quot;Kevin Martens shares insight into what to look for in documentation for 2024.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the Advocacy &amp;amp; Outreach SIG leader, &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; then recapped all of the events that Jenkins held or participated in during 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/alyssa-advocacy-update.jpg&quot; alt=&quot;Alyssa Tong recaps the events and successes of Jenkins&amp;apos; community.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;She also shared the exciting news that Jenkins has recently been won the Most Innovative DevOps Open Source Project award from DevOps Dozen&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/devops-award-group.png&quot; alt=&quot;Group photo of all the contributor summit attendees.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following Alyssa, &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;, the Security Officer, reviewed the successes that the Jenkins Security team had over the last year.
Wadeck also outlined tooling additions and changes to Jenkins that will help determine vulnerabilities and issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/wadeck-security-update.jpg&quot; alt=&quot;Wadeck Follonier reviews the statistics for Jenkins security in 2023.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tim Jacomb then took the stage once again to provide insights on the user experience of Jenkins.
He highlighted items such as the Plugin Manager improvements, UI modernization, and the work that Jan Faracik has contributed such as removing the Yahoo UI, among other things.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/tim-ui-evolution.jpg&quot; alt=&quot;Tim Jacomb shares the changes and updates the Jenkins UI has received over the last year&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After taking some time to break for lunch, we returned to the contributor summit to hear &lt;a href=&quot;https://github.com/vlatombe&quot;&gt;Vincent Latombe&lt;/a&gt; sharing what was done in Jenkins to support High Availability/Horizontal Scalability for CloudBees.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/vincent-scalability-update.jpg&quot; alt=&quot;Vincent Latombe reviews what has been done with Jenkins to support CloudBees HA/HS.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After Vincent finished, &lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; provided an update and shared what the roadmap looks like for Jenkinsfile Runner.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/oleg-jenkinsfile-runner-update.jpg&quot; alt=&quot;Oleg Nenashev provides an update on the Jenkinsfile Runner.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After Oleg wrapped up, &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt; provided insights and review from the Platform SIG.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/bruno-platform-update.jpg&quot; alt=&quot;Bruno Verachten reviews the Jenkins platform over 2023 and what the 2024 goals look like.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once Bruno finished his presentation, &lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault&quot;&gt;Alexander Brandes&lt;/a&gt; and Damien Duportal shared and discussed the idea (and potential challenges) of removing Blue Ocean from the Jenkins base distribution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/alex-and-damien-blue-ocean-update.jpg&quot; alt=&quot;Alexander Brandes and Damien Duportal discuss the eventual removal of Blue Ocean from Jenkins and the potential replacements.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a topic that will continue to be discussed for the foreseeable future, until a reasonable solution and replacement can be decided upon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After all of the presentations were finished, &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; provided an overview and demo for Searching for API usage in plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/basil-api-usage-demo.jpg&quot; alt=&quot;Basil Crow demonstrates why tracking API usage in plugins is important and what it can help with.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The presentation itself reviewed what the API usage might include, why it is helpful to perform this search, why migrations should be managed, and why empathy is a core value when it comes to development and engineering.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Contributor Summit then concluded with a two hour group coding session, where attendees were encouraged to work with other members of the summit to work on any of the topics that were discussed prior.
This provided an opportunity for people to work directly with one another, which would otherwise be impossible due to how far the Jenkins community stretches.
Work that would typically be done asynchronously was instead immediately possible thanks to the proximity of the contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/group-coding-session.jpg&quot; alt=&quot;The group coding session to end the contributor summit&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, with the Contributor Summit wrapped up, we shifted focus to FOSDEM and the rest of the weekend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year’s FOSDEM conference was as busy as ever!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/damien-stephane-booth.jpg&quot; alt=&quot;Damien Duportal and Stephane Merle converse with guests to the Jenkins booth at FOSDEM.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins booth saw tons of visitors over the two days, and we even sold out most of our t-shirts!
Bruno once again brought miniJen and a whole new Kubernetes (Roundernetes) set-up to help draw visitors in and have conversations around what Jenkins is capable of.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/minijen-bruno-stephane-booth.jpg&quot; alt=&quot;Bruno Verachten and Stephane Merle setting up miniJen and Roundernetes at the Jenkins booth.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the course of FOSDEM, we received hundreds of visitors, evident by the lack of stickers that we brought home.
There was very little downtime at the Jenkins stand, with visitors constantly coming by with questions about Jenkins present and future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/bruno-damien-booth.jpg&quot; alt=&quot;Damien Duportal and Bruno Verachten at the Jenkins booth during FOSDEM.&quot; width=&quot;631&quot; height=&quot;839&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overall, the Contributor Summit and FOSDEM were both wildly successful for the Jenkins community, proving again how important these events are.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2024/02/28/end-of-fosdem-group.jpg&quot; alt=&quot;The Jenkins team at the end of FOSDEM.&quot; width=&quot;839&quot; height=&quot;631&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;thanks-and-gratitude&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thanks-and-gratitude&quot; /&gt;Thanks and gratitude&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We want to share our deep appreciation to &lt;a href=&quot;https://www.betacowork.com/&quot;&gt;Betacowork&lt;/a&gt; for providing a room for the Jenkins contributor summit.
The room was more than enough for all of the contributors to gather and share in the summit, in addition to providing great space for the group coding session.
Thanks to Jean-Marc Meessen for connecting with Betacowork to secure the room for this year’s summit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also want to thank &lt;a href=&quot;https://fosdem.org/2024/&quot;&gt;FOSDEM&lt;/a&gt; for once again allowing Jenkins to be part of the event.
It was a wonderful experience to attend the conference and share Jenkins with the open-source community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would also like to thank both CloudBees and the Continuous Delivery Foundation for donating the shirts, socks, and stickers that occupied our booth for the weekend.&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;&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/02/23/gsoc2024-announcement/</id>
<title>Google Summer of Code 2024… Here We Come!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-02-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/02/23/gsoc2024-announcement/" />
<category term='gsoc'></category>
<category term='gsoc2024'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
We are thrilled to announce that Jenkins has been accepted to Google Summer of Code 2024!
This will be Jenkins' eighth year as a mentoring organization.


Congratulations to all 195 accepted open-source organizations!


As a mentoring organization for the past seven years, Jenkins has mentored 35 GSoC students by 85+ different mentors, bringing together over 110 strangers for a common idea - Jenkins!


At the heart of it, GSoC is more than just a mentoring program.
The intention is to welcome and engage with new contributors in open source.
It is about giving a little of your day to make a lifetime of difference, not only...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are thrilled to announce that Jenkins has been accepted to &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code 2024&lt;/a&gt;!
This will be Jenkins&#39; eighth year as a mentoring organization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to all &lt;a href=&quot;https://summerofcode.withgoogle.com/programs/2024/organizations&quot;&gt;195 accepted open-source organizations&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a mentoring organization for the past seven years, Jenkins has mentored 35 GSoC students by 85+ different mentors, bringing together over 110 strangers for a common idea - Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the heart of it, GSoC is more than just a mentoring program.
The intention is to welcome and engage with new contributors in open source.
It is about giving a little of your day to make a lifetime of difference, not only for the GSoC contributors, but also for the many Jenkins users who will benefit from the improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to welcome new GSoC contributors to the Jenkins family.
We think you will enjoy this valuable experience while developing your technical skills.
You will gain insights into how the community works.
The best part will be learning from people who are passionate about Jenkins and, more importantly, they are passionate about wanting to make a difference for another individual (GSoC contributors) and for the betterment of the project as a whole.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For detailed information on Jenkins GSoC 2023, please refer to &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/&quot;&gt;the completed projects&lt;/a&gt;.&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/gsoc/2024/GSoC2024-here-we-come.png&quot; alt=&quot;Here we come&quot; /&gt;&lt;/span&gt;
&lt;/p&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;GSoC &lt;a href=&quot;https://opensource.googleblog.com/2024/02/mentor-organizations-announced-for-google-summer-of-code-2024.html&quot;&gt;officially announced the accepted mentor organizations&lt;/a&gt;, so please expect more potential GSoC contributors to contact projects in our &lt;a href=&quot;https://www.jenkins.io/projects/gsoc#contacts&quot;&gt;Gitter and Discourse channels&lt;/a&gt;.
Many communications will also happen in SIG and sub-project channels.
We will be working hard to help potential participants to find projects that align with their interests, explore the relevant domain(s), and to prepare their project proposals before the deadline on April 2nd (UTC).
Then, we will process the applications, select projects, and assign mentor teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All information about the Jenkins GSoC is available on its &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;sub-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;how-do-i-apply&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-apply&quot; /&gt;How do I apply?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors&quot;&gt;information for contributors&lt;/a&gt; page for full application guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage interested participants to reach out to the Jenkins community early and start exploring project ideas.
We also encourage participants to join the weekly &lt;a href=&quot;https://docs.google.com/document/d/1UykfAHpPYtSx-r_PQIRikz2QUrX1SG-ySriz20rVmE0/edit?usp=sharing&quot;&gt;Jenkins GSoC office hours&lt;/a&gt;.
These meetings are for participants to meet org admins and mentors and to ask questions.
Also, be sure to join our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;Gitter channel&lt;/a&gt; and &lt;a href=&quot;https://community.jenkins.io/c/contributing/gsoc/6&quot;&gt;Discourse server&lt;/a&gt; to receive information about such incoming events in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The application period starts on March 18th (UTC), but you should prepare now!
Use the time before the application period to discuss and improve your project proposals.
We also recommend familiarizing yourself with Jenkins and exploring your proposal areas.
Project ideas include quick-start guidelines and reference newbie-friendly issues, which may help with your initial study.
If you do not see anything interesting, you can &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;propose your own project idea&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;i-want-to-be-a-mentor-is-it-too-late&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-want-to-be-a-mentor-is-it-too-late&quot; /&gt;I want to be a mentor. Is it too late?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s not!
We are looking for more project ideas and for Jenkins contributors or users who are passionate about Jenkins and want to be a mentor.
No hardcore experience is required, as mentors can study the project internals together with GSoC contributors and technical advisors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can either propose a new project idea or join an existing one.
The &lt;a href=&quot;https://www.jenkins.io/blog/2023/12/05/google-summer-of-code-a-call-for-mentors/&quot;&gt;call for mentors blog post&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors&quot;&gt;information for mentors&lt;/a&gt; page have additional information on being a mentor.
If you want to propose a new project, please do so as soon as possible so that potential GSoC contributors have time to explore them and prepare their proposals.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, mentorship does &lt;strong&gt;NOT&lt;/strong&gt; require strong expertise in Jenkins development.
The objective is to guide participants and get involved in the Jenkins community.
GSoC org admins will help find advisors if special expertise is required.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;important-dates-for-gsoc-2024&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates-for-gsoc-2024&quot; /&gt;Important dates for GSoC 2024&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;February 22 - March 18&lt;/strong&gt; - Potential GSoC contributors discuss application ideas with mentoring organizations.
Show &lt;a href=&quot;https://community.jenkins.io/c/contributing/gsoc/6&quot;&gt;us&lt;/a&gt; your proposal!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;March 18&lt;/strong&gt; - The GSoC contributor application period begins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;April 2&lt;/strong&gt; - The GSoC contributor application deadline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;May 1&lt;/strong&gt; - Accepted GSoC contributor projects are announced.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;May 1 - May 26&lt;/strong&gt; - Community Bonding Period | GSoC contributors get to know mentors, read documentation, and get up to speed to begin working on their projects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;May 27&lt;/strong&gt; - Coding officially begins!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;July 8&lt;/strong&gt; - The Midterm evaluation deadline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;August 19 - August 26&lt;/strong&gt; - Final week: GSoC contributors submit their final work product.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;September 3&lt;/strong&gt; - Initial results of Google Summer of Code 2024 are published.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;November 4&lt;/strong&gt; - Final date for all GSoC contributors to submit their final work product.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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 more info.&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/2024/01/29/nominate-someone-2024-jenkins-contributor-awards/</id>
<title>Nominate Someone – 2024 Jenkins Contributor Awards</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-01-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/01/29/nominate-someone-2024-jenkins-contributor-awards/" />
<author>
<name>alyssat</name>
</author>
<summary>
Jenkins Contributor Awards for 2024 are being run by the Continuous Delivery Foundation (CDF) along with many other CDF Community Awards.


The nominations are open and are being accepted using GitHub issues to make the process transparent.
Any contributor is eligible!
The deadline to nominate someone is February 19, 2024.
Voting will open on February 22 and close on Friday, March 22.
You can vote using this Google form that lists all of the awards and nominees.


Nominate contributors or vote with reactions/comments for all three Jenkins awards:




Most Valuable Jenkins Contributor


Most Valuable Jenkins Advocate


Jenkins Security MVP




The winners will be announced at cdCon 2024 on April 16...
</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/2024/community_awards_2024_jenkins_nominate_1.png&quot; alt=&quot;Nominate Someone – 2024 Jenkins Contributor Awards&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Contributor Awards for 2024 are being run by the Continuous Delivery Foundation (CDF) along with many other &lt;a href=&quot;https://cd.foundation/cdf-community-awards-2024/&quot;&gt;CDF Community Awards&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nominations are open and are being accepted using GitHub issues to make the process transparent.
Any contributor is eligible!
The deadline to nominate someone is February 19, 2024.
Voting will open on February 22 and close on Friday, March 22.
You can vote using &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScUHeNX-4H5jboVo6nRxo0-JtMiA8pLvMq2VkNYceax4frHPQ/viewform?pli=1&quot;&gt;this Google form&lt;/a&gt; that lists all of the awards and nominees.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominate contributors or vote with reactions/comments for all three Jenkins awards:&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/7028&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/7030&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/7029&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;The winners will be announced at cdCon 2024 on April 16 - 18, 2024.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also nominate Jenkins community members for global awards like &quot;Top CDF Ambassador&quot;, &quot;Top CDF Contributor&quot;, or &quot;Top CDF End User&quot;!
For all CDF Community Awards and more details, visit the &lt;a href=&quot;https://cd.foundation/cdf-community-awards-2024/&quot;&gt;CDF Award Page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/01/25/jenkins-2023-recap/</id>
<title>Jenkins 2023 Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-01-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/01/25/jenkins-2023-recap/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Contributed by: Wadeck Follonier


The Jenkins Security team has multiple missions, with the most visible to users being the publication of advisories.


In 2023, the team published 17 advisories: 4 included Jenkins core, and 13 were solely about plugins.
In total, 211 vulnerabilities were announced.


In terms of reporting trends, we have seen an increase in people reporting CVEs originating from dependencies.
Our position on this issue is that when analyzing CVEs, if they are impacting we correct them and publish an advisory; otherwise, we publish a blog post only for the most popular ones, such as Spring4Shell or Log4Shell.
With dozens of CVEs published every...
</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/2024/01/25/image1.png&quot; alt=&quot;Jenkins 2023 recap&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Security team has multiple missions, with the most visible to users being the publication of advisories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2023, the team published &lt;a href=&quot;https://www.jenkins.io/security/advisories/&quot;&gt;17 advisories&lt;/a&gt;: 4 included Jenkins core, and 13 were solely about plugins.
In total, 211 vulnerabilities were announced.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In terms of reporting trends, we have seen an increase in people reporting CVEs originating from dependencies.
Our position on this issue is that when analyzing CVEs, if they are impacting we correct them and publish an advisory; otherwise, we publish a blog post only for the most popular ones, such as &lt;a href=&quot;https://www.jenkins.io/blog/2022/03/31/spring-rce-CVE-2022-22965/&quot;&gt;Spring4Shell&lt;/a&gt; or &lt;a href=&quot;https://www.jenkins.io/blog/2021/12/10/log4j2-rce-CVE-2021-44228/&quot;&gt;Log4Shell&lt;/a&gt;.
With dozens of CVEs published every month, we prefer not to publish information for each one unless it is relevant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To reduce the occurrence of those issues and provide reporters with a point of reference, we have updated the &lt;a href=&quot;https://github.com/jenkinsci/docker/blob/master/SECURITY.md&quot;&gt;security policy in Docker&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would also like to extend our gratitude to the &lt;a href=&quot;https://securitylab.github.com/&quot;&gt;GitHub Security Lab&lt;/a&gt; for reporting 27 vulnerabilities through their &lt;a href=&quot;https://codeql.github.com/&quot;&gt;CodeQL&lt;/a&gt; rules and for their collaborative efforts in both the analysis and the enhancement of our tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The team does not rely solely on “external” security researchers to find vulnerabilities; a considerable amount of time during the year is spent on proactively auditing the code.
This year was marked by some specific research areas: OAuth flow and disabled SSL validation, in addition to the usual CSRF, XSS, or XXE vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, we have expanded the scope of our security reviews for Pull Requests, particularly in Jenkins core.
Approximately &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pulls?q=is%3Apr+label%3Asecurity-approved&quot;&gt;70 PRs&lt;/a&gt; were labeled as “security-approved”.
This proactive measure allowed the team to prevent the introduction of some vulnerabilities, which is significantly less costly than addressing them after they have been incorporated into the production code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As part of our mission, raising community awareness about security is also a key factor in reducing the introduction of vulnerabilities at an early stage.
In this regard, we welcomed Andrea to our security team for a summer internship from June to August.
By the end of it, he had successfully reported 28 vulnerabilities.
For more information about his internship, you can read &lt;a href=&quot;https://www.jenkins.io/blog/2023/08/23/summer-internship-in-jenkins-security/&quot;&gt;his blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Education and tooling are closely related for us.
We are investing time to propose new security automation and to improve our existing tooling.
This year, we &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/-wTosY82jZU/m/8OidfVTcAAAJ&quot;&gt;introduced&lt;/a&gt; the existing CodeQL ruleset for hosting requests.
This provided future maintainers with detailed explanations of the findings.
Along with this effort, we also enhanced our security scan by &lt;a href=&quot;https://github.com/jenkins-infra/jenkins-security-scan/pull/13&quot;&gt;supporting warning suppression&lt;/a&gt; through code annotation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Continuing with tooling improvements, we &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/8Ia0OBmzF1A/m/YBdi40u3BAAJ&quot;&gt;added&lt;/a&gt; a beta feature to the bot present in SECURITY tickets, allowing maintainers to block or unblock releases of their plugins.
The intent of this feature is to reduce the likelihood of an involuntary release when one is staged in private for a future advisory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/EqBm9AuAm-k/m/G_YPRuYZAgAJ&quot;&gt;introduced&lt;/a&gt; the possibility of having an exclusive CD mode.
This option allows maintainers to force all releases of their plugins to be done through the official CI, reducing the risk related to their laptops being compromised.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nowadays, AI is everywhere.
For security, it’s often a bit more complicated due to the aspect of confidentiality.
To circumvent this while still delving into the topic, we have been using OpenAI API since October to triage the new JENKINS tickets.
It’s the public tracker for Jenkins, but sometimes, vulnerability reports are wrongly submitted there.
AI has helped us detect whether something is security-related and thus expands our scope without needing to monitor everything.
This approach has proven to be quite successful after three months.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Along with other small projects, we continue to work on more long-term/background projects, such as the &lt;a href=&quot;https://docs.google.com/document/d/1hr_Kaf0fVWBACibpHbSYsk4RoqcHD3cBrqXxuTtWKVM&quot;&gt;introduction&lt;/a&gt; of the Content-Security-Policy header. Throughout the year, we made &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/71014&quot;&gt;significant progress&lt;/a&gt; in covering the core usage of inline JavaScript.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is a project of the Continuous Delivery Foundation.
We’re grateful for the many different ways that the Continuous Delivery Foundation supports the Jenkins project.
They provide financial support for Jenkins infrastructure, promotional support for Jenkins initiatives, infrastructure support for the Jenkins issue tracker, and consultation on many other topics.
The Jenkins project was well represented at cdCon 2023 and at cdCon Japan.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Infrastructure costs decreased by 21% in 2023 while usage increased.
Jenkins use is increasing worldwide and Jenkins infrastructure continues to meet the growing needs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins infrastructure broadened its operating environments in 2023 by expanding its use of ARM64 processors to reduce costs.
Additional software improvements were implemented in the Jenkins Pipeline to reduce costs while maintaining reliability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Costs were further reduced by the Artifactory bandwidth reduction project.
We’ve gone from 50 TB per month to 15 TB per month of artifact repository bandwidth use, thanks to help from JFrog and implementations of artifact caching proxies by the infrastructure team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re grateful for donations from our organizational sponsors like CloudBees, the Continuous Delivery Foundation, and the Linux Foundation and for our infrastructure sponsors including GitHub, JFrog, Atlassian, Microsoft, DigitalOcean, Netlify, PagerDuty, Discourse, Datadog, and Cloudflare.
We deeply appreciate the mirror providers around the world like Oregon State University Open Source Lab, Tsinghua University, XMission, Yamagata University, Servana, Belnet, and RWTH Aachen University.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The badly outdated and unmaintained Prototype.js JavaScript library has been &lt;a href=&quot;https://www.jenkins.io/blog/2023/10/09/prototype-removed/&quot;&gt;removed from Jenkins&lt;/a&gt; core and from over 50 Jenkins plugins.
Special thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt; for their work to identify and replace Prototype.js references in Jenkins JavaScript.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;User interface look and feel improvements continued throughout 2023.
Improvements were delivered in forms, menus, and pages. Menus are easier to navigate and easier to understand.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Multiple improvements were released for the Jenkins management pages, including the new “Appearance” page that makes it easier to use Jenkins themes.
Forms, pages, and menus have all been enhanced in 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Navigation of cloud management pages is simpler and clearer thanks to layout and navigation enhancements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hundreds of user interface improvement pull requests have been merged this year. Thanks to all those contributors!&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The year 2023 has been a significant period for the Jenkins project, marked by notable advancements and achievements.
The community as a whole has played a crucial role in shaping the project’s trajectory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;software-versions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#software-versions&quot; /&gt;Software Versions&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Core: The project witnessed multiple Jenkins Core releases, featuring advancements in stability, security, and added features.
Notable releases include Jenkins &lt;a href=&quot;https://www.jenkins.io/download/lts/&quot;&gt;LTS&lt;/a&gt; &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.426.2&quot;&gt;2.426.2&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/download/weekly/&quot;&gt;weekly&lt;/a&gt; releases, reflecting our commitment to both stability and innovation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java Versions: The transition to &lt;a href=&quot;https://www.jenkins.io/blog/2023/08/01/documentation-transition-to-java-17/&quot;&gt;Java 17&lt;/a&gt; and subsequently Java 21 marked a significant step forward.
The community diligently tested the top 250 plugins with Java 21, showcasing the project’s adaptability to evolving technologies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java Support Plan: The proposal and discussion around the &lt;a href=&quot;https://www.jenkins.io/blog/2023/11/06/introducing-2-2-2-java-support-plan/&quot;&gt;2+2+2 Java Support Plan&lt;/a&gt; demonstrated a strategic vision for the project’s future.
This aligns with industry standards, ensuring long-term sustainability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dependency Updates: Components throughout the Jenkins project were updated in 2023, including operating systems, libraries, and tools.
We also made essential transitions, such as moving to Debian Bookworm, the latest Alpine version, and implementing an end-of-life warning.
This helps users know when they need to upgrade their OS or Java version.
Additionally, we officially declared the end of life for Jenkins support of Red Hat Enterprise Linux 7 and derivatives like Centos 7 and Amazon Linux 2.&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;docker-images-and-containers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-images-and-containers&quot; /&gt;Docker Images and Containers&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The transition to using OS-based images and installing JDK from binaries in some instances, rather than relying solely on Temurin images, highlighted our adaptability to evolving best practices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now, all Docker images are available with a version of Eclipse Temurin JDK21.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We &lt;a href=&quot;https://hub.docker.com/layers/jenkins/ssh-agent/latest/images/sha256-e830c3a9c8a2c73c9fb3fdd6c174242316b305c4d412d3d9baabb5aba613e5a0?context=explore&quot;&gt;expanded our platform support&lt;/a&gt; to include amd64, aarch64, s390x, &lt;a href=&quot;https://hub.docker.com/layers/jenkins/ssh-agent/windowsservercore-ltsc2019-jdk11/images/sha256-5d380f5cd04a242155ac79d229cd43541f5a5e5756c539af310bb5067b137130?context=explore&quot;&gt;windows/amd64&lt;/a&gt;, and even &lt;a href=&quot;https://hub.docker.com/layers/jenkins/ssh-agent/latest-jdk21-preview/images/sha256-e430f59211c9b4a38114e8fd640570b434717fa674f54b65f6f72a554bc51a19?context=explore&quot;&gt;armv7&lt;/a&gt; for some images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regular dependency updates were a focus in 2023:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker agent received &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pulls?page=9&amp;amp;q=is%3Apr+created%3A%3C2023-12-31+closed%3A%3E2023-01-01&quot;&gt;205 pull requests&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inbound agent saw &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/pulls?q=is%3Apr+created%3A%3C2023-12-31+closed%3A%3E2023-01-01+&quot;&gt;132 pull requests&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker ssh-agent had &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pulls?q=is%3Apr+created%3A%3C2023-12-31+closed%3A%3E2023-01-01+&quot;&gt;139 pull requests&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker had &lt;a href=&quot;https://github.com/jenkinsci/docker/pulls?page=1&amp;amp;q=is%3Apr+created%3A%3C2023-12-31+closed%3A%3E2023-01-01&quot;&gt;219 pull requests&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;expanded-compatibility-testing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#expanded-compatibility-testing&quot; /&gt;Expanded Compatibility Testing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project added over 90 plugins to the compatibility testing suite that is part of our plugin bill of materials.
The most popular Jenkins plugins are regularly tested in a Jenkins configuration with hundreds of other plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These updates and transitions underscore our commitment to providing a robust and adaptable platform for our users.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout 2023, the Jenkins site and documentation saw several changes from returning and new contributors.
Over the course of 12 months, the site had a total of &lt;strong&gt;843&lt;/strong&gt; pull requests merged, &lt;strong&gt;67&lt;/strong&gt; blog posts from &lt;strong&gt;21&lt;/strong&gt; different authors, and &lt;strong&gt;98&lt;/strong&gt; plugin wiki migrations completed.
These pull requests and blog posts covered everything from minor adjustments and refinements to major announcements regarding Jenkins and everything in between.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of the notable changes that happened were:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The addition of the &lt;a href=&quot;https://www.jenkins.io/doc/book/platform-information/&quot;&gt;Platform Information&lt;/a&gt; section, which contains Java information and Jenkins support policies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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; is now visible on &lt;a href=&quot;https://plugins.jenkins.io/&quot; class=&quot;bare&quot;&gt;https://plugins.jenkins.io/&lt;/a&gt;, providing users insight into the health of plugins in the Jenkins ecosystem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/books/&quot;&gt;Books&lt;/a&gt; page was updated with new additions &amp;amp; formatting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://contributors.jenkins.io/&quot;&gt;Contributor Spotlight&lt;/a&gt; page was launched to highlight the heaviest contributors to Jenkins. The goal is to appreciate and showcase the talent and hard work that goes into keeping Jenkins working behind the scenes.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This was done in collaboration with the Outreach &amp;amp; Advocacy SIG.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several enhancements to Jenkins.io for mobile users were implemented so that regardless of platform, everyone can access and read every screen.
Additionally, there is a new layout for the blog, where each post is displayed as a card.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was also the addition of UpdateCLI to the jenkins.io repository.
This has helped ensure that whenever new versions of Jenkins are released, the documentation is updated accordingly.
Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar/&quot;&gt;Bruno Verachten&lt;/a&gt; for his work on getting this configured and added.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/blog/tags/gsoc2023/&quot;&gt;Google Summer of Code&lt;/a&gt; participants also provided various contributions to both Jenkins core and Jenkins.io, sharing their experiences and insights with the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the coming year, we are also planning on implementing a versioned documentation site, where users will select which Jenkins LTS version they are using and see the corresponding documentation.
This is the result of a Google Summer of Code project &lt;a href=&quot;https://www.jenkins.io/blog/2023/09/24/building-jenkinsio-with-alternative-tools/&quot;&gt;originally looking at alternative build tools for jenkins.io&lt;/a&gt;.
Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern/&quot;&gt;Kris Stern&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/vandit1604/&quot;&gt;Vandit Singh&lt;/a&gt; for all their work on this.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2023, through the collaboration and contributions of new and existing community members from around the globe, the Jenkins project successfully completed the following projects for the betterment of Jenkins:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The launching of a new site, &lt;a href=&quot;https://contributors.jenkins.io/&quot;&gt;contributors.jenkins.io&lt;/a&gt;, is dedicated to highlighting top Jenkins contributors who are dedicating their time and talent to shape the future of Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Participated in &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/&quot;&gt;Google Summer of Code 2023&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Welcomed 80+ new contributors with over 400 pull requests merged in &lt;a href=&quot;https://www.jenkins.io/blog/2023/09/20/Hacktoberfest-2023/&quot;&gt;Hacktoberfest 2023&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Participated in &lt;a href=&quot;https://www.jenkins.io/blog/2023/09/06/devops-world-tour/&quot;&gt;five DevOps World locations, with community speakers&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tim Jacomb - London&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Olivier Lamy - Singapore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mark Waite - New York, Chicago, and Santa Clara&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Along the way, Jenkins won the &lt;a href=&quot;https://devopsdozen.com/devops-dozen-2023-community-award-winners/&quot;&gt;DevOps Dozen Most Innovative DevOps Open Source Project award for 2023&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/post-images/2024/01/25/award.png&quot; alt=&quot;DevOps Dozen Most Innovative DevOps Open Source Project award.&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project is also excited to share what’s to come in 2024:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins in GSoC 2024: &lt;a href=&quot;https://www.jenkins.io/blog/2023/12/05/google-summer-of-code-a-call-for-mentors/&quot;&gt;Call for Project Ideas + Call for Mentors&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/02Ygo5RAcu4&quot;&gt;A Guide for Mentors&lt;/a&gt; is a great resource for potential GSoC mentors, who want to give back to the community through the act of mentorship.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/11/10/Jenkins-Contributor-Summit-in-Brussels/&quot;&gt;Contributor Summit at FOSDEM&lt;/a&gt;: A day-long event featuring updates on the &quot;State of Jenkins&quot;, Projects/SIGs, discussion on various key projects, and demos (Feb 2, 2024).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2024/&quot;&gt;FOSDEM&#39;24&lt;/a&gt;: Jenkins will have a devstand at FOSDEM (Feb 3-4, 2024).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.socallinuxexpo.org/scale/21x&quot;&gt;SCALE 21x&lt;/a&gt;: Jenkins will have a booth presence at SCALE (March 14-17, 2024)&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;Jenkins Momentum&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In August, we worked together with the Linux Foundation and the CloudBees communications teams to report out on achievements of the Jenkins project. We highlighted growth in Jenkins jobs, along with the vibrant contributor community and impressive community sponsors. Jenkins still enjoys an estimated 44% market share and is a critical part of the IT infrastructure enabling organizations to automate their CI/CD processes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Specifically, as reported in the news release and from the community stats:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Monthly Jenkins Pipeline jobs defined grew 79% during the period June 2021 – June 2023, from 27,105,176 jobs per month to 48,625,398 jobs per month. Jenkins Pipeline jobs are used to build out CI/CD software delivery automation flows, or software pipelines. Growth in this job type is a leading indicator of CI/CD adoption and, specifically, the pervasiveness of Jenkins-based CI/CD.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Total monthly jobs rose 45% from June 2021, when 50,785,205 jobs per month were defined, to June 2023 when 73,746,418 jobs per month were defined. Growth in the total monthly workload (all Jenkins jobs) further demonstrates the expansion of Jenkins usage within organizations.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The news release also called out the 600 active contributors the Jenkins project has, along with sponsors such as GitHub, Atlassian, AWS, CloudBees, Datadog, DigitalOcean, Discourse, Fastly, GitHub, IBM, JFrog, Netlify, PagerDuty, and Sentry.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Many THANKS!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project consists of more than 2000 plugins and components which are maintained and developed by thousands of contributors from around the globe.
Thanks to them, a lot of improvements happen in the project every day.
We are grateful to everybody who participates in the project, regardless of contribution size. Every bit makes a difference: new features, bug fixes, documentation, blog posts, well reported issues, Stackoverflow responses, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;MANY THANKS FOR ALL YOUR CONTRIBUTIONS!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s looking forward to many more exciting accomplishments to come in 2024!&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/01/25/sonar-vulnerability-report/</id>
<title>Collaboration is Key - Making the Open-Source Community Safer for Developers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-01-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/01/25/sonar-vulnerability-report/" />
<author>
<name>Yaniv-git</name>
</author>
<category term='security'></category>
<category term='community'></category>
<summary>
Who is Sonar?


Sonar is a code quality and security tool that helps developers write Clean Code.
Sonar analyzes code for issues that lead to unreliable, unmaintainable, and insecure software at two points in the development lifecycle - first, when the developer initially writes code in the IDE with SonarLint and, again, as part of the Continuous Integration (CI) pipeline before the code is sent for release with SonarQube or SonarCloud.


To keep up with the latest cyber security trends and better understand emerging threats, the dedicated research team at Sonar finds and inspects vulnerabilities in modern open-source applications; we incorporate all of...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;who-is-sonar&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#who-is-sonar&quot; /&gt;Who is Sonar?&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://www.sonarsource.com/&quot;&gt;Sonar&lt;/a&gt; is a code quality and security tool that helps developers write &lt;a href=&quot;https://www.sonarsource.com/solutions/clean-code/&quot;&gt;Clean Code&lt;/a&gt;.
Sonar analyzes code for issues that lead to unreliable, unmaintainable, and insecure software at two points in the development lifecycle - first, when the developer initially writes code in the IDE with &lt;a href=&quot;https://www.sonarsource.com/products/sonarlint/&quot;&gt;SonarLint&lt;/a&gt; and, again, as part of the Continuous Integration (CI) pipeline before the code is sent for release with &lt;a href=&quot;https://www.sonarsource.com/products/sonarqube/&quot;&gt;SonarQube&lt;/a&gt; or &lt;a href=&quot;https://www.sonarsource.com/products/sonarcloud/&quot;&gt;SonarCloud&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To keep up with the latest cyber security trends and better understand emerging threats, the dedicated research team at Sonar finds and inspects vulnerabilities in modern open-source applications; we incorporate all of our insights into our products (SonarLint, SonarQube, SonarCloud).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our endeavor to help secure open-source projects and improve, our research team decided to take a look at the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-jenkins&quot; /&gt;Why Jenkins?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before we get started, we’d like to thank the Jenkins team for their fast response, dedicated effort to getting this fixed, and transparency throughout the disclosure process.
Okay, let’s get into it…&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We saw this research as an excellent opportunity - and a challenging one, because Jenkins is highly popular, well-maintained, and has a great community.
Given the broad adoption and usage of Jenkins by the community, we felt it is important to analyze the security of this code base, and if we were to find a vulnerability, it would not only help the users of Jenkins but also help us better understand and improve the security capability of our solutions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From a research perspective, ignoring the impact aspect, going into well-maintained code is a double-edged sword.
On the one hand, the code has less potential for security vulnerabilities and poses a bigger challenge for finding bugs.
On the other hand, because it is easily understandable code, in addition to the well-written and thorough documentation, the researcher can progress quickly and assess the project better.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-our-research-approach-what-did-we-look-at-in-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-our-research-approach-what-did-we-look-at-in-jenkins&quot; /&gt;What is our research approach, what did we look at in Jenkins?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our initial research approach is more or less identical for each project.
First, we try to understand the project from a user’s perspective.
In the case of Jenkins, this was made easy due to the well-documented “Jenkins Handbook” and the large community that already tackled many issues and questions on the internet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following that, we started debugging and getting our hands dirty.
Slowly but surely we got a good grasp on the architecture of Jenkins, from how the project “&lt;a href=&quot;https://github.com/jenkinsci/stapler&quot;&gt;staples&lt;/a&gt;” an endpoint to a function to the authorization methodology, authentication methods, the intended behavior of various features, and more.
With this better understanding of the technical internals, we can switch to an attacker’s perspective and think of the possible attack scenarios.
Which endpoints can an unauthorized attacker reach?
What can a limited authorized attacker do?
Is a feature doing more than intended?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-was-the-outcome&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-was-the-outcome&quot; /&gt;What was the outcome?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the important mindsets of a security researcher is to know when to give up and when to stay stubborn.
Our findings were not easy to catch.
Jenkins code quality is superb making it less likely to have security vulnerabilities.
But, with our persistence, we noticed a niche feature that used third-party, unmaintained code, which allowed us to disclose sensitive information.
Usually, the feature exploited requires specific permission to execute, but due to an exception thrown before the intended behavior, the sensitive data (which was exported from the third-party code) was leaked, enabling an attacker to have a serious impact on a Jenkins instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From Sonar’s point of view, we have analyzed the complex call graph and found unique ways to improve our engine.
On top of that, it clarified for us the importance of &lt;a href=&quot;https://www.sonarsource.com/blog/deeper-sast-uncovers-hidden-security-vulnerabilities/&quot;&gt;deeper SAST&lt;/a&gt;, a feature that enables developers to automatically discover and fix code security issues arising from interactions between user source code and third-party, open-source libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We were excited to have this opportunity to collaborate with the Jenkins team, while also making the open-source community safer and providing a &lt;a href=&quot;https://www.sonarsource.com/blog/excessive-expansion-uncovering-critical-security-vulnerabilities-in-jenkins/&quot;&gt;technical blog post&lt;/a&gt; for educating the security expert audience.
Throughout the disclosure process, we were met with an impressive level of professionalism and kindness that made all of this happen.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;more-about-sonar-and-clean-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-about-sonar-and-clean-code&quot; /&gt;More about Sonar and Clean Code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At Sonar, we’re dedicated to enabling developers to create &lt;a href=&quot;https://www.sonarsource.com/solutions/clean-code/&quot;&gt;Clean Code&lt;/a&gt; — code that is consistent, intentional, adaptable, and responsible.
We believe that code quality and &lt;a href=&quot;https://www.sonarsource.com/solutions/security/&quot;&gt;security&lt;/a&gt; go hand in hand.
By focusing on Clean Code best practices, it is easier to avoid mistakes that lead to vulnerabilities in code.
Our &lt;a href=&quot;https://www.sonarsource.com/solutions/our-unique-approach/&quot;&gt;Clean as You Code&lt;/a&gt; approach ensures that code stays consistently clean avoiding the introduction of bugs and security vulnerabilities from the start with the quality of the codebase being optimized as code is added or changed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2024/01/17/jenkins-contributor-summit-update/</id>
<title>2024 Jenkins Contributor Summit - Update</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2024-01-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2024/01/17/jenkins-contributor-summit-update/" />
<author>
<name>jmMeessen</name>
</author>
<category term='events'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
The Jenkins Contributor Summit, being held in Brussels on February 2nd, is now quickly approaching.
We are looking forward to meeting you.


If you plan to join us and didn’t let us know yet, don’t forget to register by dropping us a note.
The list of registered attendees can be found in this document: Contributor Summit 24 - Attendees.


The Summit will take place at Betacowork, located at 4 Rue des Pères Blancs, 1040 Brussels, Belgium (Betacowork on Google Maps) in the "AZZAR" room.


The following list provides a quick overview of the day’s planning:




We will welcome attendees from 9h30 (9:30 AM) on.


The Summit will...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor Summit, being held in Brussels on February 2nd, is now quickly approaching.
We are looking forward to meeting you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you plan to join us and didn’t let us know yet, don’t forget to register by dropping us a note.
The list of registered attendees can be found in this document: &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1fatDxa39U-yHW6iTpMQZuW_pMf8G9jhO6yczfoqcY08/edit?usp=sharing&quot;&gt;Contributor Summit 24 - Attendees&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Summit will take place at &lt;a href=&quot;https://www.betacowork.com/&quot;&gt;&lt;strong&gt;Betacowork&lt;/strong&gt;&lt;/a&gt;, located at &lt;strong&gt;4 Rue des Pères Blancs, 1040 Brussels, Belgium&lt;/strong&gt; (&lt;a href=&quot;https://maps.app.goo.gl/S8VrWsrErmLMXqza7&quot;&gt;Betacowork&lt;/a&gt; on Google Maps) in the &quot;&lt;strong&gt;AZZAR&lt;/strong&gt;&quot; room.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following list provides a quick overview of the day’s planning:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We will welcome attendees from 9h30 (9:30 AM) on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Summit will start at 10h00 (10:00 AM).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;During the morning, we will listen to the introduction presented by the various Jenkins Officers.
Each one will present, for their domain of responsibility, the year’s projects and goals, the challenges, as well as the topics that could/should be discussed during the Summit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At 12h00 (12:00 PM) we will have a one hour lunch break, where people can go grab some food (sandwiches) at a nearby shop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At 13h00 (1:00 PM), we start the afternoon sessions and discussions:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Changes made to Jenkins to support the new CloudBees high availability solution (Vincent L.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Impact and challenges of removing Blue Ocean of the base Jenkins distribution (Alexander B. &amp;amp; Damien D.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User experience evolution&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initiatives and roadmap discussion (as built during the morning sessions).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will lead us to 16h30/17h00 (4:30/5:00 PM) for the end of the presentations and discussions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Until 18h30 (6:30 PM), we will have one or several (concurrent) coding “workshops”/discussions/demonstrations (still to be discussed and organized with Basil Crow).
People not interested in these sessions can either network or head to their respective hotels for a quick break.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At 18h30 (6:30 PM), we will head for the restaurant (&lt;a href=&quot;https://maps.app.goo.gl/CS5i53NCTTaYxZvc7&quot;&gt;“Restaurant Rubens”&lt;/a&gt;, &lt;strong&gt;Rue de l’Escadron 21, 1040 Bruxelles, Belgium&lt;/strong&gt;) that is a 12 minute walk from the co-work.
At 19h00 (7:00 PM) we will have dinner.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/12/15/jenkins-november-newsletter/</id>
<title>Jenkins November 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-12-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/12/15/jenkins-november-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Key Takeaways




Basil Crow joins the Jenkins Governance Board.


A Jenkins Contributor Summit will be held prior to FOSDEM.


The Contributor Spotlight site is now live.







Contributed by: Mark Waite


Basil Crow joins the Jenkins governance board in December 2023.
He’ll serve for a two-year term.
Thanks to Basil for his willingness to serve.
More details of the 2023 governance board and officer changes are available in a blog post by Alexander Brandes.


Jenkins 2.426.1 was released on November 15, 2023 with many improvements and additions.
Darin Pope and Mark Waite reviewed the Jenkins 2.426.1 features in a 50 minute webinar.
Key items include:




Java 21 support


Java 17 or Java 21 recommended


Prototype.js...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins September Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-takeaways&quot; /&gt;Key Takeaways&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;Basil Crow joins the Jenkins Governance Board.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A Jenkins Contributor Summit will be held prior to FOSDEM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://contributors.jenkins.io/&quot;&gt;Contributor Spotlight&lt;/a&gt; site is now live.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&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/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; joins the Jenkins governance board in December 2023.
He’ll serve for a two-year term.
Thanks to Basil for his willingness to serve.
More details of the 2023 governance board and officer changes are available in a &lt;a href=&quot;https://www.jenkins.io/blog/2023/12/08/basil-crow-board-announcement/&quot;&gt;blog post&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault&quot;&gt;Alexander Brandes&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.426.1&quot;&gt;Jenkins 2.426.1&lt;/a&gt; was released on November 15, 2023 with many improvements and additions.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/darinpope&quot;&gt;Darin Pope&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt; reviewed the Jenkins 2.426.1 features in a &lt;a href=&quot;https://www.youtube.com/watch?v=Pkd_ihgctkc&amp;amp;t=12s&quot;&gt;50 minute webinar&lt;/a&gt;.
Key items include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 21 support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 17 or Java 21 recommended&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prototype.js JavaScript library removed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Drop support for Red Hat Enterprise Linux 7 and its derivatives like CentOS 7&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.jenkins.io/blog/2023/11/10/Jenkins-Contributor-Summit-in-Brussels/&quot;&gt;Jenkins Contributor Summit&lt;/a&gt; will be held in Brussels, Belgium on Friday, February 2, 2024.
We’ll gather for a day of presentations, planning, and working on the future of Jenkins.
Immediately after the Contributor Summit, FOSDEM 2024 will be a two day conference focused on open source.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/jmmeessen&quot;&gt;Jean-Marc Meessen&lt;/a&gt; is gathering &lt;a href=&quot;https://community.jenkins.io/t/jenkins-contributor-summit-on-feb-2-2024-call-for-topics-and-ideas/10689&quot;&gt;agenda topics and attendees&lt;/a&gt; on the community site.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Microsoft has donated $40,000 USD to the Continuous Delivery Foundation for use in member projects.
The Jenkins project is pleased to be using those credits to reduce CDF expenses.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The AWS cost reduction project has a working prototype that is using Cloudflare R2 and the Jenkins mirror system to reduce bandwidth costs.
We plan to complete the Jenkins Enhancement Proposal, a prototype temporary transition, and the production transition by January 31, 2024.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.426.1 provides a new “Appearance” page so that administrators have a single page to configure the Jenkins theme and other user interface details.
Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt; for the Appearance page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.426.1 also updates the Jenkins user experience with confirmation dialogs inside the pages instead of using the web browser’s confirmation dialog.
Thanks to &lt;a href=&quot;https://github.com/mawinter69&quot;&gt;Markus Winter&lt;/a&gt; for the implementation of those dialogs and for the API that allows plugins to do the same.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Keyboard navigation has been improved in Jenkins 2.426.1 as well.
Users can now access tab panes by keyboard navigation.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 21 support&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/cd176912ed8797ddee1066be59b1a68fb9b6bc77/jep/0000/README.adoc&quot;&gt;Jenkins enhancement proposal&lt;/a&gt; by Mark Waite is progressing nicely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Progress of testing the top plugins with Java 21:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;108 of the top plugin repositories passing tests with Java 21.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;20 of the top plugin repositories not yet passing tests with Java 21.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Infrastructure team finished the transition to official 21.0.1+12 Linux (17 on Windows).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All agents and controllers now supply a JDK21 or JDK21 preview Docker image.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 17 is now the default Java version used in the Docker images, even for the LTS and Windows:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you don’t use a tag specifying the JDK version like &lt;a href=&quot;https://hub.docker.com/layers/jenkins/jenkins/2.429-jdk11/images/sha256-4a0743c391adeaf80716c14a1d2573f150328181c60b83f23eb1504e59f228bb?context=explore&quot;&gt;2.429-jdk11&lt;/a&gt;, but shorter tags like &lt;a href=&quot;https://hub.docker.com/layers/jenkins/jenkins/2.429/images/sha256-9036a884d9a8055a99d4e475080150a6d24b611018ccbc73080d492ccf9930d2?context=explore&quot;&gt;2.429&lt;/a&gt;, you will end up with an image using JDK17 and not JDK11 anymore.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OS support:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CentOS 7 container images have been &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/1777&quot;&gt;removed&lt;/a&gt;, starting from the 2.432 release.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ARM64:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;More services in the infrastructure have migrated to a new ARM64 nodepool.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://contributors.jenkins.io&quot;&gt;Contributor Spotlight&lt;/a&gt; is a new location where we will be highlighting the top contributors to Jenkins.
We have been gathering and measuring data to determine who would be part of this group, and then reached out to everyone to collaborate and capture their stories.
Thanks to all of the contributors who have collaborated with us on this project thus far, and all those who we will be working with going forward as well.
We’ll be publishing new Contributor Spotlights every two weeks, to provide space for the current spotlight to shine and leave room for other announcements or news.
Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/jmmeessen&quot;&gt;Jean-Marc-Meessen&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/hlemeur&quot;&gt;Hervé Le Meur&lt;/a&gt; and Cristina Pizzagalli for their work in gathering the data, designing the site, getting the site into production, and offering guidance along every step of the way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;November had four blog posts, including the &lt;a href=&quot;https://www.jenkins.io/blog/2023/11/10/Jenkins-Contributor-Summit-in-Brussels/&quot;&gt;Jenkins Contributor summit at FOSDEM&lt;/a&gt; announcement, the &lt;a href=&quot;https://www.jenkins.io/blog/2023/11/06/introducing-2-2-2-java-support-plan/&quot;&gt;2+2+2 Jenkins Java support plan&lt;/a&gt;, and the announcement of the Contributor Spotlight site.&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/2023/12/08/basil-crow-board-announcement/</id>
<title>Welcome Basil Crow - new Jenkins Governance Board member</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-12-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/12/08/basil-crow-board-announcement/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<summary>
We would like to announce changes in the Jenkins Governance Board.
There has been no election this year, because there was only one candidate per seat.
Please welcome Basil Crow!
At the same time, Oleg Nenashev retires from the board. We would like to thank Oleg for his contributions to the Jenkins project and the community.
As a regular leader in GSoC, Jenkins Contributor Summits, and other community activities, Oleg has been a great fit for a governance board member.
Thank you Oleg!


In addition to Basil&#8217;s inclusion in the Governance Board, our current officers will remain in their positions for another term.
Thanks to all of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would like to announce changes in the Jenkins Governance Board.
There has been no election this year, because there was only one candidate per seat.
Please welcome Basil Crow!
At the same time, Oleg Nenashev retires from the board. We would like to thank Oleg for his contributions to the Jenkins project and the community.
As a regular leader in GSoC, Jenkins Contributor Summits, and other community activities, Oleg has been a great fit for a governance board member.
Thank you Oleg!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to Basil’s inclusion in the Governance Board, our current officers will remain in their positions for another term.
Thanks to all of the officers for continuing their service:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Release Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&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;Basil will join other governance Board Members:
&lt;a href=&quot;https://www.jenkins.io/blog/authors/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;,
&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/uhafner&quot;&gt;Ullrich Hafner&lt;/a&gt;, and
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Basil’s term will last until December 2025.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-basil-crow&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-basil-crow&quot; /&gt;About Basil Crow&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is Basil’s statement from the elections:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;I have been a Jenkins user since 2012, a contributor since 2014, a
plugin maintainer since 2018, a core maintainer since 2021, and a
GitHub organization administrator since 2023. I look forward to
continuing to serve the Jenkins community in my new role as a board
member.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;My vision involves leading the design and implementation of
community-wide projects while also actively supporting the board in
executing the various administrative and operational tasks that are
needed to sustain the Jenkins project and community. The values of the
Jenkins community have always resonated with me, and I am eager to
continue championing them.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;As the Jenkins project nears its 19th birthday, it stands as a
testament to the resilience of open source communities. Much like
cities, these communities can be small yet vibrant, serving a critical
role to their constituencies. I look forward to ensuring that the
Jenkins project not only survives but thrives, providing sustained
value to its dedicated users and contributors for years to come.&lt;/em&gt;&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-for-the-jenkins-governance-board&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next-for-the-jenkins-governance-board&quot; /&gt;What’s next for the Jenkins Governance Board?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In February we host a &lt;a href=&quot;https://www.jenkins.io/blog/2023/11/10/Jenkins-Contributor-Summit-in-Brussels/&quot;&gt;Jenkins Contributor Summit&lt;/a&gt;, the day before FOSDEM.
It is a day-long event featuring presentations on the &quot;State of Jenkins&quot;, Project/SIG updates, discussion on various key projects, &quot;Ignite Talks&quot;, and demos.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t hesitate to reach out if you want to submit a presentation, talk, or demo!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;participating-in-jenkins-governance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#participating-in-jenkins-governance&quot; /&gt;Participating in Jenkins Governance&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://www.jenkins.io/project/board/&quot;&gt;Jenkins Governance Board&lt;/a&gt; has just a representative function in the community.
The project and the community have a long history of open and inclusive governance driven by many contributors.
We invite all community members to participate in the project by joining the
&lt;a href=&quot;https://www.jenkins.io/project/governance-meeting/&quot;&gt;governance meeting&lt;/a&gt;,
participating in the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;mailing list&lt;/a&gt; conversations,
and joining &lt;a href=&quot;https://www.jenkins.io/sigs&quot;&gt;special interest groups&lt;/a&gt; driving particular topics.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to &lt;a href=&quot;https://www.jenkins.io/participate&quot;&gt;the participation page&lt;/a&gt; to learn more about contributing to Jenkins in general.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/12/06/jenkins-to-github/</id>
<title>Log from Jenkins Jobs to GitHub Pull Requests as Checks</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-12-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/12/06/jenkins-to-github/" />
<author>
<name>tslmy</name>
</author>
<category term='jenkins'></category>
<category term='github'></category>
<summary>
You have a GitHub repo and a Jenkins server.
The Jenkins server has jobs for running unit tests, computing code coverages, and executing static analyses.


Every time someone opens a PR to your repo, you ask them to run those jobs, take screenshots of the results, and paste these screenshots to the PR description as a proof of quality.


That&#8217;s too much waiting and too many keystrokes.
People want automation: when they create a PR (or push a commit), those jobs should start to build.
When the builds are done, the results should be conveniently visible at the "Checks" section at the bottom of the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You have a &lt;strong&gt;GitHub repo&lt;/strong&gt; and a &lt;strong&gt;Jenkins server&lt;/strong&gt;.
The Jenkins server has jobs for running unit tests, computing code coverages, and executing static analyses.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every time someone opens a PR to your repo, you ask them to run those jobs, take screenshots of the results, and paste these screenshots to the PR description as a &lt;strong&gt;proof of quality&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s too much waiting and too many keystrokes.
&lt;strong&gt;People want automation&lt;/strong&gt;: when they create a PR (or push a commit), those jobs should start to build.
When the builds are done, the results should be conveniently visible at the &quot;Checks&quot; section at the bottom of the PR, like this:&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/2023/12/06/Screenshot-of-a-typical-PR-Checks-list.png&quot; alt=&quot;Screenshot of a typical PR Checks list&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ways-to-publish-checks-to-prs-statuses-checks-and-actions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ways-to-publish-checks-to-prs-statuses-checks-and-actions&quot; /&gt;Ways to publish checks to PRs: Statuses, Checks, and Actions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You thought about your options.
There are 3 types of entries that can be shown in this little box.
In order of increasing complexity to configure:&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;&lt;strong&gt;Statuses&lt;/strong&gt;, or as I’d like to call them, &lt;strong&gt;Commit Checks&lt;/strong&gt;.
They are associated with commits, not PRs.
This means you can run them even without creating a PR.
For example, here are some Commit Checks on a commit I directly pushed to a &lt;code&gt;master&lt;/code&gt; branch:
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/12/06/Screenshot-of-a-list-of-commit-statuses.png&quot; alt=&quot;Screenshot of a list of commit statuses&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Checks&lt;/strong&gt;, or more explicitly, &lt;strong&gt;PR Checks&lt;/strong&gt;.
These are run on commits but are stored with the PRs.
With them, you can write long essays of messages to the &quot;Checks&quot; tab of a PR, but they do require authenticating as a GitHub App instead of a user, so it’s more complicated to set up.
SonarCloud, a code analyzer, makes use of PR Checks via &lt;a href=&quot;https://github.com/apps/sonarcloud&quot;&gt;their namesake GitHub App&lt;/a&gt;.
If you look closer, their report is just Markdown:
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/12/06/Screenshot-of-a-SonarCloud-Code-Analysis-as-a-GitHub-PR-Check.png&quot; alt=&quot;Screenshot of a SonarCloud Code Analysis as a GitHub PR Check&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt; (GA).
GA is a different kind of CI system from Jenkins.
Since this article is about Jenkins only, GA is only mentioned here for the sake of completeness.
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/12/06/Screenshot-of-a-GitHub-Action-as-a-PR-Check.png&quot; alt=&quot;Screenshot of a GitHub Action as a PR Check&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;when-the-result-is-simple-use-commit-statuses&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#when-the-result-is-simple-use-commit-statuses&quot; /&gt;When the result is simple: Use commit statuses&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins jobs you want to trigger only run for a couple of seconds.
Each only emits a simple result: pass or fail.
You don’t need fancy reports, so &lt;strong&gt;commit statuses&lt;/strong&gt; seem to be a suitable choice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You installed &lt;a href=&quot;https://plugins.jenkins.io/github/&quot;&gt;the GitHub plugin&lt;/a&gt; to your Jenkins server and followed &lt;a href=&quot;https://stackoverflow.com/a/51003334/1147061&quot;&gt;this guide&lt;/a&gt; to set it up.
You are now able to emit simple one-liners as checks like this:&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://raw.githubusercontent.com/jenkinsci/github-coverage-reporter/readme/assets/coverage-success.png&quot; alt=&quot;coverage success&quot; /&gt;
&lt;em&gt;(&lt;a href=&quot;https://github.com/jenkinsci/github-coverage-reporter-plugin&quot;&gt;source&lt;/a&gt; of screenshot; Apache 2.0 licensed)&lt;/em&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It met your immediate need, but it stills falls short in a number of ways:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The plugin publishes to the PR only thrice: upon getting queued, upon the start, and upon completion.
Your job actually has &lt;strong&gt;many&lt;/strong&gt; time-consuming stages, such as building a manifest, deploying to staging, and running tests.
These stages are often packed in a single script and you &lt;strong&gt;want to be notified at each stage&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The messages show up with &lt;strong&gt;your GitHub profile image as the icon&lt;/strong&gt;, because Jenkins is using &lt;em&gt;your&lt;/em&gt; PAT!
You want to shy away from the spotlight, maybe because you don’t want to be mistaken by your less-GitHub-savvy collaborators as a ruthless robot critiquing (and blocking) everybody’s PRs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s when you start to look further.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;when-the-report-is-long-use-pr-checks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#when-the-report-is-long-use-pr-checks&quot; /&gt;When the report is long: Use PR checks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Your job generates a long report at the end, but the Checks section can only accommodate a couple of words.
You have been rendering the reports as HTML and attaching them to the Jenkins builds themselves (perhaps with a nice &lt;a href=&quot;https://palletsprojects.com/p/jinja/&quot;&gt;Jinja2 template&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/htmlpublisher/&quot;&gt;the HTML Publisher plugin&lt;/a&gt;).
The commit statuses your job writes to PRs contain links to the Jenkins builds themselves, so it’s only two clicks away from an HTML report — not bad.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To prevent past HTML reports from saturating the disk, you configured the job to only keep the 20 most recent builds.
Then the team grew and people started complaining that their reports are getting purged before they could even take a look.
You now have a &lt;strong&gt;scalability&lt;/strong&gt; problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s move those reports away from Jenkins, and what’s a better place than &lt;strong&gt;the PRs themselves&lt;/strong&gt;?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following &lt;a href=&quot;https://docs.cloudbees.com/docs/cloudbees-ci/latest/traditional-admin-guide/github-app-auth&quot;&gt;this guide from CloudBees&lt;/a&gt;, you created a GitHub App, installed it onto your repo, generated a SSH private key for the app, and uploaded it to Jenkins credentials storage with &quot;GitHub App&quot; as the &lt;em&gt;Kind&lt;/em&gt;.
(For the GitHub half of the journey, &lt;a href=&quot;http://thecodebarbarian.com/building-a-github-app-with-node-js.html&quot;&gt;this tutorial&lt;/a&gt; has better screenshots.)
Now that your Jenkins job is &lt;em&gt;allowed&lt;/em&gt; to send PR Checks, how do we tell it &lt;em&gt;what&lt;/em&gt; to send?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s when these 3 plugins come into play:&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/checks-api-plugin&quot;&gt;Checks API Plugin&lt;/a&gt;: This enables Jenkins to talk to the Checks API on various git hosting platforms, including GitHub, GitLab, and BitBucket.
This is a base plugin that is meant to be extended with other plugins, not directly used by Jenkins jobs, though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/github-checks-plugin&quot;&gt;GitHub Checks API Plugin&lt;/a&gt;: This enables Jenkins to talk to GitHub specifically.
It extends the aforementioned &lt;a href=&quot;https://github.com/jenkinsci/checks-api-plugin&quot;&gt;Checks API Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/junit-plugin&quot;&gt;JUnit Plugin&lt;/a&gt;: This publishes JUnit-style XML test reports to various destinations.
It posts to the current build, and — when the &lt;a href=&quot;https://github.com/jenkinsci/checks-api-plugin&quot;&gt;Checks API Plugin&lt;/a&gt; is available — publishes to GitHub/GitLab/…​
as PR Checks.&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/2023/12/06/Screenshot-of-a-JUnit-report-on-PR-Checks-tab.png&quot; alt=&quot;Screenshot of a JUnit report on PR Checks tab&quot; /&gt; (&lt;a href=&quot;https://plugins.jenkins.io/junit/&quot;&gt;Source&lt;/a&gt; of screenshot)&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;junit-you-said&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#junit-you-said&quot; /&gt;JUnit, you said?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contrary to what the name implies, JUnit XML reports aren’t just for JUnit;
it has been the &lt;em&gt;de facto&lt;/em&gt; standard for reporting test results for various testing frameworks (and even for languages besides Java).
Here are a few examples:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Python, pytest has &lt;a href=&quot;https://docs.pytest.org/en/7.1.x/how-to/output.html?highlight=junitxml#creating-junitxml-format-files&quot;&gt;native support&lt;/a&gt; for creating JUnit XML format reports:&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;pytest &lt;span class=&quot;nt&quot;&gt;--junitxml&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;path&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Go, the &lt;code&gt;go-junit-report&lt;/code&gt; package can translate go test results to JUnit format:&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;go &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; 2&amp;gt;&amp;amp;1 ./... | go-junit-report &lt;span class=&quot;nt&quot;&gt;-set-exit-code&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; report.xml&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In C++, Google’s testing framework (GoogleTest) can &lt;a href=&quot;https://google.github.io/googletest/advanced.html#generating-an-xml-report&quot;&gt;emit test results as XML&lt;/a&gt;, which conforms to the JUnit format:&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;GTEST_OUTPUT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;xml:/path/to/junit.xml&quot;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Run your normal test command here.&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 JUnit format is described in this article, &lt;a href=&quot;https://github.com/testmoapp/junitxml#common-junit-xml-format—​examples&quot;&gt;&lt;em&gt;Common JUnit XML Format &amp;amp; Examples&lt;/em&gt;&lt;/a&gt;, along with some examples.
You can also refer to the first 4 lines of the article &lt;a href=&quot;https://docs.getxray.app/display/XRAY/Taking+advantage+of+JUnit+XML+reports&quot;&gt;&lt;em&gt;Taking advantage of JUnit XML reports&lt;/em&gt;&lt;/a&gt; from Xray.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In summary, you can have the Jenkins job emit results in the JUnit XML schema, so that you can send the results as a PR Check via the &lt;a href=&quot;https://github.com/jenkinsci/junit-plugin&quot;&gt;JUnit Plugin&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;to-update-the-check-at-each-step&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#to-update-the-check-at-each-step&quot; /&gt;To update the check at each step&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://plugins.jenkins.io/junit&quot;&gt;JUnit plugin&lt;/a&gt; is meant for the conclusions, but you might want to publish messages before it concludes.
Depending on whether your Jenkins job can be naturally split into different &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/tour/running-multiple-steps/&quot;&gt;build steps&lt;/a&gt; and be written in a Jenkins Pipeline, there are different ways to achieve this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Case 1: If you can split your job into self-contained Steps&lt;/strong&gt;, you can update PR Checks by interacting with the &lt;a href=&quot;https://plugins.jenkins.io/checks-api&quot;&gt;Checks API plugin&lt;/a&gt; directly.
By &quot;directly&quot;, I mean you don’t need to go through its &quot;consumer plugins&quot;, such as the &lt;a href=&quot;https://plugins.jenkins.io/junit&quot;&gt;JUnit plugin&lt;/a&gt;.
In Jenkinsfile syntax:&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;publishChecks&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;my-cool-check&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;title:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Integration Test&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;summary:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Manifest is built. Deploying to a staging pool now.&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;status:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;IN_PROGRESS&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;text:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Nothing much to see here.&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;detailsURL:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;https://link.to.your/jenkins/build/&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;actions:&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 useful when each action your job takes can be written as a standalone call to executables.
For example, I may have a job that builds, tests, and publishes my Rust code by calling &lt;code&gt;cargo build&lt;/code&gt;, &lt;code&gt;cargo test&lt;/code&gt;, and &lt;code&gt;cargo publish&lt;/code&gt; respectively.
Since each step is a separate shell command, I can easily write them as:&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;c1&quot;&gt;// Under pipeline &amp;gt; stages &amp;gt; stage(&#39;...&#39;) &amp;gt; steps.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;publishChecks&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;my-cool-check&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;status:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;IN_PROGRESS&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;title:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Build, Test, and Publish&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;summary:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Building...&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;cargo build&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;publishChecks&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;my-cool-check&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;status:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;IN_PROGRESS&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;title:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Build, Test, and Publish&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;summary:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Testing...&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;cargo test&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;publishChecks&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;my-cool-check&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;status:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;IN_PROGRESS&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;title:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Build, Test, and Publish&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;summary:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Publishing...&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;cargo publish&#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&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;to-update-the-check-within-a-step&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#to-update-the-check-within-a-step&quot; /&gt;To update the Check within a Step&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Case 2: If your job is quite monolithic&lt;/strong&gt;, it can be awkward to split your self-contained script into multiple, just for the sake of separating them as build steps and inserting &lt;code&gt;publishChecks&lt;/code&gt; in-between.
In these cases, you’ll have to directly interact with the GitHub API without the Jenkins layer.
In terms of the fancy plugins, this means you even don’t have to use the &lt;a href=&quot;https://plugins.jenkins.io/checks-api&quot;&gt;Checks API plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For GitHub Apps, the authorization &amp;amp; authentication process can be quite involved:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Back when you installed your GitHub App to your repo, you granted a set of permissions to your App.
This is called &lt;strong&gt;authorization&lt;/strong&gt;. Exactly what your App can do to your repo can be retrieved from GitHub via an &quot;Installation ID&quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When your script initializes, it needs to authenticate to GitHub as your App.
To do so, the script needs a private key of the App.
You can generate a private key from the App’s settings page and use it forever.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If dealing with the raw GitHub API, the authentication is quite involved.
First, you generate a &lt;a href=&quot;https://jwt.io/introduction&quot;&gt;&lt;em&gt;JSON Web Token&lt;/em&gt; (JWT)&lt;/a&gt; with the private key.
Then, you &lt;a href=&quot;https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/authenticating-as-a-github-app-installation&quot;&gt;call a GitHub endpoint&lt;/a&gt; with this JWT, saying &quot;I’m this App, and I’m trying to access the repos we agreed upon earlier.&quot;
This endpoint gives you an &quot;installation access token&quot; (IAT).
Your script would use this IAT to call other endpoints, just like how you’d use a PAT when calling endpoints manually as yourself.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Luckily, many languages have libraries that handle the intermediate work for you.
Let’s say your Jenkinsfile runs a Python script via (&lt;code&gt;sh &#39;./run.py&#39;&lt;/code&gt;).
We can use the &lt;a href=&quot;https://github.com/PyGithub/PyGithub&quot;&gt;PyGitHub&lt;/a&gt; library to call GitHub APIs Pythonically.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Python, the built-in &lt;a href=&quot;https://docs.python.org/3/library/logging.html&quot;&gt;logging&lt;/a&gt; library is the standard way to emit messages.
Your script creates a &quot;logger&quot; and attaches different &quot;handlers&quot; to it, each defining an output channel of your messages such as standard output, file on disk, or remote service.
Intuitively, we can write a handler for logging to GitHub Checks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the help of ChatGPT, I implemented &lt;a href=&quot;https://gist.github.com/tslmy/84f34a25babe045eb302ec72f2bf39eb&quot;&gt;this handler&lt;/a&gt;.
You can see that the handler requires quite some parameters to initialize.
Where do you get them?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For locating the PR and the commit, the &lt;a href=&quot;https://plugins.jenkins.io/github-pullrequest&quot;&gt;GitHub Integration plugin&lt;/a&gt; can help.
It can trigger Jenkins jobs upon PR events, injecting &lt;a href=&quot;https://github.com/KostyaSha/github-integration-plugin/blob/master/docs/Configuration.adoc#available-environment-variables&quot;&gt;these environment variables&lt;/a&gt; to each Build.
We’ll use two: &lt;code&gt;GITHUB_PR_HEAD_SHA&lt;/code&gt; and &lt;code&gt;GITHUB_REPO_SSH_URL&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For referencing from the PR Check to the Jenkins Build, we’ll also need an environment variable set by vanilla Jenkins: &lt;code&gt;BUILD_URL&lt;/code&gt;.
On &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-belowJenkinsSetEnvironmentVariables&quot;&gt;this page&lt;/a&gt;, you can find a list of all Jenkins-set variables.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For authentication, we are on our own.
We can upload the App’s private key to Jenkins credentials storage and wrap the &lt;code&gt;sh &#39;./run.py&#39;&lt;/code&gt; step with the closure &lt;code&gt;sshUserPrivateKey&lt;/code&gt;.
For the App ID and the Installation ID, since they aren’t necessarily secrets, we can afford to spell them out with an &lt;code&gt;environment&lt;/code&gt; directive.
Combined, your Jenkinsfile might look like this:&lt;/p&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;environment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;GITHUB_APP_ID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;123&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;GITHUB_APP_INSTALLATION_ID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;456&#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;...&#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;script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sshUserPrivateKey&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;s2&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// ID from the Jenkins credentials storage.&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;keyFileVariable:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;GITHUB_APP_PRIVATE_KEY_PATH&#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;./run.py&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, in your Python script, you can read the environment variables during initialization:&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;python&quot;&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;logging&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GitHubCheckHandler&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GitHubCheckHandler&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;logger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;logging&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getLogger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GitHubCheckHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;private_key_path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getenv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;GITHUB_APP_PRIVATE_KEY_PATH&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;installation_id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getenv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;GITHUB_APP_INSTALLATION_ID&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))),&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;github_app_id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getenv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;GITHUB_APP_ID&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))),&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;owner_repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getenv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;GITHUB_REPO_SSH_URL&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;removeprefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;git@github.com:&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;removesuffix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.git&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;commit_sha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getenv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;GITHUB_PR_HEAD_SHA&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;details_url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getenv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;BUILD_URL&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;addHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&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;Then, you should be able to see Python logs directly in the PR Checks sections.
Note that the yellow light besides your check will keep spinning as you send messages.
To tell GitHub that this check has finished, you should call the &lt;code&gt;handler.conclude(...)&lt;/code&gt; method.
Therefore, you should keep the handler object exposed to your main function.&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;In this guide, we’ve explored how to automate and enhance PR quality assurance by tightening the integration between Jenkins and GitHub, specifically by emitting richer logs back to the PRs in a more timely manner.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the missing link of the feedback loop filled, we boost developers&#39; productivity.
By freeing them from manually checking the results and attaching screenshots, we save developers&#39; precious time and brain capacity, which can be devoted to more creative work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In summary, automation not only boosts efficiency but also elevates the overall quality of your software development process.
So, don’t hesitate!
Start automating your PR quality assurance today and experience the benefits of a more streamlined and productive workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you for following along and happy coding!&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/2023/12/05/google-summer-of-code-a-call-for-mentors/</id>
<title>[Google Summer of Code 2024] A Call for Mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-12-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/12/05/google-summer-of-code-a-call-for-mentors/" />
<category term='gsoc2024'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
We are happy to announce that Jenkins is preparing to participate in its eighth (8th) year in Google Summer of Code (GSoC).


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 contributors work on a 10-22 weeks-long programming project with the guidance of mentors from their respective open source organizations.
During GSoC, accepted contributors are paired with mentors from participating open-source organizations of their choice, gaining exposure to real-world software development techniques.
These GSoC contributors will get to learn from experienced open-source developers while writing code for...
</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;paragraph&quot;&gt;
&lt;p&gt;We are happy to announce that Jenkins is preparing to participate in its eighth (8th) year in Google Summer of Code (GSoC).&lt;/p&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 contributors work on a 10-22 weeks-long programming project with the guidance of mentors from their respective open source organizations.
During GSoC, accepted contributors are paired with mentors from participating open-source organizations of their choice, gaining exposure to real-world software development techniques.
These GSoC contributors will get to learn from experienced open-source developers while writing code for real-world projects!
A small stipend is provided as an incentive to support 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;Mentor interaction is a vital part of GSoC.
Mentoring is a great opportunity to improve your management and people (or general “soft”) skills while giving back to the community.
In return for mentoring, a GSoC contributor works on your project full-time for 10-22 weeks.
Think about the projects that you’ve always wanted to do but never had the time to complete.
GSoC is a fantastic program and the Jenkins project is looking forward to participating in it again in 2024, potentially with your participation!&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;.
Note that being a GSoC mentor does not require expert knowledge of Jenkins.
Mentors do not work alone.
We make sure that every project has at least two mentors.
GSoC org admins will be there to help to find technical advisers, so you can study together with your GSoC contributor.
Mentoring takes about 5 to 8 hours of work per week (more at the start, less at the end).
Mentors provide guidance, coaching, and sometimes a bit of cheerleading.
They review GSoC contributor proposals, pull-requests, and contributor presentations at the evaluation phase.
They fill in 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 GSoC contributors are expected to accomplish in about 10-22 weeks.
The coding projects can be new features, plugins, test frameworks, infrastructure, graphical interface, etc.
If you don’t have a specific project idea, please consider being a mentor for one of &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2024/project-ideas/&quot;&gt;these project ideas&lt;/a&gt;.
If you have a specific project in mind, please send us your project ideas before the beginning of February, so they can get a proper review by the GSoC committee and by the community.
Of course, we would love it if you were the mentor for your 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 a .adoc file in the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/tree/master/content/projects/gsoc/2023/project-ideas&quot;&gt;project ideas&lt;/a&gt;.
It is not necessary to submit a Google Doc, but it will still work if you want to do that.
Refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;instructions&lt;/a&gt; on submitting ideas which include an .adoc template and some 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;Case in point, 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;.
A GSoC project idea that started in the summer of 2022, and was implemented in the summer of 2023 for millions of Jenkins users to benefit from!&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 2024!&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/2023/11/29/jenkins-contributor-spotlight/</id>
<title>Introducing the Jenkins Contributor Spotlight</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-11-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/11/29/jenkins-contributor-spotlight/" />
<author>
<name>kmartens27</name>
</author>
<category term='community'></category>
<category term='contribute'></category>
<category term='appreciation'></category>
<summary>
The Jenkins project has evolved constantly over the years, thanks to the tireless efforts of the Jenkins community.
There are numerous contributors that work behind the scenes to ensure that Jenkins is functioning and staying on the cutting edge, in addition to being voices within the community and advocating for Jenkins.
It is with this sentiment in mind that we want to acknowledge and share our appreciation for these contributors.
Therefore, we are excited to announce and introduce the Jenkins Contributor Spotlight page, with our first contributor spotlight for Alexander Brandes!


This is the result of several months of research, collaboration, and determining who...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has evolved constantly over the years, thanks to the tireless efforts of the Jenkins community.
There are numerous contributors that work behind the scenes to ensure that Jenkins is functioning and staying on the cutting edge, in addition to being voices within the community and advocating for Jenkins.
It is with this sentiment in mind that we want to acknowledge and share our appreciation for these contributors.
Therefore, we are excited to announce and introduce the &lt;a href=&quot;https://contributors.jenkins.io/&quot;&gt;Jenkins Contributor Spotlight&lt;/a&gt; page, with our first contributor spotlight for &lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault&quot;&gt;Alexander Brandes&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the result of several months of research, collaboration, and determining who some of the heaviest Jenkins contributors are.
Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/jmmeessen&quot;&gt;Jean-Marc Meessen&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt; for organizing the project, retrieving the data that was used, and guiding the project direction.
We also want to share thanks to Cristina Pizzagalli for helping us design the site and &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt; for all of their work creating the site and working with the Infrastructure team to get the site integrated.
To get started, we reached out to the top ~30 contributors to better understand their backgrounds and gather some insight into their Jenkins experiences.
Thankfully, everyone that has responded has shared not only their Jenkins background and experience, but also some of their personal background.
This is a wonderful representation of the global reach that the Jenkins community has, and we want to ensure that there is a human element in addition to the technical parts.
Going forward, a new contributor spotlight will be published every two weeks.
This will provide ample time for the current contributor to shine and provide space for other announcements or news to be shared.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ultimately, Jenkins would not be where it is without the efforts of the greater community.
We want to share our deepest thanks and appreciation to all Jenkins contributors, and highlight some of the heaviest lifters.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/11/10/Jenkins-Contributor-Summit-in-Brussels/</id>
<title>Jenkins Contributor Summit in Brussels</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-11-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/11/10/Jenkins-Contributor-Summit-in-Brussels/" />
<author>
<name>jmMeessen</name>
</author>
<category term='events'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
We are happy to announce that we will hold a Jenkins Contributor Summit in Brussels prior to FOSDEM.








FOSDEM is a free event for software developers to meet, share ideas, and collaborate.
Every year, thousands of developers of free and open-source software from all over the world gather at the event in Brussels.
For the 2024 event, FOSDEM will occur between February 3 - 4, the first weekend of February.


What is a Jenkins Contributor Summit?





The Jenkins Contributor Summit brings together current and future contributors to the Jenkins project.
At this event, we will talk about the current state of the project and its future...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to announce that we will hold a &lt;strong&gt;Jenkins Contributor Summit&lt;/strong&gt; in Brussels prior to FOSDEM.&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/2023/11/ContribSummit/20180918_062844.jpg&quot; alt=&quot;Contributor Summit Desk&quot; /&gt;&lt;/span&gt;
&lt;/p&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/post-images/2023/11/ContribSummit/fosdem.videobox.logo.svg&quot; alt=&quot;image&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2024/&quot;&gt;FOSDEM&lt;/a&gt; is a free event for software developers to meet, share ideas, and collaborate.
Every year, thousands of developers of free and open-source software from all over the world gather at the event in Brussels.
For the 2024 event, FOSDEM will occur between February 3 - 4, the first weekend of February.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-a-jenkins-contributor-summit&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-a-jenkins-contributor-summit&quot; /&gt;What is a Jenkins Contributor Summit?&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 right center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/11/ContribSummit/image.jpg&quot; alt=&quot;image&quot; width=&quot;300&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor Summit brings together current and future contributors to the Jenkins project.
At this event, we will talk about the current state of the project and its future evolution.
It is a great opportunity to meet fellow members of the Jenkins community &quot;in real life&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is a day-long event (from 10h00 to 17h00) featuring presentations on the &quot;State of Jenkins&quot;, Project/SIG updates, discussion on various key projects, &quot;Ignite Talks&quot;, and demos.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t hesitate to reach out if you want to submit a presentation, talk, or demo!
Refer to the &lt;strong&gt;Contact&lt;/strong&gt; section to find out how to get in touch.&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/post-images/2023/11/ContribSummit/Jenkins_at_fosdem.jpg&quot; alt=&quot;Jenkins booth&quot; width=&quot;500&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-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-dates&quot; /&gt;Key Dates:&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;Jenkins Contributor Summit:&lt;/strong&gt; Friday 2 February 2024&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FOSDEM:&lt;/strong&gt; Saturday 3 and Sunday 4 February 2024&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;location&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#location&quot; /&gt;Location:&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.betacowork.com/&quot;&gt;&lt;em&gt;Betacowork&lt;/em&gt;&lt;/a&gt;, located at &lt;em&gt;4 Rue des Pères Blancs, 1040 Brussels, Belgium&lt;/em&gt;
The Betacowork location is easily accessible from downtown Brussels or the FOSDEM venue.&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;entry-fee&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#entry-fee&quot; /&gt;Entry Fee:&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;No cost to attend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Registration will be required (room capacity: 30).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Event is in-person only.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No catering is foreseen but food can be purchased in the neighborhood.&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;contact&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contact&quot; /&gt;Contact&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/sigs/advocacy-and-outreach/&quot;&gt;SIG - Advocacy &amp;amp; Outreach&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contact: &lt;a href=&quot;mailto:alytong13@gmail.com&quot;&gt;Alyssa Tong&lt;/a&gt;, &lt;a href=&quot;mailto:gounthar@gmail.com&quot;&gt;Bruno Verachten&lt;/a&gt;, &lt;a href=&quot;mailto:jean-marc@meessen-web.org&quot;&gt;Jean-Marc Meessen&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Community: via &lt;a href=&quot;https://community.jenkins.io/t/jenkins-contributor-summit-on-feb-2-2024-call-for-topics-and-ideas/10689&quot;&gt;Community Forum&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;agenda-draft&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#agenda-draft&quot; /&gt;Agenda (Draft)&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;Board report - (Jenkins Governance Board member)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure officer report - Damien Duportal&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Funding, sponsorships, and cost savings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modernization&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docs officer report - Kevin Marten&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release officer report - Tim Jacomb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events officer report - Alyssa Tong&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security officer report - Wadeck Follonier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User Experience SIG report - Tim Jacomb or Mark Waite&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Progress, next steps, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Platform SIG report&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java support plan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hardware support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initiatives and roadmap&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/2023/11/10/jenkins-october-newsletter/</id>
<title>Jenkins October 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-11-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/11/10/jenkins-october-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Key Takeaways




JDK21 is available on the infrastructure and in official Docker images too.


💥Breaking change: set Java 17 as default for LTS.


Prototype has been removed as of weekly 2.426







Contributed by: Wadeck Follonier




Core security advisory published on October 18



security advisory 2023-10-18


Includes an essential Jetty update that provided multiple fixes.





Plugin security advisory published on October 25



security advisory 2023-10-25


Multiple high score vulnerabilities in various plugins





During Hacktoberfest, the Content Security Policy topic got some attention with several PRs being proposed.



For more information, refer to the related ticket.










Contributed by: Mark Waite


The 2 + 2 + 2 Java support plan has been announced as the Jenkins project...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins September Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-takeaways&quot; /&gt;Key Takeaways&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;JDK21 is available on the infrastructure and in official Docker images too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;💥Breaking change: set Java 17 as default for LTS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prototype has been removed as of weekly 2.426&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Core security advisory published on October 18&lt;/p&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/2023-10-18/&quot;&gt;security advisory 2023-10-18&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Includes an essential Jetty update that provided multiple fixes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin security advisory published on October 25&lt;/p&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/2023-10-25/&quot;&gt;security advisory 2023-10-25&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multiple high score vulnerabilities in various plugins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;During Hacktoberfest, the Content Security Policy topic got some attention with several PRs being proposed.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/60865&quot;&gt;related ticket&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/blog/2023/11/06/introducing-2-2-2-java-support-plan/&quot;&gt;2 + 2 + 2 Java support plan&lt;/a&gt; has been announced as the Jenkins project approach to support Java versions now and in the future.
We plan to generally support two Java LTS releases at any one time, with a transition period over the next 2 years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 21 support by the Jenkins project is looking very, very good.
Jenkins 2.426.1 is scheduled to be released Nov 15, 2023 with full support for Java 21.
Read more about the Java support plan in the &lt;a href=&quot;https://www.jenkins.io/blog/2023/11/06/introducing-2-2-2-java-support-plan/&quot;&gt;recent blog post&lt;/a&gt; from &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt;.
Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;, &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/markewaite&quot;&gt;Mark Waite&lt;/a&gt;, and many others for their efforts to bring Java 21 support to Jenkins users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.426.1 will also be the first LTS release that removes Prototype.js.
Jenkins 2.426 weekly &lt;a href=&quot;https://www.jenkins.io/blog/2023/10/09/prototype-removed/&quot;&gt;removed Prototype.js&lt;/a&gt; after 6 months of work across over 50 plugins.
Sincere thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/2023/10/09/prototype-removed/&quot;&gt;many others&lt;/a&gt; for finishing the project that was first announced in &lt;a href=&quot;https://www.jenkins.io/blog/2023/05/12/removing-prototype-from-jenkins/&quot;&gt;May 2023&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;57 Jenkins contributors are registered to vote in the Jenkins elections.
Thanks for your involvement in Jenkins and for your interest in assuring that the project has the leadership it needs.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stabilization of the plugins.jenkins.io website (JDK upgrade to avoid OOM kills due to cgroupsv2, decrease resource usage)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;General availability on ci.jenkins.io of:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JDK21 21.0.1 (GA) - except for s390x&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maven 3.9.5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK8, 11 and 17 quarterly updates&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins &amp;amp; plugins:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins LTS 2.414.3 (less than 6 hours after publication)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin advisory (less than 2 hours after publication)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Costs and safety:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;All of our Terraform states were migrated from AWS to Azure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kept our Azure bill at $7.5k&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK19 removed from the platform&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ARM64 migration:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;5 new services migrated (total of 12)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ingress (nginx), datadog and cert-manager migrated&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins user experience continues to improve thanks to the efforts of contributors from many different areas.
Special thanks are due this month to &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt; (Prototype.js removed from Jenkins core), &lt;a href=&quot;https://github.com/mustafau&quot;&gt;Mustafa Ulu&lt;/a&gt; (consistency improvement and Turkish localization), &lt;a href=&quot;https://www.jenkins.io/blog/authors/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt; (form validation fixes and boolean build parameter display fixes), &lt;a href=&quot;https://github.com/mawinter69&quot;&gt;Markus Winter&lt;/a&gt; (nested page elements fixes), &lt;a href=&quot;https://github.com/jgreffe&quot;&gt;Julien Greffe&lt;/a&gt; (French localization improvements), and &lt;a href=&quot;https://github.com/Vlatombe&quot;&gt;Vincent Latombe&lt;/a&gt; (allow cloud reordering).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Notes and video from the &lt;a href=&quot;https://community.jenkins.io/t/user-experience-sig-october-11-2022/10165&quot;&gt;monthly user experience SIG meeting&lt;/a&gt; are available for review.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Latest Java releases - progress with installation and Jenkins development&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Oct 18, &lt;a href=&quot;https://www.oracle.com/security-alerts/cpuoct2023.html#AppendixJAVA&quot;&gt;2023 Oracle patch day&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 11.0.21&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 17.0.9&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 21.0.1&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 21 support&lt;/p&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/jep/blob/cd176912ed8797ddee1066be59b1a68fb9b6bc77/jep/0000/README.adoc&quot;&gt;Jenkins enhancement proposal&lt;/a&gt; by Mark Waite is progressing nicely&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Progress testing the top plugins with Java 21&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;36 are now tested with Java 21 (Jenkinsfile modified)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;90 are known to work with Java 21&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;13 don’t work yet with Java 21 (too outdated, using gradle, not in jenkinsci organization)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In infra, finished the transition to official JDK 21.0+35.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All agents and controllers now supply a JDK21 or JDK21 preview Docker image.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 17 is now the default Java version used in the Docker images, even for the LTS:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you don’t use a tag specifying the JDK version like &lt;a href=&quot;https://hub.docker.com/layers/jenkins/jenkins/2.429-jdk11/images/sha256-4a0743c391adeaf80716c14a1d2573f150328181c60b83f23eb1504e59f228bb?context=explore&quot;&gt;2.429-jdk11&lt;/a&gt; but shorter tags like &lt;a href=&quot;https://hub.docker.com/layers/jenkins/jenkins/2.429/images/sha256-9036a884d9a8055a99d4e475080150a6d24b611018ccbc73080d492ccf9930d2?context=explore&quot;&gt;2.429&lt;/a&gt;, you will end up with an image using JDK17 and not JDK11 anymore.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were only three blog posts during October, including the September newsletter.
However, the two non-newsletter posts provide great information.
The Plugin Health Scoring blog post, from Adrien Lecharpentier, announces and shares insight into the plugin health scoring system, and what that score means for a plugin.
The &lt;a href=&quot;https://www.jenkins.io/blog/2023/10/31/marc-s-napkin-upgrade-guide/&quot;&gt;guide to update Jenkins&lt;/a&gt;, from new author &lt;a href=&quot;https://www.jenkins.io/blog/authors/mwp565733&quot;&gt;Marc Phillips&lt;/a&gt;, provides instructions on how to update Jenkins and what his process looks like.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, we received several documentation updates from new Jenkins contributors.
While these may not have been huge changes, the effort and work done by new community members is always appreciated.
Thanks to everyone who contributed during October and Hacktoberfest!&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&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/2023/10/12/2023-10-12-jenkins-september-newsletter/image2.jpg&quot; alt=&quot;image&quot; width=&quot;294&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hacktoberfest has reached a successful end.
More than 60 additional people have contributed to Jenkins during the month of October than in the previous month.
Thanks to DigitalOcean for their sponsorship of open source through Hacktoberfest.&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/11/06/introducing-2-2-2-java-support-plan/</id>
<title>Introducing the 2 + 2 + 2 Java support plan</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-11-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/11/06/introducing-2-2-2-java-support-plan/" />
<author>
<name>basil</name>
</author>
<category term='announcement'></category>
<category term='core'></category>
<category term='developer'></category>
<category term='jenkins'></category>
<summary>
Summary








tl;dr

Jenkins 2.426.1 LTS will support Java 11, 17, and 21.
In Fall 2024, Jenkins will require Java 17 or 21 and drop support for Java 11.
Thereafter, Jenkins will support each Java LTS release for approximately four years;
i.e., Jenkins will support two Java LTS releases at any given time.











Background


Java’s historically slow release cadence has accelerated significantly in recent years.
At present, Java feature releases are delivered every six months,
with a long term support (LTS) release every two years that is supported for about six years.
Java feature releases are conceptually analogous to Jenkins weekly releases in that they allow developers to release early and...
</summary>
<content type='html'>
&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;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;title&quot;&gt;tl;dr&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.426.1 LTS will support Java 11, 17, and 21.
In Fall 2024, Jenkins will require Java 17 or 21 and drop support for Java 11.
Thereafter, Jenkins will support each Java LTS release for approximately four years;
i.e., Jenkins will support two Java LTS releases at any given time.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/2023/11/06/introducing-2-2-2-java-support-plan-figure1.svg&quot; alt=&quot;Figure 1&quot; title=&quot;Jenkins 2 + 2 + 2 Java support plan summary for Java and Jenkins LTS releases&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;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java’s historically slow release cadence has accelerated significantly in recent years.
At present, Java feature releases are delivered &lt;a href=&quot;https://blogs.oracle.com/java/post/moving-the-jdk-to-a-two-year-lts-cadence&quot;&gt;every six months&lt;/a&gt;,
with a long term support (LTS) release &lt;a href=&quot;https://blogs.oracle.com/javamagazine/post/java-long-term-support-lts&quot;&gt;every two years&lt;/a&gt; that is supported for about six years.
Java feature releases are conceptually analogous to Jenkins &lt;a href=&quot;https://www.jenkins.io/download/weekly/&quot;&gt;weekly releases&lt;/a&gt; in that they allow developers to release early and often,
while Java LTS releases are conceptually analogous to Jenkins &lt;a href=&quot;https://www.jenkins.io/download/lts/&quot;&gt;LTS releases&lt;/a&gt; in that they benefit large scale users.
The similarity between Java releases and Jenkins releases ends at the conceptual level, though — in practice,
each project has a vastly different schedule regarding
how often each type of release is performed and how long each type of release is supported.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;two-categories-of-users&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#two-categories-of-users&quot; /&gt;Two categories of users&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The above illustrates the needs of two categories of users:
developers and early adopters, who benefit from releasing early and often;
and large scale users, for whom predictability and stability are the primary consideration.
The latter will tend to prefer both Jenkins and Java LTS release lines and delay upgrading
until after the early adoption phase has passed or until it is absolutely necessary to upgrade.
The changes to Java’s release schedule in recent years raise the question of
how to align Java adoption within the Jenkins project with Java’s own release cadence,
which has accelerated significantly in recent years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;rejected-proposal-support-three-java-lts-releases-at-any-given-time&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#rejected-proposal-support-three-java-lts-releases-at-any-given-time&quot; /&gt;Rejected proposal: Support three Java LTS releases at any given time&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://adoptium.net/support/&quot;&gt;Eclipse Temurin&lt;/a&gt; and &lt;a href=&quot;https://access.redhat.com/articles/1299013&quot;&gt;Red Hat&lt;/a&gt; both support their Java LTS releases with security patches for about six years,
and in practice Java vendors will continue to maintain a Java LTS release for as long as there is market demand for it.
One answer to the question raised above, then, would be for the Jenkins project to support each Java LTS release for six years,
matching the support offered by upstream Java vendors like Eclipse Temurin and Red Hat.
This strategy primarily benefits large scale users for whom stability is the primary consideration,
but for various reasons that we will explore below it fails to meet the needs of developers and early adopters.&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/2023/11/06/introducing-2-2-2-java-support-plan-figure2.svg&quot; alt=&quot;Figure 2&quot; title=&quot;Rejected proposal: Support three Java LTS releases at any given time&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;rejected-proposal-support-one-java-lts-release-at-any-given-time&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#rejected-proposal-support-one-java-lts-release-at-any-given-time&quot; /&gt;Rejected proposal: Support one Java LTS release at any given time&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the other end of the spectrum, the Jenkins project could support each Java LTS release
for only as long as it takes for the next Java LTS release to be delivered; i.e., for two years rather than six.
This strategy would benefit developers and early adopters,
and these benefits go beyond the mere availability of shiny new language features for developers —
newer Java runtimes have implemented a significant number of performance optimizations that are of interest to operators,
and an increasing number of third-party library dependencies require the adoption of a recent Java LTS release
in order to receive bug fixes and security patches.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, the Jenkins ecosystem consists of thousands of loosely-connected components,
and building and testing them across all supported Java versions is a nontrivial effort,
notwithstanding recent advances in dependency updating.
Reducing the build and test matrix to a single version would save hundreds of thousands of dollars in cloud costs,
to say nothing of the savings in development costs
that are associated with the decreased cognitive load of a simpler build and test matrix.
However, this strategy fails to meet the needs of large scale users,
who want to adopt a Java LTS release and stick with it for as long as possible
before upgrading to the next Java LTS release.&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/2023/11/06/introducing-2-2-2-java-support-plan-figure3.svg&quot; alt=&quot;Figure 3&quot; title=&quot;Rejected proposal: Support one Java LTS release at any given time&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;accepted-proposal-2-2-2-java-support-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#accepted-proposal-2-2-2-java-support-plan&quot; /&gt;Accepted proposal: 2 + 2 + 2 Java support plan&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The above discussion highlights two categories of users,
each of whose needs are legitimate but, through no fault of their own, are in conflict with each other.
The natural solution, then, is to compromise at the midpoint.
Therefore, the Jenkins project is adopting a 2 + 2 + 2 Java support plan, where Jenkins
supports a new Java LTS release in the first two years after the general availability of that Java LTS release,
then requires that Java LTS release as the Jenkins minimum Java version in the next two years of that Java LTS release’s upstream support,
then drops support for that Java LTS release two years before that Java LTS release reaches end of life upstream.&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/2023/11/06/introducing-2-2-2-java-support-plan-figure4.svg&quot; alt=&quot;Figure 4&quot; title=&quot;Accepted proposal: 2 + 2 + 2 Java support plan&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In practice, this means that Jenkins will support a given Java LTS release
for approximately two-thirds the amount of time that upstream Java vendors do,
that Jenkins will support two Java LTS releases at any given time rather than three,
and that large scale users can stay on a Java LTS release for four years at a time.
This plan balances the needs of large scale users for predictability and stability
with the needs of early adopters and developers
to improve and simplify Jenkins with the latest Java capabilities
and to reduce the maintenance overhead associated with a large build and test matrix.&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;upcoming-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upcoming-dates&quot; /&gt;Upcoming dates&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;2023-11-15&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Jenkins 2.426.1 LTS will support Java 11, 17, and 21.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;2024-11-15&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Jenkins LTS will require Java 17 or 21 and drop support for Java 11.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thereafter, the 2 + 2 + 2 support plan will take effect as described above.
Check this blog for detailed dates at that time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These requirements apply to all components of the Jenkins system,
including the Jenkins controller, all types of agents, CLI clients, and other components.
You do &lt;em&gt;not&lt;/em&gt; need to build your application with the same version of Java used to run Jenkins itself;
see the &lt;a href=&quot;https://www.jenkins.io/doc/book/platform-information/support-policy-java/#running-java-based-tools-and-builds-on-jenkins:&quot;&gt;Running Java-based tools and builds on Jenkins&lt;/a&gt; section of the documentation.&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;As the age-old adage says, a good compromise is when both parties are equally dissatisfied,
and we recognize that this plan is not ideal for either category of user.
However, we feel that it optimizes globally for the sustained progress of the Jenkins community as a whole,
ensuring that the software and the community around it remain relevant for a wide variety of people and use cases.
As the Jenkins project nears its 19th birthday,
we look forward to the establishment of a sustainable software development lifecycle
that can serve the project’s valued users and contributors for years to come.&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/2023/10/31/marc-s-napkin-upgrade-guide/</id>
<title>Back of the Napkin Guide to Updating Jenkins, for the uninitiated</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-10-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/10/31/marc-s-napkin-upgrade-guide/" />
<category term='jenkins'></category>
<category term='upgrade'></category>
<category term='plugins'></category>
<summary>
.


Prologue


Here&#8217;s a brief account of my journey to update my Jenkins Servers.
Think of this as a "back of the napkin" guide that I used to research and upgrade my Jenkins Servers, which had been left unattended for far too long.
I know many of you are seasoned experts - I wasn&#8217;t.
I&#8217;ve included references that I found useful in my research, but keep in mind, your setup may be different from mine.
I hope this helps others in their journey.


Yours in Jenkins,
Marc




“This is the way”




Pre-work:

Grab your plugin list and dive into the Change log.
You&#8217;re going to want to pore over EVERY change log...
</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/2023/10/31/upgrade-jenkins-from-manage-jenkins.png&quot; alt=&quot;Upgrade Jenkins&quot; /&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;prologue&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#prologue&quot; /&gt;Prologue&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a brief account of my journey to update my Jenkins Servers.
Think of this as a &quot;back of the napkin&quot; guide that I used to research and upgrade my Jenkins Servers, which had been left unattended for far too long.
I know many of you are seasoned experts - I wasn’t.
I’ve included references that I found useful in my research, but keep in mind, your setup may be different from mine.
I hope this helps others in their journey.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yours in Jenkins,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/mwp565733&quot;&gt;Marc&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;“This is the way”&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;pre-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pre-work&quot; /&gt;Pre-work:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Grab your plugin list and dive into the &lt;code&gt;Change log&lt;/code&gt;.
You’re going to want to pore over EVERY change log from your current version to your target version, and every single iteration in between.
Keep an eye out for any mentions of your plugins and Java versions (both client and primary) in the Change Log. You’re building a validation checklist here (e.g., does SSH still work? Is the plugin functioning properly?).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;ADDED ROI&lt;/strong&gt;: While you’re scrutinizing your plugins, take a moment to consider which ones are gathering dust. Are any of them deprecated? Do you still need them? Try deactivating them (before you outright remove them) and see if anyone kicks up a fuss.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;Backup Security roles and Users&lt;/code&gt;: If you’re using LDAP/AD, make offline copies of your Security groups and access, User Lists and Security groups (&lt;em&gt;&amp;lt;jenkins_url&amp;gt;/manage/role-strategy/&lt;/em&gt; &amp;amp;&amp;amp; &lt;em&gt;&amp;lt;jenkins_url&amp;gt;/manage/role-strategy/assign-roles&lt;/em&gt;).
Don’t forget to backup configurations to access the Active Directory too (&lt;em&gt;&amp;lt;jenkins_url&amp;gt;/configureSecurity/&lt;/em&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;let-the-work-begin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#let-the-work-begin&quot; /&gt;Let the work begin:&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Get cozy with your backups for those inevitable rollbacks.
I had quite the love affair with plugins…​ making a tar/zip archive of /JENKINS_HOME/plugins was a lifesaver.
Some plugins, like &lt;a href=&quot;https://plugins.jenkins.io/active-directory/&quot;&gt;Active Directory&lt;/a&gt;,
really threw me for a loop during updates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;SNAPSHOTS&lt;/code&gt;: Take them at the beginning, and after each benchmark, if you can afford the luxury.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Update Plugins&lt;/code&gt;: Aim for the highest compatible level. I found that reaching for the &quot;highest level&quot; sometimes led to unnecessary headaches. Keep it simple, kid. &lt;strong&gt;SNAPSHOT:&lt;/strong&gt; Archive the &amp;lt;JENKINS_HOME&amp;gt;/plugins/ folder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Update the Core application&lt;/code&gt;: Stick with the method you used for the initial install.
I’m running on RHEL and used yum…​
I tried getting fancy with downloading the war file, but it kept throwing tantrums…​
Stick with what you know.
Keep in mind, versions pre-2.400 used a different security key than post-2.400 (&lt;a href=&quot;https://www.jenkins.io/blog/2023/03/27/repository-signing-keys-changing/&quot;&gt;Jenkins 2.397 and 2.387.2:
New Linux Repository Signing Keys&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Update plugins &lt;em&gt;AGAIN&lt;/em&gt;&lt;/code&gt;: Aim for the highest &quot;compatible&quot; level (hopefully, it’s the highest level now).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Plugin configuration&lt;/code&gt;: My CVS plugin was a bit needy, requiring files not in the hpi install file. Follow the appropriate plugin documentation to satisfy these dependencies.
Establish connections to external databases and services (AD/CVS/etc.).
&lt;strong&gt;Special anecdote&lt;/strong&gt;: I had a bit of a tiff with the &quot;Require TLS&quot; checkbox for the LDAPS connect…​ a conflict needed to be resolved.
Specifically, I had to tweak the systemctl for Jenkins…​ ensure &lt;code&gt;-Dhudson.plugins.active_directory.ActiveDirectorySecurityRealm.forceLdaps=true&lt;/code&gt; was removed before enabling that checkbox, else you’ll be dealing with authentication errors with LDAPS &lt;sub&gt;&lt;a href=&quot;https://plugins.jenkins.io/active-directory/#plugin-content-encryption-support&quot;&gt;Reference&lt;/a&gt;&lt;/sub&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Validation&lt;/code&gt;: Time to check that list you made earlier…​ can you SSH out to client servers?
Can you connect to your external services/databases?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cleanup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cleanup&quot; /&gt;Cleanup:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Depending on the scale of your upgrade, you might want to &lt;code&gt;re-examine your plugins&lt;/code&gt;.
Some plugins might have been sent out to pasture as their functionality gets folded into the Core.
Consider these plugins for deactivation, and maybe even removal down the line.
This little cleanup could help plug some security holes (and put a smile on your CISO’s face).
Remember to do a little jig after each disable/remove and application recycle.&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;epilogue&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#epilogue&quot; /&gt;Epilogue&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a story without an end…​
It’s not a one-and-done deal.
After I finished the upgrade cycle, I made weekly pilgrimages to each server to update plugins, disable ones that seemed to be gathering dust, remove the ones that &lt;em&gt;WERE&lt;/em&gt; just collecting dust, and address any warnings that popped up in the Jenkins UI.
The more you do it, the easier it gets.
I had a few practice runs on my sandbox server before I dared to touch the production servers.
And I kept taking snapshots as I went along, like a tourist in my own code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is my tale…​ now it’s time for you to write yours.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References:&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;Core app updated&lt;/p&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/doc/book/installing/&quot;&gt;Installation guide for Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos&quot;&gt;Installation guide for Jenkins RHEL&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Change log&lt;/p&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/doc/upgrade-guide/&quot;&gt;Jenkins Change Log for upgrades&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plug-in references&lt;/p&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/&quot;&gt;Jenkins Plugin Library&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/active-directory/&quot;&gt;Jenkins Active Directory Plugin&lt;/a&gt;&lt;/p&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/active-directory/#plugin-content-encryption-support&quot;&gt;Active Directory forceLdaps guidance&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/dimensionsscm/&quot;&gt;Jenkins Dimensions Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/role-strategy/&quot;&gt;Jenkins Role Strategy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supplementary reading&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/ops/jenkins-war-update&quot;&gt;Upgrading Jenkins with a WAR file&lt;/a&gt; My initial drafts were based on this process&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/geekculture/how-to-upgrade-jenkins-on-windows-linux-server-b7d4526abc31&quot;&gt;How to Upgrade Jenkins on Windows/Linux Server&lt;/a&gt; I used this for Troubleshooting guides tips and tricks&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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/2023/10/25/what-is-the-plugin-health-score/</id>
<title>What is the plugin health score?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-10-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/10/25/what-is-the-plugin-health-score/" />
<category term='jenkins'></category>
<category term='plugins'></category>
<category term='plugin-health-scoring'></category>
<summary>
Short story long


As of October 24th, there is a new tab named Health Score on each plugin page of plugins.jenkins.io.


This new tab provides the plugin&#8217;s health score, along with every aspect that contributed to its score.
The score is meant to be unbiased and all plugins are evaluated the same way.


Here is what it looks like:


.




Back to the beginning


This project started during the Google Summer of Code 2022 and was finished during the Google Summer of Code 2023.
We created the Plugin Health Scoring project with and for the Jenkins community.


The purpose of the project is to provide an unbiased score to...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;short-story-long&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#short-story-long&quot; /&gt;Short story long&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of October 24th, there is a new tab named &lt;strong&gt;Health Score&lt;/strong&gt; on each plugin page of &lt;a href=&quot;https://plugins.jenkins.io&quot;&gt;plugins.jenkins.io&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This new tab provides the plugin’s health score, along with every aspect that contributed to its score.
The score is meant to be unbiased and all plugins are evaluated the same way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is what it looks like:&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/2023/10/25/2023-10-25-what-is-the-plugin-health-score/plugin-health-score-mailer.png&quot; alt=&quot;Plugin health score for Mailer&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;back-to-the-beginning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#back-to-the-beginning&quot; /&gt;Back to the beginning&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project started during the Google Summer of Code 2022 and was finished during the Google Summer of Code 2023.
We created the Plugin Health Scoring project with and for the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The purpose of the project is to provide an unbiased score to all plugins.
The resulting score is based on data retrieved from each plugin, and this data is analyzed the same way for every plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;understanding-the-scores&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#understanding-the-scores&quot; /&gt;Understanding the scores&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The scores are based on several data points gathered from each plugin.
We use the &lt;code&gt;update-center.json&lt;/code&gt; to populate the list of plugins and their source code location.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Based on that, we run what we call &lt;code&gt;probes&lt;/code&gt; on each plugin.
The purpose of these probes is strictly to gather data such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Is there a &lt;code&gt;Jenkinsfile&lt;/code&gt; within the plugin repository?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When was the last commit on the default branch of the repository?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is &lt;a href=&quot;https://plugin-health.jenkins.io/probes&quot;&gt;the list of probes&lt;/a&gt; used in the project, and you can find their source code &lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/tree/main/core/src/main/java/io/jenkins/pluginhealth/scoring/probes&quot;&gt;in their repository&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the data is gathered, we run a list of &lt;em&gt;scoring&lt;/em&gt; processes, which grade all plugins based only on the available data.
All plugins are then scored using the same criteria.
You can find the list of &lt;em&gt;scoring&lt;/em&gt; processes &lt;a href=&quot;https://plugin-health.jenkins.io/scores&quot;&gt;on the Plugin Health Score site&lt;/a&gt; and their implementation &lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/tree/main/core/src/main/java/io/jenkins/pluginhealth/scoring/scores&quot;&gt;in the Plugin Health Score repository&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to the Plugin Health Scoring project &lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/blob/main/docs/ARCHITECTURE.adoc&quot;&gt;documentation&lt;/a&gt; for further information about the architecture and behavior 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;how-is-it-displayed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-is-it-displayed&quot; /&gt;How is it displayed?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The score of every plugin is fetched when the plugin site is built.
That data is then used to build the &lt;code&gt;/&amp;lt;plugin-name&amp;gt;/healthscore/&lt;/code&gt; page, using the component &lt;code&gt;PluginHealthScore&lt;/code&gt;.
That component can be found in &lt;a href=&quot;https://github.com/jenkins-infra/plugin-site/blob/master/plugins/plugin-site/src/components/PluginHealthScore.jsx&quot;&gt;the plugin site repository&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The scores and different categories are dynamic, and are coming directly from the Plugin Health Scoring project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;disclaimer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#disclaimer&quot; /&gt;Disclaimer&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The scores are not perfect and are just another indicator of the plugin state.
We are still working on using more data from the plugin to contribute to the score.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The grading system that generates the score for each plugin is, I believe, subjective.
However, it is not written in stone and can, and most likely will, evolve in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you feel there is something incorrect about a plugin score, this may indicate a false negative.
Please raise an issue on the &lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/issues/new?assignees=&amp;amp;labels=bug&amp;amp;projects=&amp;amp;template=bug-report.yaml&quot;&gt;Plugin Health Scoring project&lt;/a&gt; if the score does not appear to be accurate.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://github.com/jenkins-infra/plugin-health-scoring&quot;&gt;Plugin Health Scoring&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/projects/plugin-health-scoring-system&quot;&gt;Google Summer of Code 2022 project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Google Summer of Code 2023 project page&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/2023/10/12/jenkins-september-newsletter/</id>
<title>Jenkins September 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-10-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/10/12/jenkins-september-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Key Takeaways




JDK21 is around the corner







Contributed by: Wadeck Follonier




A plugin security advisory was published on September 6.



Security Advisory 2023-09-06


This included multiple high score vulnerabilities in various plugins.





A core security advisory was published on September 20.



Security Advisory 2023-09-20


Multiple vulnerabilities were corrected in core.


This advisory also included fixes for a plugin.










Contributed by: Mark Waite


Voter registration is now open for the 2023 Jenkins elections.
We&#8217;re electing two board members and all five officers.
Jenkins contributors must register to vote in each year&#8217;s elections.


How do I register to vote?




More detailed instructions are available in the Jenkins elections 2023 blog post.



New Jenkins features

The 10 year old JavaScript...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins September Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-takeaways&quot; /&gt;Key Takeaways&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;JDK21 is around the corner&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A plugin security advisory was published on September 6.&lt;/p&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/2023-09-06/&quot;&gt;Security Advisory 2023-09-06&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This included multiple high score vulnerabilities in various plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A core security advisory was published on September 20.&lt;/p&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/2023-09-20/&quot;&gt;Security Advisory 2023-09-20&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multiple vulnerabilities were corrected in core.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This advisory also included fixes for a plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voter registration is now open for the 2023 Jenkins elections.
We’re electing two board members and all five officers.
Jenkins contributors must register to vote in &lt;strong&gt;each year’s elections&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-do-i-register-to-vote&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-register-to-vote&quot; /&gt;How do I register to vote?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://community.jenkins.io/g/election-voter-2023&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/register-button.png&quot; alt=&quot;register button&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More detailed instructions are available in the &lt;a href=&quot;https://www.jenkins.io/blog/2023/09/18/board-officer-election-announcement/&quot;&gt;Jenkins elections 2023 blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-jenkins-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-jenkins-features&quot; /&gt;New Jenkins features&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 10 year old JavaScript library, &lt;code&gt;Prototype.js&lt;/code&gt;, has been removed from Jenkins 2.426 as announced in a &lt;a href=&quot;https://www.jenkins.io/blog/2023/10/09/prototype-removed/&quot;&gt;recent blog post&lt;/a&gt; by Basil Crow.
The Jenkins board extends its sincere thanks to Tim Jacomb, Basil Crow, Rahul Somasunderam, and many others that worked to remove that old library from Jenkins core and over 60 plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The bandwidth reduction on Artifactory is complete as &lt;code&gt;repo.jenkins-cio.org&lt;/code&gt; no longer mirrors Apache Maven repositories, thanks to our infrastructure caching.
We’ve seen a decrease of more than 50% in monthly outbound downloads.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We’ve been doing some plumbing work to increase the availability of jenkins.io web services during operations (or those pesky unplanned infrastructure problems).
No more outages when upgrading Kubernetes for replicated services.
That’s right, we’ve got your back!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have a new sponsor for the Jenkins Project in Cloudflare.
We’re currently evaluating migrating &lt;code&gt;updates.jenkins.io&lt;/code&gt; to their system next month.
Exciting times ahead!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ARM64: We’ve migrated 5 new services, making for a total of 7, from x86 to ARM64, including jenkins.io and javadoc.jenkins.io.
We’re moving on up!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It’s time to say goodbye to Oracle Cloud!
The sponsorship has ended and &lt;code&gt;archives.jenkins.io&lt;/code&gt; now runs on DigitalOcean.
We’re grateful to both of these providers for their past and present help.
Here’s to new beginnings!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JDK21&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We’re working with updatecli to keep the JDK21 &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3736&quot;&gt;updated&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We’re still waiting for the &lt;a href=&quot;https://adoptium.net/blog/2023/09/temurin21-delay/&quot;&gt;official release&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker images:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ssh agent: first JDK 21 &lt;a href=&quot;https://hub.docker.com/r/jenkins/ssh-agent/tags?page=1&amp;amp;name=jdk21&quot;&gt;preview images&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker agent: first JDK 21 &lt;a href=&quot;https://hub.docker.com/r/jenkins/agent/tags?page=1&amp;amp;name=jdk21&quot;&gt;preview images&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inbound agent: first JDK21 &lt;a href=&quot;https://hub.docker.com/r/jenkins/inbound-agent/tags?page=1&amp;amp;name=jdk21&quot;&gt;preview images&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controller: first JDK21 preview images&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 11, 17, and 21 with Jenkins&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://docs.google.com/document/d/1y3RVlniNmz-5Nd3LI-w58LDf760Ai7FqssP4zHuTv8U/edit?usp=sharing&quot;&gt;Mark Waite’s Google Doc&lt;/a&gt; for further information.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A draft was sent to the Jenkins board and officers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Since a pciture is worth a thousand words, here is a &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1Gc-0yuYOD5u674qnxbPOWhCU5t9viCJukVj_9b-kwAw/edit#gid=2094671884&quot;&gt;diagram&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It needs further discussion and refinement before it is finalized.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work on agent and controller images&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker-agent received a few version bumps and two breaking changes, resulting in seven releases.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;💥 Breaking change: Moving to bookworm.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;💥 Breaking change: Using a ltsc2019 base image for windowsservercore-ltsc2019 agent images.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inbound-agent received a few version bumps and two breaking changes, resulting in four new releases.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;💥Breaking change: Moving to bookworm.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;💥Breaking change: Using a ltsc2019 base image for windowsservercore-ltsc2019 agent images and add a nanoserver-ltsc2019 image.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During September, there were several updates for the community blog and Jenkins documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, there were 10 blog posts written by 11 different authors.
The blog posts include &lt;a href=&quot;https://www.jenkins.io/blog/tags/gsoc2023/&quot;&gt;updates and recaps for the Google Summer of Code&lt;/a&gt;, the &lt;a href=&quot;https://www.jenkins.io/blog/2023/09/18/board-officer-election-announcement/&quot;&gt;2023 Jenkins board and officer elections&lt;/a&gt;, and a review of the &lt;a href=&quot;https://www.jenkins.io/blog/2023/09/06/artifactory-bandwidth-reduction/&quot;&gt;Artifactory bandwidth reduction project&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins security section now includes a list of all &lt;a href=&quot;https://www.jenkins.io/security/issues/&quot;&gt;security issues since 2018&lt;/a&gt;.
This list compiles all security issues that have been published in a security advisory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, a new &lt;a href=&quot;https://www.jenkins.io/doc/book/platform-information/&quot;&gt;Platform Information&lt;/a&gt; section was added to the Jenkins user handbook.
This section contains support polciies for the Jenkins platform and upgrade guides for Java versions in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&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/2023/10/12/2023-10-12-jenkins-september-newsletter/image2.jpg&quot; alt=&quot;image&quot; width=&quot;294&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Hacktoberfest is in progress!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s still time to register, pick your projects, and contribute.
Registration is between September 26 and October 31 on the &lt;a href=&quot;https://hacktoberfest.com/participation/&quot;&gt;Hacktoberfest site&lt;/a&gt;. &lt;a href=&quot;https://www.jenkins.io/blog/2023/09/20/Hacktoberfest-2023/&quot;&gt;Read how you could contribute to Jenkins&lt;/a&gt;.&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/2023/10/12/2023-10-12-jenkins-september-newsletter/image1.png&quot; alt=&quot;image&quot; width=&quot;225&quot; height=&quot;225&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins in Google Summer of Code 2023 has concluded!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to all 4 GSoC contributors for their completion of this year’s program.
Read more about their projects in their blog posts below:&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/2023/09/24/building-jenkinsio-with-alternative-tools/&quot;&gt;GSoC Building Jenkins.io with alternative tools&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/09/22/incremental-build-detection-probe/&quot;&gt;Incremental Build Detection Probe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/09/20/renovate-bot-probe-blog/&quot;&gt;Renovate Probe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/09/09/jsr305-probe-blog/&quot;&gt;Detecting deprecated JSR-305 imports Probe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/08/28/number-of-open-issues-probe/&quot;&gt;Number of open issues Probe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/08/24/gsoc-docker-based-quickstart/&quot;&gt;Docker-based Jenkins quick start&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/08/24/gitlab-plugin-modernization-report/&quot;&gt;GitLab Plugin Modernization&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;&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/2023/10/09/prototype-removed/</id>
<title>Prototype removed from Jenkins 2.426</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-10-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/10/09/prototype-removed/" />
<author>
<name>basil</name>
</author>
<category term='announcement'></category>
<category term='jenkins'></category>
<summary>
Following up on my previous post about removing Prototype from Jenkins,
Prototype has been removed from the 2.426 weekly release and will be removed from the November LTS release.
This removal required changes in about 60 plugins.
Use the Plugin Manager to upgrade all plugins before and after upgrading to Jenkins 2.426.


A migration of this scope would not have been possible without the support of the entire Jenkins community.
In particular, we would like to thank Tim Jacomb and Rahul Somasunderam for doing a large portion of the development work.
Additionally, we would like to thank the following contributors for participating in the removal of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following up on my previous post about &lt;a href=&quot;https://www.jenkins.io/blog/2023/05/12/removing-prototype-from-jenkins/&quot;&gt;removing Prototype from Jenkins&lt;/a&gt;,
Prototype has been removed from the 2.426 weekly release and will be removed from the November LTS release.
This removal required changes in about 60 plugins.
&lt;strong&gt;Use the Plugin Manager to upgrade all plugins before and after upgrading to Jenkins 2.426.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A migration of this scope would not have been possible without the support of the entire Jenkins community.
In particular, we would like to thank Tim Jacomb and Rahul Somasunderam for doing a large portion of the development work.
Additionally, we would like to thank the following contributors for participating in the removal of Prototype from the Jenkins project
by developing, reviewing, or releasing a Prototype-related change in the &lt;code&gt;jenkinsci&lt;/code&gt; and/or &lt;code&gt;jenkins-infra&lt;/code&gt; GitHub organizations:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Adrien Lecharpentier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alexander Brandes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alexis Tual&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bhagyashri Sapnar&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bruno Kinoshita&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bruno Verachten&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Carroll Chiou&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Christopher Orr&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dan Alvizu&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Daniel Beck&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Devin Nusbaum&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dmitry Platonov&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fred G&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gavin McDonald&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go Sueyoshi&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ioannis Moutsatsos&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Iurii Ignatko&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;James Nord&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jan Faracik&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jesse Glick&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jiri Vanek&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Joe Hansche&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jose Blas Camacho Taboada&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Josh Aguilar&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kanstantsin Shautsou&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kevin Martens&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kris Stern&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Markus Winter&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Martin Pokorny&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Michael Tughan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oliver Gondža&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Olivier Lamy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pierre Beitz&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Raihaan Shouhell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Robert Sandell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Roland Asmann&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Timka Dyussyumbayev&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tobias Gruetzmacher&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ullrich Hafner&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Victor Balakine&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wadeck Follonier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yaroslav Afenkin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zbynek Konecny&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you for your contributions,
and I hope to see many of you again in the &lt;code&gt;javax&lt;/code&gt; to &lt;code&gt;jakarta&lt;/code&gt; API migration.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/09/26/Supercharge-Your-Jenkins-Workflow-with-Mergify/</id>
<title>Supercharge Your Jenkins Workflow with Mergify</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/26/Supercharge-Your-Jenkins-Workflow-with-Mergify/" />
<author>
<name>jd</name>
</author>
<category term='jenkins'></category>
<category term='tutorial'></category>
<category term='merge queue'></category>
<category term='Mergify'></category>
<category term='cicd'></category>
<summary>
Introduction


In the modern software development landscape, continuous integration (CI) and continuous deployment (CD) are no longer just trendy buzzwords.
They are vital components of the development cycle.
Two tools that are often associated with these operations are Jenkins and Mergify.
Jenkins, an open-source automation server, is used to automate parts of the development process, including building, testing, and deploying applications.
Mergify, on the other hand, is a powerful GitHub automation tool and merge queue that can simplify the management of pull requests.




Setting Things Up


Before we dive into the wonders of the Mergify-Jenkins tandem, let&#8217;s quickly walk through setting things up.


To get started with Jenkins,...
</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;In the modern software development landscape, continuous integration (CI) and continuous deployment (CD) are no longer just trendy buzzwords.
They are vital components of the development cycle.
Two tools that are often associated with these operations are Jenkins and &lt;a href=&quot;https://mergify.com&quot;&gt;Mergify&lt;/a&gt;.
Jenkins, an open-source automation server, is used to automate parts of the development process, including building, testing, and deploying applications.
Mergify, on the other hand, is a powerful GitHub automation tool and merge queue that can simplify the management of pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;setting-things-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-things-up&quot; /&gt;Setting Things Up&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before we dive into the wonders of the Mergify-Jenkins tandem, let’s quickly walk through setting things up.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To get started with Jenkins, &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/&quot;&gt;you need to install it on your server&lt;/a&gt;, and then you can use its rich set of plugins to define your build, test, and deployment pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mergify, on the other hand, requires no installation.
&lt;a href=&quot;https://docs.mergify.com/getting-started/&quot;&gt;You integrate it with your GitHub account&lt;/a&gt;, and then you define your automation rules in a YAML file that lives in your repository.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-power-duo-jenkins-and-mergify&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-power-duo-jenkins-and-mergify&quot; /&gt;The Power Duo: Jenkins and Mergify&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins and Mergify are powerful tools individually, but when combined, they can take your DevOps workflows to the next level.
The robust build and test automation provided by Jenkins are the perfect complement to Mergify’s ability to automate GitHub workflows, such as labeling, merging, backporting, and more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By integrating Jenkins and Mergify, you’re essentially creating a powerful CI/CD pipeline.
You’re able to automatically build, test, and deploy your software while also managing the various GitHub workflows in an efficient and streamlined manner.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;automating-pull-request-updates-with-jenkins-and-mergify&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automating-pull-request-updates-with-jenkins-and-mergify&quot; /&gt;Automating Pull Request Updates with Jenkins and Mergify&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One particularly powerful combination of Jenkins and Mergify is in the area of pull request updates.
Normally, if a Jenkins build fails due to a commit, someone has to notify the developer to update their pull request manually.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Mergify, this process can be completely automated.
Using Mergify’s pull request rules, you can configure a rule that will automatically request changes and comment on the pull request if the Jenkins build fails.
This not only saves time but also ensures that issues are immediately flagged and addressed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-1-configure-jenkins-build-status-reporting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-1-configure-jenkins-build-status-reporting&quot; /&gt;Step 1: Configure Jenkins Build Status Reporting&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Firstly, you need to ensure that Jenkins is reporting the build status back to GitHub.
This can be done using the &lt;a href=&quot;https://plugins.jenkins.io/github/&quot;&gt;GitHub plugin in Jenkins&lt;/a&gt;.
After installing the plugin, go to the configuration of the job that you want to link with GitHub and find the &quot;Post-build Actions&quot; section.
There, add &quot;Set GitHub commit status (universal)&quot; and configure it to update the status of the commit in GitHub based on the build result.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-2-set-up-mergify-rules&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-2-set-up-mergify-rules&quot; /&gt;Step 2: Set Up Mergify Rules&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, in your GitHub repository, you need to create a &lt;code&gt;.mergify.yml&lt;/code&gt; file where you’ll define your automation rules.
Here’s an example of a rule that comments on and labels a pull request if the Jenkins build fails:&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;pull_request_rules&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;comment on PR if build fails&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;conditions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# Replace with the actual name of your Jenkins reported check&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;check-failure=Jenkins&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;comment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;message&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;The&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Jenkins&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;has&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;failed.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Please&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;review&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;your&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;changes.&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;toggle&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;s&quot;&gt;build-failed&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;In this configuration:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;conditions&lt;/code&gt; section checks if the Jenkins build is unsuccessful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;actions&lt;/code&gt; section defines what actions Mergify should take if the conditions are met.
In this case, it will add a comment to the pull request and apply the label &lt;code&gt;build-failed&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 wanted to also update the pull request with the latest change from its base branch to see if that’d make it work, you could use the &lt;code&gt;update&lt;/code&gt; action from Mergify also:&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;pull_request_rules&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;comment and update on PR if build fails&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;conditions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# Replace with the actual name of your Jenkins reported check&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;check-failure=Jenkins&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;actions&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;comment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;message&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;The&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Jenkins&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;has&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;failed.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Please&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;review&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;your&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;changes.&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;toggle&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;s&quot;&gt;build-failed&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# Merge PR base branch into the PR, this will retrigger the CI&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;update&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&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-3-commit-and-push-mergify-yml-file&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-3-commit-and-push-mergify-yml-file&quot; /&gt;Step 3: Commit and Push &lt;code&gt;.mergify.yml&lt;/code&gt; File&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, commit this file to your repository, and Mergify will start automating based on the rules you’ve defined.&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;ensuring-secure-mergify-merges-with-the-merge-queue&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ensuring-secure-mergify-merges-with-the-merge-queue&quot; /&gt;Ensuring Secure Mergify Merges with the Merge Queue&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another powerful way you can combine Jenkins and Mergify is by using the Merge Queue feature.
The merge queue is a strategy offered by Mergify to secure your repository’s main branch state.
It ensures that the main branch is always green by validating that each pull request integrates correctly before merging.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Jenkins as your continuous integration (CI) system, you can ensure each pull request is thoroughly checked before it gets added to the merge queue.
Here’s how you can configure this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-1-set-up-jenkins-for-ci&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-1-set-up-jenkins-for-ci&quot; /&gt;Step 1: Set Up Jenkins for CI&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the first step, ensure your Jenkins setup is correctly reporting the build status to GitHub, as explained previously.
Each pull request should trigger a Jenkins job, which subsequently updates the pull request status based on the build result.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-2-configure-mergify-merge-queue&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-2-configure-mergify-merge-queue&quot; /&gt;Step 2: Configure Mergify Merge Queue&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, in your &lt;code&gt;.mergify.yml&lt;/code&gt; file, you can set up a rule that places the pull request in a merge queue once it’s approved and all CI checks, including Jenkins, pass. Below is an example configuration:&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;queue_rules&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;default&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;merge_conditions&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;#approved-reviews-by&amp;gt;=1&quot;&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;check-success=Jenkins&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;routing_conditions&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;#approved-reviews-by&amp;gt;=1&quot;&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;check-success=Jenkins&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;In this configuration:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;queue_rules&lt;/code&gt; section sets up a merge queue named &lt;code&gt;default&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A pull request is added to this queue when it has at least one approval (&lt;code&gt;#approved-reviews-by&amp;gt;=1&lt;/code&gt;) and the Jenkins check is successful (&lt;code&gt;check-success=Jenkins&lt;/code&gt;) — this is what the &lt;code&gt;routing_conditions&lt;/code&gt; are for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The pull request is merged once it’s updated and still has Jenkins checks passing, plus the required approval.&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;step-3-commit-and-push-mergify-yml-file-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-3-commit-and-push-mergify-yml-file-2&quot; /&gt;Step 3: Commit and Push &lt;code&gt;.mergify.yml&lt;/code&gt; File&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you have updated the &lt;code&gt;.mergify.yml&lt;/code&gt; file with the above rules, commit and push the file to your repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this setup, each pull request must pass the Jenkins build and get approval before Mergify adds it to the merge queue.
Only when the pull request at the front of the queue passes all checks, it gets merged, ensuring the main branch’s integrity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By coupling Jenkins&#39; robust CI functionality with Mergify’s merge queue, you can make your development workflow much more efficient and error-proof, saving your team time and reducing the risk of breaking your main branch.&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;conclusion-harness-the-power-of-jenkins-and-mergify&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion-harness-the-power-of-jenkins-and-mergify&quot; /&gt;Conclusion: Harness the Power of Jenkins and Mergify&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Jenkins handling the building, testing, and deploying of your software and Mergify managing your GitHub workflows, you have a truly powerful and streamlined CI/CD pipeline.
This combination allows you to automate your workflows, improve efficiency, and ultimately deliver better software.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By embracing tools like Jenkins and Mergify, you’re not just keeping up with modern DevOps practices; you’re also investing in the long-term productivity and success of your software development projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, are you ready to supercharge your Jenkins workflow with Mergify? &lt;a href=&quot;https://mergify.com&quot;&gt;Try for free&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/09/24/building-jenkinsio-with-alternative-tools/</id>
<title>GSoC Building Jenkins.io with alternative tools</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/24/building-jenkinsio-with-alternative-tools/" />
<author>
<name>vandit1604</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='jenkins.io'></category>
<category term='jenkins-infra'></category>
<summary>
This blog showcases all the work done in the project Building Jenkins.io with Alternative Tools during Google Summer of Code 2023.


Table of Contents




About Project


Coding Phase 1


Coding Phase 2


Future Improvements


Acknowledgments


Useful Links






About Project


The Jenkins documentation site is generated as a static website using Awestruct from AsciiDoc sources.
One of the drawbacks of the current build method is that the technical documentation is not versioned.
It is thus not possible to view the documentation for a given Jenkins version.
Only the latest can be viewed.
This can lead to unnecessary confusion and is a worse experience than many other documentation sites like the git site, Python, and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog showcases all the work done in the project &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/alternative-jenkinsio-build-tool/&quot;&gt;Building Jenkins.io with Alternative Tools&lt;/a&gt; during Google Summer of Code 2023.&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-project&quot;&gt;About Project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coding &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;Coding &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;#future-improvements&quot;&gt;Future Improvements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgments&quot;&gt;Acknowledgments&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-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-project&quot; /&gt;About 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://www.jenkins.io/&quot;&gt;Jenkins documentation site&lt;/a&gt; is generated as a static website using Awestruct from AsciiDoc sources.
One of the drawbacks of the current build method is that the technical documentation is not versioned.
It is thus not possible to view the documentation for a given Jenkins version.
Only the latest can be viewed.
This can lead to unnecessary confusion and is a worse experience than many other documentation sites like the &lt;a href=&quot;https://git-scm.com/docs/git&quot;&gt;git site&lt;/a&gt;, &lt;a href=&quot;https://docs.python.org/3.11/&quot;&gt;Python&lt;/a&gt;, and others.
Another drawback of Awestruct is that for the last two years it has only been maintained by people from the Jenkins project.
Relying on Awestruct is not a good thing in the long run.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The preferred set of tools that will replace Awestruct are &lt;a href=&quot;https://antora.org/&quot;&gt;Antora&lt;/a&gt; for its out of the box versioning functionality and &lt;a href=&quot;https://www.gatsbyjs.com/&quot;&gt;Gatsby&lt;/a&gt; for it’s super fast builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The migration was performed in the following 2 coding phases:&lt;/p&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;In this phase, the following tasks were completed:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I used Antora to migrate the user documentation which was versioned and the developer documentation which was non-versioned while keeping much of the functionality that we already have on jenkins.io.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I migrated Tutorials, Guides, and Solution Pages which were all non-versioned.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I fixed Interpage Linking across all the pages.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can watch me talk about phase 1 of the project in the &lt;a href=&quot;https://youtu.be/W4eSVCTmqb8?t=1929&quot;&gt;midterm presentation here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; height=&quot;473&quot; src=&quot;https://www.youtube.com/embed/W4eSVCTmqb8?rel=0&amp;amp;start=1929&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;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 this phase, the following tasks were completed:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I used &lt;a href=&quot;https://strapi.io/&quot;&gt;Strapi CMS&lt;/a&gt; with Gatsby. I would also have liked to integrate Git Workflow here which was not suggested by mentors. Hence, It was not the perfect fit for Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I then moved to Gatsby and developed the blogs feature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I developed other pages like LTS Changelog, LTS Weekly, Download page and many more.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s the link to the &lt;a href=&quot;https://youtu.be/M9_HPQwetMg?t=1153&quot;&gt;Final Presentation&lt;/a&gt; where you can watch me talk about the project’s final phase.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; height=&quot;473&quot; src=&quot;https://www.youtube.com/embed/M9_HPQwetMg?rel=0&amp;amp;start=1188&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;future-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-improvements&quot; /&gt;Future Improvements&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;Some pages like changelogs and the Pipeline steps reference still need more refining and are missing some features that exist on the current documentation pages.
I will continue working on the project to refine them and make it ready as a drop-in replacement for Jenkins.io.&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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m grateful that I got the opportunity to contribute to Jenkins under Google Summer of Code.
I can say with confidence that Jenkins taught me a lot and I love learning so I don’t plan to stop contributing to Jenkins any soon.
I was able to pull off the project to this extent only because of 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/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/iamrajiv&quot;&gt;Rajiv Ranjan Singh&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/yiminggong/&quot;&gt;Yiming Gong&lt;/a&gt;.
I am grateful for their constant support and guidance throughout the project.
Their valuable feedback and insights into the project helped me a lot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would also like to thank the org admins, &lt;a href=&quot;https://www.jenkins.io/blog/authors/jmmeessen&quot;&gt;Jean-Marc Meessen&lt;/a&gt; for being a warm, father-like figure to me, &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; for always making sure the meetings and the project demos go smoothly , &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt; for deep involvement in resolving development challenges. and &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt; for always checking up on me and all the other contributors.&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://github.com/Vandit1604/jenkins-docs&quot;&gt;Github repo containing the code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://matrix.to/#/#jenkinsci_gsoc-2023-building-jenkinsio:matrix.org&quot;&gt;Gitter channel&lt;/a&gt; or &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt; in case you have any question(s) or feedback.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/09/22/incremental-build-detection-probe/</id>
<title>Incremental Build Detection Probe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/22/incremental-build-detection-probe/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='healthscore'></category>
<category term='probes'></category>
<category term='plugin'></category>
<summary>
Introduction


The Incremental Build Detection Probe was developed as a part of Google Summer of Code 2023 for the plugin health scoring system project.


Incremental builds aid in continuous delivery of plugins, deploying only the modules affected by new commits [1].
Jenkins core and plugins can be deployed incrementally, rather than waiting for the developer to manually deploy the release [2].


This probe identifies the plugins that have configured incremental-builds.




Importance of the Probe


This probe encourages delivery automation and saves the maintainer from manual deployment.




Challenges


Understanding the configuration and implementation posed a major challenge in this probe.
To me, it seemed that I needed to check the...
</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;The &lt;code&gt;Incremental Build Detection Probe&lt;/code&gt; was developed as a part of &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Google Summer of Code 2023&lt;/a&gt; for the plugin health scoring system project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Incremental builds aid in continuous delivery of plugins, deploying only the modules affected by new commits &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;.
Jenkins core and plugins can be deployed incrementally, rather than waiting for the developer to manually deploy the release &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_2&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_2&quot; title=&quot;View footnote.&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe identifies the plugins that have configured &lt;code&gt;incremental-builds&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;importance-of-the-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#importance-of-the-probe&quot; /&gt;Importance of the Probe&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe encourages delivery automation and saves the maintainer from manual deployment.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges&quot; /&gt;Challenges&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Understanding the configuration and implementation posed a major challenge in this probe.
To me, it seemed that I needed to check the configuration for &lt;a href=&quot;https://maven.apache.org/maven-ci-friendly.html&quot;&gt;Maven Friendly CI versions&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My mentor pointed out the following and explained that &lt;a href=&quot;https://matrix.to/#/!VkECGUHmVHbfLeicii:gitter.im/$_CwOuPxb9DPkkWTaO4QFIXOMmEqPeHpOq4Ca2eTrw-4?via=gitter.im&amp;amp;via=matrix.org&amp;amp;via=matrix.freyachat.eu&quot;&gt;the actual configuration goes deeper&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/305/README.adoc#setup&quot;&gt;setup is actually done in &lt;code&gt;.mvn/maven.config&lt;/code&gt;&lt;/a&gt; and it is essential that I look for the configuration in &lt;code&gt;.mvn/maven.config&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some plugins configure it in &lt;code&gt;extensions.xml&lt;/code&gt; in the &lt;code&gt;.mvn&lt;/code&gt; section such as &lt;a href=&quot;https://github.com/jenkinsci/kubernetes-plugin/blob/0141a5f145128b5b8458d40686a3904006f45b8d/.mvn/extensions.xml&quot;&gt;kubernetes-plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The final step was to look for the configuration in the CD workflow.
As the &lt;code&gt;jep-229&lt;/code&gt; (Continuous Delivery Probe) is already live, I did not need to look for this configuration.&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;outcome-and-learning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#outcome-and-learning&quot; /&gt;Outcome and Learning&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I learned more about GitHub Workflows and its strength.
This probe is merged and ready to be live.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information or if you have any questions, please visit the official GSoC 2023 project &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Adding Probes to &quot;Plugin Health Score&quot;&lt;/a&gt; description page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. &lt;a href=&quot;https://www.cloudbees.com/jenkins/maven&quot; class=&quot;bare&quot;&gt;https://www.cloudbees.com/jenkins/maven&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_2&quot;&gt;
&lt;a href=&quot;#_footnoteref_2&quot;&gt;2&lt;/a&gt;. &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/305/README.adoc&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jep/blob/master/jep/305/README.adoc&lt;/a&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/09/21/jenkins-august-newsletter/</id>
<title>Jenkins August 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/21/jenkins-august-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Key Takeaways




Jenkins project reports growth of 79% in Jenkins Pipeline, used to propel software delivery.







Contributed by: Wadeck Follonier




Andrea Chiera completed his 3 months internship within the Security team, auditing 100 plugins and finding 20+ vulnerabilities.



Summer Internship in Jenkins security


Thank you very much for your involvement and also to the team for mentoring him.





A Plugin security advisory was published on August 16



Jenkins Security Advisory 2023-08-16


This included four high score vulnerabilities and several medium or lower vulnerabilities.


A total of 13 plugins were affected.





The Security team is progressing on the CSP compliance project for Jenkins Core, encountering interesting corner cases that have to...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins July Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-takeaways&quot; /&gt;Key Takeaways&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;Jenkins project reports growth of 79% in Jenkins Pipeline, used to propel software delivery.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Andrea Chiera completed his 3 months internship within the Security team, auditing 100 plugins and finding 20+ vulnerabilities.&lt;/p&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/2023/08/23/summer-internship-in-jenkins-security/&quot;&gt;Summer Internship in Jenkins security&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you very much for your involvement and also to the team for mentoring him.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A Plugin security advisory was published on August 16&lt;/p&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/2023-08-16/&quot;&gt;Jenkins Security Advisory 2023-08-16&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This included four high score vulnerabilities and several medium or lower vulnerabilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A total of 13 plugins were affected.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Security team is progressing on the CSP compliance project for Jenkins Core, encountering interesting corner cases that have to be covered.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/71014&quot;&gt;https://issue-redirect.jenkins.io/issue/71014&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voter registration and candidate nomination for Jenkins elections will begin in September.
The &lt;a href=&quot;https://www.jenkins.io/blog/2023/09/18/board-officer-election-announcement/&quot;&gt;blog post&lt;/a&gt; contains more details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The ten year old Prototype.js JavaScript library will be removed from Jenkins core beginning with the weekly release October 3, 2023.
Special thanks to Basil Crow and Tim Jacomb for their work preparing Jenkins core and Jenkins plugins for a successful removal of that outdated library.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JDK21 (Early Access Temurin Edition) and Maven 3.9.4 are generally available for developers on ci.jenkins.io.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK17 is the default for all Jenkins controllers and agents on the Jenkins public infrastructure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Migration of the last two VMs to a new IPv6-enabled network removed a monthly cost of $1000 for unused cloud resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins user experience continues to improve.
Jenkins 2.414.1 include significant updates to many UI elements, including form and page modernization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dropdown links have been improved and are now part of a common framework&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Log recorder administration has been updated to be consistent with other pages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sign-in page has been modernized and simplified&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many delete dialogs have been standardized and prepared for future improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Builds widget has a better layout&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;There has been an issue with Docker Images republishing unexpectedly, causing old tags to be rebuilt.
This is now solved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK21:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Work is ongoing to keep JDK21 updated to an early access version in Jenkins’ infrastructure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins can run on JDK21 since version 2.419.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1y3RVlniNmz-5Nd3LI-w58LDf760Ai7FqssP4zHuTv8U/edit?usp=sharing&quot;&gt;A proposal from Mark Waite&lt;/a&gt; regarding Java 11, Java 17, and Java 21 adoption roadmap in Jenkins is being considered.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker agents and controller:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ssh-agent: breaking change in 5.10.0 with the replacement of bullseye in favor of &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/299&quot;&gt;bookworm&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controller:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2.414.1 brought a breaking change: &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/1687&quot;&gt;update debian images to bookworm&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows agent images are now using a Windows server image, which is a breaking change.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows 2022 images are being considered due to Windows 2019 reaching end-of-life.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Instructions for Java 17 are still to be updated in the Windows docs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the course of August, there were seven blog posts published by a combination of 12 different authors.
This included &lt;a href=&quot;https://www.jenkins.io/blog/tags/gsoc2023/&quot;&gt;updates from the Google Summer of Code&lt;/a&gt; participants, a retrospective on a &lt;a href=&quot;https://www.jenkins.io/blog/2023/08/23/summer-internship-in-jenkins-security/&quot;&gt;Jenkins security internship&lt;/a&gt;, considering what &lt;a href=&quot;https://www.jenkins.io/blog/2023/08/30/a-glimpse-of-the-future/&quot;&gt;the future holds for Jenkins&lt;/a&gt;, and notices regarding &lt;a href=&quot;https://www.jenkins.io/blog/2023/09/06/artifactory-bandwidth-reduction/&quot;&gt;bandwidth reduction&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/2023/08/22/linux-containers-rebuilt/&quot;&gt;Linux containers&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/2023/08/01/documentation-transition-to-java-17/&quot;&gt;Java 17 use in the Jenkins documentation&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/09/20/renovate-bot-probe-blog/</id>
<title>Renovate Probe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/20/renovate-bot-probe-blog/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='healthscore'></category>
<category term='probes'></category>
<category term='plugin'></category>
<summary>
Introduction


Bots are used to automate tasks in a plugin.
The Plugin Health Scoring System tracks usage of two bots - Dependabot and Renovate.


Dependabot looks for dependencies that are outdated in a plugin.
It can also raise a security alert if a security breach is found, like when the code depends on an insecure package.


Renovate provides automated dependency updates.
It can also schedule PRs and customize behavior using configuration files.




Importance of the probe


This is a community requested probe to track the usage of Renovate.
Bot tracking probes help in identifying which bot is used most by the plugins.
In the future, the probe will aid in...
</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;Bots are used to automate tasks in a plugin.
The Plugin Health Scoring System tracks usage of two bots - &lt;a href=&quot;https://github.com/dependabot&quot;&gt;Dependabot&lt;/a&gt; and &lt;a href=&quot;https://docs.renovatebot.com/&quot;&gt;Renovate&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dependabot looks for dependencies that are outdated in a plugin.
It can also raise a security alert if a security breach is found, like when the code depends on an insecure package.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Renovate provides automated dependency updates.
It can also schedule PRs and customize behavior using configuration files.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;importance-of-the-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#importance-of-the-probe&quot; /&gt;Importance of the probe&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a community requested probe to track the usage of Renovate.
Bot tracking probes help in identifying which bot is used most by the plugins.
In the future, the probe will aid in decision-making when the need arises to add or remove a bot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The pull requests created by Renovate will be counted when scoring the probe.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges&quot; /&gt;Challenges&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;Dependabot&lt;/code&gt; and &lt;code&gt;Renovate&lt;/code&gt; probes both had similar functionality: finding their respective configuration in &lt;code&gt;GitHub&lt;/code&gt; workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Implementing the solution with the correct class design was a major challenge while working on this probe.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;outcome-and-conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#outcome-and-conclusion&quot; /&gt;Outcome and Conclusion&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Having implemented a similar class in the &lt;a href=&quot;https://www.jenkins.io/blog/2023/07/16/security-scan-probe-blog/&quot;&gt;Security Scan&lt;/a&gt; probe, this probe was easy to complete.
The probe has been successfully merged and pushed into production.
The probe will help identify usage of Renovate in plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information or to find answers to any questions you might have, please visit the official GSoC 2023 project &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Adding Probes to &quot;Plugin Health Score&quot;&lt;/a&gt; description page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/09/20/Hacktoberfest-2023/</id>
<title>Hacktoberfest 2023</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/20/Hacktoberfest-2023/" />
<author>
<name>jmMeessen</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<category term='newcomer'></category>
<category term='outreach-programs'></category>
<summary>
Once again, Hacktoberfest is back!
During this October event, everyone can celebrate and support open source by contributing changes.


This year&#8217;s edition is special because it is Hacktoberfest&#8217;s tenth anniversary.
Once again, the Jenkins community will participate in the event, and we invite you to contribute to Jenkins projects.
We also encourage maintainers to welcome and help newcomers in the project.


The event is a good opportunity to cross the "imposter syndrome" threshold and contribute back to Open Source.
A lot of helpful folks will be available to guide less experienced contributors in their first steps.
It is also a great opportunity to acquire and exercise new...
</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/hacktoberfest/hacktoberfest_2023_logo.png&quot; alt=&quot;Hacktoberfest&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once again, &lt;a href=&quot;https://hacktoberfest.com&quot;&gt;Hacktoberfest&lt;/a&gt; is back!
During this October event, everyone can celebrate and support open source by contributing changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year’s edition is special because it is Hacktoberfest’s tenth anniversary.
Once again, the Jenkins community will participate in the event, and we invite you to contribute to Jenkins projects.
We also encourage maintainers to welcome and help newcomers in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The event is a good opportunity to cross the &quot;imposter syndrome&quot; threshold and contribute back to Open Source.
A lot of helpful folks will be available to guide less experienced contributors in their first steps.
It is also a great opportunity to acquire and exercise new skills, both hard and soft, while improving your experience with CI/CD in general and Jenkins in particular.
On top of this, it is a great way to &quot;build the Jenkins dev muscle&quot;, should one want to be part of the Jenkins Google Summer of Code 2024 adventure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September is the perfect time to prepare for Hacktoberfest.
Get a jump start by finding projects to contribute to, adding the &quot;Hacktoberfest&quot; tag to your projects, or familiarizing yourself with Git.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Due to the increasing popularity of Hacktoberfest, and to ensure its sustainability for another decade, the organization is &lt;a href=&quot;https://hacktoberfest.com/about/#digital-rewards&quot;&gt;moving away from a free t-shirt reward to a digital reward&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is what &lt;strong&gt;contributors&lt;/strong&gt; need to know to participate and complete Hacktoberfest:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Register anytime between September 26 and October 31 on the &lt;a href=&quot;https://hacktoberfest.com/participation/&quot;&gt;Hacktoberfest site&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull requests can be made in any &lt;a href=&quot;https://github.com/orgs/jenkinsci/repositories?q=hacktoberfest&quot;&gt;jenkinsci&lt;/a&gt; or &lt;a href=&quot;https://github.com/orgs/jenkins-infra/repositories?q=hacktoberfest&quot;&gt;jenkins-infra&lt;/a&gt; GitHub project that is participating in Hacktoberfest (look for the &quot;hacktoberfest&quot; topic).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Project maintainers must accept your pull requests for them to count toward your total.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new digital reward kit will include a customizable badge that evolves with each pull request accepted by maintainers, representing the participant’s journey in open source and Hacktoberfest.
Additionally, participants will receive unique badges featuring a delightful surprise and gifts from sponsors.
Participants will also be able to proudly share their badge on the Holopin Hacktoberfest Badge Board of Fame.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In previous years, Hacktoberfest sponsors have given participants who completed 4 PRs the option to plant a tree through Tree Nation, instead of receiving a t-shirt.
This year, a tree will be purchased for the first 50,000 participants that complete their first PR.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins specific details can be found on the &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest&quot;&gt;Jenkins Hacktoberfest page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some good resources for beginners can be found here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Intro to Open Source&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/tutorial_series/an-introduction-to-open-source&quot;&gt;Introduction to GitHub and Open Source projects&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://opensource.guide/how-to-contribute/&quot;&gt;How to contribute to Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/what-is-open-source&quot;&gt;What is Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/cheatsheets/how-to-use-git-a-reference-guide&quot;&gt;How to use Git&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sharpen your skills&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.github.com/training-kit/&quot;&gt;GitHub training kit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://guides.github.com/introduction/flow/&quot;&gt;Understanding the GitHub flow&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorial_series/an-introduction-to-open-source&quot;&gt;An introduction to Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://opensource.com/article/19/5/how-get-job-doing-open-source&quot;&gt;How Open Source contributions can boost your career&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.blog/2015-01-21-how-to-write-the-perfect-pull-request/&quot;&gt;How to write the perfect Pull Request&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.to/chrissiemhrk/git-commit-message-5e21&quot;&gt;How to write a good commit message&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A good introduction to Jenkins contribution is the series of &lt;a href=&quot;https://www.youtube.com/playlist?list=PLvBBnHmZuNQIwIZ86HL39uot6751EOd-f&quot;&gt;Modernizing Jenkins plugins&lt;/a&gt; recorded livestreams.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;maintainers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#maintainers&quot; /&gt;Maintainers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins and plugin &lt;strong&gt;maintainers&lt;/strong&gt; also need to get ready for Hacktoberfest by preparing your project for contributions by following these best practices:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add the &quot;hacktoberfest&quot; topic to your repository to &lt;strong&gt;OPT-IN TO HACKTOBERFEST&lt;/strong&gt; and indicate you’re looking for contributions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the &quot;hacktoberfest&quot; label to issues you want contributors to help with in your GitHub project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a CONTRIBUTING.md file with contribution guidelines to your repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose issues that have a well-defined scope and are self-contained.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be ready to review pull requests, accepting those that are valid by merging them, leaving an overall approving review, or by adding the &quot;hacktoberfest-accepted&quot; label.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reject any spammy requests you receive by labeling them as &quot;spam&quot; and any other invalid contributions by closing them or labeling them as &quot;invalid&quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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/2023/09/18/board-officer-election-announcement/</id>
<title>Jenkins Board and Officer Elections 2023 - Nominations Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/18/board-officer-election-announcement/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
We are excited to announce the 2023 Jenkins Governance Board and officer elections!


Nominations


Nominations can be submitted for two governance board positions, and all five officer positions (Security, Events, Release, Infrastructure, and Documentation).


During the registration period, we invite community members to nominate candidates by sending a message to the election-committee group.
In your message, please include the name of the nominee, the specific position and your reasons for nominating that person.
The nomination period ends on October 27.
Nominees will be notified, and asked to confirm that they are interested in running as a candidate.
The list of candidates will be announced on November 06.


Anyone...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;We are excited to announce the 2023 Jenkins Governance Board and officer elections!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;nominations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nominations&quot; /&gt;Nominations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominations can be submitted for two &lt;a href=&quot;https://www.jenkins.io/project/board/&quot;&gt;governance board&lt;/a&gt; positions, and all five &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;officer&lt;/a&gt; positions (Security, Events, Release, Infrastructure, and Documentation).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the registration period, we invite community members to nominate candidates by sending a message to the &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election-committee&lt;/a&gt; group.
In your message, please include the name of the nominee, the specific position and your reasons for nominating that person.
The nomination period ends on &lt;strong&gt;October 27&lt;/strong&gt;.
Nominees will be notified, and asked to confirm that they are interested in running as a candidate.
The list of candidates will be announced on November 06.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Anyone can nominate anyone as candidate!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many thanks to &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; and &lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt; for serving on the &lt;a href=&quot;https://www.jenkins.io/project/board/&quot;&gt;Jenkins Governance Board&lt;/a&gt;.
We also want to thank &lt;a href=&quot;https://github.com/dduportal&quot;&gt;Damien Duportal&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#jenkins-team-leads-and-officers&quot;&gt;Infrastructure Officer&lt;/a&gt;, &lt;a href=&quot;https://github.com/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#security&quot;&gt;Security Officer&lt;/a&gt;, &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#events&quot;&gt;Events Officer&lt;/a&gt;, &lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;, and &lt;a href=&quot;https://github.com/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt; for all of their work over the last term.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-election-consists-of-4-phases&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-election-consists-of-4-phases&quot; /&gt;The election consists of 4 phases:&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;Nomination of candidates (September 18 - October 27)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voter registration (September 18 - November 05)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting (November 06 - December 1)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Results announcement (December 11)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;voting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voting&quot; /&gt;Voting&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Participation in the election process requires registering an account on the &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&lt;/a&gt; and at least one contribution made before September 1, 2023.
When registering, you can use an existing GitHub account or create a new account specifically for &lt;a href=&quot;https://community.jenkins.io&quot;&gt;Jenkins community forums&lt;/a&gt;.
We ask all community members who are interested in voting and meet the requirements to join the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2023&quot;&gt;election-voter-2023&lt;/a&gt; group during the registration period.
Previous elections utilized their own groups, so joining the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2023&quot;&gt;election-voter-2023&lt;/a&gt; group is required for participation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have made the decision to trust participants and not require that you provide evidence of contribution as part of your voter registration.
We reserve the right to ban any account from the election process if we identify abuse.
Once registration is over, a list of email addresses will be sent to the &lt;a href=&quot;https://civs1.civs.us/&quot;&gt;Condorcet Internet Voting Service (CIVS)&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing&quot; /&gt;Contributing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As shown on the &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Participate and Contribute&lt;/a&gt; page, there are many different ways to contribute to Jenkins. You can contribute by:&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/participate/connect/&quot;&gt;Connecting with the community&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/meet/&quot;&gt;Joining or organizing a meetup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/code/&quot;&gt;Contributing code to Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/help/&quot;&gt;Helping Jenkins users&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/internationalization/&quot;&gt;Translating Jenkins resources&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/test/&quot;&gt;Testing Jenkins core and plugins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/document/&quot;&gt;Contributing to Jenkins documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/design/&quot;&gt;Creating art or updating the Jenkins UI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/review-changes/&quot;&gt;Reviewing open pull requests&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;Donating to Jenkins&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;All contributions to Jenkins and its community are welcome&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;election&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#election&quot; /&gt;Election&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On November 06, candidates will be announced, and all registered voters will be notified by email to participate using the &lt;a href=&quot;https://civs.cs.cornell.edu&quot;&gt;Condorcet Voting System&lt;/a&gt;.
Registration to vote closes on November 05.
All votes must be submitted by December 1.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results&quot; /&gt;Results&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As soon as the votes are counted, the results will be published.
The new term starts on December 11, when the newly elected members will transition to their roles.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates&quot; /&gt;Important Dates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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;Important Dates&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time&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;Nomination of candidates open&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 18&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;Voter registration opens&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 18&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;Nomination of candidates closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;October 27&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;Voter registration closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;November 05&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;Candidates announced &amp;amp; Voting starts&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;November 06&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;Voting closes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;December 01&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;Announcing Results&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;December 11&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#troubleshooting&quot; /&gt;Troubleshooting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are new to Jenkins elections, unfamiliar with the Condorcet Internet Voting Service (CIVS) or the community forums, or feel overwhelmed with the process, don’t worry, we’ve got you covered. We published a &lt;a href=&quot;https://www.jenkins.io/project/election-walkthrough/&quot;&gt;step-by-step guide&lt;/a&gt;, outlining how to to join the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2023&quot;&gt;election-voter-2023&lt;/a&gt;, activate your CIVS account and cast your vote.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you encounter issues still or need assistance, don’t hesitate to contact the &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election committee&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you, as always, and don’t forget to register to vote by December 1!&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/2023/09/09/jsr305-probe-blog/</id>
<title>Detecting deprecated JSR-305 imports Probe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/09/jsr305-probe-blog/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='healthscore'></category>
<category term='probes'></category>
<category term='plugin'></category>
<summary>
Introduction


This blog post describes the latest addition to the plugin health scoring system developed as part of my Google summer of Code Project: a probe that detects usages of the JSR-305 framework in plugins.


The JSR-305 framework provides annotations to detect software defects.
Its executive committee voted it as dormant since May 2012.
It is important to stop using the framework for the following reasons:




It is no longer maintained.


The annotations have questionable license.


The annotations are in the reserved javax namespace and there is no public release of the spec.
Since it is not actively maintained, there is little chance this would be published.




For more...
</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;This blog post describes the latest addition to the plugin health scoring system developed as part of &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;my Google summer of Code Project&lt;/a&gt;: a probe that detects usages of the &lt;code&gt;JSR-305&lt;/code&gt; framework in plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://jcp.org/en/jsr/detail?id=305&quot;&gt;&lt;code&gt;JSR-305&lt;/code&gt; framework&lt;/a&gt; provides annotations to detect software defects.
Its executive committee &lt;a href=&quot;https://jcp.org/en/jsr/detail?id=305&quot;&gt;voted it as dormant since May 2012&lt;/a&gt;.
It is important to stop using the framework for the following reasons:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It is no longer maintained.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The annotations have questionable license.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The annotations are in the reserved javax namespace and there is no public release of the spec.
Since it is not actively maintained, there is little chance this would be published.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more insight, refer to the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/uE1wwtVi1W0/m/gLxdEJmlBQAJ&quot;&gt;Jenkins developer mailing list conversation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;@Nonnull&lt;/code&gt; and &lt;code&gt;@CheckForNull&lt;/code&gt; annotations, which are part of JSR-305, have been &lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/replace-jsr-305-annotations/&quot;&gt;deprecated since 2016&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;JSR-305&lt;/code&gt; probe checks whether the deprecated annotations are used in a plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;importance-of-the-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#importance-of-the-probe&quot; /&gt;Importance of the probe&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe identifies the outdated annotations used in a plugin and highlight them in the scoring system.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;challenges-and-learning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges-and-learning&quot; /&gt;Challenges and Learning&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The outdated annotations are imported in &lt;code&gt;.java&lt;/code&gt; files.
My first approach was to go for an abstract class because I assumed there could be other probes that may need to look for code in &lt;code&gt;.java&lt;/code&gt; files.
After a series of reviews, one of the mentors pointed out that to comply with the &lt;a href=&quot;https://github.com/openrewrite/rewrite-jenkins/blob/98bfbecc9c9507a069c9ac1f1e35cd5dd0fa0687/src/main/resources/META-INF/rewrite/rewrite.yml&quot;&gt;OpenWrite rule&lt;/a&gt;, all imports from the &lt;code&gt;javax.annotation&lt;/code&gt; package should be checked for deprecation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, based on the &lt;a href=&quot;https://blog.devgenius.io/key-principles-in-software-dry-kiss-yagni-solid-and-other-acronyms-98e5575a6942&quot;&gt;YAGNI principle&lt;/a&gt; (&quot;You Aren’t Gonna Need It&quot;), which means features are developed only when you need them, the &lt;code&gt;abstract&lt;/code&gt; wasn’t the current requirement.
I restructured the code and used a single class to implement the probe.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion-and-outcome&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion-and-outcome&quot; /&gt;Conclusion and Outcome&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe will identify the deprecated annotations and let maintainers know which imports in a plugin require replacement.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information or to find answers to any questions you might have, please visit the official GSoC 2023 project &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Adding Probes to &quot;Plugin Health Score&quot;&lt;/a&gt; description page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/09/06/devops-world-tour/</id>
<title>DevOps World Tour 2023</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/06/devops-world-tour/" />
<category term='events'></category>
<category term='contribute'></category>
<category term='devopsworld'></category>
<summary>
DevOps World Tour is coming to a city near you with events in multiple locations across the US, UK, and Asia.
Jenkins project contributors will be attending and presenting in each city on the tour.


Tim Jacomb - London





Tim Jacomb will be presenting in London.
Tim is a lead software engineer at Kainos and has been the Jenkins release officer since December 2020.


He led the delivery of significant improvements to Jenkins core, including user interface modernization, major internal component upgrades, and more.
He automated the creation of the Jenkins changelog.
He was recognized by his peers in the Jenkins project as the Most Valuable Jenkins...
</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/2023/09/05/2023-09-05-devops-world-tour.png&quot; alt=&quot;image&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.devopsworld.com/&quot;&gt;DevOps World Tour&lt;/a&gt; is coming to a city near you with events in multiple locations across the US, UK, and Asia.
Jenkins project contributors will be attending and presenting in each city on the tour.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;tim-jacomb-london&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tim-jacomb-london&quot; /&gt;Tim Jacomb - London&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 right center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/avatars/timja.jpg&quot; alt=&quot;image&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tim Jacomb will be presenting in London.
Tim is a lead software engineer at Kainos and has been the Jenkins release officer since December 2020.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;He led the delivery of significant improvements to Jenkins core, including user interface modernization, major internal component upgrades, and more.
He automated the creation of the Jenkins changelog.
He was recognized by his peers in the Jenkins project as the Most Valuable Jenkins Contributor for 2020 and 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;olivier-lamy-singapore&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#olivier-lamy-singapore&quot; /&gt;Olivier Lamy - Singapore&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 right center&quot;&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/19728?v=4&quot; alt=&quot;image&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Olivier Lamy will be presenting in Singapore.
Olivier is a Jenkins core maintainer and a maintainer of more than 80 Jenkins plugins.
He’s been a Jenkins committer for more than 13 years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;He is a member of the Apache Software Foundation and an active committer on multiple projects.
He has served as an Apache project management committee member on multiple projects including Maven, Jetty, Tomcat, Commons, Cloudstack, Archiva, and more.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;mark-waite-new-york-chicago-santa-clara&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mark-waite-new-york-chicago-santa-clara&quot; /&gt;Mark Waite - New York, Chicago, Santa Clara&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 right center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/avatars/markewaite.jpg&quot; alt=&quot;image&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mark Waite will be presenting in New York, Chicago, and Santa Clara.&lt;br&gt;
Mark is a member of the Jenkins board, a Jenkins core maintainer, and the maintainer of the Jenkins git plugin and a number of other plugins.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;He served as Jenkins documentation officer in the past and was one of the creators of the &lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/&quot;&gt;&quot;Improve a plugin&quot; tutorial&lt;/a&gt;.
Mark is involved in many Jenkins efforts, including &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;Google Summer of Code&lt;/a&gt;. &lt;a href=&quot;https://www.jenkins.io/sigs/ux/&quot;&gt;user experience&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/sigs/docs/&quot;&gt;documentation&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/sigs/platform/&quot;&gt;platform&lt;/a&gt; special interest groups.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;lets-talk-about-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lets-talk-about-jenkins&quot; /&gt;Let’s talk about Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each of the conferences will include a wide range of speakers in a single day of presentations.
After the day of presentations, we’ll host a &quot;Let’s talk about Jenkins&quot; session.
Conference attendees are invited to join us as we discuss Jenkins, listen to users, and identify ways that Jenkins can help users succeed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for the DevOps World Tour near you at the &lt;a href=&quot;https://www.devopsworld.com/&quot;&gt;conference website&lt;/a&gt;.
Jenkins users and contributors are invited to use the &lt;strong&gt;DW23JENKINS&lt;/strong&gt; discount code.
See you at the conference!&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/2023/09/06/artifactory-bandwidth-reduction/</id>
<title>Stop Caching Maven Central</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-09-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/09/06/artifactory-bandwidth-reduction/" />
<category term='infrastructure'></category>
<category term='artifactory'></category>
<category term='jfrog'></category>
<summary>
JFrog has been a sponsor of the Jenkins project for many years.
We&#8217;re delighted that they continue to sponsor the Jenkins project and continue to provide our artifact hosting service, repo.jenkins-ci.org.


Releases, incremental development builds, and snapshots of Jenkins core, Jenkins tooling, Jenkins plugins, and Jenkins infrastructure components are hosted on JFrog Artifactory.
The worldwide Jenkins community has been well served for many years by JFrog&#8217;s hosted artifact repository.


Maven Central


Effective Thursday September 7, 2023, we will stop caching the Maven Central repository from repo.jenkins-ci.org.
The change will be transparent to Jenkins developers because Apache Maven automatically appends the Maven Central repository to its list...
</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/2023/09/06/2023-09-06-artifactory-bandwidth-reduction.png&quot; alt=&quot;image&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jfrog.com/&quot;&gt;JFrog&lt;/a&gt; has been a sponsor of the Jenkins project for many years.
We’re delighted that they continue to sponsor the Jenkins project and continue to provide our artifact hosting service, &lt;a href=&quot;https://repo.jenkins-ci.org&quot;&gt;repo.jenkins-ci.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Releases, incremental development builds, and snapshots of Jenkins core, Jenkins tooling, Jenkins plugins, and Jenkins infrastructure components are hosted on JFrog Artifactory.
The worldwide Jenkins community has been well served for many years by JFrog’s hosted artifact repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;maven-central&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#maven-central&quot; /&gt;Maven Central&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Effective Thursday September 7, 2023, we will stop caching the Maven Central repository from &lt;a href=&quot;https://repo.jenkins-ci.org&quot;&gt;repo.jenkins-ci.org&lt;/a&gt;.
The change will be transparent to Jenkins developers because Apache Maven automatically appends the Maven Central repository to its list of repositories.
Beginning Thursday September 7, 2023, Jenkins developers will receive Maven Central artifacts from Maven Central instead of receiving them from the Jenkins Artifactory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In case of issues, please open a &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/new/choose&quot;&gt;Jenkins help desk ticket&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’d like more details of the bandwidth misuse investigation, refer to the &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3599&quot;&gt;help desk ticket&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;bandwidth-misuse-the-long-story&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bandwidth-misuse-the-long-story&quot; /&gt;Bandwidth misuse - the long story&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Bandwidth misuse can happen in many different ways.
Most of our bandwidth misuse was innocent misconfiguration.
You can benefit users, the Jenkins community, and Jenkins sponsors by better configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the bandwidth misuse was not innocent misconfiguration, it was bad programming and bad monitoring of a server.
You can benefit users, the Jenkins community, and Jenkins sponsors by monitoring bandwidth used by your servers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;correct-tool-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#correct-tool-configuration&quot; /&gt;Correct tool configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Two cases involved a Jenkins tool binary that was being downloaded repeatedly from Artifactory.
Ephemeral Jenkins agents were configured to download the tool every time they started.
The download source was configured to read the tar.gz tool installer from the Jenkins Artifactory repository.
Once the tool was downloaded from Jenkins Artifactory, it was unpacked, installed, and used.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The download process took time because it was reading from the public internet to a local agent.
The unpack and install took time because it was performed every time an ephemeral agent started.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Please install remote tools onto the agent &lt;em&gt;before&lt;/em&gt; connecting the agent to the controller&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Please download a &lt;em&gt;local copy&lt;/em&gt; of the tool if you must download tools onto the agent&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t waste the time and bandwidth to download and install a tool from a remote location after the agent starts.
The OpenJDK project, Eclipse Temurin project, and the Apache Maven project all thank you for not repeatedly downloading the same binary from their servers.
Jenkins thanks you as well.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;abuse-reports-to-cloud-providers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#abuse-reports-to-cloud-providers&quot; /&gt;Abuse reports to cloud providers&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another case involved a rogue server that was repeatedly downloading all versions of the Jenkins war files.
That rogue server was using over 20TB per month for its repeated downloads of the same files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We reported the misuse to the abuse reporting service of the cloud provider that was hosting the server.
The abuse reporting service told us they would investigate.
The cloud provider took no further actions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Please choose cloud providers that &lt;em&gt;honor abuse reports&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We blocked the IP address of that server, hoping that the server would not switch to a new IP address and resume its abusive downloads.
The IP block stopped the abusive requests.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;use-local-caching&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-local-caching&quot; /&gt;Use local caching&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another case involved agents from the Jenkins project that were repeatedly downloading dependencies as part of their regular build processes.
Because we prefer ephemeral agents, the dependencies were being downloaded to the newly launched agent while it was building Jenkins core and Jenkins plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Herve Le Meur and Damien Duportal implemented an &lt;a href=&quot;https://github.com/jenkins-infra/helm-charts/blob/main/charts/artifact-caching-proxy/templates/nginx-proxy-configmap.yaml&quot;&gt;artifact caching proxy using nginx&lt;/a&gt; for each of the cloud providers that host agents for the Jenkins project.
The artifact caching proxy is hosted on the same cloud provider that runs the agents.
It caches requests from agents running on that cloud provider.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mark Waite’s home lab appeared in the top 5 consumers in a slightly different case.
Mark corrected job configuration errors in his home lab that were causing individual jobs to download all their dependencies to a job-specific cache folder.
Job specific caching caused the discs to fill on his agents and wasted bandwidth from the repository server.
Fixing the job configuration error removed that home lab from the list.
Mark implemented a central cache in his home lab in an attempt to prevent the issue in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Cache your &lt;em&gt;dependencies&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Use local drives and local servers to cache your dependencies so that they can be downloaded faster.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary&quot; /&gt;Summary&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve learned to analyze log files with SQL queries thanks to the &lt;a href=&quot;https://github.com/basil/artifactory-sql&quot;&gt;Artifactory SQL tool&lt;/a&gt; provided by Basil Crow.
We upload artifactory logs into a SQLite database and can then use SQL select statements to identify patterns and trends.
Thanks to Basil for a very helpful analysis tool.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to JFrog for their patience and perseverance while we worked through these improvements.&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/2023/08/30/a-glimpse-of-the-future/</id>
<title>A glimpse of the future</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-08-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/08/30/a-glimpse-of-the-future/" />
<category term='jenkins'></category>
<category term='jdk21'></category>
<category term='risc-v'></category>
<summary>
You&#8217;ve all seen it before: the bitter sting of botched predictions.
Flying cars, nuclear ovens in the kitchen, killer robot dogs, and lunar living - all expected to be part of our daily lives by now.
Well, some of these wild dreams did come to pass, but I&#8217;m not about to roll the dice and predict what our world will look like 50 years hence.
Instead, let me paint a picture of Jenkins' future up until October 2024.


Why am I being so specific about this end date, you ask?
It&#8217;s because I want to highlight two major projects that Jenkins might tackle before the...
</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/2023/08/30/2023-08-30-a-glimpse-of-the-future/image2.png&quot; alt=&quot;image&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ve all seen it before: the bitter sting of botched predictions.
Flying cars, nuclear ovens in the kitchen, killer robot dogs, and lunar living - all expected to be part of our daily lives by now.
Well, some of these wild dreams did come to pass, but I’m not about to roll the dice and predict what our world will look like 50 years hence.
Instead, let me paint a picture of Jenkins&#39; future up until October 2024.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why am I being so specific about this end date, you ask?
It’s because I want to highlight two major projects that Jenkins might tackle before the leaves start to fall next year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of these projects is the potential leap to JDK21, and we’ve got a proposed roadmap for that.
Jenkins will stop supporting JDK 11 in October 2024 when many Java providers (Eclipse Temurin, OpenJDK, …​) stop supporting Java 11.
This transition is one of the more significant moves Jenkins might be considering in the coming months.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next project doesn’t have a roadmap within Jenkins yet, but the progress is promising, and it’s intertwined with the first project like two vines on a trellis.
As some of you may know, I’ve got a fondness for CPU architectures that were once seen as outlandish or still raise a few eyebrows.
I’m referring to ARM and RISC-V, of course.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ARM is making strides, finding its way into everything from laptops to servers.
So, my personal campaign to see ARM recognized as a first-class citizen has been successful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, I’m turning my attention to RISC-V - my next personal endeavor and hobby.
While it’s not a fresh face in the CPU crowd, it’s currently experiencing a notable uptick in popularity.
The emergence of numerous single-board computers, workstations, and servers reminds me of the early days of ARM, but amplified.
I’ve touched on this before in one of my &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/10/miniJen-and-RISC-V/#the-risc-v-quest&quot;&gt;blog posts&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s explore how JDK21, Jenkins, and RISC-V might be connected, at least in the maze of my musings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;java-version-planning-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-version-planning-for-jenkins&quot; /&gt;Java Version Planning for Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The ink’s barely dry on the plans for which versions of the JDK the Jenkins project will support this year and the next.
What I’m about to spill is just a snippet from a proposal whipped up by &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;.
For now, it’s about as definitive as a weather forecast.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’ll be more detailed blog posts down the line when the final decision is made and the roadmap is as clear as a bell.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java-11&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-11&quot; /&gt;Java 11:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 11 OpenJDK’s public support ends in late 2024.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Eclipse Temurin, Red Hat, and Microsoft will support Java 11 through October 2024.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oracle extends support until October 2026.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amazon Corretto supports Java 11 until September 2027.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Proposal: End-of-life for Java 11 in Jenkins is suggested for October 31, 2024.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins LTS support for Java 11 will end with the August 7, 2024 release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 21 will become the required baseline starting with the September 4, 2024 LTS release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Admin monitors announcing Java 11’s end of life will be enabled in Jenkins weekly releases by October 3, 2023 and in the December 13, 2023 LTS release.&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;java-17&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-17&quot; /&gt;Java 17:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 17 adoption is increasing in Jenkins.
The Jenkins documentation now recommends Java 17 in the installation guides and in the tutorials.&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/2023/08/30/2023-08-30-a-glimpse-of-the-future/image3.png&quot; alt=&quot;Java adoption rates based on Java version.&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java-21&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-21&quot; /&gt;Java 21:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 21 releases on September 19, 2023.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oracle, Eclipse Temurin, Red Hat, and others plan to support Java 21 as a long term support release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Proposal: Jenkins aims to support Java 21 in weekly releases by the end of October 2023.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Are we confident Jenkins will be running on top of JDK 21 next October?&lt;br&gt;
I guess so. Thanks to the work of Stéphane Merle, JDK21 is already available at &lt;a href=&quot;https://ci.jenkins.io&quot;&gt;https://ci.jenkins.io&lt;/a&gt; to build plugins.
You just have to add one line to your Jenkinsfile, and your plugin will be tested on JDK21.&lt;/br&gt;
&lt;/p&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;nl&quot;&gt;configurations:&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;nl&quot;&gt;platform:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;jdk:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;17&#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;nl&quot;&gt;platform:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;jdk:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;21&#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;nl&quot;&gt;platform:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;jdk:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;11&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Furthermore, thanks to the work of the community (and particularly &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt;), Jenkins &lt;code&gt;2.419&lt;/code&gt; and &lt;code&gt;2.420&lt;/code&gt; no longer require the &lt;code&gt;--enable-future-java&lt;/code&gt; flag for JDK 21 beta.
Jenkins &lt;code&gt;2.418&lt;/code&gt; and prior require the flag for Java 21 beta.&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;nv&quot;&gt;$ &lt;/span&gt;java &lt;span class=&quot;nt&quot;&gt;-version&lt;/span&gt;
openjdk version &lt;span class=&quot;s2&quot;&gt;&quot;21-beta&quot;&lt;/span&gt; 2023-09-19
OpenJDK Runtime Environment Temurin-21+34-202308082331 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 21-beta+34-202308082331&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM Temurin-21+34-202308082331 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 21-beta+34-202308082331, mixed mode, sharing&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; jenkins-2.417.war
Running with Java 21 from /opt/jdk-21, which is not yet fully supported.
Run the &lt;span class=&quot;nb&quot;&gt;command &lt;/span&gt;again with the &lt;span class=&quot;nt&quot;&gt;--enable-future-java&lt;/span&gt; flag to &lt;span class=&quot;nb&quot;&gt;enable &lt;/span&gt;preview support &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;future Java versions.
Supported Java versions are: &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;11, 17]
See &lt;span class=&quot;nb&quot;&gt;link&lt;/span&gt;:https://jenkins.io/redirect/java-support/ &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;more information.

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; jenkins-2.419.war
Running from: /home/mwaite/bugs/jenkins-2.419.war
webroot: /home/mwaite/.jenkins/war
2023-08-24 15:42:32.857+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1]     INFO    winstone.Logger#logInternal: Beginning extraction from war file&lt;span class=&quot;sb&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;I also heard from Basil Crow during the &lt;a href=&quot;https://community.jenkins.io/t/governance-meeting-august-21-2023/9142&quot;&gt;latest Governance board meeting&lt;/a&gt; that the &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-development/dependency-management/#jenkins-core-bom&quot;&gt;Jenkins BOM&lt;/a&gt; had already run with JDK21; that’s good news.
We will have to stay alert because of things that won’t migrate easily (think of Groovy for example), but if it’s too easy, it’s no fun, right?&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;jenkins-and-risc-v&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-and-risc-v&quot; /&gt;Jenkins and RISC-V&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project is already churning out &lt;code&gt;aarch64&lt;/code&gt; (64-bit ARM) Docker images for both the controller and agents.
On top of that, we’re putting &lt;code&gt;aarch64&lt;/code&gt; through its paces with regular testing, and some parts of the Jenkins infrastructure are already humming along on &lt;code&gt;aarch64&lt;/code&gt; hardware.&lt;br&gt;
We can’t say the same for &lt;code&gt;RISC-V&lt;/code&gt;, and for good reason.
&lt;code&gt;RISC-V&lt;/code&gt; isn’t a supported CPU architecture for Jenkins, it hasn’t been put to the test, Docker isn’t officially on board with this architecture yet (even if Kubernetes is &lt;a href=&quot;https://twitter.com/hipeac/status/1687344636795252737?s=20&quot;&gt;already on the bandwagon&lt;/a&gt;), and the Jenkins project doesn’t own a single RISC-V machine.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few months back, I whipped up a &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/10/miniJen-and-RISC-V/#the-risc-v-quest&quot;&gt;Jenkins agent for RISC-V&lt;/a&gt;.
Sadly, the machine I had at my disposal wasn’t up to the task of hosting a Jenkins controller.
At that time, I was using a nightly build of JDK19 by Temurin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These days, I’ve got another RISC-V machine that’s got more cores and more memory than the last one, and it meets the Jenkins recommendations, which are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;4 GB+ of RAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;50 GB+ of drive space&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here I’m wielding the StarFive VisionFive2, which boasts 8GB of RAM, 4 RISCV64 cores clocking up to 1.5GHz, and for now, a 128GB SDCard.
I’ll swap it out for an NVMe disk when I get around to it.
It’s built on the &lt;a href=&quot;https://www.starfivetech.com/en/site/soc&quot;&gt;JH7110&lt;/a&gt; from StarFive.
We’re seeing this SoC pop up on SBCs more and more these days (Star64, and so on).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the machine is (on paper) up to the task of running Jenkins, we should give it a whirl, right?&lt;br&gt;
I loaded a snapshot version of Debian onto the board after giving the firmware a tune-up, and away we went.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;risc-v-and-jdk&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#risc-v-and-jdk&quot; /&gt;RISC-V and JDK&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jdk17&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jdk17&quot; /&gt;JDK17&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The logical first step would be to install a version of the JDK, then follow the official documentation to get Jenkins up and running on Debian, right?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve already been burned by the default JDK on RISC-V with Debian, which turns out to be a &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/10/miniJen-and-RISC-V/#zero-vm&quot;&gt;Zero VM&lt;/a&gt;.&lt;br&gt;
If I were to kick things off with the default JDK, I reckon its performance would leave me so frustrated, I wouldn’t bother going any further.&lt;br&gt;
You’re not buying it?
Alright, I see how it is.
Let’s not install Jenkins the old-fashioned way then, let’s give it a whirl on the command line after installing the default JDK.&lt;/br&gt;
&lt;/br&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;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;openjdk-17-jdk-headless

java &lt;span class=&quot;nt&quot;&gt;-version&lt;/span&gt;
openjdk version &lt;span class=&quot;s2&quot;&gt;&quot;17.0.5&quot;&lt;/span&gt; 2022-10-18
OpenJDK Runtime Environment &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 17.0.5+8-Debian-2&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
OpenJDK 64-Bit Zero VM &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 17.0.5+8-Debian-2, interpreted mode&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;Yes, we’re using a Zero VM.
Now onto the Jenkins war download.&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;-L&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; /tmp/jenkins.war &lt;span class=&quot;nb&quot;&gt;link&lt;/span&gt;:https://updates.jenkins.io/latest/jenkins.war&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s launch Jenkins on the command line:&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;java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; /tmp/jenkins.war

Running from: /tmp/jenkins.war

webroot: /home/user/.jenkins/war

2023-08-06 12:31:15.432+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] INFO winstone.Logger#logInternal: Beginning extraction from war file&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s say I let it run for a good while, and nothing else happened.&lt;br&gt;
A Zero VM is about as useful for running a server as a chocolate teapot.&lt;br&gt;
Let’s switch gears and go with something that’s got a bit more pep in its step.&lt;/br&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jdk21&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jdk21&quot; /&gt;JDK21&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I’m penning this article, there’s no official JDK21 release we can snag from the &lt;a href=&quot;https://adoptium.net/temurin/releases/&quot;&gt;Eclipse Temurin Latest Releases&lt;/a&gt; page.&lt;br&gt;
We’ll have to scrounge up a nightly build from the Adoptium &lt;a href=&quot;https://github.com/adoptium/temurin21-binaries/releases&quot;&gt;Temurin 21 binaries repo.&lt;/a&gt;&lt;br&gt;
RISC-V binaries aren’t exactly churned out daily, so you might have to do a bit of digging to find a release with RISC-V binaries.&lt;br&gt;
At the time of writing this blog post, the latest available is release &lt;a href=&quot;https://github.com/adoptium/temurin21-binaries/releases/tag/jdk21-2023-08-08-20-16-beta&quot;&gt;jdk21-2023-08-08-20-16-beta&lt;/a&gt;.&lt;br&gt;
In this release, there are several RISC-V binaries up for grabs, but we don’t need static libs or a debug image, so we’ll opt for &lt;a href=&quot;https://github.com/adoptium/temurin21-binaries/releases/download/jdk21-2023-08-08-20-16-beta/OpenJDK21U-jdk_riscv64_linux_hotspot_2023-08-08-20-16.tar.gz&quot;&gt;OpenJDK21U-jdk_riscv64_linux_hotspot_2023-08-08-20-16.tar.gz&lt;/a&gt;.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s reel in the JDK21 binaries:&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;-L&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;link&lt;/span&gt;:https://github.com/adoptium/temurin21-binaries/releases/download/jdk21-2023-08-08-20-16-beta/OpenJDK21U-jdk_riscv64_linux_hotspot_2023-08-08-20-16.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that we have them, let’s install them on the machine.&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;sudo mkdir&lt;/span&gt; /opt/jdk21
&lt;span class=&quot;nb&quot;&gt;sudo tar&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-xzf&lt;/span&gt; OpenJDK21U-jdk_riscv64_linux_hotspot_&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.tar.gz &lt;span class=&quot;nt&quot;&gt;-C&lt;/span&gt; /opt/jdk21 &lt;span class=&quot;nt&quot;&gt;--strip-components&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once it’s installed, let’s inform the system about this new set of java binaries:&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;sudo &lt;/span&gt;update-alternatives &lt;span class=&quot;nt&quot;&gt;--install&lt;/span&gt; /usr/bin/java java /opt/jdk21/bin/java 1
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;update-alternatives &lt;span class=&quot;nt&quot;&gt;--install&lt;/span&gt; /usr/bin/javac javac /opt/jdk21/bin/javac 1
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;update-alternatives &lt;span class=&quot;nt&quot;&gt;--install&lt;/span&gt; /usr/bin/javadoc javadoc /opt/jdk21/bin/javadoc 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These commands create alternatives for the java, javac, and javadoc commands and associate them with the respective binaries in the JDK 21 installation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After installing the alternatives, you need to select the default one.
Run the following command and choose the number corresponding to the JDK 21 alternative in the presented menu:&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;sudo &lt;/span&gt;update-alternatives &lt;span class=&quot;nt&quot;&gt;--config&lt;/span&gt; java&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Repeat this for javac and javadoc:&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;sudo &lt;/span&gt;update-alternatives &lt;span class=&quot;nt&quot;&gt;--config&lt;/span&gt; javac
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;update-alternatives &lt;span class=&quot;nt&quot;&gt;--config&lt;/span&gt; javadoc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Verify the Default Java Version: After configuring the alternatives, you can verify that JDK 21 is the default Java version by running:&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;java &lt;span class=&quot;nt&quot;&gt;-version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-and-jdk21&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-and-jdk21&quot; /&gt;Jenkins and JDK21&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;on-the-command-line&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#on-the-command-line&quot; /&gt;On the command line&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s try to launch Jenkins with JDK21 now, and see if it gets any better than with JDK17:&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;java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; /tmp/jenkins.war +
Running from: /tmp/jenkins.war
webroot: /home/user/.jenkins/war
2023-08-24 08:35:11.202+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] INFO winstone.Logger#logInternal: Beginning extraction from war file
2023-08-24 08:35:17.635+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
2023-08-24 08:35:17.947+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] INFO org.eclipse.jetty.server.Server#doStart: jetty-10.0.15&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; built: 2023-04-11T17:25:14.480Z&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; git: 68017dbd00236bb7e187330d7585a059610f661d&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; jvm 21-beta+34-202308081713
2023-08-24 08:35:19.288+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] INFO o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2023-08-24 08:35:19.521+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] INFO o.e.j.s.s.DefaultSessionIdManager#doStart: Session &lt;span class=&quot;nv&quot;&gt;workerName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;node0
2023-08-24 08:35:22.058+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] INFO hudson.WebAppMain#contextInitialized: Jenkins home directory: /home/user/.jenkins found at: &lt;span class=&quot;nv&quot;&gt;$user&lt;/span&gt;.home/.jenkins
2023-08-24 08:35:22.647+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] INFO o.e.j.s.handler.ContextHandler#doStart: Started w.@2a9bc08f&lt;span class=&quot;se&quot;&gt;\{&lt;/span&gt;Jenkins v2.420,/,file:///home/user/.jenkins/war/,AVAILABLE&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\{&lt;/span&gt;/home/user/.jenkins/war&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
2023-08-24 08:35:22.698+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] INFO o.e.j.server.AbstractConnector#doStart: Started ServerConnector@43599640&lt;span class=&quot;se&quot;&gt;\{&lt;/span&gt;HTTP/1.1, &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;http/1.1&lt;span class=&quot;o&quot;&gt;)}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\{&lt;/span&gt;0.0.0.0:8080&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
2023-08-24 08:35:22.743+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1] INFO org.eclipse.jetty.server.Server#doStart: Started Server@b83a9be&lt;span class=&quot;se&quot;&gt;\{&lt;/span&gt;STARTING&lt;span class=&quot;o&quot;&gt;}[&lt;/span&gt;10.0.15,sto&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0] @14031ms
2023-08-24 08:35:22.746+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;35] INFO winstone.Logger#logInternal: Winstone Servlet Engine running: &lt;span class=&quot;nv&quot;&gt;controlPort&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;disabled
2023-08-24 08:35:23.763+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;42] INFO jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Started initialization&lt;/span&gt;
2023-08-24 08:35:23.820+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;40] INFO jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Listed all plugins&lt;/span&gt;
2023-08-24 08:35:28.157+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;40] INFO jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Prepared all plugins&lt;/span&gt;
2023-08-24 08:35:28.180+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;40] INFO jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Started all plugins&lt;/span&gt;
2023-08-24 08:35:28.204+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;40] INFO jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Augmented all extensions&lt;/span&gt;
2023-08-24 08:35:29.182+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;46] INFO jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: System config loaded&lt;/span&gt;
2023-08-24 08:35:29.185+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;40] INFO jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: System config adapted&lt;/span&gt;
2023-08-24 08:35:29.187+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;43] INFO jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Loaded all jobs&lt;/span&gt;
2023-08-24 08:35:29.194+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;43] INFO jenkins.InitReactorRunner&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#onAttained: Configuration for all jobs updated&lt;/span&gt;
2023-08-24 08:35:29.366+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;60] INFO hudson.util.Retrier#start: Attempt &lt;span class=&quot;c&quot;&gt;#1 to do the action check updates server&lt;/span&gt;
2023-08-24 08:35:31.242+0000 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;45] INFO jenkins.install.SetupWizard#init:
&lt;span class=&quot;k&quot;&gt;*************************************************************&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;*************************************************************&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;*************************************************************&lt;/span&gt;
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
2c4d91ba22d24f639a59ad50e6d82686
This may also be found at: /home/user/.jenkins/secrets/initialAdminPassword
&lt;span class=&quot;k&quot;&gt;*************************************************************&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;*************************************************************&lt;/span&gt;
&lt;span class=&quot;k&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;Jenkins coughed up this log a few seconds after I fired off the command, so it looks like we’re in business.&lt;br&gt;
Notice anything odd?
Shouldn’t Jenkins give us a heads-up that it’s not meant to run with JDK21?
Aren’t JDK17 and JDK11 the only ones getting the official nod?&lt;br&gt;
Up until a few weeks ago, that was the score…​
And it’ll stay that way for the LTS versions until next October.
At the start of August 2023, this &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/8365&quot;&gt;PR&lt;/a&gt; got the green light, and since then, there’s no need to add the &lt;code&gt;--enable-future-java&lt;/code&gt; flag to give JDK21 versions the go-ahead.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s take the current LTS for a spin:&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;-L&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; /tmp/jenkins.war &lt;span class=&quot;nb&quot;&gt;link&lt;/span&gt;:https://get.jenkins.io/war-stable/latest/jenkins.war
java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; /tmp/jenkins.war
Running with Java 21 from /opt/jdk21, which is not yet fully supported.
Run the &lt;span class=&quot;nb&quot;&gt;command &lt;/span&gt;again with the &lt;span class=&quot;nt&quot;&gt;--enable-future-java&lt;/span&gt; flag to &lt;span class=&quot;nb&quot;&gt;enable &lt;/span&gt;preview support &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;future Java versions.
Supported Java versions are: &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;11, 17]
See &lt;span class=&quot;nb&quot;&gt;link&lt;/span&gt;:https://jenkins.io/redirect/java-support/ &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;more information.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, the current LTS does not support JDK 21 yet.&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jenkins-standard-package-installation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-standard-package-installation&quot; /&gt;Jenkins standard package installation&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we’re using Debian, let’s go with the &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/linux/#weekly-release&quot;&gt;standard installation of the weekly release&lt;/a&gt; now.&lt;br&gt;
Unfortunately, we get an error when installing the Jenkins package the official way.&lt;/br&gt;
&lt;/p&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;Job &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;jenkins.service failed because the control process exited with error code.
See &lt;span class=&quot;s2&quot;&gt;&quot;systemctl status jenkins.service&quot;&lt;/span&gt; and &lt;span class=&quot;s2&quot;&gt;&quot;journalctl -xeu jenkins.service&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;details.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These commands don’t say much to help with understanding what the problem is.&lt;br&gt;
Let’s try another way:&lt;/br&gt;
&lt;/p&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;/usr/bin/jenkins
jenkins: invalid Java version: openjdk version &lt;span class=&quot;s2&quot;&gt;&quot;21-beta&quot;&lt;/span&gt; 2023-09-19
OpenJDK Runtime Environment Temurin-21+34-202308081713 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 21-beta+34-202308081713&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM Temurin-21+34-202308081713 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 21-beta+34-202308081713, mixed mode, sharing&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;Now it’s clear as day: we’ve installed a JDK21 version that plays nice with the WAR file, but the scripts tied to &lt;code&gt;systemd&lt;/code&gt; aren’t up to speed with this JDK version yet.&lt;br&gt;
They’re still checking if we’re using JDK11, 17 or 21, but they’re not ready for prime time, hence the failure.&lt;br&gt;
So, how do we fix this mess?&lt;/br&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;tweaking-the-package-installation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tweaking-the-package-installation&quot; /&gt;Tweaking the package installation&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/doc/book/system-administration/systemd-services/#overriding-service-configurations&quot;&gt;official documentation&lt;/a&gt; tells us we can override systemd service configurations thanks to&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;sudo &lt;/span&gt;systemctl edit jenkins.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This gives us something like:&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;c&quot;&gt;### Editing /etc/systemd/system/jenkins.service.d/override.conf&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;### Anything between here and the comment below will become the new contents of the file&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;JAVA_OPTS=-Djava.awt.headless=true -Xmx1024m&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;JENKINS_OPTS=--enable-future-java&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;I have just added the last line in the hope of getting Jenkins to start.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt; and &lt;code&gt;sudo systemctl start jenkins&lt;/code&gt; should now be enough to get Jenkins started.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, we’re almost good to go:&lt;br /&gt;
&lt;/p&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;sudo &lt;/span&gt;systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;/lib/systemd/system/jenkins.service&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; enabled&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; preset: enabled&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Drop-In: /etc/systemd/system/jenkins.service.d
└─override.conf
Active: activating &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;start&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; since Thu 2023-08-24 09:28:34 UTC&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; 1min 2s ago
Main PID: 7138 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;java&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
CPU: 2min 32.701s
CGroup: /system.slice/jenkins.service
└─7138 /usr/bin/java &lt;span class=&quot;nt&quot;&gt;-Djava&lt;/span&gt;.awt.headless&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-Xmx1024m&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; /usr/share/java/jenkins.war &lt;span class=&quot;nt&quot;&gt;--webroot&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/cache/jenkins/war &lt;span class=&quot;nt&quot;&gt;--httpPort&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;8&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why almost?
We’ve still got a couple of hitches.
The first one is the timeout.
These RISC-V machines don’t have an optimized kernel yet, so a lot of things are slower than molasses in January.
Too slow.&lt;br&gt;
We’d best give Jenkins a bit more time to get its act together, just to be on the safe side.&lt;br&gt;
Let’s bump up the timeout.
Like before, we’ll tweak the configuration: courtesy of &lt;code&gt;sudo systemctl edit jenkins&lt;/code&gt;.&lt;/br&gt;
&lt;/br&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;c&quot;&gt;### Editing /etc/systemd/system/jenkins.service.d/override.conf&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;### Anything between here and the comment below will become the new contents of the file&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;JAVA_OPTS=-Djava.awt.headless=true -Xmx1024m&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;TimeoutStartSec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;390

&lt;span class=&quot;c&quot;&gt;### Lines below this comment will be discarded&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;You may have spotted I removed &lt;code&gt;Environment=&quot;JENKINS_OPTS=--enable-future-java&quot;&lt;/code&gt; from the settings.
We’re running the last weekly release of Jenkins that can handle JDK21, so why should we keep that?&lt;br&gt;
We’ve got another fly in the ointment: the existing jenkins script in &lt;code&gt;/usr/bin/jenkins&lt;/code&gt; is pulling a rabbit out of its hat with &lt;code&gt;sed&lt;/code&gt;, trying to pin down a valid release.
Unfortunately, our Java binary spits out something like “&lt;code&gt;21-beta&lt;/code&gt;”.
The script then trips up on validation, and in the end, throws a tantrum and refuses to start Jenkins.&lt;br&gt;
Our workaround (while we twiddle our thumbs waiting for &lt;a href=&quot;https://github.com/jenkinsci/packaging/pull/429&quot;&gt;this PR&lt;/a&gt; to build the next package) is to tweak this file.
Change line 40 so it reads:&lt;/br&gt;
&lt;/br&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;awk&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&quot;&#39;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;/version/ \{print $2}&#39;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;.&#39;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;\{match($1, /^[0-9]+/); print substr($1, RSTART, RLENGTH)}&#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;Once you’ve done that, fire off &lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt; and &lt;code&gt;sudo systemctl restart jenkins&lt;/code&gt; and voilà, you’ve got a Jenkins instance running on JDK21 on a RISC-V machine.&lt;br&gt;
For those of you still hanging in there, yes, there’s a quicker workaround…​&lt;br&gt;
Just stick the &lt;code&gt;Environment=&quot;JENKINS_OPTS=--enable-future-java&quot;&lt;/code&gt; line back in the &lt;code&gt;override.conf&lt;/code&gt; file, and you’ll have a Jenkins instance up and running with JDK21 faster than you can say &quot;compile&quot;.&lt;/br&gt;
&lt;/br&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/2023/08/30/2023-08-30-a-glimpse-of-the-future/image1.png&quot; alt=&quot;image&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/p&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;We’ve now got a fresh-off-the-press Jenkins instance humming along thanks to a nightly build of the JDK21 by Temurin.&lt;br&gt;
That’s all well and good, but how do we install newer versions of the JDK when they roll off the assembly line?&lt;br&gt;
One of these days, we’ll have regular JDK21 releases available straight from the package manager, but until that day comes, how are we supposed to update our installed version?&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well, I don’t have a silver bullet, but how about using Jenkins?&lt;br&gt;
I’ve whipped up a nifty little &lt;a href=&quot;https://github.com/gounthar/jenkins-temurin-riscv/blob/main/Jenkinsfile-21&quot;&gt;Jenkinsfile&lt;/a&gt; that checks every day at 2:30 AM UTC if Temurin has pushed out a new nightly build for RISC-V.&lt;br&gt;
If it strikes gold, it installs it into &lt;code&gt;/home/jenkins/jdk-21&lt;/code&gt;.&lt;br&gt;
It’s not exactly a masterpiece, since the version we’re using is in &lt;code&gt;/opt/jdk21&lt;/code&gt;, but we could tweak it to shoot us an email when it finds something.&lt;br&gt;
We’d then have to put Jenkins on ice, shuffle the contents of &lt;code&gt;/home/jenkins/jdk-21&lt;/code&gt; over to &lt;code&gt;/opt/jdk21&lt;/code&gt;, and then wake Jenkins back up.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re itching to give it a whirl, just whip up a &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/getting-started/#defining-a-pipeline-in-scm&quot;&gt;new pipeline from source control&lt;/a&gt; and point it at the &lt;a href=&quot;https://github.com/gounthar/jenkins-temurin-riscv.git&quot;&gt;repo I mentioned earlier&lt;/a&gt;.&lt;br&gt;
I’ll be the first to admit, even with an email notification, this workflow isn’t exactly a walk in the park, but it should be a stopgap solution, since Java 21 is set to launch on September 19, 2023.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Keep your ears to the ground for more updates and thrilling developments as we forge Jenkins&#39; future together.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/08/28/number-of-open-issues-probe/</id>
<title>Number of Open Issues Probe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-08-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/08/28/number-of-open-issues-probe/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='healthscore'></category>
<category term='probes'></category>
<category term='plugin'></category>
<summary>
Introduction


An alarming number of issues in a plugin may signify that the plugin is outdated, in need of a new maintainer, or in need of a complete revamp.
Open issues might also mean that there are a lot of new feature requests, which in turn means the plugin has quite a number of active users.
The number of open issue probe counts the number of open issues in the issue tackers.








As of now, the probe only counts open issues in GitHub and the JIRA issue tacker.







Importance of the probe


The goal of the probe is to help maintainers and contributors identify plugins they...
</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;An alarming number of issues in a plugin may signify that the plugin is outdated, in need of a new maintainer, or in need of a complete revamp.
Open issues might also mean that there are a lot of new feature requests, which in turn means the plugin has quite a number of active users.
The number of open issue probe counts the number of open issues in the issue tackers.&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;
As of now, the probe only counts open issues in GitHub and the JIRA issue tacker.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;importance-of-the-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#importance-of-the-probe&quot; /&gt;Importance of the probe&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal of the probe is to help maintainers and contributors identify plugins they want to invest their time into.
This would lead to maintainers keeping plugins updated and useful for the users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;tasks-and-challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tasks-and-challenges&quot; /&gt;Tasks and Challenges&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the Google Summer of Code project duration, I was intended to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Figure out the correct class design.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Understand the Update Center and how it works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implement the &lt;a href=&quot;https://github-api.kohsuke.org/&quot;&gt;GitHub&lt;/a&gt; and &lt;a href=&quot;https://developer.atlassian.com/server/jira/platform/rest-apis/&quot;&gt;JIRA&lt;/a&gt; APIs.&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;outcome&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#outcome&quot; /&gt;Outcome&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The probe was approved and ready to be merged.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;learning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#learning&quot; /&gt;Learning&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the course of the project, I learned about the correct usage and implementation of the &lt;code&gt;abstract&lt;/code&gt; class.
This was a more complex version of the class I was used to.&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;This probe will help maintainers in identifying the number of open issues a plugin has.
This will also keep the plugin relevant to the latest Jenkins updates.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information or to find answers to any questions you might have, please visit the official GSoC 2023 project &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Adding Probes to &quot;Plugin Health Score&quot;&lt;/a&gt; description page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/08/24/gsoc-docker-based-quickstart/</id>
<title>Docker-based Jenkins quick start examples</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-08-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/08/24/gsoc-docker-based-quickstart/" />
<author>
<name>ash-sxn</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='docker'></category>
<category term='docker-compose'></category>
<category term='gitpod'></category>
<category term='documentation'></category>
<summary>
Table of Contents




About the Project


Phase 1


Phase 2


Next Steps


Acknowledgments


Useful Links






About the Project


The aim of my project was to tackle the challenges and intricacies that users frequently encounter when configuring Jenkins with Docker.
The current process comprises numerous daunting steps associated with security risks.
My objective was to resolve this issue using Docker Compose by crafting a Docker Compose file and conducting regular testing.
Furthermore, the project included the creation of user-friendly documentation, tutorials, and a streamlined Gitpod setup accessible with just one click.


What will change in Jenkins after this project:



Previously, users had to follow six intimidating steps to install Jenkins with Docker, which appear...
</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/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;#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;#acknowledgments&quot;&gt;Acknowledgments&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 aim of my project was to tackle the challenges and intricacies that users frequently encounter when configuring Jenkins with Docker.
The current process comprises numerous daunting steps associated with security risks.
My objective was to resolve this issue using Docker Compose by crafting a Docker Compose file and conducting regular testing.
Furthermore, the project included the creation of user-friendly documentation, tutorials, and a streamlined Gitpod setup accessible with just one click.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-will-change-in-jenkins-after-this-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-will-change-in-jenkins-after-this-project&quot; /&gt;What will change in Jenkins after this project:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Previously, users had to follow six intimidating steps to install Jenkins with Docker, which appear as follows:&lt;/p&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/2023/08/24/2023-08-24-Screenshot-docker-in-docker.png&quot; alt=&quot;Creating docker in docker container&quot; /&gt;&lt;/span&gt;
&lt;/p&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/2023/08/24/2023-08-24-Screenshot-dockerfile.png&quot; alt=&quot;Building dockerfile&quot; /&gt;&lt;/span&gt;
&lt;/p&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/2023/08/24/2023-08-24-Screenshot-custom-container.png&quot; alt=&quot;Creating container from previous image&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;After this project, users will only need two commands: &lt;code&gt;git clone URL&lt;/code&gt; and &lt;code&gt;docker-compose up -d&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This also applies to tutorials that utilize the same Docker setup as mentioned above.
After cloning the repository, users will only need to execute &lt;code&gt;docker-compose up -d &amp;lt;keyword&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Additionally, users can take advantage of a one-click setup using Gitpod to easily experience Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Currently, these Docker Compose files undergo regular testing via GitHub Actions.
We plan to transition this process to Jenkins in the near future.&lt;/p&gt;
&lt;/li&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&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;During Phase 1, we aimed to accomplish this objective using scripts.
We developed &lt;code&gt;jenkins_init.sh&lt;/code&gt; and &lt;code&gt;jenkins_teardown.sh&lt;/code&gt; scripts to initiate and stop the containers.
Additionally, we crafted scripts for SSH key generation and the cloning/forking of repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout Phase 1, I gained insights into:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Optimal Git and GitHub practices&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Effective conflict resolution in merging&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The structure of the Jenkins file system&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creation and utilization of Docker Compose files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Crafting of shell scripts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Building Dockerfiles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Understanding of SSH key mechanisms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigating the functionality of Gitpod&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Composing technical documentation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to explore &lt;a href=&quot;https://www.jenkins.io/blog/2023/07/22/gsoc-2023-midterm/&quot;&gt;my midterm recap blog post&lt;/a&gt; and watch &lt;a href=&quot;https://www.youtube.com/watch?v=W4eSVCTmqb8&quot;&gt;my midterm presentation recording&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;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 Phase 2, our focus shifted towards integrating Windows as well, given that the shell scripts from Phase 1 were incompatible without Windows Subsystem for Linux (WSL).
During this phase, we uncovered the utility of Docker Compose profiles, which turned out to be an excellent solution.
These profiles allowed the tutorials to function similarly to our previous scripts, employing designated keywords.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A crucial aspect of the project was automated testing, which introduced me to GitHub Actions, a tool I hadn’t previously experienced.
GitHub Actions were employed to test the functionality of Docker Compose files, facilitate the uploading of Docker images to Docker Hub, perform plugin updates, and manage other various tasks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During Phase 2, my learning encompassed:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker Compose files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub Actions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Jenkins Remote Access API&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;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;The upcoming steps for the project involve:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Full integration into jenkins.io.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Transitioning from GitHub Actions to jenkins.ci.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Incorporating the repository into Hacktoberfest with &quot;good first issues&quot; to engage beginner contributors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a stretch goal, expanding the project with additional tutorials.&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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am grateful for the guidance and support provided throughout this project from my mentors &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&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/jmmeessen&quot;&gt;Jean-Marc Meessen&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;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://github.com/ash-sxn/GSoC-2023-docker-based-quickstart&quot;&gt;GitHub repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/docker-compose-build/&quot;&gt;Project Selection Post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1ZpPihadYqpAvR20rxZkTD2SVpf34E6YMzg6opU6yHAg/edit#heading=h.lntg56ljm653&quot;&gt;Proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1yij9OvM2_92My3vqjn6u8ABHjXcyy0a7O6oM30b6ctM/edit&quot;&gt;Project specific office hours meeting notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://matrix.to/#/#gsoc-2023-docker-quickstart:matrix.org&quot;&gt;Gitter Channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://community.jenkins.io/t/docker-quick-start-examples-gsoc-2023/7479&quot;&gt;Recordings of these weekly project meetings &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;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;In conclusion, participating in GSoC 2023 was an incredible experience that allowed me to learn new skills and contribute to an open-source project.
I am grateful for the opportunity and would like to thank my mentors and the Jenkins community for their support and guidance.
I look forward to continuing to contribute.&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/2023/08/24/gitlab-plugin-modernization-report/</id>
<title>GSoC GitLab Plugin Modernization Project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-08-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/08/24/gitlab-plugin-modernization-report/" />
<author>
<name>harsh-ps-2003</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='gitlab'></category>
<category term='plugins'></category>
<summary>
The goal of this blog is to showcase the work done on GitLab Plugin during the Google Summer of Code 2023.
For a detailed description of the project, please refer to the project page.


Overview




About Project


Coding Phase 1


Coding Phase 2


Future Improvements


Acknowledgments


Useful Links






About Project


Plugins grow old and become difficult to maintain with time.
GitLab Plugin was one such plugin that needed some love and care.
The GitLab Plugin Modernization project thus aimed to modernize the GitLab Plugin by replacing the (RESTEasy) library with modern (GitLab4J-API) library via Jenkins (GitLab API plugin).
The replacement normalizes the use of the GitLab API with regard to the (GitLab Authentication),...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal of this blog is to showcase the work done on GitLab Plugin during the Google Summer of Code 2023.
For a detailed description of the project, please refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/gitlab-plugin-modernization/&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&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-project&quot;&gt;About Project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coding &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;Coding &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;#future-improvements&quot;&gt;Future Improvements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#acknowledgments&quot;&gt;Acknowledgments&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-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-project&quot; /&gt;About Project&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugins grow old and become difficult to maintain with time.
GitLab Plugin was one such plugin that needed some love and care.
The GitLab Plugin Modernization project thus aimed to modernize the GitLab Plugin by replacing the (&lt;a href=&quot;https://resteasy.dev&quot;&gt;RESTEasy&lt;/a&gt;) library with modern (&lt;a href=&quot;https://github.com/gitlab4j/gitlab4j-api&quot;&gt;GitLab4J-API&lt;/a&gt;) library via Jenkins (&lt;a href=&quot;https://plugins.jenkins.io/gitlab-api/&quot;&gt;GitLab API plugin&lt;/a&gt;).
The replacement normalizes the use of the GitLab API with regard to the (&lt;a href=&quot;https://plugins.jenkins.io/gitlab-oauth/&quot;&gt;GitLab Authentication&lt;/a&gt;), (&lt;a href=&quot;https://plugins.jenkins.io/gitlab-branch-source/&quot;&gt;GitLab Branch Source&lt;/a&gt;), and (&lt;a href=&quot;https://plugins.jenkins.io/gitlab-logo/&quot;&gt;GitLab Logo&lt;/a&gt;) plugins.
This modernization reduces future maintenance burden and improves the overall quality of the plugin by making it more lightweight due to reduced dependencies and enhanced documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The migration was performed in the following 2 coding phases:&lt;/p&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;In this phase, the following tasks were completed:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Migration of GitLab Plugin from RESTEasy to GitLab4J-API via the GitLab-API plugin, without affecting the webhook functionality of the plugin. (&lt;a href=&quot;https://github.com/jenkinsci/gitlab-plugin/pull/1501&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Interactive testing of partially migrated plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The achievements of this phase were demonstrated in the &lt;a href=&quot;https://youtu.be/W4eSVCTmqb8&quot;&gt;Midterm Presentation&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;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 this phase, the following tasks were completed:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Adapting webhooks implementation to GitLab4J-API.(&lt;a href=&quot;https://github.com/jenkinsci/gitlab-plugin/pull/1553&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Migrating the Proxy Settings from RESTEasy to GitLab4J-API.(&lt;a href=&quot;https://github.com/jenkinsci/gitlab-plugin/pull/1566&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Partially adapting the Unit and Integration tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improving the documentation of the plugin.(&lt;a href=&quot;https://github.com/jenkinsci/gitlab-plugin/pull/1556&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Interactive testing of the fully migrated plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The results of this phase will be showcased in the Final Presentation in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-improvements&quot; /&gt;Future Improvements&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;As GitLab has discontinued the GitLab API V3, the plugin should only support GitLab API V4 and above. Thus the plugin will be updated to support GitLab API V4 and above only.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The plugin lacks the test coverage, thus the plugin’s Unit, Integrations as well as Docker-based Tests will have to be updated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitLab 16.0 has introduced some breaking changes which will have to be handled in 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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My gratitude knows no bounds that I got the opportunity to contribute to such impactful project under Google Summer of Code with such kind mentors.
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; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Mark Waite&lt;/a&gt; for their constant support and guidance throughout the project.
They put in a lot of effort in interactively testing the migrated plugin and providing me with valuable feedback.
They never let me be stuck in any difficulty for too long and always helped me in finding the solution to the problem.
I would also like to thank &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil/&quot;&gt;Basil Crow&lt;/a&gt; for the guidance he provided me with during the initial phase of the project, which helped the team shape the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, thanks to the org admins, &lt;a href=&quot;https://www.jenkins.io/blog/authors/jmmeessen&quot;&gt;Jean-Marc Meessen&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern/&quot;&gt;Kris Stern&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar/&quot;&gt;Bruno Verachten&lt;/a&gt;, for always keeping me and other contributors on our toes and assisting us with any blockers and concerns by organizing weekly stand-up calls and personal 1-to-1 meets every phase.&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://plugins.jenkins.io/gitlab-plugin/&quot;&gt;GitLab Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/gitlab-plugin&quot;&gt;Plugin’s GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://matrix.to/#/#jenkinsci_gitlab-plugin:gitter.im&quot;&gt;Gitter channel&lt;/a&gt; or &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt; in case you have any question(s) or feedback.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/08/23/summer-internship-in-jenkins-security/</id>
<title>Summer Internship in Jenkins security</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-08-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/08/23/summer-internship-in-jenkins-security/" />
<category term='plugins'></category>
<category term='security'></category>
<category term='jenkins'></category>
<summary>
Context

Jenkins is an open-source CI/CD solution that is extensible with a wide range of plugins that can be installed using the Jenkins plugin distribution repository or via manual installation.


This extensibility is a powerful feature of Jenkins, but it is a critical aspect that has to be secured to avoid risks and vulnerabilities that can impact the Jenkins system.


The internship took place while working in direct contact with the Jenkins Security Team, having daily meetings to discuss topics, possible blockers, and share ideas.



Internship Goals

The main goals of the internship were:




Understanding how some of the common vulnerabilities can be recognized in the...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;context&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#context&quot; /&gt;Context&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is an open-source CI/CD solution that is extensible with a wide range of plugins that can be installed using the Jenkins plugin distribution repository or via manual installation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This extensibility is a powerful feature of Jenkins, but it is a critical aspect that has to be secured to avoid risks and vulnerabilities that can impact the Jenkins system.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The internship took place while working in direct contact with the Jenkins Security Team, having daily meetings to discuss topics, possible blockers, and share ideas.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;internship-goals&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#internship-goals&quot; /&gt;Internship Goals&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main goals of the internship were:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Understanding how some of the common vulnerabilities can be recognized in the Jenkins ecosystem by paying attention to common patterns related to best practices in terms of configuration and data flow control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auditing the plugins in a structural and ordered way, with comprehensive vulnerability scoring and classification using the MITRE standard, permitting them to be reviewed easily by the team.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reporting findings to the team and plugin maintainers using the Jira issue tracker, having live sessions to help the latter ones have a full comprehension of the vulnerability reported.&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;organizational-model&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#organizational-model&quot; /&gt;Organizational Model&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Good communication is a necessary basis for a good organizational model.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regarding that, a Slack channel was opened where I could ask questions, open discussions, and share ideas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to that, there were scheduled weekly sessions with my manager, Wadeck Follonier, who leads the Jenkins Security Team, and with my co-pilot, Kevin Guerroudj.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During these sessions, I could open discussion for doubts, receive knowledge, and propose activities that I could do during the internship, as well as a daily session with the team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To be more productive and get quick feedback from the team, a spreadsheet was made available to me to note the plugins audited with related security audit documents, where I reported my findings and associated security tickets.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Furthermore, CloudBees got me in touch with other interns working in different departments using a Slack channel and also scheduled monthly meetings to discuss our progress on our projects and the value added to them.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-journey&quot; /&gt;The journey&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the beginning of this security journey, I had the opportunity to quickly learn about the common vulnerabilities that we could find inside a Plugin, thanks to a cyber gym that my manager created and distributed on a GitHub repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is essentially a Jenkins plugin, called &lt;a href=&quot;https://github.com/Wadeck/emmenthal-plugin&quot;&gt;Emmenthal Plugin&lt;/a&gt;, that is written with some bad patterns that the Jenkins documentation suggests to avoid and that permits to obtain common vulnerabilities like Cross Site Scripting, XML External Entities, Server Side Request Forgery, Path Traversal, and so on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From that moment on, I enjoyed the journey.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started the audit with easier and less popular plugins, and each day I increased the difficulty level with more popular plugins until the end of the journey.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was obvious to me that the plugins with larger installation counts were also more secure due to the accrued attention they already got prior to now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the journey, I improved my skills on auditing thanks to a structured internal document that the team uses for auditing, and that helped me to be more precise and to not forget anything that caught my attention during the analysis of the plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following each finding, there was a brainstorming phase where I tried to classify the vulnerability in terms of CWEs and assign a CVSS score to understand the real impact and risks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, the reporting to the maintainers was done using Jira and described in a structured format that permits them to easily and quickly understand the point impacted inside the code and the reproduction steps to have a procedure to replicate it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results&quot; /&gt;Results&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The value that I added to the project can be measured in terms of vulnerabilities reported and confirmed by the Jenkins Security Team and based on the type of plugin affected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In terms of numbers, I reported 23 vulnerabilities, split into two categories using “10k installations” as a threshold:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;19 vulnerabilities were found in less popular plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4 vulnerabilities were found in more popular plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the moment, only 3 vulnerabilities are known to the public in the Jenkins Security Advisories:&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/security/advisory/2023-07-26/&quot;&gt;Jenkins Security Advisory 2023-07-26 (SECURITY-3192)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2023-08-16/&quot;&gt;Jenkins Security Advisory 2023-08-16 (SECURITY-3201, SECURITY-3223)&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;conclusions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusions&quot; /&gt;Conclusions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I enjoyed this opportunity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It helped me to be more confident in a practical manner on the security aspects and also permitted me to learn new ways to do audits.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I obtained good results in terms of the contributions of the Jenkins ecosystem, and it will have a positive impact on my professional career.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;message-from-the-co-pilot&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#message-from-the-co-pilot&quot; /&gt;Message from the co-pilot&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Andrea quickly stood out during his internship.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;His ability to understand and adapt to our tasks was impressive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;He always asked the right questions and showed a real passion for learning.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was great to work with someone so eager to grow in this field.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;message-from-the-security-officer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#message-from-the-security-officer&quot; /&gt;Message from the security officer&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Andrea was able since the beginning and until the end, to ask very smart questions, showing his deep interest in the cybersecurity field.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;He was able to demonstrate great analytical skills.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This kind of internship is continuously showing me that this kind of project is worth it for multiple reasons: for the intern themself, to learn new topics and get practical experience, but also for the community in terms of security improvement and also for the rest of the team, to have mentoring opportunities.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/08/22/linux-containers-rebuilt/</id>
<title>Linux containers rebuilt</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-08-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/08/22/linux-containers-rebuilt/" />
<category term='issues'></category>
<category term='jira'></category>
<summary>
A Jenkins job mistakenly rebuilt the Linux container images for recent Jenkins weekly releases and recent Jenkins LTS releases.
Users that downloaded some of those Linux container images received container images that could not run the Jenkins controller.
The incorrect container images would fail to run with the message that Jenkins is not supported with Java 8.



Running with Java 8 from /usr/lib/jvm/java-1.8-openjdk/jre,
which is older than the minimum required version (Java 11).
Supported Java versions are: [11, 17, 21]





Corrected Linux container images


The Linux container images for Jenkins 2.419, 2.401.1, 2.401.2, and 2.401.3 have been rebuilt August 21, 2023.


Container images for Jenkins agents are not...
</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;A Jenkins job mistakenly rebuilt the Linux container images for recent Jenkins weekly releases and recent Jenkins LTS releases.
Users that downloaded some of those Linux container images received container images that could not run the Jenkins controller.
The incorrect container images would fail to run with the message that Jenkins is not supported with Java 8.&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;Running with Java 8 from /usr/lib/jvm/java-1.8-openjdk/jre,
which is older than the minimum required version (Java 11).
Supported Java versions are: [11, 17, 21]&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;corrected-linux-container-images&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#corrected-linux-container-images&quot; /&gt;Corrected Linux container images&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Linux container images for Jenkins 2.419, 2.401.1, 2.401.2, and 2.401.3 have been rebuilt August 21, 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Container images for Jenkins agents are not affected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More details are available in the original &lt;a href=&quot;https://github.com/jenkinsci/docker/issues/1690&quot;&gt;issue report&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/08/02/jenkins-july-newsletter/</id>
<title>Jenkins July 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-08-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/08/02/jenkins-july-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Key Takeaways




A Jenkins Core security advisory was published on July 26


The official documentation has migrated to Java 17


Operating system end of life notifications have been added







Contributed by: Wadeck Follonier


During July, there were two Security Advisories published:




Plugin security advisory published on July 12



Multiple high-score vulnerabilities


A total of 16 plugins were affected





Jenkins core and plugins security advisory published on July 26



The highest severity is “High”










Contributed by: Mark Waite




The Jira upgrade was successful.
Special thanks to the Linux Foundation for their continued support.


Mark Waite was elected to the CDF Governing Board as a committer representative.


Jenkins core continues to improve.



Prototype.js removal is progressing well.
More details...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins July Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-takeaways&quot; /&gt;Key Takeaways&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;A Jenkins Core security advisory was published on July 26&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The official documentation has migrated to Java 17&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Operating system end of life notifications have been added&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During July, there were two Security Advisories published:&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/security/advisory/2023-07-12/&quot;&gt;Plugin security advisory published on July 12&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Multiple high-score vulnerabilities&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A total of 16 plugins were affected&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https:/security/advisory/2023-07-26/&quot;&gt;Jenkins core and plugins security advisory published on July 26&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The highest severity is “High”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Jira upgrade was successful.
Special thanks to the Linux Foundation for their continued support.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mark Waite was elected to the &lt;a href=&quot;https://cd.foundation/about/governing-board/&quot;&gt;CDF Governing Board&lt;/a&gt; as a committer representative.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins core continues to improve.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Prototype.js removal is progressing well.
More details are in the &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1dpaKALZaK0_HIGy6ony3wnegr1frTg3u1lngG4KdoC8/edit?usp=sharing&quot;&gt;tracking sheet&lt;/a&gt;.
Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, and many others.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins plugins continue to improve.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HTMLUnit 3 upgrades are in progress.
More details are in the &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1ih_gVd9uhxLw4BZ6IeJGrYsvu-DvIF0xovu4wZbaXy8/edit#gid=0&quot;&gt;tracking sheet&lt;/a&gt;.
Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt;, and many others.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Rollout of Kubernetes &lt;code&gt;1.25&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was a production outage on public services (download mirrors, LDAP, etc.) which led to a public IP change.
More information can be found in the &lt;a href=&quot;https://www.jenkins.io/blog/2023/07/12/jenkins-mirrors-postmortem-outage/&quot;&gt;post mortem blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.401.3&quot;&gt;Jenkins LTS&#39; &lt;code&gt;2.401.3&lt;/code&gt;&lt;/a&gt; (security release) was deployed everywhere less than 2 hours after the security advisory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ci.jenkins.io migrated to new (and more powerful) hardware and a new network for faster builds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows 2022 agents reached general availability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The browser confirm dialog has been replaced with friendly modal dialogs - &lt;a href=&quot;https://github.com/mawinter69&quot;&gt;Markus Winter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Safe restart has a better user experience - &lt;a href=&quot;https://github.com/meiswjn&quot;&gt;Jan Meiswinkel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The log manager page has more improvements - &lt;a href=&quot;https://www.jenkins.io/blog/authors/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several platform updates occurred throughout June:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Updates on Docker Images&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ssh-agent(releases &lt;code&gt;5.6.0&lt;/code&gt;, &lt;code&gt;5.6.1&lt;/code&gt;, &lt;code&gt;5.6.2&lt;/code&gt;, &lt;code&gt;5.6.3&lt;/code&gt;, &lt;code&gt;5.7.0&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tracking JDK versions for the next level of performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bumping node alpine docker image to &lt;code&gt;18.16.1-alpine3.18&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bump debian from &lt;code&gt;bullseye-20230522&lt;/code&gt; to &lt;code&gt;bullseye-20230703&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Debian &lt;code&gt;ca-certificates&lt;/code&gt; package&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker-agent (releases &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/releases/tag/3131.vf2b_b_798b_ce99-2&quot;&gt;&lt;code&gt;3131.vf2b_b_798b_ce99-2&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/releases/tag/3131.vf2b_b_798b_ce99-3&quot;&gt;&lt;code&gt;3131.vf2b_b_798b_ce99-3&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/releases/tag/3131.vf2b_b_798b_ce99-4&quot;&gt;&lt;code&gt;3131.vf2b_b_798b_ce99-4&lt;/code&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows enthusiasts, rejoice! Introducing Windows Server and Nanoserver LTSC 2022 images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More efficient image building with multi-stage image for Windows Server Core.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bump debian from &lt;code&gt;bullseye-20230502&lt;/code&gt; to &lt;code&gt;bullseye-20230703&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bump archlinux from &lt;code&gt;base-20230430.0.146624&lt;/code&gt; to &lt;code&gt;base-20230702.0.161694&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bumping Git version on Windows to &lt;code&gt;2.41.0.windows.2&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inbound-agent (releases &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/releases/tag/3131.vf2b_b_798b_ce99-2&quot;&gt;&lt;code&gt;3131.vf2b_b_798b_ce99-2&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/releases/tag/3131.vf2b_b_798b_ce99-3&quot;&gt;&lt;code&gt;3131.vf2b_b_798b_ce99-3&lt;/code&gt;&lt;/a&gt;):&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Bump the parent image jenkins/agent version to &lt;code&gt;3131.vf2b_b_798b_ce99-3&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now allows &lt;code&gt;JENKINS_URL&lt;/code&gt; to be unset when &lt;code&gt;JENKINS_DIRECT_CONNECTION&lt;/code&gt; is set.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controller (releases &lt;a href=&quot;https://github.com/jenkinsci/docker/releases/tag/2.401.2&quot;&gt;&lt;code&gt;2.401.2&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/docker/releases/tag/2.412&quot;&gt;&lt;code&gt;2.412&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/docker/releases/tag/2.413&quot;&gt;&lt;code&gt;2.413&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/docker/releases/tag/2.414&quot;&gt;&lt;code&gt;2.414&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkinsci/docker/releases/tag/2.415&quot;&gt;&lt;code&gt;2.415&lt;/code&gt;&lt;/a&gt;):&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Keeping up-to-date with the latest Bullseye version and timezone changes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Latest News&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;End of life operating systems:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Beginning with Jenkins &lt;code&gt;2.407&lt;/code&gt;, Jenkins administrators will be warned if they are running Jenkins on an operating system that is within 6 months of its &lt;a href=&quot;https://endoflife.date/&quot;&gt;end of life date&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The operating system end of life warning has been &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/8118&quot;&gt;backported to Jenkins &lt;code&gt;2.401.2&lt;/code&gt;&lt;/a&gt; after discussion in the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/jPh07uaqv1o/m/_e7vnUiqAgAJ&quot;&gt;Jenkins developer mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Jenkins project does not test Jenkins on operating systems that are not supported by the operating system provider.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We don’t support Jenkins on operating systems that are not supported by the operating system provider.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These last months, &lt;a href=&quot;https://community.jenkins.io/t/end-of-life-operating-systems/7644/9&quot;&gt;we’ve seen&lt;/a&gt; OS vendors offer extended support contracts for their systems having reached their end of life.
However, the Jenkins project has not extended its &lt;a href=&quot;https://www.jenkins.io/doc/book/platform-information/support-policy-linux/&quot;&gt;Linux support policy&lt;/a&gt; or its &lt;a href=&quot;https://www.jenkins.io/doc/administration/requirements/windows/&quot;&gt;Windows support policy&lt;/a&gt; beyond the public end of life for any of those operating systems.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/6310&quot;&gt;Java 17 instructions&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins is transitioning from using Java 11 as the preferred version to using Java 17, which offers more functionality, speed, and development support.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The documentation and usage areas are being updated to reflect this change, while also clarifying that Java 11 support in Jenkins will continue.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the course of July, six different blog posts were published from nine different authors, including updates on the Google Summer of Code projects that are in progress.
Thanks to all the participants for their insights and work!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins documentation has transitioned to using Java 17 within the installation guides and other documentation areas.
&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/6310&quot;&gt;This issue&lt;/a&gt; explains some more background of the transition and what work has been completed already.
&lt;a href=&quot;https://www.jenkins.io/blog/2023/08/01/documentation-transition-to-java-17/&quot;&gt;A blog post&lt;/a&gt; was published to highlight this change and provide background for the transition.
The post also encourages users to upgrade so that they can enjoy the additional features and functions that come with Java 17.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;google-summer-of-code-projects-midterm-evaluations-are-complete&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-summer-of-code-projects-midterm-evaluations-are-complete&quot; /&gt;Google Summer of Code projects midterm evaluations are complete!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The midterm demos were presented via the Jenkins online meetup at the beginning of July, 2023.
If you missed it, refer to the &lt;a href=&quot;https://www.jenkins.io/blog/2023/07/22/gsoc-2023-midterm/&quot;&gt;blog post&lt;/a&gt; for the recap.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to all four GSoC Contributors for passing this milestone!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Onward to the second half of GSoC 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Happy coding!&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/2023/08/02/2023-08-02-jenkins-july-newsletter/image1.png&quot; alt=&quot;image&quot; width=&quot;839&quot; /&gt;&lt;/span&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/08/01/documentation-transition-to-java-17/</id>
<title>Java 17 usage in Jenkins.io Documentation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-08-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/08/01/documentation-transition-to-java-17/" />
<category term='java'></category>
<category term='linux'></category>
<category term='jenkins'></category>
<category term='documentation'></category>
<summary>
Jenkins has fully supported Java 17 since the 2.357 weekly release and 2.361.1 Long Term Support release.
For this reason, we have transitioned to using Java 17 in the Jenkins user handbook.
This includes the installation guides, Pipeline documentation, and Pipeline syntax.
Refer to the GitHub issue for additional information and insight.


Background


Debian 12 was released on June 10, 2023, and it no longer delivers OpenJDK 11.
Due to this change in Debian, we have transitioned to using Java 17 in the documentation.
The idea is this will encourage users to upgrade to Java 17, which has been fully supported since September 2022.
Aligning with the actively...
</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/2023/08/01/jenkins-supports-java-17.png&quot; alt=&quot;Jenkins supports Java 17.&quot; width=&quot;600&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has fully supported Java 17 since the 2.357 weekly release and 2.361.1 Long Term Support release.
For this reason, we have transitioned to using Java 17 in the Jenkins user handbook.
This includes the &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/&quot;&gt;installation guides&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;Pipeline documentation&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/&quot;&gt;Pipeline syntax&lt;/a&gt;.
Refer to the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/6310&quot;&gt;GitHub issue&lt;/a&gt; for additional information and insight.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Debian 12 was released on June 10, 2023, and it no longer delivers OpenJDK 11.
Due to this change in Debian, we have transitioned to using Java 17 in the documentation.
The idea is this will encourage users to upgrade to Java 17, which has been fully supported since September 2022.
Aligning with the actively supported Java version will also help prevent user confusion or frustration when trying to follow installation and usage guides.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;upgrading-your-java-version&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrading-your-java-version&quot; /&gt;Upgrading your Java version&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While updating the documentation to reflect Java 17 support, we also added instructions on &lt;a href=&quot;https://www.jenkins.io/doc/administration/requirements/upgrade-java-to-17/&quot;&gt;upgrading Jenkins&#39; Java version from 11 to Java 17&lt;/a&gt;.
This page includes a video walkthrough created by &lt;a href=&quot;https://www.jenkins.io/blog/authors/darinpope&quot;&gt;Darin Pope&lt;/a&gt; that guides users through the process of upgrading the Java version for Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As always, update all installed plugins prior to &lt;em&gt;and&lt;/em&gt; after updating Jenkins.
This ensures up-to-date plugins that remain compatible.
If plugins are not updated both before and after the upgrade, you can encounter compatibility issues.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/07/22/gsoc-2023-midterm/</id>
<title>Jenkins in Google Summer of Code Midterm Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-07-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/07/22/gsoc-2023-midterm/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='midterm'></category>
<summary>
The Jenkins in GSoC program recently reached its midterm milestone for GSoC 2023.
This milestone served to assess performance, and precipitate pass/fail decisions.
Taking time to evaluate the progress and workflow of the project provides an opportunity to correct course and address underlying issues.


Earlier this month, on the Jenkins Online Meetup, GSoC contributors presented midterm status and progress for their projects, below is a recap.
Thank you Jagruti, Harsh, Vandit, and Ashutosh for your contributions to Jenkins!


Add Probes to "Plugin Health Score"


By Jagruti Tiwari


A probe collects data about each plugin.
It is an automated system that ensures the Jenkins Community-defined rules are followed.
The probe...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins in GSoC program recently reached its midterm milestone for GSoC 2023.
This milestone served to assess performance, and precipitate pass/fail decisions.
Taking time to evaluate the progress and workflow of the project provides an opportunity to correct course and address underlying issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Earlier this month, on the &lt;a href=&quot;https://www.meetup.com/jenkins-online-meetup/&quot;&gt;Jenkins Online Meetup&lt;/a&gt;, GSoC contributors presented midterm status and progress for their projects, below is a recap.
Thank you Jagruti, Harsh, Vandit, and Ashutosh for your contributions to Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;add-probes-to-plugin-health-score&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#add-probes-to-plugin-health-score&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Add Probes to &quot;Plugin Health Score&quot;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By &lt;a href=&quot;https://github.com/Jagrutiti/&quot;&gt;Jagruti Tiwari&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A probe collects data about each plugin.
It is an automated system that ensures the Jenkins Community-defined rules are followed.
The probe data is used by health scoring to compute a score, and a higher-quality probe receives a good score.
Conversely, an obsolete or outdated plugin is given a lower score.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sharing details about the probes that I worked on during the first phase of GSoC.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;unreleased-production-changes-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#unreleased-production-changes-probe&quot; /&gt;Unreleased Production Changes Probe&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A bug fix, security improvement, or new feature can only be beneficial when it’s actually released.
The &quot;Unreleased Production Changes&quot; probe is designed to detect unreleased commits in the production files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe’s primary goal is to identify unreleased production commits specifically in the Maven production files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following my mentors&#39; advice, I began by writing test cases to accurately reproduce the probe’s requirements. Subsequently, I added the necessary code to pass each of these test cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the implementation, I utilized the JGit library and familiarized myself with its features.
However, I encountered some challenges due to a lack of depth in Git concepts, which required me to delve deeper and strengthen my understanding of Git concepts along the way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://www.jenkins.io/blog/2023/07/16/unreleased-production-changes-probe&quot;&gt;unreleased production changes&lt;/a&gt; blog post for more details on the probe.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-third-party-repository-detection-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-third-party-repository-detection-probe&quot; /&gt;The Third-Party Repository Detection Probe&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By definition, a third-party repository is a repository that is not hosted at &lt;a href=&quot;https://repo.jenkins-ci.org/&quot;&gt;https://repo.jenkins-ci.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The third-party repository detection probe ensures that plugins are only built from trusted and reliable Maven repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe was requested by the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the major challenges in implementing this probe was considering the parent and child pom relationships from all angles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Certain edge-case scenarios were not initially taken into account while specifying the probe, and due to the number of open questions, the probe was temporarily put on hold until further research was conducted.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout the process, I extensively read the Maven documentation to gain a better understanding of how to test POM structure, inheritance, and Maven API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://www.jenkins.io/blog/2023/07/20/third-party-repository-detection-probe&quot;&gt;third party repository detection probe&lt;/a&gt; blog post for more details on the probe.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;github-security-scan-workflow-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#github-security-scan-workflow-probe&quot; /&gt;GitHub Security Scan Workflow Probe&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Security Scan probe identifies whether the plugin is configured to execute the security action.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From a security perspective, this probe is crucial as it checks for known security breaches and vulnerabilities in a plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Its primary purpose is to ensure that the security scan is correctly configured in the plugin’s GitHub Action.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, this probe involves refactoring existing classes to avoid code duplication, and it shares similarities with the JEP-229 (Continuous Delivery) probe, which also looks for CI configurations in GitHub Actions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout this process, I have gained knowledge in leveraging the class hierarchy to build an abstract probe that can be implemented by any probes requiring GitHub Action configuration checks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The findings of this probe will be highly beneficial to the security team, as it helps identify any gaps and enables the improvement of the overall security of the Jenkins plugin ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://www.jenkins.io/blog/2023/07/16/security-scan-probe-blog&quot;&gt;security scan probe&lt;/a&gt; blog post for more details on the probe.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-about-the-second-half-of-gsoc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-about-the-second-half-of-gsoc&quot; /&gt;What about the second-half of GSoC?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the second half of the GSoC project, I will be working on a few more probes, including the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Detect Renovate usage:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This probe will identify how many plugins use the Renovate bot CLI to detect outdated dependencies in the plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If any outdated dependencies are found, it will automatically create a pull request (PR) to update the dependency.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Count open tickets:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This probe will detect open issues in both Github and JIRA.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to these new probes, I will also be focusing on fixing bugs and making enhancements to the existing probes.&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;gitlab-plugin-modernization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gitlab-plugin-modernization&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/gitlab-plugin-modernization/&quot;&gt;GitLab Plugin Modernization&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By &lt;a href=&quot;https://github.com/harsh-ps-2003/&quot;&gt;Harsh Pratap Singh&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The GitLab Plugin facilitates seamless interaction between Jenkins and GitLab.
This project involves replacing the usage of the outdated RESTEasy library in the plugin with GitLab4J-API through the GitLab API Jenkins Library Plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This migration holds significant importance for the following reasons:&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 migration will significantly reduce future maintenance issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It makes the plugin more lightweight by reducing dependencies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It improves consistency with other Jenkins plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It enhances documentation and overall user experience.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During Coding Phase 1, the following achievements were made:&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;Successfully completed the migration from RESTEasy to GitLab4J-API via the GitLab-API plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Conducted interactive testing of the partially migrated Plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To use the upcoming modernized GitLab Plugin, please ensure the following requirements are met:&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;Minimum GitLab version: &lt;code&gt;14.0&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Minimum Jenkins version: &lt;code&gt;2.387.3&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the years, GitLab has evolved significantly.
During the migration process, we discovered that the plugin will soon have the removal of GitLab API V3 support, as GitLab now only supports V4 of its API.
We strongly encourage V3 users to switch to V4 as soon as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following tasks are still in progress during the 2nd Coding Phase:&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;Adapting the Webhooks to GitLab4J-API’s events (completed)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Migrating the Proxy settings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adapting the unit and integration tests (work in progress)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improving the documentation&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;building-jenkins-io-with-alternative-tools&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#building-jenkins-io-with-alternative-tools&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/alternative-jenkinsio-build-tool/&quot;&gt;Building Jenkins.io with Alternative Tools&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By &lt;a href=&quot;https://www.jenkins.io/blog/authors/vandit1604/&quot;&gt;Vandit Singh&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins users frequently refer to &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;jenkins.io&lt;/a&gt; for documentation, and a new LTS line is released and available to all Jenkins users worldwide every 12 weeks.
However, the documentation for each prior edition is not currently maintained, and that’s where my project comes in to provide Versioned Documentation for the users of the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With my project, users will be able to switch between different versions of the documentation, depending on the version of Jenkins they are running.
To achieve this, we adopt Antora, which comes with versioning out-of-the-box and creates documentation pages using asciidoc.
Additionally, Gatsby will be used to generate some of the YAML file-generated components.
This way, we aim to enhance the accessibility and usability of the documentation for Jenkins users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Till now, we have migrated all documentation from &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;jenkins.io&lt;/a&gt; which leaves us only with the Gatsby part of the implementation.
The completed components include:&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;User Guide&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Solution Pages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tutorials&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Developer Guide&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Subprojects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Community Section&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the successful migration of the above components, our next focus will be on working with the following components or single pages using Gatsby as the framework:&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;Blogs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Roadmap&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security Advisories&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Changelog&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade Guide&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;About&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Homepage&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we enter the 2nd Coding Phase of GSoC, completing these sections/pages will mark the end of the project and the full migration from Awestruct to Antora and Gatsby.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;docker-based-jenkins-quickstart-examples&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-based-jenkins-quickstart-examples&quot; /&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/docker-compose-build/&quot;&gt;Docker-based Jenkins Quickstart Examples&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By &lt;a href=&quot;https://www.jenkins.io/blog/authors/ash-sxn/&quot;&gt;Ashutosh Saxena&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project’s goal is to address the problems and complexities users often face when setting up Jenkins with Docker.
The current process involves multiple intimidating steps with security risks.
So, how are we solving these problems?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The intimidating steps can be simplified by using Docker Compose to hide all the complexities of Docker.
Additionally, we have created scripts to automate the running of the Jenkins container with Docker.
One script is called &lt;code&gt;jenkins_init.sh&lt;/code&gt;, and another script called &lt;code&gt;jenkins_teardown.sh&lt;/code&gt; is used to clean everything.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To address the security risk of running jobs on the controller, we are using the controller and agent as separate containers.
For this purpose, we use another script called &lt;code&gt;keygen.sh&lt;/code&gt; that creates and updates &lt;code&gt;SSH&lt;/code&gt; keys.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the tutorial part, it is essential to lower the barrier to entry for Jenkins.
Therefore, the user will only need to add a keyword to the &lt;code&gt;jenkins_init.sh&lt;/code&gt; script.
For example, for a Maven tutorial, the user can simply run &lt;code&gt;./jenkins_init.sh maven&lt;/code&gt; to start the tutorial.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, everything now works with &lt;code&gt;Gitpod&lt;/code&gt; with just a click.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Things to do during the 2nd Coding Phase:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add more tutorials and integrate them with ./jenkins_init.sh.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide support for Windows without WSL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regularly test all the tutorial files and scripts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Develop concise and easy-to-understand documentation for new and updated tutorials.&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;end-note&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#end-note&quot; /&gt;End Note&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A full recording from the meetup can be found &lt;a href=&quot;https://youtu.be/W4eSVCTmqb8&quot;&gt;HERE&lt;/a&gt; and slides are &lt;a href=&quot;https://docs.google.com/presentation/d/1kfGd0IB2PWp_yzSDFk5ClY00qZGreGjirtqL7-SZ1js/edit?usp=sharing&quot;&gt;HERE&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/07/20/third-party-repository-detection-probe/</id>
<title>Third Party Repository Detection Probe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-07-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/07/20/third-party-repository-detection-probe/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='healthscore'></category>
<category term='probes'></category>
<category term='plugin'></category>
<summary>
Introduction


A third-party repository is a repository that is not hosted at https://repo.jenkins-ci.org/.


The Jenkins Infra team was concerned about the dependencies used by third-party repositories.
These repositories are a concern, not just for security reasons, but also for reliability.


The third-party repository detection probe ensures that plugins are built only from trusted and reliable Maven repositories.




Importance of the probe


This probe was requested by the community.
In the ticket description, one of the plugin developers asked the Jenkins team to include a third-party repository in the plugin build.
With the probe in place, the Jenkins team can now identify the plugins they should add to the...
</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;A third-party repository is a repository that is not hosted at &lt;a href=&quot;https://repo.jenkins-ci.org/&quot; class=&quot;bare&quot;&gt;https://repo.jenkins-ci.org/&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Infra team was concerned about the dependencies used by third-party repositories.
These repositories are a concern, not just for security reasons, but also for reliability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The third-party repository detection probe ensures that plugins are built &lt;em&gt;only&lt;/em&gt; from trusted and reliable Maven repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;importance-of-the-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#importance-of-the-probe&quot; /&gt;Importance of the probe&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe was requested by the community.
In the ticket description, one of the plugin developers asked the Jenkins team to include a third-party repository in the plugin build.
With the probe in place, the Jenkins team can now identify the plugins they should add to the build process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges&quot; /&gt;Challenges&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a Maven project, all the dependencies are listed in the &lt;code&gt;pom.xml&lt;/code&gt; file.
A plugin can have multiple pom files, and each module may have its own pom.
This means that there can be multiple child poms in the same repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A major challenge in this probe was considering the parent and child pom relationship from all angles.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;outcome&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#outcome&quot; /&gt;Outcome&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During code reviews and test cases, we noticed that there were assumptions made regarding Maven’s project hierarchies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Furthermore, some edge-case scenarios were not considered while specifying the probe.
Due to the number of open questions, this probe was put on hold until further research was completed.
The goal of doing this was to adapt the project architecture to tackle the newly identified cases.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;learning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#learning&quot; /&gt;Learning&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I implemented parameterized test cases to test the probe.
Additionally, I extensively read the Maven documentation to understand how to test POM structure, inheritance, and Maven API.&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;This probe is currently partially completed, with approximately 60% of the code and test cases already implemented.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The objective is to create an efficient pom probe capable of aggregating all the parent-child pom relationships into a single file.
By doing so, we can easily list the third-party repositories used in every pom file within the repository.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information or to find answers to any questions you might have, please visit the official GSoC 2023 project &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Adding Probes to &quot;Plugin Health Score&quot;&lt;/a&gt; description page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/07/16/unreleased-production-changes-probe/</id>
<title>Unreleased Production Changes Probe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-07-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/07/16/unreleased-production-changes-probe/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='healthscore'></category>
<category term='probes'></category>
<category term='plugin'></category>
<summary>
Introduction


A bug fix, security fix, or new features are of no use unless they are released.


A production release not only provides users with an updated plugin, but also gives the developers a chance to get feedback on their work.


The "unreleased production changes" probe looks for unreleased commits in the production files.


If an unreleased file is found in the production path, the probe returns a failure message.
If no unreleased file is found, it returns a success message.








For now, we are focusing on Maven production files (pom.xml and src/main folder).





This is my first probe that went live as a GSoC contributor.




Importance of...
</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;A bug fix, security fix, or new features are of no use unless they are released.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A production release not only provides users with an updated plugin, but also gives the developers a chance to get feedback on their work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &quot;unreleased production changes&quot; probe looks for unreleased commits in the production files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If an unreleased file is found in the production path, the probe returns a failure message.
If no unreleased file is found, it returns a success message.&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;
For now, we are focusing on Maven production files (&lt;code&gt;pom.xml&lt;/code&gt; and &lt;code&gt;src/main&lt;/code&gt; folder).
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is my first probe that went live as a GSoC contributor.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;importance-of-the-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#importance-of-the-probe&quot; /&gt;Importance of the probe&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The probe aims to identify unreleased production commits in  Maven production files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finding an unreleased production file can mean one or more of the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;There are unreleased security fixes that should be released as soon as possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are unreleased features requested that would improve the usefulness of the plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The plugin maintainer may be inactive or too busy to further develop the plugin.
This could indicate the plugin needs a new maintainer and should be up for adoption.&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;challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges&quot; /&gt;Challenges&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Learning to use &lt;a href=&quot;https://www.eclipse.org/jgit/&quot;&gt;JGit&lt;/a&gt;, a Java library that implements a Git version control system, was one of the biggest challenges I faced when working on this probe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since I was not familiar with Git hierarchy, I struggled to find the parent of a child commit using JGit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the end, my mentors suggested a pair programming session to review the thinking process involved in implementing such a probe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am thankful for their kindness and patience.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;outcome&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#outcome&quot; /&gt;Outcome&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When unreleased production files are found, the probe returns a failure status and the list of filenames.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When no unreleased production file is found, the probe returns a success message.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;learning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#learning&quot; /&gt;Learning&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope there comes a day when test cases become my friends, but I don’t see this happening anytime soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentors suggested I should start with writing the test cases to reproduce the probe requirement(s), and later add code to pass each of the test cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This gave me an understanding of what the probe should actually do, and I learned to identify the test case scenarios.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Reading commits wasn’t possible without JGit Java library.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To implement JGit library and understand the features it provides, you should have strong understanding of Git concepts.
I lacked depth in Git concepts that made me struggle with JGit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This led me to strengthen the Git concepts along the way.&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;I once again realised the open-source world values quality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The community is fine with fewer &quot;quality&quot; probes, as opposed to many &quot;not-so-useful&quot; probes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting from ground zero is tough, whether implementing a new Java library or starting new work in another field.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, with correct mentorship and guidance, you can rise up faster.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information or to find answers to any questions you might have, head to the official GSoC 2023 project &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Adding Probes to  &quot;Plugin Health Score&quot;&lt;/a&gt; description page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/07/16/security-scan-probe-blog/</id>
<title>Security Scan Probe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-07-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/07/16/security-scan-probe-blog/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='healthscore'></category>
<category term='probes'></category>
<category term='plugin'></category>
<summary>
Introduction


The Jenkins Security team offers a GitHub action that automatically scans the plugin source code during Continuous Integration and reports security issues.


The Jenkins community considers using such tools to ensure a high-security level for plugins as a good practice.


The Security Scan probe identifies whether the plugin is configured to execute the security action.




Importance of the Probe


This probe is essential from a security perspective, as it checks for known security breaches and vulnerabilities in a plugin.


Its primary purpose is to verify that the security scan is properly configured in the plugin&#8217;s GitHub Action.




Challenges


This probe was originally started by another contributor.
However, they...
</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;The Jenkins Security team offers a GitHub action that automatically scans the plugin source code during Continuous Integration and reports security issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community considers using such tools to ensure a high-security level for plugins as a good practice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Security Scan probe identifies whether the plugin is configured to execute the security action.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;importance-of-the-probe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#importance-of-the-probe&quot; /&gt;Importance of the Probe&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe is essential from a security perspective, as it checks for known security breaches and vulnerabilities in a plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Its primary purpose is to verify that the security scan is properly configured in the plugin’s GitHub Action.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges&quot; /&gt;Challenges&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe was originally started by another contributor.
However, they were unable to continue, so I took over their work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, this probe required refactoring existing classes to eliminate code duplication, as the &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/229&quot;&gt;JEP-229 (Continuous Delivery)&lt;/a&gt; probe also looks for CI configurations in GitHub Actions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;outcome&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#outcome&quot; /&gt;Outcome&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This probe will be beneficial to the security team, as it helps identify gaps and improve the security of the Jenkins 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;learning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#learning&quot; /&gt;Learning&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this project, I accomplished the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Successfully rebased an existing Git branch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Developed and wrote unit test cases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gained knowledge on leveraging the class hierarchy to build an abstract probe that can be implemented by any probes requiring GitHub Action configuration checks.&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information or if you have any questions, please visit the official GSoC 2023 project &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Adding Probes to  &quot;Plugin Health Score&quot;&lt;/a&gt; description page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/07/12/jenkins-mirrors-postmortem-outage/</id>
<title>Post Mortem of the 7th July 2023 Jenkins Infrastructure Outage</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-07-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/07/12/jenkins-mirrors-postmortem-outage/" />
<category term='infrastructure'></category>
<category term='mirrors'></category>
<category term='jenkins'></category>
<category term='outage'></category>
<category term='postmortem'></category>
<summary>
On Friday 7th of July 2023, the Jenkins infrastructure suffered a major outage from 11:05am UTC until 15:25pm UTC with complete downtime of the following public services:




accounts.jenkins.io


fallback.get.jenkins.io


get.jenkins.io


incrementals.jenkins.io


javadoc.jenkins.io


plugin-health.jenkins.io


plugin-site-issues.jenkins.io


plugins.origin.jenkins.io


plugins.jenkins.io


rating.jenkins.io


repo.azure.jenkins.io


reports.jenkins.io


stories.jenkins.io


uplink.jenkins.io


weekly.ci.jenkins.io


www.origin.jenkins.io




We also had complete downtime of the following non-public services:




ldap.jenkins.io


previews of *.jenkins.io pull requests (infra.ci.jenkins.io)




In addition, there was disruption (partial or complete) of the following services:




ci.jenkins.io


infra.ci.jenkins.io


issues.jenkins.io


plugins.jenkins.io


repo.jenkins-ci.org


www.jenkins.io











The public IPs of these services changed (DNS records included) to:




20.7.178.24 (IPv4)


2603:1030:408:5::15a (IPv6)




⚠️ Update your corporate networks (DNS, proxies, firewall) if you need to access these services.






Incident Timeline




10:30am UTC: After a successful upgrade of the public Kubernetes cluster in Azure to 1.25 (as part of help desk ticket 3582),...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On Friday 7th of July 2023, the Jenkins infrastructure suffered a major outage from 11:05am UTC until 15:25pm UTC with complete downtime of the following public services:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;accounts.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fallback.get.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;get.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;incrementals.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;javadoc.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugin-health.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugin-site-issues.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugins.origin.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugins.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rating.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;repo.azure.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;reports.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;stories.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;uplink.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;weekly.ci.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;www.origin.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also had complete downtime of the following non-public services:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ldap.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;previews of *.jenkins.io pull requests (infra.ci.jenkins.io)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition, there was disruption (partial or complete) of the following services:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ci.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;infra.ci.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;issues.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugins.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;repo.jenkins-ci.org&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;www.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The public IPs of these services changed (DNS records included) to:&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;20.7.178.24&lt;/code&gt; (IPv4)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;2603:1030:408:5::15a&lt;/code&gt; (IPv6)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;⚠️ Update your corporate networks (DNS, proxies, firewall) if you need to access these services.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;incident-timeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#incident-timeline&quot; /&gt;Incident Timeline&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;10:30am UTC:&lt;/strong&gt; After a successful upgrade of the public Kubernetes cluster in Azure to 1.25 (as part of &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3582&quot;&gt;help desk ticket 3582&lt;/a&gt;), we realized that the LDAP service was not reachable by the services running inside the cluster (such as accounts.jenkins.io).
We quickly identified IP restrictions blocking these requests as the pod originating IP was in a different range than before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;10:55am UTC:&lt;/strong&gt; The fix (&lt;a href=&quot;https://github.com/jenkins-infra/azure/pull/431&quot;&gt;Azure PR 431&lt;/a&gt;) is deployed to specify a proper set of IP ranges for the pods.
It removed all of the node pools (all the virtual machines where the container was running) and failed to re-create them, causing a full outage of all the services running in this cluster:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;accounts.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;get.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;incrementals.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;javadoc.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;jenkins-wiki-exporter.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ldap.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugins.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;previews of *.jenkins.io pull requests (infra.ci.jenkins.io)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;release.ci.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;repo.azure.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;reports.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;stories.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;uplink.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;www.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;11:16am until 13:16pm UTC:&lt;/strong&gt; The failure to re-create resources led us to spend the 2 next hours creating the cluster from scratch with a fixed network setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;15:17pm UTC:&lt;/strong&gt; &lt;a href=&quot;https://github.com/jenkins-infra/azure/pull/432&quot;&gt;This pull request&lt;/a&gt; is pushed to persist the manual work we did to recreate the cluster including the IP setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;15:25pm UTC:&lt;/strong&gt; All services are back to normal&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-happened&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-happened&quot; /&gt;What Happened?&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;When the cluster was initially created, we selected the &lt;code&gt;10.&lt;strong&gt;244&lt;/strong&gt;.0.0/&lt;strong&gt;16&lt;/strong&gt;&lt;/code&gt; virtual network IP range (ref. &lt;a href=&quot;https://github.com/jenkins-infra/azure-net/blob/fcb010a5d9f164203c9a896fcb974df4051c321d/vnets.tf#L66&quot;&gt;Azure VNets&lt;/a&gt;) with a &lt;code&gt;10.245.0.0/24&lt;/code&gt; sub-network (ref. &lt;a href=&quot;https://github.com/jenkins-infra/azure-net/blob/fcb010a5d9f164203c9a896fcb974df4051c321d/vnets.tf#L161)&quot;&gt;Azure subnet&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But we ignored that the &lt;code&gt;10.&lt;strong&gt;244&lt;/strong&gt;.0.0/&lt;strong&gt;24&lt;/strong&gt;&lt;/code&gt; range is the default CIDR for the Kubernetes Pods network in Azure when using the &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/aks/configure-kubenet&quot;&gt;&quot;kubenet&quot; network to support IPv6 instead of the default CNI&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The node pool re-creation failed because we assumed both ranges were able to communicate and tried to deploy an invalid setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As soon as we specified a custom Pod CIDR in a distinct range, everything went fine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the original cluster was deleted it transitively removed the current Public IPs, as it removed the &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/aks/faq#why-are-two-resource-groups-created-with-aks&quot;&gt;Nodes Resource Group&lt;/a&gt; containing the Public IP.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;These public IPs should change as little as possible to avoid problems with our users running behind a corporate firewall with an allow-list.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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-can-we-do-to-improve&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-can-we-do-to-improve&quot; /&gt;What can we do to improve?&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;As per &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3582#issuecomment-1629210833&quot;&gt;our initial assessment&lt;/a&gt;: protect the Public IPs from deletion by adding a &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/lock-resources?tabs=json&quot;&gt;Management Lock&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3582#issuecomment-1629752851&quot;&gt;recommended by other contributors&lt;/a&gt;: storing the Public IP in a distinct Resource Group and set up the Kubernetes-managed Load Balancers accordingly (annotation &lt;code&gt;service.beta.kubernetes.io/azure-load-balancer-resource-group&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improve our network diagrams and documentation to have better access to the representation and potential overlaps when preparing operations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avoid changing AKS node pools configurations all at once: we would have caught the issue after the first node pool and could have avoided a full outage (we are working on this topic for the &lt;code&gt;arm64&lt;/code&gt; node pools in &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3623&quot;&gt;PR-3623&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;from-0-to-production-in-less-than-4-hours&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#from-0-to-production-in-less-than-4-hours&quot; /&gt;From 0 to production in less than 4 hours!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the takeaways of this outage, is that we are able to recover from a full destruction of the cluster hosting almost all public services in less than &lt;strong&gt;4&lt;/strong&gt; hours.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s a huge collaborative work which allowed this: from defining the architecture, building the infrastructure, backing-up its data, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This huge effort started years ago by &lt;a href=&quot;https://www.jenkins.io/blog/authors/rtyler/&quot;&gt;R. Tyler Croy&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/olblak/&quot;&gt;Olivier Vernin&lt;/a&gt; and backed by a lot of contributors such as &lt;a href=&quot;https://www.jenkins.io/blog/authors/daniel-beck/&quot;&gt;Daniel Beck&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/hlemeur/&quot;&gt;Hervé Le Meur&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;Tim Jacomb&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Mark E Waite&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/smerle33/&quot;&gt;Stéphane Merle&lt;/a&gt; and many more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As current Infrastructure Officer, I want to thank them all so that our life is easier when catastrophic events happens!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/07/10/jenkins-june-newsletter/</id>
<title>Jenkins June 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-07-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/07/10/jenkins-june-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Key Takeaways




Red Hat Enterprise Linux 7, and derivatives like CentOS 7, reach early end of life.


Upgrades and improvements of Jenkins components continue with significant progress towards the eventual removal of Prototype.js from Jenkins core.


Thanks to a kind donation from Launchable, pull requests to Jenkins core now complete their evaluation builds in 2 hours rather than the 6 hours that were previously required.







Contributed by: Wadeck Follonier




There was one security advisory published on June 14



2023-06-14 Security Advisory


The security team discovered a vulnerability that was corrected as a (positive) side effect of a maintenance task.
There is no new security release per se for...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins June Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-takeaways&quot; /&gt;Key Takeaways&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;Red Hat Enterprise Linux 7, and derivatives like CentOS 7, reach early end of life.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrades and improvements of Jenkins components continue with significant progress towards the eventual removal of Prototype.js from Jenkins core.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thanks to a kind donation from Launchable, pull requests to Jenkins core now complete their evaluation builds in 2 hours rather than the 6 hours that were previously required.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;There was one security advisory published on June 14&lt;/p&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/2023-06-14/&quot;&gt;2023-06-14 Security Advisory&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The security team discovered a vulnerability that was corrected as a (positive) side effect of a maintenance task.
There is no new security release per se for Jenkins Core, but an advisory and associated warnings to let administrators know that an update is recommended.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That advisory also included fixes for plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expansion of the security audit scope in Jenkins Core&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Originally the scope of the audit requirement was only “UI-related” changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But recently, there were multiple changes in JavaScript / Jelly without a UI impact, mainly for maintenance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More information about this is in the &lt;a href=&quot;https://docs.google.com/document/d/1QttPwdimNP_120JukigKsRuBvMr34KZhVfsbgq1HFLM&quot;&gt;Jenkins UX SIG - Agendas &amp;amp; Notes&lt;/a&gt;, for June 21.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Special thanks to the GitHub Security Lab for their reports&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This is the second time in a row that vulnerabilities they reported were corrected in the advisory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kudos to Alvaro Muñoz and Tony Torralba for their work on this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In collaboration with them, the Jenkins Security team will improve the &lt;a href=&quot;https://www.jenkins.io/blog/2020/11/04/codeql/&quot;&gt;CodeQL scanning tool&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Linux Foundation will upgrade &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;issues.jenkins.io&lt;/a&gt; on Thursday, July 6, 2023.
Special thanks to the Linux Foundation for their skilled administration of our JIRA instance.
More detailed information is available on the &lt;a href=&quot;https://status.jenkins.io/issues/2023-07-06-jira-outage/&quot;&gt;status page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The four &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#gsoc-2023&quot;&gt;Google Summer of Code projects&lt;/a&gt; mentored by members of the Jenkins project are preparing midterm presentations and midterm evaluations.
The &lt;a href=&quot;https://www.meetup.com/jenkins-online-meetup/events/294355266/&quot;&gt;midterm webinar&lt;/a&gt; will be Thursday, July 6, 2023.
A recording will be available as well along with the &lt;a href=&quot;https://docs.google.com/presentation/d/1kfGd0IB2PWp_yzSDFk5ClY00qZGreGjirtqL7-SZ1js/edit?usp=sharing&quot;&gt;presentation slides&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Upgrades and improvements of Jenkins components continue, with significant progress towards the eventual removal of Prototype.js from Jenkins core.
We’ve also seen upgrades for Guava, Guice, Apache commons.io, and HTMLUnit.
Thanks to the providers of those libraries and special thanks to the Jenkins maintainers that are leading those upgrades.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to a kind donation from &lt;a href=&quot;https://www.launchableinc.com/&quot;&gt;Launchable&lt;/a&gt;, pull requests to Jenkins core now complete their evaluation builds in 2 hours, rather than the 6 hours that were previously required.
Launchable uses AI techniques to select a time-limited subset of tests, executed as part of pull request evaluation.
Special thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; for implementing Launchable in the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The CDF Technical Oversight Committee elections have finished.
The Jenkins project nominee, &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;, has been elected to serve.
We’re pleased that the Jenkins project continues to have representation on the committee.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Cloud Costs Control effort continued:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We kept the AWS bill at $11,000 while the build workload of ci.jenkins.io increased by 15%.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We also decreased the Azure bill by $2,000 ($9,000 → $7,000) despite adding (more) resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the build workload migration to ARM64: &lt;a href=&quot;https://javadoc.jenkins.io&quot;&gt;javadoc.jenkins.io&lt;/a&gt; is now proudly served by Azure ARM64 instances.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/changelog-stable/&quot;&gt;Jenkins LTS&lt;/a&gt;&#39; 2.401.1 and 2.401.2 were deployed everywhere less than 24 hours after their releases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://ubuntu.com/blog/ubuntu-18-04-eol-for-devices&quot;&gt;Ubuntu 18.04 Bionic end of life&lt;/a&gt;: All of our VMs are now using Ubuntu 22.04, except the Update Center one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cloud Control:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The trusted.ci.jenkins.io and puppet.jenkins.io systems were migrated to Azure for security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS is only used by ci.jenkins.io for container agents. This means no more EC2.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IPv6 support for get.jenkins.io and every other public services, thanks to their migration to a brand new AKS cluster with dual stack enabled.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;User experience improvements continue thanks to the efforts of &lt;a href=&quot;https://github.com/mawinter69&quot;&gt;Markus Winter&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pulls/meiswjn&quot;&gt;Jan Meiswinkel&lt;/a&gt;, and others.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Markus is improving the look and feel of the delete dialog, so that it will be consistent and will appear within the web page as a modal dialog, rather than appearing outside the page as a browser dialog.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jan Faracik continues to improve the look and feel of Jenkins pages, including recent improvements to the logs page and improvement in the cascading style sheets.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several platform updates occurred throughout June:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CentOS 7: Early End of Life announcement.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can find out more details in the &lt;a href=&quot;https://www.jenkins.io/blog/2023/05/30/operating-system-end-of-life&quot;&gt;blog post announcement&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Included in version &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.407&quot;&gt;2.407&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker Image Updates&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins agent and controller images: Utilizing &lt;a href=&quot;https://www.updatecli.io/&quot;&gt;updatecli&lt;/a&gt; for image management.
JDK17 version tracking for &lt;code&gt;ssh-agent&lt;/code&gt; and Alpine Linux and JDK version tracking for the controller.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ssh-agent&lt;/code&gt;: Released versions &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/releases/tag/5.6.0&quot;&gt;&lt;code&gt;5.6.0&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/releases/tag/5.4.0&quot;&gt;&lt;code&gt;5.4.0&lt;/code&gt;&lt;/a&gt; with JDK version tracking and other enhancements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;docker-agent&lt;/code&gt;: New release &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/releases/tag/3131.vf2b_b_798b_ce99-2&quot;&gt;&lt;code&gt;3131.vf2b_b_798b_ce99-2&lt;/code&gt;&lt;/a&gt; with updated dependencies and &lt;code&gt;3.18.2&lt;/code&gt; Alpine Linux version.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;docker-inbound-agent&lt;/code&gt;: Release &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/releases/tag/3131.vf2b_b_798b_ce99-2&quot;&gt;&lt;code&gt;3131.vf2b_b_798b_ce99-2&lt;/code&gt;&lt;/a&gt; with updated parent image.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker Controller: Release &lt;a href=&quot;https://github.com/jenkinsci/docker/releases/tag/2.411&quot;&gt;&lt;code&gt;2.411&lt;/code&gt;&lt;/a&gt; with Jenkins 2.411 and security policy enhancements.
Refer to the &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/1647&quot;&gt;release notes&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker Hub Stats&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Monthly image exports are shared on &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1NfGpKDXaRQh1DRD64CG1fY6CoIG9D—​H8Ft01VhfzRQ/edit#gid=256200265&quot;&gt;this spreadsheet&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ArchLinux usage is low, but not deprecated.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work in Progress&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows image availability for the controller.
The latest version: &lt;code&gt;2.410&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the month of June, three blog posts were published on the Jenkins blog.
This included the &lt;a href=&quot;https://www.jenkins.io/blog/2023/06/20/jenkins-may-newsletter/&quot;&gt;May newsletter&lt;/a&gt;, an &lt;a href=&quot;https://www.jenkins.io/blog/2023/06/22/mirrors-jenkins-new-IP/&quot;&gt;update announcement for Jenkins mirrors&lt;/a&gt;, and instructions on &lt;a href=&quot;https://www.jenkins.io/blog/2023/06/20/remove-outdated-plugins-while-using-docker/&quot;&gt;removing deprecated plugins from Jenkins when using Docker&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The documentation has also started to transition to using Java 17 in the installation documentation for various platforms.
The &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/linux/&quot;&gt;Linux installation documentation&lt;/a&gt; has been updated accordingly and includes a note regarding the Debian 12 release (as it does not deliver OpenJDK 11).
This note will be present on any page that is part of the transition so that users are aware of the updates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As always, we appreciate all the documentation contributions from new and existing users.
Thank you for your work and dedication to the open source community!&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/06/22/mirrors-jenkins-new-IP/</id>
<title>New Public IPv4 for Jenkins Mirrors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-06-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/06/22/mirrors-jenkins-new-IP/" />
<category term='infrastructure'></category>
<category term='mirrors'></category>
<category term='jenkins'></category>
<summary>
The Jenkins project packages and plugins are hosted through a network of mirror servers (provided by our sponsors) close to your location.


It provides a "HTTP redirector" service hosted behind the get.jenkins.io, mirrors.jenkins.io and mirrors.jenkins-ci.org domains, with a new public IP: `20.119.232.75` 20.7.178.24 (as per /blog/2023/07/12/jenkins-mirrors-postmortem-outage/) since the 12th of June 2023.
The former redirector service and its previous IPv4 will be decommissioned the 27th of June 2023.








Please update your DNS servers and firewall rules to the new IP `20.119.232.75` 20.7.178.24 if you are in a restricted environment.











More details in https://github.com/jenkins-infra/helpdesk/issues/3351....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project packages and plugins are hosted through a network of mirror servers (provided by our sponsors) close to your location.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It provides a &quot;HTTP redirector&quot; service hosted behind the &lt;code&gt;get.jenkins.io&lt;/code&gt;, &lt;code&gt;mirrors.jenkins.io&lt;/code&gt; and &lt;code&gt;mirrors.jenkins-ci.org&lt;/code&gt; domains, with a new public IP: &lt;s&gt;`20.119.232.75`&lt;/s&gt; &lt;code&gt;20.7.178.24&lt;/code&gt; (as per &lt;a href=&quot;https://www.jenkins.io/blog/2023/07/12/jenkins-mirrors-postmortem-outage/&quot; class=&quot;bare&quot;&gt;/blog/2023/07/12/jenkins-mirrors-postmortem-outage/&lt;/a&gt;) since the 12th of June 2023.
The former redirector service and its previous IPv4 will be decommissioned the 27th of June 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Please update your DNS servers and firewall rules to the new IP &lt;s&gt;`20.119.232.75`&lt;/s&gt; &lt;code&gt;20.7.178.24&lt;/code&gt; if you are in a restricted environment.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
More details in &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3351&quot; class=&quot;bare&quot;&gt;https://github.com/jenkins-infra/helpdesk/issues/3351&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/06/20/remove-outdated-plugins-while-using-docker/</id>
<title>How to remove deprecated plugins from Jenkins while using Docker</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-06-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/06/20/remove-outdated-plugins-while-using-docker/" />
<category term='jenkins'></category>
<category term='docker'></category>
<category term='plugins'></category>
<category term='jcasc'></category>
<summary>
The Jenkins plugin ecosystem is highly active, and it&#8217;s not uncommon to come across deprecated plugins.
This can be both positive and negative.
On the positive side, it signifies that the plugin is no longer necessary since its functionality has been integrated into Jenkins core or rendered obsolete by new features or technologies.
On the downside, deprecation could indicate that the plugin is no longer maintained and considered unsafe.


However, removing deprecated plugins from Jenkins when using Docker can be a bit troublesome.
This is due to the way the Jenkins Docker container functions.
Whether you&#8217;re using the default container or a custom one, it runs...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins plugin ecosystem is highly active, and it’s not uncommon to come across deprecated plugins.
This can be both positive and negative.
On the positive side, it signifies that the plugin is no longer necessary since its functionality has been integrated into Jenkins core or rendered obsolete by new features or technologies.
On the downside, deprecation could indicate that the plugin is no longer maintained and considered unsafe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, removing deprecated plugins from Jenkins when using Docker can be a bit troublesome.
This is due to the way the Jenkins Docker container functions.
Whether you’re using the default container or a custom one, it runs on an image that comes with a predefined set of plugins.
Even if you remove these plugins from the Jenkins UI, they are not completely removed from the container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, you might be wondering how this works.
Allow me to explain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s consider a scenario where we are utilizing a &lt;code&gt;docker-compose.yaml&lt;/code&gt; file to define our Jenkins instance.
Although there may be numerous services, our focus will be on the Jenkins controller at present.&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;#  docker compose up -d --build --force-recreate&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./controller&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;always&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;ports&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;8080:8080&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;50000:50000&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;volumes&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;s&quot;&gt;jenkins-data:/var/jenkins_home:rw&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./casc.d:/var/jenkins_home/casc.d/:ro&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./secrets/id_jenkins.pem:/run/secrets/SSH_AGENT_KEY:ro&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;environment&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;s&quot;&gt;JENKINS_EXT_URL=http://localhost:8080&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;CASC_JENKINS_CONFIG=/var/jenkins_home/casc.d/&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;org.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;PUBLIC_IP&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;...&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;Dockerfile&lt;/code&gt; for the Jenkins controller is as follows:&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;dockerfile&quot;&gt;&lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; jenkins/jenkins:2.401.1-lts-jdk17&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# [...]&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;## Install custom plugins&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;COPY&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; --chown=jenkins:jenkins ./plugins.txt /usr/share/jenkins/plugins.txt&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;jenkins-plugin-cli &lt;span class=&quot;nt&quot;&gt;--plugin-file&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/share/jenkins/plugins.txt
&lt;span class=&quot;c&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;To define the plugins we wish to install, we are utilizing a &lt;code&gt;plugins.txt&lt;/code&gt; file.
It is worth noting that some of these plugins may become deprecated in the future.
For this example, we are utilizing the &lt;a href=&quot;https://plugins.jenkins.io/bootstrap4-api&quot;&gt;Bootstrap 4 API plugin&lt;/a&gt;, which has a dependency on the &lt;a href=&quot;https://plugins.jenkins.io/popper-api&quot;&gt;Popper API plugin&lt;/a&gt;.
At the time of writing, both plugins have been deprecated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the beginning of the removal process, these two plugins are defined in the &lt;code&gt;plugins.txt&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&gt;[...]
# See https://github.com/jenkinsci/docker#usage-1
[...]
bootstrap4-api
[...]
popper-api
[...]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tldr&quot; /&gt;TL;DR&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;Remove any references to the deprecated plugins in the &lt;code&gt;plugins.txt&lt;/code&gt; file if you are using one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rebuild the image.&lt;/p&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;docker compose build jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recreate your container if the rebuild was successful.&lt;/p&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;docker compose up &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--build&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--force-recreate&lt;/span&gt; jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optional: enter in the running container to check if the plugins references are gone.&lt;/p&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;docker compose &lt;span class=&quot;nb&quot;&gt;exec &lt;/span&gt;jenkins bash
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/share/jenkins/
&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;plugins.txt |grep bootstrap&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove the plugins in the UI, as described in the next section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart by hitting the &lt;code&gt;/safeRestart&lt;/code&gt; endpoint.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optional: remove the plugins&#39; remnants from the docker volume.&lt;/p&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;cd&lt;/span&gt; ~/plugins
&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-artl&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;...]
&lt;span class=&quot;nt&quot;&gt;-rw-r--r--&lt;/span&gt;   1 jenkins jenkins        8 Jun  6 13:05 bootstrap4-api.jpi.version_from_image
&lt;span class=&quot;nt&quot;&gt;-rw-r--r--&lt;/span&gt;   1 jenkins jenkins        0 Jun  6 13:05 bootstrap4-api.jpi.pinned
&lt;span class=&quot;nt&quot;&gt;-rw-r--r--&lt;/span&gt;   1 jenkins jenkins        9 Jun  6 13:05 popper-api.jpi.version_from_image
&lt;span class=&quot;nt&quot;&gt;-rw-r--r--&lt;/span&gt;   1 jenkins jenkins        0 Jun  6 13:05 popper-api.jpi.pinned
drwxr-xr-x   6 jenkins jenkins     4096 Jun  6 13:05 bootstrap4-api
drwxr-xr-x   5 jenkins jenkins     4096 Jun  6 13:05 popper-api
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;...]
&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-fr&lt;/span&gt; bootstrap4-api&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; popper-api&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well done!
You have successfully eliminated any deprecated plugins (at least for now).
Keep up the good work!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-intuitive-but-plenty-wrong-approach&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-intuitive-but-plenty-wrong-approach&quot; /&gt;The intuitive (but plenty wrong) approach&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;you-cant-ignore-the-warning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#you-cant-ignore-the-warning&quot; /&gt;You can’t ignore the warning&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your Jenkins instance has deprecated plugins, you’ll notice a notification bell in the top right corner.
Selecting it will display a warning message similar to this:&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/2023/06/20/2023-06-20-remove-outdated-plugins-while-using-docker/the-following-plugins-are-deprecated.png&quot; alt=&quot;the following plugins are deprecated&quot; width=&quot;deprecated plugins warning&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It suggests you select &lt;strong&gt;Manage Jenkins&lt;/strong&gt; to remove the deprecated plugins.
Once in &lt;strong&gt;Manage Jenkins&lt;/strong&gt;, you can’t ignore the warning:&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/2023/06/20/2023-06-20-remove-outdated-plugins-while-using-docker/the-following-plugins-are-deprecated-once-more.png&quot; alt=&quot;the following plugins are deprecated once more&quot; width=&quot;deprecated plugins warning once again&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s a clear indication that we need to take action to address this situation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;removing-deprecated-plugins-in-the-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#removing-deprecated-plugins-in-the-ui&quot; /&gt;Removing deprecated plugins in the UI&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Follow these steps to remove the deprecated 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;Select &lt;strong&gt;Plugins&lt;/strong&gt;, then select &lt;strong&gt;Installed plugins&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the search box, enter the name of the deprecated plugin (in this case, it’s &lt;code&gt;popper&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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/2023/06/20/2023-06-20-remove-outdated-plugins-while-using-docker/popper-can-t-be-uninstalled.png&quot; alt=&quot;popper can t be uninstalled&quot; width=&quot;search for the deprecated plugin&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, we encounter an issue as we are unable to uninstall it.
The checkmark is greyed out, and the &lt;strong&gt;Uninstall&lt;/strong&gt; button (red cross) is disabled.
Why is that?
Some plugins have dependencies on other plugins, which in turn have dependencies on additional plugins, creating a chain of dependencies.
When you hover your mouse pointer over the uninstall icon (red cross), you’ll see a tooltip that indicates the parent plugin blocking the uninstallation:&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/2023/06/20/2023-06-20-remove-outdated-plugins-while-using-docker/who-is-my-daddy.png&quot; alt=&quot;what is the parent plugin blocking the uninstallation?&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this case, &lt;code&gt;popper&lt;/code&gt; is a dependency for another plugin called &lt;code&gt;bootstrap4-api&lt;/code&gt;.
Therefore, we need to remove &lt;code&gt;bootstrap4-api&lt;/code&gt; first and then proceed with &lt;code&gt;popper&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back to the &lt;del&gt;drawing board&lt;/del&gt; search box, this time with &lt;code&gt;bootstrap4-api&lt;/code&gt;.&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/2023/06/20/2023-06-20-remove-outdated-plugins-while-using-docker/bootstrap4-can-be-uninstalled.png&quot; alt=&quot;bootstrap4 can be uninstalled&quot; width=&quot;search for the parent plugin&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This time, we can uninstall it by selecting the uninstall icon (red cross).
We will then encounter a warning message saying:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You are about to uninstall the Bootstrap 4 API Plugin plugin.
This will remove the plugin binary from your $JENKINS_HOME, but it will leave the configuration files of the plugin untouched.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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/2023/06/20/2023-06-20-remove-outdated-plugins-while-using-docker/remove-the-plugin-binary.png&quot; alt=&quot;remove the plugin binary&quot; width=&quot;remove the plugin binary&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Really?
We’ll check that later.
Select &lt;strong&gt;Yes&lt;/strong&gt; to proceed with the uninstallation, and we’re back to the &lt;strong&gt;Installed plugins&lt;/strong&gt; page.
Let’s give another chance to popper by searching for it again:&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/2023/06/20/2023-06-20-remove-outdated-plugins-while-using-docker/popper-can-be-uninstalled.png&quot; alt=&quot;popper can be uninstalled&quot; width=&quot;popper can be uninstalled now&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Same player, shoot again.
Follow the same steps as before to uninstall &lt;code&gt;popper&lt;/code&gt;.
After successfully uninstalling popper, you may notice that the notification icon still displays a message.
Furthermore, if we go back to the &lt;strong&gt;Installed plugins&lt;/strong&gt; page, we’ll see that &lt;code&gt;popper&lt;/code&gt; is still there.&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/2023/06/20/2023-06-20-remove-outdated-plugins-while-using-docker/pending-uninstallation.png&quot; alt=&quot;pending uninstallation&quot; width=&quot;pending uninstallation&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why is this the case?
We asked for an uninstallation, but it didn’t fully happen.
Jenkins has to restart in order to complete the process.
You can hit the &lt;code&gt;/safeRestart&lt;/code&gt; endpoint to restart Jenkins safely and then select &lt;strong&gt;Yes&lt;/strong&gt;.
When you return, you will notice that the notification icon has disappeared, and the plugin is no longer listed on the &lt;strong&gt;Installed plugins&lt;/strong&gt; page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;removing-deprecated-plugins-in-the-docker-context&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#removing-deprecated-plugins-in-the-docker-context&quot; /&gt;Removing deprecated plugins in the Docker context&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, depending on your Jenkins configuration, you may find that the deprecated plugins have somehow reappeared in your Jenkins instance, sometimes even with an older version.
How is this possible?
If your Jenkins container instance inherits from the Jenkins official container, it comes with a predefined set of plugins.
Most of the time, these plugins won’t be enough for your specific use case.
You will need to install additional plugins.
When you do so, the new plugins are installed in the &lt;code&gt;$JENKINS_HOME/plugins&lt;/code&gt; directory with a command such as:&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;dockerfile&quot;&gt;&lt;span class=&quot;k&quot;&gt;COPY&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; --chown=jenkins:jenkins ./plugins.txt /usr/share/jenkins/plugins.txt&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;jenkins-plugin-cli &lt;span class=&quot;nt&quot;&gt;--plugin-file&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/share/jenkins/plugins.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So…​
Whenever you remove a deprecated plugin from the Jenkins UI, remember to remove it from the Docker context as well.
Otherwise, it will be reinstalled when you rebuild the container.
In my case, I had to remove the following plugins from the &lt;code&gt;plugins.txt&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;dockerfile&quot;&gt;&lt;span class=&quot;c&quot;&gt;# See https://github.com/jenkinsci/docker#usage-1&lt;/span&gt;
ant:487.vd79d090d4ea_e
[...]
bootstrap4-api:4.6.0-3
[...]
popper-js:2.9.2-1
[...]
ws-cleanup:0.45&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now you’re safe for the next time you rebuild your Jenkins container.
But what about your running container?
Is it free of any reference to the deprecated plugins?
Let’s find out.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;removing-deprecated-plugins-from-the-running-container&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#removing-deprecated-plugins-from-the-running-container&quot; /&gt;Removing deprecated plugins from the running container&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is an excerpt of my &lt;code&gt;docker-compose.yml&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;dockerfile&quot;&gt;&lt;span class=&quot;c&quot;&gt;#  docker compose up -d --build --force-recreate&lt;/span&gt;
services:
    jenkins:
        build: ./controller
        restart: always
        ports:
            - &quot;8080:8080&quot;
            - &quot;50000:50000&quot;
        volumes:
            - jenkins-data:/var/jenkins_home:rw
            - ./casc.d:/var/jenkins_home/casc.d/:ro
        environment:
            - CASC_JENKINS_CONFIG=/var/jenkins_home/casc.d/
[...]
volumes:
    jenkins-data:&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;jenkins-data&lt;/code&gt; volume is mounted on the &lt;code&gt;/var/jenkins_home&lt;/code&gt; directory of the container.
However, the &lt;code&gt;/usr/share/jenkins/plugins.txt&lt;/code&gt; file, as we saw earlier in the &lt;code&gt;Dockerfile&lt;/code&gt;, is not mounted on a shared volume.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I happen to have installed &lt;code&gt;bash&lt;/code&gt; in my container, so I can run the following command to get a shell in the container (&lt;code&gt;jenkins&lt;/code&gt; is the name of the service in the &lt;code&gt;docker-compose.yml&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;bash&quot;&gt;docker compose &lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; jenkins bash&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can do the same with &lt;code&gt;sh&lt;/code&gt; if &lt;code&gt;bash&lt;/code&gt; was not installed in your Docker image.
Now, let’s search for the plugins definition file.
As we’ve seen in the Dockerfile, it’s located in &lt;code&gt;/usr/share/jenkins/plugins.txt&lt;/code&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;nb&quot;&gt;cd&lt;/span&gt; /usr/share/jenkins
&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;plugins.txt |grep bootstrap4-api
bootstrap4-api:4.6.0-3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The reference to the deprecated plugin is still there.
Is that a problem?
No.
As the &lt;a href=&quot;https://github.com/jenkinsci/docker#usage-1&quot;&gt;documentation&lt;/a&gt; says:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When jenkins container starts, it will check JENKINS_HOME has this reference content, and copy them there if required. It will not override such files, so if you upgraded some plugins from UI they won’t be reverted on the next start.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So it’s there, but it won’t do any harm, it won’t be used…​ unless we restart Jenkins.
Let’s leave it there, until the next time we rebuild the container, as we have already cleaned up the &lt;code&gt;plugins.txt&lt;/code&gt; file used by the Docker context earlier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now what?
Let’s have a look at the &lt;code&gt;$JENKINS_HOME&lt;/code&gt; directory.&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;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$JENKINS_HOME&lt;/span&gt;
find &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-name&lt;/span&gt; plugins.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nothing.
We don’t have a &lt;code&gt;plugins.txt&lt;/code&gt; file in the &lt;code&gt;$JENKINS_HOME&lt;/code&gt; directory.
Fine.
What else?
Can we find any remaining trace of the deprecated plugins?
I’m afraid we can.&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;find &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-name&lt;/span&gt; bootstrap4&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
./plugins/bootstrap4-api
./plugins/bootstrap4-api/META-INF/maven/io.jenkins.plugins/bootstrap4-api
./plugins/bootstrap4-api/WEB-INF/lib/bootstrap4-api.jar
./plugins/bootstrap4-api.bak
./plugins/bootstrap4-api.jpi
./plugins/bootstrap4-api.jpi.version_from_image
./plugins/bootstrap4-api.jpi.pinned&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are still some traces of the &lt;code&gt;bootstrap4-api&lt;/code&gt; deprecated plugin in the &lt;code&gt;$JENKINS_HOME/plugins&lt;/code&gt; directory.
What about the &lt;code&gt;popper-js&lt;/code&gt; plugin?
It’s there too.
It may explain why despite having removed the deprecated plugins from the Jenkins UI, they were still there when we restarted the container.
Let’s remove them for real this time:&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;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; ./plugins/bootstrap4-api&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; ./plugins/popper&lt;span class=&quot;k&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;We can now safely exit the container and restart it from the UI by accessing the &lt;code&gt;/safeRestart&lt;/code&gt; endpoint.
Once we return, we should verify that the deprecated plugins are no longer present.&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/2023/06/20/2023-06-20-remove-outdated-plugins-while-using-docker/the-following-plugins-are-deprecated.png&quot; alt=&quot;the following plugins are deprecated&quot; width=&quot;deprecated plugins warning&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Oh no!
It seems like the deprecated plugins have reappeared in the running container.
How did that happen?
It’s because we only restarted the container without rebuilding it.
The configuration still references the deprecated plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Simply restarting the container repeatedly won’t resolve the issue.
We need to rebuild the image after removing the deprecated plugins from the Docker context.
Then, we can recreate the container and remove the deprecated plugins from the running container using the UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a Jenkins admin, it’s important to go with the flow and avoid swimming upstream like a salmon.
By following the proper steps, we can address this issue effectively.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Want to try it by yourself?
Just follow the steps of the &lt;strong&gt;TL;DR&lt;/strong&gt; section.&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/06/20/jenkins-may-newsletter/</id>
<title>Jenkins May 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-06-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/06/20/jenkins-may-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Key Takeaways




Jenkins plugin updates released to fix security vulnerabilities, advisory published on May 16.


JDK8 support has been dropped in favor of JDK11 as the default for running Jenkins agents.


Ssh-agent release 5.0.0 introduces breaking changes.







Contributed by: Wadeck Follonier




A Security Policy was added for the Docker images of the project.



Due to multiple reports about CVEs present in the Docker images the project was publishing, we wanted to clarify the situation.


Most CVEs do not impact the final application and do not require publishing justifications about the lack of impact on numerous CVEs every week.





One plugin advisory was published on May 16:



This included at...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins May Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-takeaways&quot; /&gt;Key Takeaways&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;Jenkins plugin updates released to fix security vulnerabilities, advisory published on May 16.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK8 support has been dropped in favor of JDK11 as the default for running Jenkins agents.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ssh-agent release 5.0.0 introduces breaking changes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href=&quot;https://github.com/jenkinsci/docker/blob/master/SECURITY.md&quot;&gt;Security Policy&lt;/a&gt; was added for the Docker images of the project.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Due to multiple reports about CVEs present in the Docker images the project was publishing, we wanted to clarify the situation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most CVEs do not impact the final application and do not require publishing justifications about the lack of impact on numerous CVEs every week.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One &lt;a href=&quot;https://www.jenkins.io/security/advisory/2023-05-16/&quot;&gt;plugin advisory&lt;/a&gt; was published on May 16:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This included at least one high vulnerability in a very popular plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several significant initiatives are already in progress within the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to those who are leading the initiatives and thanks to those who are assisting with initiatives like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Prototype.js removal from Jenkins core and Jenkins plugins.
Contributing guidelines are in the &lt;a href=&quot;https://www.jenkins.io/blog/2023/05/12/removing-prototype-from-jenkins/&quot;&gt;blog post&lt;/a&gt;.
Detailed issue reports are available in the &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-70906&quot;&gt;JENKINS-70906: Jira epic&lt;/a&gt;.
Progress reports for affected plugins are available in the &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1dpaKALZaK0_HIGy6ony3wnegr1frTg3u1lngG4KdoC8/edit?usp=sharing&quot;&gt;tracking sheet&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HTMLUnit 3 upgrade in the Jenkins test harness, Jenkins core, and many Jenkins plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Guava 32 upgrade&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re also excited to have additional efforts in:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reducing the core pull request evaluation time (and cost) with Launchable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using GitHub autolink for easier references to Jenkins Jira tickets.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Cloud Cost Controls effort has continued by optimizing resource usage, resulting in:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Decreased the AWS bill of $ 3,000 (14,000 → 11,000).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Decreased the Azure bill of $ 2,000 to (11,000 → 9,000) despite adding resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Launchable is now generally available for community developers on ci.jenkins.io.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins LTS &lt;code&gt;2.387.3&lt;/code&gt; was deployed everywhere less than 24 hours after it was released.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ubuntu &lt;code&gt;22.04&lt;/code&gt; upgrade campaign (&lt;code&gt;18.04&lt;/code&gt; is end of life) continued (6 more VMs, 5 VMs left).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build workload migration to &lt;code&gt;ARM64&lt;/code&gt;: internal tools.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The user experience SIG continues to improve the look and feel and the accessibility of the Jenkins user interface.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/blog/2023/05/12/removing-prototype-from-jenkins/&quot;&gt;Prototype.js removal from Jenkins core and Jenkins plugins&lt;/a&gt; has already shown us that additional UI capabilities will be available as we remove that old library.
Dr. Ullrich Hafner has created a &lt;a href=&quot;https://github.com/jenkinsci/data-tables-api-plugin/pull/356&quot;&gt;prototype&lt;/a&gt; of one of those enhancements in the data tables plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cristina Pizzagalli and Jan Faracik have both been working on improving accessibility for Jenkins users with disabilities.
We particularly thank the usability and accessibility team at Deutsche Telekom IT GmbH for their &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-71153&quot;&gt;JENKINS-71153: accessibility assessment report&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Deprecation&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Red Hat Enterprise Linux 7 (and derivatives) early end of life&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To ensure a smooth transition, we are implementing several measures to inform users when an operating system is approaching its end of life.
These changes will be visible in upcoming releases and container images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Key Dates:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;May 28 - &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/7913&quot;&gt;Pull request&lt;/a&gt; merged&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;May 30 - &lt;a href=&quot;https://www.jenkins.io/blog/2023/05/30/operating-system-end-of-life/&quot;&gt;Blog post&lt;/a&gt; and &lt;a href=&quot;https://community.jenkins.io/t/end-of-life-operating-systems/7644&quot;&gt;community topic&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;May 30 - First weekly release containing the warning - &lt;code&gt;2.407&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nov 16 - RHEL 7 support ends in Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ongoing work&lt;/p&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/dduportal&quot;&gt;Damien Duportal&lt;/a&gt; is actively working on code factorization, specifically targeting a single repository for all agent images.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This will streamline maintenance tasks, such as fixing CVEs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The first phase for JDK versions has already been completed, resulting in significantly reduced code size.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Additionally, efforts are underway to merge two agents, aiming for synchronized release cycles.
This change should not impact end users, except for the transition of the repository into an archive.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We can provide more frequent updates on the development of Alpine images thanks to the use of &lt;code&gt;updatecli&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is an ongoing discussion in the &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/1629&quot;&gt;pull request&lt;/a&gt; regarding the switch of the Alma Linux container from version 8 to version 9.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What has been done&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Updates on Docker Images:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Significant progress has been made on ppc64le.
Thank you, &lt;a href=&quot;https://github.com/ksalerno99&quot;&gt;Kenneth&lt;/a&gt;, for your valuable contributions!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PRs for &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/391&quot;&gt;docker-agent&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/220&quot;&gt;docker-ssh-agent&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/pull/339&quot;&gt;inbound-agent&lt;/a&gt;, and the &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/1586&quot;&gt;controller&lt;/a&gt; have been successfully merged.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ssh-agent release &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/releases/tag/5.0.0&quot;&gt;5.0.0&lt;/a&gt; introduces breaking changes.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JDK8 support has been dropped in favor of JDK11 as the default for running Jenkins agents.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re pleased to welcome several new documentation contributions, including our Google Summer of Code contributors:&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/2023/05/26/ash-sxn-introduction-blog-post/&quot;&gt;Ashutosh Saxena&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/05/22/jagruti-introduction-blog-post/&quot;&gt;Jagruti Tiwari&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/05/18/harsh-ps-2003-introduction-blog-post/&quot;&gt;Harsh Pratap Singh&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/05/17/vandit1604-introduction-blog-post/&quot;&gt;Vandit Singh&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;We’re very pleased that these new Jenkins contributors have seen the value of documentation and have submitted documentation improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also welcomed first-time documentation contributors in May and are pleased to have their additions.
Thanks so much to our documentation contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&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/2023/06/20/2023-06-20-jenkins-may-newsletter/image2.png&quot; alt=&quot;image&quot; width=&quot;839&quot; height=&quot;Jenkins Contributor Awards 2023&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every year, the community nominates and votes for three outstanding difference makers in the Jenkins community: Most Valuable Advocate, Security MVP, and Most Valuable Contributor.
Congratulations go to:&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/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt; - Security MVP.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt; - Most Valuable Contributor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt; - Most Valuable Advocate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read what makes them &lt;a href=&quot;https://www.jenkins.io/blog/2023/05/16/jenkins-2023-award-winners/&quot;&gt;outstanding contributors&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many THANKS and congratulations to all award nominees!&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/2023/06/20/2023-06-20-jenkins-may-newsletter/image1.jpg&quot; alt=&quot;image&quot; width=&quot;839&quot; height=&quot;cdCon + GitOpsCon 2023&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation (CDF)&lt;/a&gt; hosted its fourth flagship event, cdCon, on May 8 – 9, 2023 in Vancouver, Canada as &lt;a href=&quot;https://events.linuxfoundation.org/cdcon-gitopscon/&quot;&gt;cdCon + GitOpsCon&lt;/a&gt;, co-organized with the &lt;a href=&quot;https://cncf.io/&quot;&gt;Cloud Native Computing Foundation (CNCF)&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sessions from the most widely used CI/CD and GitOps technologies, including the Jenkins community, were there with project updates along with various talks from community members and users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In case you missed it, below are the recorded Jenkins sessions at cdCon:&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://youtu.be/9o5suZ0lRss&quot;&gt;Fidelity’s Software Delivery Platform - Frictionless Approach to Achieve Autonomic DevOps &amp;amp; Enhanced Security/Compliance Practices&lt;/a&gt; - Jamie Plower &amp;amp; Evan Elms, Fidelity Investments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/Yr3zNnbggfE&quot;&gt;CI/CD for Data Building Dev/Test Data Environments with Open Source Stacks&lt;/a&gt; - Vinodhini Duraisamy, Treeverse.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/9QBORPTbkaY&quot;&gt;Intentional and Unintentional Compromises in Test Automation&lt;/a&gt; - Mark Waite, Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/vz7_rAQz_9c&quot;&gt;The Graduated Panel&lt;/a&gt; &lt;a href=&quot;https://cdcongitopscon2023.sched.com/?iframe=yes&amp;amp;w=100%&amp;amp;sidebar=yes&amp;amp;bg=no#&quot;&gt;- Dan Garfield, Codefresh; Priyanka Ravi, Weaveworks; Mark Waite, CloudBees; Andrea Frittoli, IBM &amp;amp; Moderated by Lori Lorusso, JFrog&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;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/06/20/2023-06-20-jenkins-may-newsletter/image3.png&quot; alt=&quot;image&quot; width=&quot;839&quot; height=&quot;Google Summer of Code 2023&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins welcomed four Google Summer of Code contributors to the family.
Each contributor will be working hand in hand with their dedicated mentors.
We’d like to introduce you to the Jenkins in GSoC contributors and the projects they will be making a difference on:&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/2023/05/26/ash-sxn-introduction-blog-post/&quot;&gt;Ashutosh Saxena&lt;/a&gt; - Docker Based Jenkins Quickstart Examples.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/05/22/jagruti-introduction-blog-post/&quot;&gt;Jagruti Tiwari&lt;/a&gt; - Adding Probes to Plugin Health Scoring System.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/05/18/harsh-ps-2003-introduction-blog-post/&quot;&gt;Harsh Pratap Singh&lt;/a&gt; - GitLab Plugin Modernization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/05/17/vandit1604-introduction-blog-post/&quot;&gt;Vandit Singh&lt;/a&gt; - Building Jenkins.io with Alternative Tools.&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;&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/2023/05/30/operating-system-end-of-life/</id>
<title>End of life operating systems</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/30/operating-system-end-of-life/" />
<category term='linux'></category>
<category term='platform'></category>
<summary>
Beginning with Jenkins 2.407, May 30, 2023 and Jenkins 2.401.2, June 28, 2023, Jenkins administrators will be warned if they are running Jenkins on an operating system that is within 6 months of its end of life date.


The warning includes the date when Jenkins will no longer be supported on that operating system version.
It advises the administrator to upgrade to a newer version of the operating system.







The Jenkins project does not support, test, or accept pull requests for operating systems that are no longer supported by their provider.
For more information, refer to our Linux support policy.




Red Hat Enterprise Linux 7...
</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;Beginning with Jenkins 2.407, May 30, 2023 and Jenkins 2.401.2, June 28, 2023, Jenkins administrators will be warned if they are running Jenkins on an operating system that is within 6 months of its &lt;a href=&quot;https://endoflife.date/&quot;&gt;end of life date&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The warning includes the date when Jenkins will no longer be supported on that operating system version.
It advises the administrator to upgrade to a newer version of the operating system.&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/2023/05/30/operating-system-end-of-life-monitor.png&quot; alt=&quot;Operating system end of life warning&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project does not support, test, or accept pull requests for operating systems that are no longer supported by their provider.
For more information, refer to our &lt;a href=&quot;https://www.jenkins.io/doc/book/platform-information/support-policy-linux/&quot;&gt;Linux support policy&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;red-hat-enterprise-linux-7-and-derivatives&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#red-hat-enterprise-linux-7-and-derivatives&quot; /&gt;Red Hat Enterprise Linux 7 and derivatives&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://www.redhat.com/&quot;&gt;Red Hat&lt;/a&gt; maintains &lt;a href=&quot;https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux&quot;&gt;Red Hat Enterprise Linux&lt;/a&gt; in accordance with the &lt;a href=&quot;https://access.redhat.com/support/policy/updates/errata&quot;&gt;Red Hat Enterprise Linux Life Cycle&lt;/a&gt;.
Red Hat Enterprise Linux 7 was initially released in 2014.
It has been a very popular operating system thanks to its stability and long support life.
That support life ends on June 30, 2024.
A &lt;a href=&quot;https://www.redhat.com/en/blog/end-maintenance-red-hat-enterprise-linux-7-almost-here&quot;&gt;Red Hat blog post&lt;/a&gt; provides more details on the upcoming end of life.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Derivatives of Red Hat Enterprise Linux 7 like CentOS Linux 7, Scientific Linux 7, and Oracle Linux 7 will also no longer be supported after June 30, 2024.
A &lt;a href=&quot;https://blog.centos.org/2023/04/end-dates-are-coming-for-centos-stream-8-and-centos-linux-7/&quot;&gt;CentOS project blog post&lt;/a&gt; shares their announcement of end of life.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Amazon Linux 2 is also a derivative of Red Hat Enterprise Linux 7.
It will no longer be supported by Amazon after June 30, 2025.
The &lt;a href=&quot;https://aws.amazon.com/amazon-linux-2/faqs/&quot;&gt;Amazon Linux 2 FAQs&lt;/a&gt; share more details on Amazon Linux 2 end of life.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has decided to end its support of Red Hat Enterprise Linux 7 and its derivatives in late 2023.
After &lt;strong&gt;Nov 16, 2023&lt;/strong&gt;, the Jenkins project will no longer support running Jenkins on Red Hat Enterprise Linux 7 or any of its derivatives.
Jenkins container images based on CentOS 7 will no longer be supported after &lt;strong&gt;Nov 16, 2023&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users should replace their Red Hat Enterprise Linux 7 installations with another operating system.
If they prefer to continue with Red Hat or one of its derivatives, they have many alternatives, including:&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://access.redhat.com/products/discover-red-hat-enterprise-linux/&quot;&gt;Red Hat Enterprise Linux&lt;/a&gt; 8 or 9&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://almalinux.org/&quot;&gt;AlmaLinux&lt;/a&gt; 8 or 9&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://rockylinux.org/&quot;&gt;Rocky Linux&lt;/a&gt; 8 or 9&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.oracle.com/linux/&quot;&gt;Oracle Linux&lt;/a&gt; 8 or 9&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;fedora-linux-36&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fedora-linux-36&quot; /&gt;Fedora Linux 36&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://fedoraproject.org/&quot;&gt;Fedora project&lt;/a&gt; maintains releases of Fedora Linux according the their &lt;a href=&quot;https://docs.fedoraproject.org/en-US/releases/lifecycle/&quot;&gt;release life cycle&lt;/a&gt;.
Fedora 36 reached end of life May 16, 2023.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users should upgrade their Fedora Linux 36 to Fedora Linux 37 or Fedora Linux 38.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ubuntu-linux-18-04&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ubuntu-linux-18-04&quot; /&gt;Ubuntu Linux 18.04&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://canonical.com/&quot;&gt;Canonical&lt;/a&gt; maintains &lt;a href=&quot;https://ubuntu.com/&quot;&gt;Ubuntu Linux&lt;/a&gt; in accordance with the &lt;a href=&quot;https://ubuntu.com/about/release-cycle&quot;&gt;Ubuntu lifecycle and release cadence&lt;/a&gt;.
Ubuntu 18.04 reaches its end of standard support on May 31, 2023.
The &lt;a href=&quot;https://ubuntu.com/blog/18-04-end-of-standard-support&quot;&gt;Ubuntu blog&lt;/a&gt; shares more details of the end of life and alternatives for users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users should upgrade their Ubuntu Linux 18.04 to Ubuntu Linux 20.04 or Ubuntu Linux 22.04.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;alpine-linux-3-14&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#alpine-linux-3-14&quot; /&gt;Alpine Linux 3.14&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alpine Linux 3.14 reached its end of support on May 1, 2023
The &lt;a href=&quot;https://alpinelinux.org/releases/&quot;&gt;Alpine releases page&lt;/a&gt; describes their support policy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users should upgrade their Alpine Linux 3.14 to Alpine Linux 3.15, Alpine Linux 3.16, Alpine Linux 3.17, or Alpine Linux 3.18.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/05/26/ash-sxn-introduction-blog-post/</id>
<title>Introducing Ashutosh Saxena as the GSoC 2023 Contributor Working on Docker Based Jenkins Quickstart Examples</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/26/ash-sxn-introduction-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='docker'></category>
<summary>
Hello, Jenkins community! I am really excited to be a GSoC 2023 contributor for Docker-based Jenkins quickstart examples project. In this blog post, I will take you through the details of the project in the following:


Project Description


The Docker-based Jenkins Quickstart Examples project aims to provide a quick and easy way for users to get started with Jenkins using Docker.
By providing user-friendly Docker Compose files and updating the documentation, we make it simple for beginners to set up Jenkins and start exploring its features.
These files will be regularly tested on ci.jenkins.io to ensure reliability and functionality.
The Pipeline Steps doc generator will...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello, Jenkins community! I am really excited to be a GSoC 2023 contributor for Docker-based Jenkins quickstart examples project. In this blog post, I will take you through the details of the project in the following:&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;The Docker-based Jenkins Quickstart Examples project aims to provide a quick and easy way for users to get started with Jenkins using Docker.
By providing user-friendly Docker Compose files and updating the documentation, we make it simple for beginners to set up Jenkins and start exploring its features.
These files will be regularly tested on &lt;code&gt;ci.jenkins.io&lt;/code&gt; to ensure reliability and functionality.
The Pipeline Steps doc generator will be used to maintain up-to-date documentation, and Gitpod will facilitate quickstart with a &lt;code&gt;.gitpod.yml&lt;/code&gt; file running &lt;code&gt;docker-compose&lt;/code&gt; commands, enabling easy preview of Jenkins instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our goal is to enhance the user experience and make it more seamless and efficient for users to become familiar with Jenkins using Docker.
The current quickstart process with Jenkins using the existing Docker examples can be complex and challenging for new users, with lots of &lt;code&gt;docker&lt;/code&gt; commands to follow and hard-to-understand documentation.
This project aims to address these issues and make it easier for users to get started with Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More info can be found &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/docker-compose-build/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;introduction&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introduction&quot; /&gt;Introduction&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am an IT undergraduate from India, I just gave my second year exams so I’ll be a third year student after this summer.
I have a keen interest in DevOps and Cybersecurity. I heard of open source in my freshman year and loved the Idea of free and open software for all.&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;why-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-jenkins&quot; /&gt;Why Jenkins?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I got to know of Jenkins while I was learning DevOps and after learning about Open Source I was eager to start contributing and be a part of a community.
And Jenkins was built on Java which was the first language that I have learned. So I started to look into the Jenkins community.
In the beginning, I couldn’t understand much about the issues and that’s where Hacktoberfest came into the picture.
It was the push that I needed to submit my first PR, and I also got a T-shirt from the participation too.
During Hacktoberfest the playlist about modernizing jenkins plugins by &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/darinpope&quot;&gt;Darin Pope&lt;/a&gt; was really helpful.
After that I saw a post about Jenkins participating in GSoC 2023.
That’s when I started to look into GSoC, and during preparation of the GSoC proposal the community helped me a lot and nudged me in the right direction to learn new things and reviewed my proposal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;engaging-with-the-community&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#engaging-with-the-community&quot; /&gt;Engaging with the community&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I plan to give my all this summer to complete GSoC successfully and learn a lot of new things from the community, especially the communication part as I am not that good at it. I’ll give my all.
And I hope that my contribution this summer can have a positive impact on the community.
How I’d plan to be a part of community after GSoC:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I’d like to participate in events like Hacktoberfest to help others become part of the community.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I’d like to work on my original goal of improving my Java skills through contributions to the Jenkins core.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I’d like to adopt a plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I’d like to participate in GSoC as a mentor in the future from Jenkins.&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;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;I want to thank the community for selecting me for GSoC 2023 and helping me to prepare for it. And special thanks to my mentors for giving their precious time and mentoring me this summer.
I hope my contributions will be a useful addition to Jenkins.
I’m looking forward to working with you all this summer!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/05/25/github-sponsors-jenkinsci-org/</id>
<title>GitHub sponsors the Jenkins project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/25/github-sponsors-jenkinsci-org/" />
<category term='jenkins'></category>
<category term='sponsor'></category>
<category term='github'></category>
<summary>
The Jenkins project has used GitHub since 2007.
GitHub has been our source code hosting and management platform for almost as long as Jenkins has existed.
Jenkins core and all its plugins live on GitHub.







We are pleased to announce that GitHub sponsors the jenkinsci GitHub organization with enterprise features, such as autolink references.


If you are a Jenkins plugin maintainer, you can now use autolink references to link to Jenkins Jira issues.
All you need to do is heading to the "Settings" tab of your GitHub repository and add the following configuration to the "Autolink references" section:



Numeric
Reference prefix: JENKINS-
Target URL: https://issue-redirect.jenkins.io/issue/&lt;num&gt;



We&#8217;re deeply grateful to...
</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;The Jenkins project has used &lt;a href=&quot;http://github.com/&quot;&gt;GitHub&lt;/a&gt; since 2007.
GitHub has been our source code hosting and management platform for almost as long as Jenkins has existed.
&lt;a href=&quot;https://github.com/jenkinsci/jenkins&quot;&gt;Jenkins core&lt;/a&gt; and all its plugins live on GitHub.&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/2023/05/25/2023-05-25-github-sponsors-jenkinsci-org.png&quot; alt=&quot;GitHub sponsors Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are pleased to announce that GitHub sponsors the &lt;a href=&quot;https://github.com/jenkinsci/jenkins&quot;&gt;&lt;code&gt;jenkinsci&lt;/code&gt;&lt;/a&gt; GitHub organization with enterprise features, such as &lt;a href=&quot;https://docs.github.com/en/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/configuring-autolinks-to-reference-external-resources&quot;&gt;autolink references&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are a Jenkins plugin maintainer, you can now use autolink references to link to Jenkins Jira issues.
All you need to do is heading to the &quot;Settings&quot; tab of your GitHub repository and add the following configuration to the &quot;Autolink references&quot; section:&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;Numeric
Reference prefix: JENKINS-
Target URL: https://issue-redirect.jenkins.io/issue/&amp;lt;num&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re deeply grateful to GitHub for their support of open source software and especially for their support of the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-jenkins-project-by-numbers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-jenkins-project-by-numbers&quot; /&gt;The Jenkins project by numbers&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/jenkinsci&quot;&gt;jenkinsci&lt;/a&gt; GitHub organization hosts over 2,600 repositories.
These repositories are the home of:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1,000,000+ Lines of Code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;130,000+ Pull requests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;20,000+ Issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2,500+ organization members&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;and countless contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We truly thank GitHub for their sponsorship of the Jenkins 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/2023/05/22/jagruti-introduction-blog-post/</id>
<title>Introducing Jagruti Tiwari as the GSoC 2023 Contributor Working on Adding Probes to Plugin Health Scoring System</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/22/jagruti-introduction-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='healthscore'></category>
<category term='probes'></category>
<category term='plugin'></category>
<summary>
Background


I started contributing to open-source projects in Jan 2022. I tried setting up well-known projects like Django, Brave browser, and Chromium but failed miserably. I didn’t know that open source is not about projects but about community. Gradually I stumbled upon freeCodeCamp. That’s where I wrote my first test case and fixed minor bugs. I gained the confidence to continue contributing to open source.


Two months later it was time for GSoC. I started late but wanted to make it anyhow. OpenFoodFacts turned out to be the best-suited project for me. I did not make it to GSoC 2022 but built...
</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/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;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started contributing to open-source projects in Jan 2022. I tried setting up well-known projects like Django, Brave browser, and Chromium but failed miserably. I didn’t know that open source is not about projects but about community. Gradually I stumbled upon &lt;a href=&quot;https://www.freecodecamp.org/&quot;&gt;freeCodeCamp&lt;/a&gt;. That’s where I wrote my first test case and fixed minor bugs. I gained the confidence to continue contributing to open source.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Two months later it was time for GSoC. I started late but wanted to make it anyhow. &lt;a href=&quot;https://world.openfoodfacts.org/&quot;&gt;OpenFoodFacts&lt;/a&gt; turned out to be the best-suited project for me. I did not make it to GSoC 2022 but built a lifelong relationship with the mentors. They groomed, tutored, and mentored me. They made me the open-source contributor I am today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;education-and-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#education-and-work&quot; /&gt;Education and Work&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hold a master’s degree in computer application. I work at one of the reputed organizations in India as a Senior Project Engineer. My total work experience is around 4 years.&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;why-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-jenkins&quot; /&gt;Why Jenkins?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have worked for the longest time in Java. I was looking to contribute to Java projects during Hacktoberfest 2022. It was a weekend when the fest started. I decided to give a try to a project that seems difficult from the outside. I commented on different issues and asked for guidance and explanation. That’s when Mark Waite came to the rescue. He was my mentor throughout. After making a couple of documentation fixes I remember writing a simple test to test a constructor. He showed me how it could be done. The next day I remember bragging to my colleagues about contributing to Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few days later Jean-March Meessen set up a call with me. He asked about my experience in open source, contributing to Jenkins, what I do, my future open-source plans, etc. When the call ended I wanted to be a part of a community where there are more people like him.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-plugin-health-scoring-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-plugin-health-scoring-system&quot; /&gt;Why Plugin Health Scoring System?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After Hacktoberfest, I contributed to different plugins. Modernized them, fixed minor bugs, wrote test cases, etc. When Jenkins&#39; ideas list for GSoC 2023 was out, I tried contributing to a couple of projects in the list. Projects required skills like ReactJs, Antora, and Docker. I found I was short of time to pick those skills and make an attempt to write a decent proposal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I made my first PR to Plugin Health Scoring System. It was merged in 3-4 days. This was my fastest merged PR. I understood Adrien’s instructions and did not stray from the solution. This gave me the confidence to apply to Plugin Health Score for GSoC 2023. Once the PR was merged, I asked the community if I should work on the proposal or make more contributions. Mentors unanimously suggested it’s time I start with the proposal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started with the daft proposal in Feb 2023. After multiple rounds of review until the last submission date, I always thought I should add something more to make it slightly better.&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-will-the-community-benefit-from-my-gsoc-contribution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-will-the-community-benefit-from-my-gsoc-contribution&quot; /&gt;How will the community benefit from my GSoC contribution&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My project is titled “Adding Probes to Plugin Health Score”. As the title suggests I have proposed to add as many probes as possible to determine a plugin’s health.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-are-probes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-are-probes&quot; /&gt;What are &lt;code&gt;probes&lt;/code&gt;?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Probes are nothing but data that compute the health score of the plugin. The score is computed based on the data collected by the probe. Based on this score, the future contributors and maintainers, adopters decide which plugin they want to invest their time in.&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-will-i-do-during-this-gsoc-period&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-will-i-do-during-this-gsoc-period&quot; /&gt;What will I do during this GSoC period?&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;Designing the probes&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;Identify the key features and functionality of the plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Define the metrics that would contribute to the Plugin Health Score.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The more probe criteria the plugin meets, the higher the health score of the plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deciding the probe’s interaction with other probes&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;Decide the order in which a probe should be executed by the scheduler (Which probe should be executed first, second, and so on).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Determining how the probe would contribute to the score&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;Give each probe a weightage (coefficient).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the probe criteria are met with a plugin. Increase the score of the plugin. Otherwise, leave the score as it is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If a probe weight is negative, adding the negative value will decrease the score; eventually decreasing the health of the plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding unit test cases for each probe and scoring implementation. If time permits, I will add some integration test cases too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Delivering 10 new probes to the Plugin Health Scoring System.&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;These probes will contribute to calculating the overall health of a plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;By the time the project ends, the tool will approximately have 24 probes in all (10 new + 14 existing probes)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;links-for-more-information&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links-for-more-information&quot; /&gt;Links for more information&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sharing a few links so that everyone is abreast of my progress throughout the GSoC period.&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/2023/projects/add-probes-to-plugin-health-score/&quot;&gt;Adding Probes to Plugin Health Score project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://drive.google.com/file/d/1VEd-RDpJglWMMZApkQ0cn3Xujfj4sXW6/view?pli=1&quot;&gt;My GSoC project proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1QcwSiAuQtoy4dGlPXgY3w8FjDzTJn-3yCv75U-OFJ04/edit#heading=h.u6412d3y060g&quot;&gt;Meeting notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/jagruti-tiwari/&quot;&gt;My LinkedIn profile&lt;/a&gt; in case someone wants to know more about me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_GSoC-Plugin_Health_Score:gitter.im&quot;&gt;Gitter channel&lt;/a&gt; or &lt;a href=&quot;https://community.jenkins.io/&quot;&gt;community.jenkins.io&lt;/a&gt; for question(s) or feedback.&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;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;The GSoC Community Bonding period will end next week. I have attended two project meetings until now and am on the threshold of completing my first probe as a GSoC contributor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2022, &lt;a href=&quot;https://opensource.googleblog.com/2021/11/expanding-google-summer-of-code-in-2022.html&quot;&gt;GSoC opened doors for every interested contributor&lt;/a&gt;. Irrespective of the fact whether they are a student, working professional, or a self-learner. I plan to make the best use of the opportunity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I wish to stay with the community long after GSoC. Hope to have their guidance and support as always.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/05/18/harsh-ps-2003-introduction-blog-post/</id>
<title>Introducing Harsh Pratap Singh as the GSoC 2023 Contributor working on GitLab Plugin Modernization</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/18/harsh-ps-2003-introduction-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='plugins'></category>
<category term='gitlab'></category>
<summary>
This is Harsh Pratap Singh, an Open source enthusiast, who is currently in his freshman year exploring different technologies related to DevSecOps and Blockchain.
I am curious and passionate about automation thus Jenkins is my goto Open Source organization for Google Summer of Code.
This is my first time contributing to Open Source and I am already loving it.
I am fortunate enough to get selected in Google Summer of Code 2023 and I am looking forward to a thrilling summer.


About the Project


I will be working on GitLab Plugin Modernization project which primarily aims to replace the use of old RESTEasy with modern...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is Harsh Pratap Singh, an Open source enthusiast, who is currently in his freshman year exploring different technologies related to DevSecOps and Blockchain.
I am curious and passionate about automation thus Jenkins is my goto Open Source organization for Google Summer of Code.
This is my first time contributing to Open Source and I am already loving it.
I am fortunate enough to get selected in Google Summer of Code 2023 and I am looking forward to a thrilling summer.&lt;/p&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;I will be working on GitLab Plugin Modernization project which primarily aims to replace the use of old RESTEasy with modern GitLab4J-API library via the GitLab API Jenkins library plugin.
After this migration, the Jenkins Community will experience improved performance, better maintenance and support, and increased functionality and flexibility in the Gitlab-Plugin.
I am optimistic and excited to collaborate with the Jenkins community and learn from the experienced mentors and community members for successful completion of the Project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more details related to the project, you can refer to the
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/gitlab-plugin-modernization/&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;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;I want to express by gratitude towards my mentors and org admins for their constant guidance and support.
I sincerely hope that I will be able to help Jenkins community prosper with my contributions and create a positive impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please feel free to reach out through &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gitlab-plugin:gitter.im&quot;&gt;gitter&lt;/a&gt; or &lt;a href=&quot;https://community.jenkins.io/&quot;&gt;community channels&lt;/a&gt; for fruitful discussions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to a great Summer!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/05/17/vandit1604-introduction-blog-post/</id>
<title>Introducing Vandit Singh as the GSoC 2023 Contributor Working on Building Jenkins.io with Alternative Tools</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/17/vandit1604-introduction-blog-post/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<summary>
Dear Jenkins Community,


I am thrilled to have this opportunity to introduce myself as the Google Summer of Code (GSoC) 2023 contributor who will be working on the exciting project of "Building jenkins.io with alternative tools".
I am genuinely excited to join this vibrant community and contribute to the development of Jenkins, a widely adopted and powerful automation server.


Project Description/Motivation:


The project I will be working on aims to generate the existing Jenkins.io website using alternative tools like Antora and Gatsby.
The primary goal of this project is to make the Jenkins user documentation Product Version Bound.
Both tools are used for site generation however...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dear Jenkins Community,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am thrilled to have this opportunity to introduce myself as the Google Summer of Code (GSoC) 2023 contributor who will be working on the exciting project of &quot;Building jenkins.io with alternative tools&quot;.
I am genuinely excited to join this vibrant community and contribute to the development of Jenkins, a widely adopted and powerful automation server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-descriptionmotivation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-descriptionmotivation&quot; /&gt;Project Description/Motivation:&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project I will be working on aims to generate the existing Jenkins.io website using alternative tools like Antora and Gatsby.
The primary goal of this project is to make the Jenkins user documentation Product Version Bound.
Both tools are used for site generation however we will be using Antora for most parts of the site as its best fits our current needs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&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;Let me take a moment to introduce myself.
My name is Vandit Singh, and I am an aspiring software developer from India with a passion for automation and continuous integration/continuous delivery (CI/CD) practices.
I have a strong interest in Java, DevOps and Web, and I am eager to leverage my skills to have a fruitful summer under Google Summer of Code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout my academic journey, I have realized the tremendous potential of automation in streamlining software development processes.
My exposure to Jenkins, both as a user and an admirer of its capabilities, has inspired me to become an active contributor to its growth and evolution.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;plans-for-the-near-future&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plans-for-the-near-future&quot; /&gt;Plans for the Near Future:&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I embark on this GSoC journey, I have laid out some plans for the initial phase of the project before the mid-term evaluations.
Firstly, I will focus on developing a prototype of jenkins.io with Antora with Versioned User Documentation.
After that developer documentation will be non-versioned and at last blogs will be generated with Gatsby.
For more details, you can refer to the
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/projects/alternative-jenkinsio-build-tool/&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In parallel, I will collaborate with the Jenkins community to gather feedback and suggestions on the existing Jenkins.io structure.
By understanding the needs and pain points of the community, I aim to enhance the user experience and ensure that the alternative tools project aligns seamlessly with the existing content and architecture and enhances UI/UX in some way.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;technical-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#technical-details&quot; /&gt;Technical Details:&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From a technical perspective, my work will involve tools that are used to generate static sites.
This may include solutions like
&lt;a href=&quot;https://antora.org/&quot;&gt;Antora&lt;/a&gt;
and
&lt;a href=&quot;https://www.gatsbyjs.com/&quot;&gt;Gatsby&lt;/a&gt;,
with a focus on maintaining the current theme and layout.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout the GSoC period, I am eager to collaborate with the Jenkins community, engage in discussions, and learn from the experienced members who have been instrumental in shaping Jenkins into the remarkable tool it is today.
I genuinely believe that this project will be a collective effort, and I am excited to collaborate and contribute in a meaningful way.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;in-closing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#in-closing&quot; /&gt;In Closing:&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I embark on this incredible journey as a GSoC 2023 contributor, I would like to express my gratitude to the Jenkins community for giving me this opportunity.
I am honoured to be part of a community that fosters innovation and promotes open-source collaboration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am filled with a sense of enthusiasm and anticipation as I dive into the project and get to know the community better.
Together, we can unlock new possibilities and ensure that Jenkins remains at the forefront of continuous integration and delivery.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please stay tuned for updates and feel free to reach out to me via the Jenkins community channels.
Your guidance, feedback, and support are invaluable as I work towards building a more vibrant and resourceful jenkins.io.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you all for your warm welcome, and here’s to an exciting and fruitful GSoC.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/05/16/jenkins-2023-award-winners/</id>
<title>Jenkins 2023 Contributor Award Winners</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/16/jenkins-2023-award-winners/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='awards'></category>
<category term='cdcon'></category>
<category term='cdf'></category>
<summary>
At cdCon last week in Vancouver, May 8–9, the Jenkins Contributor Award winners were announced along with fifteen (15) other CDF Award winners.
This is an annual award program where Jenkins contributors are nominated and voted by their peers within the Jenkins community.


Thank you to everyone who nominated and voted and to CDF for hosting this program.  And special thanks to all of the Jenkins nominees, the project is in a better place because of you!


The Jenkins project has three award categories: Most Valuable Advocate, Security MVP, and Most Valuable Contributor.
Congratulations to this year’s winners! Your hard work and leadership...
</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/2023/05/16/2023-05-16-jenkins-2023-award-winners/image4.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;326&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At cdCon last week in Vancouver, May 8–9, the Jenkins Contributor Award winners were announced along with fifteen (15) other &lt;a href=&quot;https://cd.foundation/blog/2023/05/10/congratulations-to-the-2023-cdf-community-award-winners/&quot;&gt;CDF Award winners&lt;/a&gt;.
This is an annual award program where Jenkins contributors are nominated and voted by their peers within the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to everyone who nominated and voted and to CDF for hosting this program.  And special thanks to all of the &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScUL4GAL-6wOjHKbT86ptKSStnglKM9_MKTQXzjgwimCDEtGw/viewform&quot;&gt;Jenkins nominees&lt;/a&gt;, the project is in a better place because of you!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has three award categories: Most Valuable Advocate, Security MVP, and Most Valuable Contributor.
Congratulations to this year’s winners! Your hard work and leadership are what makes this community thrive and the advancement of the Jenkins project possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And the 2023 Jenkins Contributor Award honorees 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/post-images/2023/05/16/2023-05-16-jenkins-2023-award-winners/image3.png&quot; alt=&quot;image&quot; width=&quot;78&quot; height=&quot;78&quot; /&gt; &lt;strong&gt;Security MVP: &lt;a href=&quot;https://www.jenkins.io/blog/authors/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the Jenkins code scanning tooling project he started and went to GA recently, his never-ending improvements on the security documentation for jenkins.io, 50+ vulnerabilities reported by Daniel that were published during last year.
And his continuous effort to ensure the update center is stable and secure.&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/janfaracik.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://www.jenkins.io/blog/authors/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In honor of the work that he’s done to refine and improve the look and feel of Jenkins.
He’s successfully implemented major changes to the Jenkins user interface, removed outdated components, and advanced the state of the Jenkins user experience.&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/markewaite.jpg&quot; alt=&quot;image&quot; width=&quot;99&quot; height=&quot;109&quot; /&gt; &lt;strong&gt;Most Valuable Advocate: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the tremendous work he has done on all the Jenkins media (Gitter, discourse, etc.), the numerous PR reviews, the YouTube videos with Darin Pope, the SIG he runs or attends to…
Well, too much to list.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;The award ceremony at cdCon was filmed and we will link the video here as soon as it’s available.&lt;/em&gt;&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/2023/05/12/removing-prototype-from-jenkins/</id>
<title>Removing Prototype from Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/12/removing-prototype-from-jenkins/" />
<author>
<name>basil</name>
</author>
<category term='announcement'></category>
<category term='developer'></category>
<category term='jenkins'></category>
<summary>
Summary


Usage of the Prototype JavaScript framework has been deprecated in recent versions of Jenkins core and will be removed completely in the future.
Plugin developers should prepare for this transition by removing usages of Prototype and testing with Prototype removed.




Motivation


Prototype was created by Sam Stephenson in February 2005 as part of Ajax support in Ruby on Rails.
While it was considered a major advance at the time, it has now fallen out of favor due to its invasive modifications to standard JavaScript functionality.
At this point in time, all Prototype features have native equivalents in the Web Platform.
Moreover, the very presence of Prototype&#8217;s...
</summary>
<content type='html'>
&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;Usage of the &lt;a href=&quot;http://prototypejs.org/&quot;&gt;Prototype&lt;/a&gt; JavaScript framework has been deprecated in recent versions of Jenkins core and will be removed completely in the future.
Plugin developers should prepare for this transition by removing usages of Prototype and testing with Prototype removed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;motivation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#motivation&quot; /&gt;Motivation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Prototype was created by Sam Stephenson in February 2005 as part of &lt;a href=&quot;https://en.wikipedia.org/wiki/Ajax_(programming)&quot;&gt;Ajax&lt;/a&gt; support in &lt;a href=&quot;https://rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt;.
While it was considered a major advance at the time, it has now fallen out of favor due to its invasive modifications to standard JavaScript functionality.
At this point in time, all Prototype features have native equivalents in the &lt;a href=&quot;https://developer.mozilla.org/&quot;&gt;Web Platform&lt;/a&gt;.
Moreover, the very presence of Prototype’s invasive modifications actively causes compatibility problems with modern JavaScript libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Worse, core currently uses a patched version of Prototype &lt;a href=&quot;https://github.com/prototypejs/prototype/releases/tag/1.7&quot;&gt;1.7&lt;/a&gt;, released on November 15, 2010.
The latest version is &lt;a href=&quot;https://github.com/prototypejs/prototype/releases/tag/1.7.3&quot;&gt;1.7.3&lt;/a&gt;, released on September 22, 2015.
When an attempt was made to upgrade to 1.7.3 in 2018 in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/49319&quot;&gt;JENKINS-49319&lt;/a&gt;, the change had to be reverted.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Clearly the status quo is unsustainable.
For these reasons, we have been working to remove Prototype from the Jenkins ecosystem in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/70906&quot;&gt;JENKINS-70906&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;testing-core-and-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-core-and-plugins&quot; /&gt;Testing core and plugins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of Jenkins 2.404, a user experimental flag has been added to remove Prototype.
The flag can be enabled or disabled on a per-user basis and removes Prototype from all Jenkins UI pages.
The flag is intended to be used by core and plugin developers to do testing with Prototype removed.
To enable the flag, go to the &lt;strong&gt;Configure&lt;/strong&gt; page for your user in 2.404 or later, scroll to the &lt;strong&gt;Experiments&lt;/strong&gt; section at the bottom, and enable the flag.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of Jenkins 2.404, most usages of Prototype have been removed from core, and even more will be removed by 2.405.
We anticipate that all core usages of Prototype will be removed in a forthcoming weekly release.
At that point, the focus will shift to removing Prototype usages from plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To test with Prototype removed, enable the user experimental flag and watch the browser console log for error messages as you exercise various pieces of JavaScript code.
If an error occurs with Prototype removed but does not occur with Prototype present, you have found code that needs to be adapted.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;adapting-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adapting-plugins&quot; /&gt;Adapting plugins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When adapting plugins, first ensure that the plugin is using plugin parent POM &lt;a href=&quot;https://github.com/jenkinsci/plugin-pom/releases/tag/plugin-4.58&quot;&gt;4.58&lt;/a&gt; or greater.
This contains an update to support the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API&quot;&gt;Fetch API&lt;/a&gt; in the &lt;a href=&quot;https://htmlunit.org/&quot;&gt;HtmlUnit&lt;/a&gt; browser used by the test harness.
Without this, you will likely see errors concerning the Fetch API in HtmlUnit tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next thing to do is search for common Prototype usages and convert them to native JavaScript APIs.
The following command attempts to search for some common usages in views:&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;find &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-type&lt;/span&gt; f &lt;span class=&quot;se&quot;&gt;\(&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-name&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;*.groovy&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-name&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;*.jelly&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-name&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;*.js&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\)&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-exec&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-HnE&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;\.each\(|Object\.toJSON|Prototype\.Selector|\$\$\(|\$\(|\$A|\$F|\.on\(|\.observe\(|\.fire\(|Form\.getInputs|Element\.stopObserving|\.getElementsBySelector\(|\.insert\(|\.removeClassName\(|\.addClassName\(|\.hasClassName\(|\.nextSiblings\(|\.firstDescendant\(|\.previous\(|\.up\(|\.down\(|\.next\(|\.childElements\(|\.escapeHTML\(|\.show\(\)|\.hide\(\)|\.getStyle\(|\.setStyle\(|\.setOpacity\(|\.getResponseHeader\(|Ajax\.Request|Ajax\.Updater|Ajax\.PeriodicalUpdater&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;se&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 neither an exhaustive list, nor is it guaranteed to be free from false positives.
But it is a good place to start.
Below I will give some examples of common usages and their recommended replacements.
When in doubt, consult the &lt;a href=&quot;http://api.prototypejs.org/&quot;&gt;Prototype API documentation&lt;/a&gt; for information about the old usage,
and consult the &lt;a href=&quot;https://developer.mozilla.org/&quot;&gt;Web Platform&lt;/a&gt; documentation for information about recommended replacements.
Keep in mind that script could find false positives as &lt;code&gt;$&lt;/code&gt; is used in both prototype.js and jQuery.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you have removed the usage of Prototype, test your plugin both with and without the user experimental flag enabled.
If the line you have changed works with and without Prototype (as verified by stepping into the line with the browser’s JavaScript debugger), then you are ready to merge and release the change.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;cheat-sheet&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cheat-sheet&quot; /&gt;Cheat sheet&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following are my rough and unpolished notes from doing this conversion a few dozen times.
This is a good place to start, but it is not an exhaustive list of changes that need to be made.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;general-changes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#general-changes&quot; /&gt;General changes&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Replace any usages of &lt;code&gt;.each&lt;/code&gt; with &lt;code&gt;.forEach&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the argument to the Prototype $ function is a string, then replace it with &lt;code&gt;document.getElementById&lt;/code&gt;.
For example, replace $(&quot;my-id&quot;) with &lt;code&gt;document.getElementById(&quot;my-id&quot;)&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the argument to the Prototype $ function is an &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Element&quot;&gt;&lt;code&gt;Element&lt;/code&gt;&lt;/a&gt;, then simply remove the call to the Prototype $ function.
For example, replace $(element) with &lt;code&gt;element&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Prototype double dollar-sign function should be replaced with either &lt;code&gt;document.querySelector&lt;/code&gt; or &lt;code&gt;document.querySelectorAll&lt;/code&gt;, depending on whether the first result or all results are required.
Also be on the lookout for usages of &lt;code&gt;Prototype.Selector.find&lt;/code&gt; and &lt;code&gt;Prototype.Selector.select&lt;/code&gt;, which can also be replaced by query selectors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Prototype $A function should be replaced with &lt;code&gt;Array.from&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;class-names&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#class-names&quot; /&gt;Class names&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next most common set of issues is regarding class names.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.hasClassName(&quot;my-class&quot;)&lt;/code&gt; with &lt;code&gt;element.classList.contains(&quot;my-class&quot;)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Similarly, replace e.g. &lt;code&gt;element.removeClassName(&quot;my-class&quot;)&lt;/code&gt; with &lt;code&gt;element.classList.remove(&quot;my-class&quot;)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Similarly, replace e.g. &lt;code&gt;element.addClassName(&quot;my-class&quot;)&lt;/code&gt; with &lt;code&gt;element.classList.add(&quot;my-class&quot;)&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;One caveat here is that the Prototype versions of these functions can accept a space-separated string of multiple class names;
the native JavaScript versions do not accept this and instead require you to iterate over each class name.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;element-manipulation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#element-manipulation&quot; /&gt;Element manipulation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next most common set of issues is regarding element manipulation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.childElements()&lt;/code&gt; with &lt;code&gt;element.children&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.down()&lt;/code&gt; with &lt;code&gt;element.firstElementChild&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.firstDescendant()&lt;/code&gt; with &lt;code&gt;element.firstElementChild&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.next()&lt;/code&gt; with &lt;code&gt;element.nextElementSibling&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.previous()&lt;/code&gt; with &lt;code&gt;element.previousElementSibling&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.setOpacity(0)&lt;/code&gt; with &lt;code&gt;element.style.opacity = 0&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.setStyle({foo: bar})&lt;/code&gt; with &lt;code&gt;element.style.foo = bar&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.show()&lt;/code&gt; with &lt;code&gt;element.style.display = &quot;&quot;&lt;/code&gt; and e.g. &lt;code&gt;element.hide()&lt;/code&gt; with &lt;code&gt;element.style.display = &quot;none&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.up(&quot;div&quot;)&lt;/code&gt; with &lt;code&gt;element.closest(&quot;div&quot;)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.up()&lt;/code&gt; with &lt;code&gt;element.parentNode&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace Prototype-based element creation with &lt;code&gt;document.createElement&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;Element.getElementsBySelector&lt;/code&gt; with &lt;code&gt;document.querySelector&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;Element.insert&lt;/code&gt; with &lt;code&gt;element.appendChild&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;Element.getStyle&lt;/code&gt; with &lt;code&gt;element.style&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;event-handling&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#event-handling&quot; /&gt;Event handling&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another common set of issues is regarding event handling.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;Element.observe(element, &quot;event&quot;, callback)&lt;/code&gt; with &lt;code&gt;element.addEventListener(&quot;event&quot;, callback)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.observe(&quot;event&quot;, callback)&lt;/code&gt; with &lt;code&gt;element.addEventListener(&quot;event&quot;, callback)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;Element.on(element, &quot;event&quot;, callback)&lt;/code&gt; with &lt;code&gt;element.addEventListener(&quot;event&quot;, callback)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;element.on(&quot;event&quot;, callback)&lt;/code&gt; with  &lt;code&gt;element.addEventListener(&quot;event&quot;, callback)&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;Element.stopObserving&lt;/code&gt; with &lt;code&gt;document.removeEventListener&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;Event.fire(element, &quot;event&quot;)&lt;/code&gt; with &lt;code&gt;element.dispatchEvent(new Event(&quot;event&quot;))&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace e.g. &lt;code&gt;Event.on(element, &quot;event&quot;, callback)&lt;/code&gt; with &lt;code&gt;element.addEventListener(&quot;event&quot;, callback)&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;json-strings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#json-strings&quot; /&gt;JSON strings&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Calls to &lt;code&gt;Object.toJSON&lt;/code&gt; are problematic.
They need to be converted to &lt;code&gt;JSON.stringify&lt;/code&gt; when Prototype is not present, but &lt;code&gt;JSON.stringify&lt;/code&gt; is actually broken when Prototype is present.
The recommendation is to use a conditional during the transition phase:&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;javascript&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// TODO simplify when Prototype.js is removed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toJSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Prototype.js&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;toJSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Standard&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&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;ajax-requests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ajax-requests&quot; /&gt;Ajax requests&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, the most difficult set of changes relates to Ajax requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anything that uses &lt;code&gt;Ajax.Request&lt;/code&gt;, &lt;code&gt;Ajax.Updater&lt;/code&gt;, or &lt;code&gt;Ajax.PeriodicalUpdater&lt;/code&gt; should be converted to using the Fetch API.
The best way to learn how to do this is to study the examples from recent core pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that &lt;code&gt;Ajax.Request&lt;/code&gt; defaults to POST requests, but the Fetch API defaults to GET requests.
If the original code did not specify a method, ensure you are still doing a POST request.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also note that the Jenkins version of Prototype automatically adds a crumb to POST requests; this must be done explicitly when using the Fetch API by adding a &lt;code&gt;Crumb&lt;/code&gt; header.
Core features a &lt;code&gt;crumb.wrap()&lt;/code&gt; method that takes an existing object (which may be empty) and adds the &lt;code&gt;Crumb&lt;/code&gt; header to it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;application/x-www-form-urlencoded&lt;/code&gt; parameters should be passed to the Fetch API in the body, but beware that HtmlUnit is not compatible with these.
Search core for &lt;code&gt;objectToUrlFormEncoded&lt;/code&gt; for a workaround.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Fetch API will return a response object.
If the original Prototype code used &lt;code&gt;onSuccess&lt;/code&gt;, you will need to check &lt;code&gt;response.ok&lt;/code&gt; before doing the action;
if the original Prototype code used &lt;code&gt;onCompletion&lt;/code&gt;, you can skip this check.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are checking the response for a header with &lt;code&gt;.getResponseHeader&lt;/code&gt; in Prototype, this will need to be replaced with &lt;code&gt;.headers.get&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have read this far, congratulations and good luck!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/05/10/jenkins-april-newsletter/</id>
<title>Jenkins April 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/10/jenkins-april-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Key Takeaways




There was one security advisory this month announcing vulnerabilities regarding Jenkins plugins.


Cloud Cost Controls with improved resource cleanups and VM usage optimization to face the increased rate of builds on ci.jenkins.io.


Thanks to DigitalOcean for their continued support and ($8,400 credit) sponsorship of Jenkins.


Ppc64le docker agent images are now available.


Jenkins at cdCon + GitOpsCon!







Contributed by: Wadeck Follonier


In April, there was one advisory regarding plugins published on April 12:




One coordinated effort related to improper masking of credentials.


14 plugins were impacted.


12 without fixes according to our documentation.







Contributed by: Mark Waite


The Chinese language Jenkins website is being retired.
Translation updates have not been made...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins April Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-takeaways&quot; /&gt;Key Takeaways&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;There was one security advisory this month announcing vulnerabilities regarding Jenkins plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cloud Cost Controls with improved resource cleanups and VM usage optimization to face the increased rate of builds on ci.jenkins.io.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thanks to DigitalOcean for their continued support and ($8,400 credit) sponsorship of Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ppc64le docker agent images are now available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins at cdCon + GitOpsCon!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In April, there was one advisory regarding plugins published on &lt;a href=&quot;https://www.jenkins.io/security/advisory/2023-04-12/&quot;&gt;April 12&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One coordinated effort related to improper masking of credentials.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;14 plugins were impacted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;12 without fixes according to our &lt;a href=&quot;https://www.jenkins.io/security/plugins/#unresolved&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Chinese language Jenkins website is being retired.
Translation updates have not been made in two years and users are perplexed when the installation instructions and other instructions are no longer correct.
The Chinese localization of Jenkins continues to be available, but the links to the Chinese website have been removed.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cloud Cost Controls with improved resource cleanups and VM usage optimization to face the increased rate of builds on ci.jenkins.io:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Decreased the AWS bill from $19,000 to $14,000, resulting in savings of $5,000.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Decreased the Azure bill by $2,000.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean gave $8,400 additional credits to the Jenkins project, for the infrastructure to sustain ci.jenkins.io increased build rate.
Thanks to DigitalOcean for their continued support!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ci.jenkins.io performance improved by getting rid of the JobConfigHistory plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Ubuntu &lt;code&gt;22.04&lt;/code&gt; upgrade campaign (&lt;code&gt;18.04&lt;/code&gt; is end-of-life in May 2023) is in progress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins LTS &lt;code&gt;2.387.2&lt;/code&gt; was deployed everywhere less than 48h after its release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;General availability of JDK &lt;code&gt;8u372-b07&lt;/code&gt;, &lt;code&gt;11.0.19+7&lt;/code&gt;, and &lt;code&gt;17.0.7+7&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prototyping Azure &lt;code&gt;arm64&lt;/code&gt; build agents is done, we can move forward to production for our internal usages first.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An accessibility assessment of Jenkins has been provided by Deutsche Telekom.
The assessment is being used by Cristina Pizzagalli and others to improve the Jenkins user experience for users with disabilities.
Contributors that are interested in helping with the accessibility improvements should include their comments on &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/71153&quot;&gt;JENKINS-71153&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mobile users of Jenkins will now see a card layout of the Jenkins user interface, thanks to work done by &lt;a href=&quot;https://www.jenkins.io/blog/authors/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Prototype.js JavaScript library that is widely used in Jenkins core and Jenkins plugins is being replaced.
Special thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault&quot;&gt;Alexander Brandes&lt;/a&gt;, and several others for their work replacing that library.
Contributors that would like to help with the JavaScript work are invited to assign themselves one of the issues listed in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/70906&quot;&gt;JENKINS-70906&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the course of April, the Jenkins platform saw several updates and improvements.
These improvements include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Digicert code signing for MSI installer and jar file was updated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The PGP signing key was updated for RPM and DEB packages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ppc64le: we’re almost at the end.
Thank you so much for your contributions &lt;a href=&quot;https://github.com/ksalerno99&quot;&gt;Kenneth&lt;/a&gt;!&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;docker-agent: &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/391&quot;&gt;PR&lt;/a&gt; merged.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;docker-ssh-agent: &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/220&quot;&gt;PR&lt;/a&gt; merged.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inbound-agent: &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/pull/339&quot;&gt;PR&lt;/a&gt; merged.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Controller &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/1586&quot;&gt;PR&lt;/a&gt; is also done, but not merged yet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Latest updates on the agent images:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ssh-agent &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/releases/tag/4.15.0&quot;&gt;release 4.15.0&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This includes updating Debian to &lt;code&gt;bullseye-20230411&lt;/code&gt; in &lt;code&gt;/17/8/11/bullseye&lt;/code&gt;. (&lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/234&quot;&gt;#234&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding &lt;code&gt;ppc64le&lt;/code&gt; support back into the Jenkins CI SSH agent Docker build. (&lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/220&quot;&gt;#220&lt;/a&gt;) &lt;a href=&quot;https://github.com/ksalerno99&quot;&gt;@ksalerno99&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now using Java &lt;code&gt;11.0.18&lt;/code&gt; (&lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/231&quot;&gt;#231&lt;/a&gt;) &lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;@MarkEWaite&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker-agent release &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/releases/tag/3107.v665000b_51092-8&quot;&gt;3107.v665000b_51092-8&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Upgrade of Arch Linux from &lt;code&gt;base-20230319.0.135218&lt;/code&gt; to &lt;code&gt;base-20230409.0.141585&lt;/code&gt; in &lt;code&gt;/11/archlinux&lt;/code&gt;. (&lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/402&quot;&gt;#402&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade of Debian from &lt;code&gt;bullseye-20230320&lt;/code&gt; to &lt;code&gt;bullseye-20230411&lt;/code&gt; in &lt;code&gt;11/17/bullseye&lt;/code&gt;. (&lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/403&quot;&gt;#403&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added &lt;code&gt;ppc64le&lt;/code&gt; support back into the Jenkins CI agent Docker build. (&lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/391&quot;&gt;#391&lt;/a&gt;) &lt;a href=&quot;https://github.com/ksalerno99&quot;&gt;@ksalerno99&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exposing the default image user to the environment variable user. (&lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/400&quot;&gt;#400&lt;/a&gt;) &lt;a href=&quot;https://github.com/dduportal&quot;&gt;@dduportal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt; is working on a &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/7913&quot;&gt;system&lt;/a&gt; that would warn when operating system end-of-life is approaching.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the course of April, there were 4 blog posts published, featuring seven different authors.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt; continues his series on building android apps in Jenkins.
As Google Summer of Code begins, we want to acknowledge and thank all of the applicants for their efforts.
Thanks to all of the continuing and new contributors, all of your work helps support both the Jenkins project and the Open-Source community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also want to thank DigitalOcean for their continued support and sponsorship of Jenkins.
They have provided us with an additional $8,400 credit as the Infrastructure team works on reducing bandwidth usage further.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Jenkins in Google Summer of Code (GSoC)&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had an unprecedented number of GSoC applicants interested in Jenkins this year.
The Jenkins project received over 60 proposals by the close of the application period.
Dedicated Jenkins mentors worked overtime and weekends to review and grade proposals within a two weeks period.
Many THANKS to the wonderful Jenkins mentors, this program isn’t possible without them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Best of luck to all GSoC participants!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Jenkins at cdCon + GitOpsCon&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;April was all about preparations for cdCon, which took place on May 8–9, 2023 in Vancouver, Canada as &lt;a href=&quot;https://events.linuxfoundation.org/cdcon-gitopscon/&quot;&gt;cdCon + GitOpsCon&lt;/a&gt;, co-organized with the &lt;a href=&quot;https://cncf.io/&quot;&gt;Cloud Native Computing Foundation (CNCF)&lt;/a&gt;.
Members of the Jenkins Governance Board, long-time Jenkins users and contributors &lt;a href=&quot;https://www.jenkins.io/blog/authors/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt; were in attendance.
Mark took part in the &lt;a href=&quot;https://sched.co/1Js9F&quot;&gt;Graduated Projects Keynote Panel&lt;/a&gt;, discussing Jenkins Community’s experiences with graduation and sharing his thoughts on why graduation matters for the community and users of Jenkins.
Recordings for the conference will be available in approximately two weeks, on the &lt;a href=&quot;https://www.youtube.com/channel/UC7HcWhSetq6nTlpMXPHKz_A&quot;&gt;CDF YouTube channel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to everyone who attended!&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/05/04/gsoc2023-projects-announcement/</id>
<title>Welcome Google Summer of Code 2023 Contributors!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/04/gsoc2023-projects-announcement/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
On behalf of the Jenkins GSoC org admin team and mentors,
we would like to welcome
Harsh Pratap Singh,
Jagruti Tiwari,
Vandit Singh, and
Ashutosh Saxena.
They will be working on Google Summer of Code projects in the Jenkins organization,
and they have already done some contributions.


This year we have the following projects:




GitLab Plugin modernisation -
Cleaning and modernizing the extensively used GitLab plugin.
Contributor: Harsh Pratap Singh from India.
Mentors: Mark Waite, Kris Stern, and Freyam Mehta.


Adding probes to Plugin Health Score -
The first iteration of the tool provided a limited set of probes.
To improve the effectiveness of the scoring system, more probes are needed.
Contributor: Jagruti Tiwari from India.
Mentors:...
</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/gsoc/gsoc_projects_contributors_selected.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the Jenkins GSoC org admin team and mentors,
we would like to welcome
&lt;a href=&quot;https://github.com/harsh-ps-2003&quot;&gt;Harsh Pratap Singh&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Jagrutiti&quot;&gt;Jagruti Tiwari&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Vandit1604&quot;&gt;Vandit Singh&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/ash-sxn&quot;&gt;Ashutosh Saxena&lt;/a&gt;.
They will be working on Google Summer of Code projects in the Jenkins organization,
and they have already done some contributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we have the following projects:&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;GitLab Plugin modernisation&lt;/strong&gt; -
Cleaning and modernizing the extensively used GitLab plugin.&lt;br&gt;
&lt;em&gt;Contributor&lt;/em&gt;: &lt;a href=&quot;https://github.com/harsh-ps-2003&quot;&gt;Harsh Pratap Singh&lt;/a&gt; from India.&lt;br&gt;
&lt;em&gt;Mentors&lt;/em&gt;: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/freyam&quot;&gt;Freyam Mehta&lt;/a&gt;.&lt;/br&gt;
&lt;/br&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adding probes to Plugin Health Score&lt;/strong&gt; -
The first iteration of the tool provided a limited set of probes.
To improve the effectiveness of the scoring system, more probes are needed.&lt;br&gt;
&lt;em&gt;Contributor&lt;/em&gt;: &lt;a href=&quot;https://github.com/Jagrutiti&quot;&gt;Jagruti Tiwari&lt;/a&gt; from India.&lt;br&gt;
&lt;em&gt;Mentors&lt;/em&gt;: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alecharp&quot;&gt;Adrien Lecharpentier&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/dheerajodha/&quot;&gt;Dheeraj Singh Jodha&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/mostafaashraf&quot;&gt;Mostafa Ashraf Mohamed&lt;/a&gt;.&lt;/br&gt;
&lt;/br&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Building jenkins.io with alternative tools&lt;/strong&gt; -
Using alternative tooling (i.e., Antora) to build the Jenkins static site and provide documentation per Jenkins version.&lt;br&gt;
&lt;em&gt;Contributor&lt;/em&gt;: &lt;a href=&quot;https://github.com/Vandit1604&quot;&gt;Vandit Singh&lt;/a&gt; from India.&lt;br&gt;
&lt;em&gt;Mentors&lt;/em&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/iamrajiv&quot;&gt;Rajiv Ranjan Singh&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/yiminggong&quot;&gt;Yiming Gong&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;.&lt;/br&gt;
&lt;/br&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker-based Jenkins quickstart examples&lt;/strong&gt; -
Provide examples, sample code, and documentation on how to start a local Jenkins instance.&lt;br&gt;
&lt;em&gt;Contributor&lt;/em&gt;: &lt;a href=&quot;https://github.com/ash-sxn&quot;&gt;Ashutosh Saxena&lt;/a&gt; from India.&lt;br&gt;
&lt;em&gt;Mentors&lt;/em&gt;: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&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/sbostandoust&quot;&gt;Saeid Bostandoust&lt;/a&gt;.&lt;/br&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As part of the &quot;GSoC Community Bonding Period&quot; over the next few weeks, project teams will be reaching out to potential stakeholders.
The purpose is to establish connections with the community to get comments regarding their project designs.
If you are interested in the projects, please join discussions in the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;GSoC SIG&lt;/a&gt; and &lt;a href=&quot;https://app.gitter.im/\#/room/#jenkinsci_jenkins:gitter.im&quot;&gt;project&lt;/a&gt; Gitter channels, the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Developer mailing lists&lt;/a&gt;, and project meetings once they get scheduled.
Also, expect more detailed blogposts about the projects soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested to know more about GSoC in Jenkins, you can find information, timelines, and communication channels &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/05/02/android-and-jenkins-releases/</id>
<title>Building Android apps with Jenkins: release management</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-05-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/05/02/android-and-jenkins-releases/" />
<category term='jenkins'></category>
<category term='android'></category>
<summary>
The previous blog post of this series discusses what I think makes CI/CD for mobile app development a unique kind of animal, and my first steps in building Android apps with Jenkins.
We were left with a working declarative pipeline per branch, one Docker image per branch too, and an application binary ready to be deployed.
Ready?


Release management


I was able to find the binaries in the workspace in a matter of seconds, but there is no release available, only binaries.
This means there are some manual steps required to create a versioned release that we can deliver to test users, for example.


We can...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/blog/2023/04/07/android-and-jenkins-discovery/&quot;&gt;previous blog post&lt;/a&gt; of this series discusses what I think makes CI/CD for mobile app development a unique kind of animal, and my first steps in building Android apps with Jenkins.
We were left with a working declarative pipeline per branch, one Docker image per branch too, and an application binary ready to be deployed.
Ready?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;release-management&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#release-management&quot; /&gt;Release management&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I was able to find the binaries in the workspace in a matter of seconds, but there is no release available, only binaries.
This means there are some manual steps required to create a versioned release that we can deliver to test users, for example.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can manually create a release within GitHub and then copy-paste the binaries from Jenkins&#39; artifact archives to the GitHub release page.
We can also do the same for the Google Play Store.
However, this approach is neither efficient nor error-proof.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In regards to having a release on the Github repository at the same time as on Google Play, it really depends on the app and its audience.
For the purposes of this article, let’s assume it’s okay.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;prerequisites&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#prerequisites&quot; /&gt;Prerequisites&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To automate the release process, we need to determine the criteria for a version number, how to update the version number, and what constitutes a release.
We can use the &quot;&lt;a href=&quot;https://github.com/dipien/semantic-version-gradle-plugin&quot;&gt;Semantic Version&lt;/a&gt;&quot; Gradle plugin, which has a strict set of rules to guide us.
This plugin allows us to &lt;a href=&quot;https://github.com/dipien/semantic-version-gradle-plugin#incrementing-the-project-version&quot;&gt;increment&lt;/a&gt; the patch, minor, or major version using Gradle commands.
We can also use &lt;a href=&quot;https://github.com/dipien/semantic-version-gradle-plugin#version-classifier&quot;&gt;classifiers&lt;/a&gt; such as snapshot, beta, alpha, or any other version classifier to define a version name.&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;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;1.1.11&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;apply&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;plugin:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;com.dipien.android.semantic-version&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;I then searched for a Jenkins plugin that would create a GitHub release.
As the saying goes,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
There’s a plugin for that
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;but unfortunately, I couldn’t find one that meets my needs.
While there is a plugin called &lt;a href=&quot;https://plugins.jenkins.io/git-changelog/&quot;&gt;Git Changelog&lt;/a&gt; that can merge commit messages to produce a readable version of the changes, it doesn’t create the release.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;github-release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#github-release&quot; /&gt;GitHub release&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to stay on the Jenkins side, there isn’t a plugin this time.
However, there are various ways to create a release.
You can use the &lt;a href=&quot;https://docs.github.com/en/rest?apiVersion=2022-11-28&quot;&gt;GitHub REST API&lt;/a&gt; or the &lt;a href=&quot;https://cli.github.com/&quot;&gt;&lt;code&gt;gh&lt;/code&gt;&lt;/a&gt; command, which can handle all the heavy lifting for us.
Therefore, let’s go back to the drawing board and add the command to our Docker image.&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;dockerfile&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Install GitHub command line tool&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; GITHUB_TOKEN $GITHUB_TOKEN&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://cli.github.com/packages/githubcli-archive-keyring.gpg | &lt;span class=&quot;nb&quot;&gt;dd &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/share/keyrings/githubcli-archive-keyring.gpg &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    &lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;go+r /usr/share/keyrings/githubcli-archive-keyring.gpg &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;deb [arch=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;dpkg &lt;span class=&quot;nt&quot;&gt;--print-architecture&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;tee&lt;/span&gt; /etc/apt/sources.list.d/github-cli.list &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\
&lt;/span&gt;    apt update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--no-install-recommends&lt;/span&gt; gh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once that’s done, we need to use &lt;a href=&quot;https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/about-authentication-with-a-github-app&quot;&gt;GitHub App authentication&lt;/a&gt; to enable &lt;code&gt;gh&lt;/code&gt; to use our credentials.
To do this, we have to install the &lt;a href=&quot;https://plugins.jenkins.io/github-branch-source/&quot;&gt;GitHub Branch Source plugin&lt;/a&gt; and then create a &lt;a href=&quot;https://www.jenkins.io/blog/2020/04/16/github-app-authentication/&quot;&gt;GitHub Application&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/github-branch-source-plugin/blob/master/docs/github-app.adoc&quot;&gt;existing documentation&lt;/a&gt; on GitHub is exactly what we need, so a link to this should suffice.
The only fields you need to prepare and fill out at this stage are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Github App name - i.e. &lt;code&gt;Jenkins-&amp;lt;team name&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Homepage URL - your company’s domain or a GitHub repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Webhook URL - your jenkins instance, for example, &lt;code&gt;&lt;a href=&quot;https://&amp;lt;jenkins-host&amp;gt;/github-webhook/&quot; class=&quot;bare&quot;&gt;https://&amp;lt;jenkins-host&amp;gt;/github-webhook/&lt;/a&gt;&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;At that moment, I &lt;a href=&quot;https://github.com/gounthar/MyFirstAndroidAppBuiltByJenkins/blob/main/jenkins/create-release.sh&quot;&gt;queried&lt;/a&gt; GitHub using &lt;code&gt;gh&lt;/code&gt; to determine
whether the release already existed, and create it if not.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My choice of how to create the release was entirely arbitrary: I decided to create a release when the version ended with &lt;code&gt;&quot;RELEASE&quot;&lt;/code&gt;, a draft release when there was no suffix, and a pre-release when the version ended with &lt;code&gt;&quot;ALPHA&quot;&lt;/code&gt; or &lt;code&gt;&quot;BETA&quot;&lt;/code&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;suffix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$versionName&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;s/.*-//&#39;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$suffix&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in
    &lt;/span&gt;ALPHA|BETA&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Time to do a prerelease&quot;&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;GH_OPTS&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;nv&quot;&gt;$GH_OPTS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;-p&quot;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt;
    SNAPSHOT&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;This is a snapshot, we won&#39;t release anything&quot;&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;GH_OPTS&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;nv&quot;&gt;$GH_OPTS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; DO_NOT_RELEASE&quot;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt;
    RELEASE&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;This a real release, so no need to use -d or -p&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Unknown suffix &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$suffix&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, so we&#39;ll do a draft release&quot;&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;GH_OPTS&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;nv&quot;&gt;$GH_OPTS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;-d&quot;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;esac&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 good enough for my use case.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;gh&lt;/code&gt; command does a nice job of preparing a release change log, so I’m relying on it.
If we’re not building on the main branch, the release is not finalized, so I can still tidy it up later.
It’s great to be able to create a release as soon as it’s required, even when it’s not necessary…&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/2023/05/02/2023-05-02-android-and-jenkins-releases/too-many-releases.png&quot; alt=&quot;Too many releases&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It looks like I may have gone a little too far with the automatic release creation, don’t you think?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, what about using that workflow to create a release on the Play Store?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;google-play-store-release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-play-store-release&quot; /&gt;Google Play Store release&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The version is already handled by the semantic plugin, and the release notes are almost ready to go.
Now, we just need to find the right plugin to push our app to the Google Play Store.
Luckily, we have a plugin for that, called &lt;a href=&quot;https://github.com/Triple-T/gradle-play-publisher&quot;&gt;&lt;code&gt;com.github.triplet.play&lt;/code&gt;&lt;/a&gt;.
This time, it’s a &lt;a href=&quot;https://plugins.gradle.org/plugin/com.github.triplet.play&quot;&gt;Gradle plugin&lt;/a&gt; instead of a Jenkins plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first step to getting your app on the Play Store is to pay the $25 developer account fee.
After that, you need to register your app, import the EULA (there are &lt;a href=&quot;https://termly.io/products/eula-generator/&quot;&gt;free websites&lt;/a&gt; to generate that), upload the required paperwork, and then upload the signed app.
Since the app is not signed yet, we’ll need to do that first.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;signing-the-app-from-the-command-line&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#signing-the-app-from-the-command-line&quot; /&gt;Signing the app from the command line&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are different ways to sign your app - from the command line using &lt;code&gt;apksigner&lt;/code&gt; for APKs, &lt;code&gt;jarsigner&lt;/code&gt; for app bundles, or you can configure Gradle to sign it during the build.
In any case, you need to generate a private key using &lt;code&gt;keytool&lt;/code&gt; before signing the app.&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; keytool &lt;span class=&quot;nt&quot;&gt;-genkey&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-keystore&lt;/span&gt; my-release-key.jks &lt;span class=&quot;nt&quot;&gt;-keyalg&lt;/span&gt; RSA &lt;span class=&quot;nt&quot;&gt;-validity&lt;/span&gt; 10000 &lt;span class=&quot;nt&quot;&gt;-alias&lt;/span&gt; my-alias&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s quickly review how to sign an apk:&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;Align the unsigned APK using &lt;a href=&quot;https://developer.android.com/tools/zipalign&quot;&gt;&lt;code&gt;zipalign&lt;/code&gt;&lt;/a&gt;:&lt;/p&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;zipalign &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 4 my-app-unsigned.apk my-app-unsigned-aligned.apk&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;zipalign&lt;/code&gt; ensures that all uncompressed data starts with a particular byte alignment relative to the start of the file, which may reduce the amount of RAM consumed by an app.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sign your APK with your previously generated private key using &lt;a href=&quot;https://developer.android.com/tools/apksigner&quot;&gt;&lt;code&gt;apksigner&lt;/code&gt;&lt;/a&gt;:&lt;/p&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;apksigner sign &lt;span class=&quot;nt&quot;&gt;--ks&lt;/span&gt; my-release-key.jks &lt;span class=&quot;nt&quot;&gt;--out&lt;/span&gt; my-app-release.apk my-app-unsigned-aligned.apk&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This example outputs the signed APK at &lt;code&gt;my-app-release.apk&lt;/code&gt; after signing it with a private key and certificate, that are stored in a single KeyStore file: &lt;code&gt;my-release-key.jks&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, let’s discuss how to sign an application bundle (located in &lt;code&gt;app/build/outputs/bundle/debug&lt;/code&gt;) thanks to Gradle.&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;jarsigner &lt;span class=&quot;nt&quot;&gt;-verbose&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-sigalg&lt;/span&gt; SHA256withRSA &lt;span class=&quot;nt&quot;&gt;-keystore&lt;/span&gt; ../../../../../my-release-key.jks app-debug.aab my-alias&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;signing-the-app-from-gradle&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#signing-the-app-from-gradle&quot; /&gt;Signing the app from Gradle&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open the module-level &lt;code&gt;build.gradle&lt;/code&gt; file and add the &lt;code&gt;signingConfigs {}&lt;/code&gt; block with entries for &lt;code&gt;storeFile&lt;/code&gt;, &lt;code&gt;storePassword&lt;/code&gt;, &lt;code&gt;keyAlias&lt;/code&gt; and &lt;code&gt;keyPassword&lt;/code&gt;.
Then, pass that object to the &lt;code&gt;signingConfig&lt;/code&gt; property in your build type.
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;signingConfigs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;release&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// You need to specify either an absolute path or include the&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// keystore file in the same directory as the build.gradle file.&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;storeFile&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;my-release-key.jks&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;storePassword&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;password&quot;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;keyAlias&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;my-alias&quot;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;keyPassword&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;password&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;n&quot;&gt;buildTypes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;release&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;minifyEnabled&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;proguardFiles&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getDefaultProguardFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;proguard-android-optimize.txt&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;proguard-rules.pro&#39;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;signingConfig&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;signingConfigs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;release&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;From now on, when you create the bundle with Gradle, it will be signed, self-signed, which is not what we’re aiming for.
We still need to upload the icon, a summary, screenshots, banners, and other boilerplate content…
The next step is to create a GCP project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;creating-a-gcp-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-a-gcp-project&quot; /&gt;Creating a GCP project&lt;/h4&gt;
&lt;div class=&quot;videoblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; height=&quot;473&quot; src=&quot;https://www.youtube.com/embed/Vdw1LgBcy3o?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You have to &lt;a href=&quot;https://developers.google.com/android-publisher/getting_started#enable&quot;&gt;enable the Android Publisher API&lt;/a&gt; for that project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; height=&quot;473&quot; src=&quot;https://www.youtube.com/embed/eXJBIkHNB48?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, you have to &lt;a href=&quot;https://developers.google.com/android-publisher/getting_started#existing&quot;&gt;link&lt;/a&gt; your Google Play developer account to the GCP project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; height=&quot;473&quot; src=&quot;https://www.youtube.com/embed/XaokL2ku4JA?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After this, you need to &lt;a href=&quot;https://cloud.google.com/iam/docs/service-accounts-create&quot;&gt;create a service account&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; height=&quot;473&quot; src=&quot;https://www.youtube.com/embed/hAHvZe1XklU?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then create a &lt;a href=&quot;https://cloud.google.com/iam/docs/keys-create-delete&quot;&gt;key&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; height=&quot;473&quot; src=&quot;https://www.youtube.com/embed/LdMSK1d63Sw?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To set up the necessary credentials for publishing our app to the Play Store, we’ll need to create an environment variable in Jenkins.
To do this, we first need to install the &lt;a href=&quot;https://plugins.jenkins.io/envinject/&quot;&gt;Environment Injector plugin&lt;/a&gt;.
Once that’s done, we can grant the necessary permissions to our service account so that it can publish the app on our behalf.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; height=&quot;473&quot; src=&quot;https://www.youtube.com/embed/LXVydeeMnSU?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And we’re finally ready to publish our app thanks to Gradle on Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;publishing-the-app&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#publishing-the-app&quot; /&gt;Publishing the app&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;gradlew&lt;/code&gt; tasks group &lt;code&gt;publishing&lt;/code&gt; tells us we have a &lt;code&gt;publishBundle&lt;/code&gt; task that uploads App Bundle for all variants.&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;./gradlew tasks &lt;span class=&quot;nt&quot;&gt;--group&lt;/span&gt; publishing

&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Task :tasks

&lt;span class=&quot;nt&quot;&gt;------------------------------------------------------------&lt;/span&gt;
Tasks runnable from root project &lt;span class=&quot;s1&quot;&gt;&#39;My First Built by Jenkins Applications&#39;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;------------------------------------------------------------&lt;/span&gt;

Publishing tasks
&lt;span class=&quot;nt&quot;&gt;----------------&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;...]
publishBundle - Uploads App Bundle &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;all variants.
   See https://github.com/Triple-T/gradle-play-publisher#publishing-an-app-bundle
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;...]
BUILD SUCCESSFUL &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;1s
1 actionable task: 1 executed&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we did not store the generated &lt;code&gt;jks&lt;/code&gt; file in the repo, we have to use a variable to hold the value.
On your machine, it would work with something like:&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;ANDROID_PUBLISHER_CREDENTIALS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;json&lt;span class=&quot;sb&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;On Jenkins, we will create a secret.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;839&quot; height=&quot;473&quot; src=&quot;https://www.youtube.com/embed/XkORY9nbgak?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The secret is now available under the &lt;code&gt;android-publisher-credentials&lt;/code&gt; key.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The triplet &lt;a href=&quot;https://github.com/Triple-T/gradle-play-publisher#common-configuration&quot;&gt;documentation&lt;/a&gt; tells us that we can set up a configuration in the build.gradle file like:&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;play&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Overrides defaults&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;track&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;internal&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;updatePriority&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&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;n&quot;&gt;releaseStatus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ReleaseStatus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DRAFT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&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;Gradle Play Publisher supports uploading both the App Bundle and APK, and can promote those artifacts to different tracks.
You can customize how your artifacts are published using several options:&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;track&lt;/code&gt;: The target stage for an artifact, such as &lt;code&gt;internal&lt;/code&gt;/&lt;code&gt;alpha&lt;/code&gt;/&lt;code&gt;beta&lt;/code&gt;/&lt;code&gt;production&lt;/code&gt; or any custom track.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Defaults to internal&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;releaseStatus&lt;/code&gt;: The type of release, such as &lt;code&gt;ReleaseStatus.COMPLETED&lt;/code&gt;, &lt;code&gt;ReleaseStatus.DRAFT&lt;/code&gt;, &lt;code&gt;ReleaseStatus.HALTED&lt;/code&gt;, or &lt;code&gt;ReleaseStatus.IN_PROGRESS&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Defaults to &lt;code&gt;ReleaseStatus.COMPLETED&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;userFraction&lt;/code&gt;: The percentage of users who will receive a staged release.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This is only applicable where &lt;code&gt;releaseStatus=[IN_PROGRESS/HALTED]&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;defaults to &lt;code&gt;0.1&lt;/code&gt; (10%)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;updatePriority&lt;/code&gt;: Sets the update priority for a new release.
Refer to &lt;a href=&quot;https://developer.android.com/guide/playcore/in-app-updates&quot;&gt;Google’s documentation&lt;/a&gt; for more information.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Defaults to the API value&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Furthermore, according to the &lt;a href=&quot;https://github.com/Triple-T/gradle-play-publisher#uploading-release-notes&quot;&gt;documentation&lt;/a&gt;, you need to supply a release notes file.
To do so, you need to add a file under &lt;code&gt;src/[sourceSet]/play/release-notes/[language]/[track].txt&lt;/code&gt;.&lt;br&gt;
Here, &lt;code&gt;sourceSet&lt;/code&gt; is a full variant name, &lt;code&gt;language&lt;/code&gt; is one of the Play Store supported codes, and &lt;code&gt;track&lt;/code&gt; is the channel you want these release notes to apply to.
If no channel is specified, the default channel will be used.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As an example, let’s assume you have these two different release notes:&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;src/main/play/release-notes/en-US/default.txt
.../beta.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you publish to the beta channel, the &lt;code&gt;beta.txt&lt;/code&gt; release notes will be uploaded.
For any other channel, &lt;code&gt;default.txt&lt;/code&gt; will be uploaded.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For our use case, we’ll &lt;a href=&quot;https://github.com/gounthar/MyFirstAndroidAppBuiltByJenkins/blob/main/jenkins/create-gps-release.sh&quot;&gt;use&lt;/a&gt; the &lt;code&gt;internal&lt;/code&gt; track, and start from the release notes generated via the &lt;code&gt;gh&lt;/code&gt; tool to produce a shorter version, limited to 500 characters as specified by Google.&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;gh release view v&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;versionName&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; 500 &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;s2&quot;&gt;&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&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;s2&quot;&gt;&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;s/http.*[/]/#/&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$releaseNotesDir&lt;/span&gt;/internal.txt
    &lt;span class=&quot;nv&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &amp;lt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$releaseNotesDir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/internal.txt&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; .&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; %s &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;content&lt;/span&gt;:0:500&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;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$releaseNotesDir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/internal.txt&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;Have we completed all the necessary steps?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We now have an Android application that builds, has undergone static analysis, and is automatically pushed to both GitHub and the Google Play Store.
However, there is still much left to cover, which we will explore in upcoming episodes.&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/2023/04/13/meet-with-jenkins-community-cdcon-gitopscon/</id>
<title>Meet with Jenkins Community at cdCon + GitOpsCon 2023</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-04-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/04/13/meet-with-jenkins-community-cdcon-gitopscon/" />
<author>
<name>cdfoundation</name>
</author>
<category term='jenkins'></category>
<category term='cdcon'></category>
<category term='conference'></category>
<category term='continuous delivery'></category>
<category term='cicd'></category>
<category term='gitops'></category>
<summary>
The Continuous Delivery Foundation (CDF) is happy to host its fourth flagship event, cdCon, taking place on May 8–9, 2023 in Vancouver, Canada as cdCon + GitOpsCon, co-organized with the Cloud Native Computing Foundation (CNCF), making it the must-attend event for anyone who is involved in CD, DevOps, and GitOps.


By combining the two events, cdCon + GitOpsCon aims to bring their communities together to collaborate and build the future of GitOps and CD.
The program committees reviewed more than 250 submissions and selected over 60 sessions that will span topics from technical challenges and deep dives, to end-user stories and introductory...
</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/2023/04/13/2023-04-13-meet-with-jenkins-community-cdcon-gitopscon/meet-with-jenkins-community-cdcon-gitopscon.png&quot; alt=&quot;cdCon + GitOpsCon 2023 Visual with Jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://cd.foundation&quot;&gt;Continuous Delivery Foundation (CDF)&lt;/a&gt; is happy to host its fourth flagship event, cdCon, taking place on May 8–9, 2023 in Vancouver, Canada as &lt;a href=&quot;https://events.linuxfoundation.org/cdcon-gitopscon/&quot;&gt;cdCon + GitOpsCon&lt;/a&gt;, co-organized with the &lt;a href=&quot;https://cncf.io&quot;&gt;Cloud Native Computing Foundation (CNCF)&lt;/a&gt;, making it the must-attend event for anyone who is involved in CD, DevOps, and GitOps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By combining the two events, cdCon + GitOpsCon aims to bring their communities together to collaborate and build the future of GitOps and CD.
The program committees reviewed more than 250 submissions and selected over 60 sessions that will span topics from technical challenges and deep dives, to end-user stories and introductory content.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://events.linuxfoundation.org/cdcon-gitopscon/program/schedule/&quot;&gt;cdCon + GitOpsCon program&lt;/a&gt; contains sessions from the most widely used CI/CD and GitOps technologies.
The Jenkins Community will be there with project updates and various talks from our community members and users.
Here are some of the sessions you don’t want to miss.&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://sched.co/1Jp7p&quot;&gt;Fidelity’s Software Delivery Platform - Frictionless Approach to Achieve Autonomic DevOps &amp;amp; Enhanced Security/Compliance Practices&lt;/a&gt; - Jamie Plower &amp;amp; Evan Elms, Fidelity Investments&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sched.co/1Jp87&quot;&gt;Testing 100’s of OS Images with Jenkins: A Journey from Pull Request to Production Release&lt;/a&gt; - Vipul Gupta, balena&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sched.co/1JpAU&quot;&gt;CI/CD for Data - Building Dev/Test Data Environments with Open Source Stacks&lt;/a&gt; - Vinodhini Duraisamy, Treeverse&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sched.co/1Jp9i&quot;&gt;Continuous Delivery on Arm: A Practical Approach&lt;/a&gt; - Pranay Bakre, Arm Inc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to these sessions, Mark Waite of CloudBees, a member of the Jenkins Governance Board and a long-time Jenkins user and contributor will take part in &lt;a href=&quot;https://sched.co/1Js9F&quot;&gt;the Graduated Projects Keynote Panel&lt;/a&gt;, discussing Jenkins Community’s experiences with graduation and sharing his thoughts on why graduation matters for the community and users of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We look forward to an awesome event and we hope to see you there!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/04/12/jenkins-march-newsletter/</id>
<title>Jenkins March 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-04-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/04/12/jenkins-march-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Highlights




Jenkins 2.397 and 2.387.2 are both using new Linux repository signing keys.


The Pipeline graph view plugin continues to evolve and improve as a Pipeline visualization replacement for Blue Ocean.


The number of pull requests merged for jenkins.io crossed into triple digits this month (101).







Contributed by: Mark Waite


Jenkins' installers for Debian and Red Hat have all been signed with new PGP private keys.
Refer to the Jenkins blog post for more details.
The Jenkins installer for Windows and the Jenkins WAR file have also been signed with a new code signing certificate issued by DigiCert.
Thanks to the Continuous Delivery Foundation for their help 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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins March Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#highlights&quot; /&gt;Highlights&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;Jenkins 2.397 and 2.387.2 are both using new Linux repository signing keys.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Pipeline graph view plugin continues to evolve and improve as a Pipeline visualization replacement for Blue Ocean.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The number of pull requests merged for jenkins.io crossed into triple digits this month (101).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins&#39; installers for Debian and Red Hat have all been signed with new PGP private keys.
Refer to the Jenkins &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/27/repository-signing-keys-changing/&quot;&gt;blog post&lt;/a&gt; for more details.
The Jenkins installer for Windows and the Jenkins WAR file have also been signed with a new code signing certificate issued by DigiCert.
Thanks to the Continuous Delivery Foundation for their help with the new code signing certificate.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Chinese translation of the Jenkins documentation has been unmaintained for almost two years.
Rather than risk confusing Chinese users that are following outdated instructions, we’ve removed the link to the outdated Chinese site.
We invite Chinese users to use the English language documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/press/&quot;&gt;Jenkins press contacts&lt;/a&gt; have been simplified, to invite members of the press with questions about Jenkins to post their questions to the &lt;a href=&quot;https://community.jenkins.io/c/press/24&quot;&gt;press category&lt;/a&gt; on community.jenkins.io.
Special thanks to &lt;a href=&quot;https://www.discourse.org/&quot;&gt;Discourse&lt;/a&gt; for hosting the Jenkins community site.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins board, members of the Jenkins security team, and several others were involved in resolving an incorrect claim against a repository of the Jenkins GitHub organization.
The claim incorrectly asserted that one of the Jenkins GitHub repositories had published private information, copyrighted material, or a password without consent.
The issue was resolved through the efforts of Daniel Beck, the company that filed the incorrect report, and the maintainers of the affected plugins.
Thanks to all involved for resolving the issue.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kguerroudj&quot;&gt;Kevin Guerroudj&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Two security advisories have been published during the month of March:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One regarding &lt;a href=&quot;https://www.jenkins.io/security/advisory/2023-03-21/&quot;&gt;plugins&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;13 plugins were impacted&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;9 without fixes according to our &lt;a href=&quot;https://www.jenkins.io/security/plugins/#unresolved&quot;&gt;documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One regarding &lt;a href=&quot;https://www.jenkins.io/security/advisory/2023-03-08/&quot;&gt;core and update-center2&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The most critical being an XSS which we were able to confirm that there was no exploit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the course of March, the Jenkins infrastructure team has worked to provide several enhancements and updates including:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Huge effort on bandwidth reduction for dependencies from JFrog, by switching almost all workloads to the new artifact caching proxy, with a focus on developer UX to allow disabling it when unreliable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All of the controller Azure credentials are managed as code, opening the door for safer identity management.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved safety and reliability for the releases of both weekly and Jenkins Core, by migrating this process into a new private Kubernetes cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maven 3.9.0 and 3.9.1 were rolled-out to developers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Ubuntu 22.04 upgrade campaign has been planned and started.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new GPG key rolled-out for signing Jenkins repositories and Core artifacts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Usual maintenance efforts to keep the infrastructure running, including weekly dependency upgrades, support for the 2 security advisories, and migrating pipelines from GitHub actions to our own Jenkins private instances.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins user experience continues to improve thanks to the efforts of many contributors, with special thanks to &lt;a href=&quot;https://github.com/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt; and the many reviewers involved in the improvements.&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/pipeline-graph-view/&quot;&gt;Pipeline graph view plugin&lt;/a&gt; continues to evolve and improve as a Pipeline visualization replacement for Blue Ocean.
It now includes progressive viewing of log files.
Thanks to &lt;a href=&quot;https://github.com/timbrown5&quot;&gt;Tim Brown&lt;/a&gt; for the improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://weekly.ci.jenkins.io/manage/about/&quot;&gt;&quot;About Jenkins&quot;&lt;/a&gt; page in Jenkins weekly releases now includes a &lt;a href=&quot;https://user-images.githubusercontent.com/43062514/224480863-9e8e893a-c78a-4511-98c3-b672bedef80a.png&quot;&gt;new image&lt;/a&gt; and an invitation to &quot;get involved&quot; with the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/7718&quot;&gt;Jenkins icon legend&lt;/a&gt; is now a modal dialog in Jenkins weekly releases.
The modal dialog does not move the user away from the current page.
Expect to see more modal dialogs in Jenkins in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More Jenkins messages have been translated into Turkish thanks to &lt;a href=&quot;https://github.com/mustafau&quot;&gt;Mustafa Ulu&lt;/a&gt;.
They have been released in Jenkins weekly releases in March.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Support for &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/7299&quot;&gt;user experimental flags&lt;/a&gt; (&quot;feature flags&quot;) has been added to Jenkins core.
Developers can deliver new features and allow users to enable or disable those features for their own account.
Thanks to Wadeck Follonier for the implementation and thanks to all those who reviewed and helped with the pull request.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the course of March, there were 7 blog posts published, featuring several different authors.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar/&quot;&gt;Bruno Verachten&lt;/a&gt; has shared his experiences using Jenkins in intriguing ways, as well as starting a new series of posts regarding Android and Jenkins.
We also crossed into triple digits (101) for the number of pull requests merged this month for jenkins.io alone.
Along with recent UI updates, the Jenkins documentation is being updated to reflect the simplified Manage Jenkins settings names.
Thanks to all of the continuing and new contributors, all of your work helps support both the Jenkins project and the Open-Source community.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the course of March, the Jenkins platform team provided several updates and improvements.
These improvements include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins 2.397 and 2.387.2 both using new Linux repository signing keys.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;There is a &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/27/repository-signing-keys-changing/&quot;&gt;great article&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt; to explain why the keys have changed and how to update accordingly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nothing has to be done for Jenkins Docker installation, because the key is not required for container installations, as we manage the service ourselves in the container.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker end of open source software images (&lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3457&quot;&gt;Docker announcement&lt;/a&gt; with later changes)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The old jenkinsci handle could have gone away, as it was not protected by OSS organization, before Docker changed their mind.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins4Eval may go, as it is dangerous and not really needed.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;At this time, it is for a very niche use.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PowerPC 64: has made some nice progress. Thank you so much for your contribution &lt;a href=&quot;https://github.com/ksalerno99&quot;&gt;Kenneth&lt;/a&gt;!&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;docker-agent: &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/391&quot;&gt;PR&lt;/a&gt; reviewed, checks have passed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;docker-ssh-agent: &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/220&quot;&gt;PR&lt;/a&gt; reviewed, checks have passed too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inbound-agent: &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/pull/339&quot;&gt;PR&lt;/a&gt; reviewed, checks will pass once the docker-agent PR will be accepted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controller: &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/1586&quot;&gt;PR&lt;/a&gt; is done as well, checks have passed too.
It shouldn’t be long until all of these PRs make it into the next release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Welcome to the community Kenneth, we’re delighted to have you onboard!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alpine aarch64 images &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/issues/397&quot;&gt;issue&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We’ve been following the progress for a few months now, and it looks like it won’t be solved soon.
Temurin needs help to get this back on track.
In the meantime, we have other Debian based images that can do the job.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows MSI installer code signing certificate updated (also signs jar file):&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows users expect their installers to be signed/secured (because of malware and so on).
The previous certificate expired March 30, 2023.
Fortunately, Mark Waite and other members of the community managed to get a new one, so the latest weekly release is signed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lawyers had to be involved, but the process is now complete.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The  MSI installer is signed with the new key.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Latest updates on the agent images:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ssh-agent &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/releases/tag/4.13.0&quot;&gt;release 4.13.0&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;chore(deps): bump debian from bullseye-20230208 to bullseye-20230320 in /8/11/17bullseye (&lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/222&quot;&gt;#222&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker-agent release &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/releases/tag/3107.v665000b_51092-6&quot;&gt;3107.v665000b_51092-6&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;chore(deps): bump archlinux from base-20230226 to base-20230319.0.135218 in /11/archlinux (&lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/393&quot;&gt;#393&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;chore(deps): bump debian from bullseye-20230227 to bullseye-20230320 in /11/17/bullseye (&lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/394&quot;&gt;#394&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Experiments with RISC-V have &lt;a href=&quot;https://www.jenkins.io/blog/2023/03/10/miniJen-and-RISC-V/&quot;&gt;progressed&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.socallinuxexpo.org/scale/20x&quot;&gt;&lt;strong&gt;SCALE 20X#&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So thrilled to have been back at the usual spot (Pasadena Convention Center, CA) for SCALE this year, an added bonus were visits from special friends 🥰, Kohsuke Kawaguchi &amp;amp; Arun Gupta 🎉!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many thanks to the Jenkins fans for stopping by the booth to let us know how much they love Jenkins!
Special thanks to the SCALE committee for being a wonderful host! 🚀&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/2023/04/10/2023-04-10-jenkins-newsletter/image2.jpg&quot; alt=&quot;image&quot; width=&quot;291&quot; height=&quot;219&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/04/10/2023-04-10-jenkins-newsletter/image3.jpg&quot; alt=&quot;image&quot; width=&quot;291&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/04/10/2023-04-10-jenkins-newsletter/image4.jpg&quot; alt=&quot;image&quot; width=&quot;291&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/04/10/2023-04-10-jenkins-newsletter/image5.jpg&quot; alt=&quot;image&quot; width=&quot;291&quot; /&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Jenkins in Google Summer of Code (GSoC)&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you lurk on the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;Jenkins GSoC Gitter channel&lt;/a&gt;, you will be quite surprised at the level of engagement…​ It is anything but quiet.
The hustle and bustle indicates the level of interest in Jenkins in GSoC.
Here’s where we currently stand:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We’ve received over 50 proposals via the Google Summer of Code portal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Organization administrators and mentoring are reviewing and ranking the proposals.&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;Jenkins Awards&lt;/strong&gt;&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/2023/04/10/2023-04-10-jenkins-newsletter/image1.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;158&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The list of nominations for the Jenkins Contributor Awards is quite impressive this year, with more people being nominated than ever before.
We want to thank and congratulate all nominees, your contributions are seen, recognized and appreciated!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also had more people voting this year than in previous years.
Thank you to everyone who took the time to vote!
Voting is now closed, and the results will be announced on May 8-9 at &lt;a href=&quot;https://events.linuxfoundation.org/cdcon-gitopscon/&quot;&gt;cdCon&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt;&lt;/span&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/04/12/digital-ocean-continued-sponsorship/</id>
<title>DigitalOcean and Jenkins partnership continues to grow!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-04-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/04/12/digital-ocean-continued-sponsorship/" />
<author>
<name>kmartens27</name>
</author>
<category term='jenkins'></category>
<category term='digitalocean'></category>
<category term='community'></category>
<summary>
The Jenkins project wants to acknowledge and share massive thanks to DigitalOcean for their continued sponsorship.


Between August 2022 and March 2023, Jenkins had been using roughly $1,300 credits a month.
During March, we encountered a severe increase in our DigitalOcean workloads.
This was a result of much heavier reliance on DigitalOcean, as we worked to resolve other infrastructure concerns.
In addition to this reliance, there was increased activity on the Jenkins Bill Of Material repository.
Unfortunately, the increased activity and reliance combined to push Jenkins over our normal budget.


However, DigitalOcean has provided the Jenkins project with an additional $8,400 credit for the next six...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.digitalocean.com&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-09-19-digital-ocean-sponsorship/DO-horizontal.png&quot; alt=&quot;DO horizontal&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project wants to acknowledge and share massive thanks to DigitalOcean for their continued sponsorship.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Between August 2022 and March 2023, Jenkins had been using roughly $1,300 credits a month.
During March, we encountered a severe increase in our DigitalOcean workloads.
This was a result of much heavier reliance on DigitalOcean, as we worked to resolve other infrastructure concerns.
In addition to this reliance, there was increased activity on the Jenkins Bill Of Material repository.
Unfortunately, the increased activity and reliance combined to push Jenkins over our normal budget.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, DigitalOcean has provided the Jenkins project with an additional &lt;strong&gt;$8,400&lt;/strong&gt; credit for the next six months.
This ensures that we are able to manage our resources and DigitalOcean workloads, without worry of interruption.
Our deepest thanks go out to DigitalOcean, as they continue to show how supportive they are to both Jenkins and the Open Source community.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/04/07/android-and-jenkins-discovery/</id>
<title>Building Android apps with Jenkins: an introduction</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-04-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/04/07/android-and-jenkins-discovery/" />
<category term='jenkins'></category>
<category term='android'></category>
<summary>
Why is mobile CI/CD special?


In 2020, a surprising 33% of professional mobile app developers were not using Continuous Integration/Continuous Deployment (CI/CD) practices, which is 18% more than web developers.
There are several reasons why this is the case:




Unique needs: Unlike web applications, mobile applications have different requirements, which means that mobile CI/CD requires a different approach and dedicated tools.


Tightly controlled ecosystems: Unlike the open ecosystem of the web, mobile app ecosystems are tightly controlled by the OS providers, such as Apple and Google.
These providers have strict rules from development to deployment, to running the apps.
As a result, traditional CI/CD approaches and...
</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/2023/04/07/2023-04-07-android-and-jenkins-discovery/profile_of_cicd_users.png&quot; alt=&quot;profile of ci/cd users&quot; width=&quot;found on www.developernation.net/blog/devops-ci-cd-usage-trends&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-is-mobile-cicd-special&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-is-mobile-cicd-special&quot; /&gt;Why is mobile CI/CD special?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2020, a surprising &lt;a href=&quot;https://www.developernation.net/blog/devops-ci-cd-usage-trends&quot;&gt;33% of professional mobile app developers&lt;/a&gt; were not using Continuous Integration/Continuous Deployment (CI/CD) practices, which is 18% more than web developers.
There are several reasons why this is the case:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Unique needs: Unlike web applications, mobile applications have different requirements, which means that mobile CI/CD requires a different approach and dedicated tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tightly controlled ecosystems: Unlike the open ecosystem of the web, mobile app ecosystems are tightly controlled by the OS providers, such as Apple and Google.
These providers have strict rules from development to deployment, to running the apps.
As a result, traditional CI/CD approaches and best practices can’t be applied out of the box.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Specialized expertise is required: Mobile CI/CD requires specific expertise that may not be available in the typical DevOps team.
In many cases, mobile developers must handle the mobile CI/CD pipeline themselves due to the unique requirements.
However, it is still CI/CD and requires that specific mindset, along with mobility knowledge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mobile CI/CD requires a separate pipeline: Mobile CI/CD requires setting up a separate pipeline from web or backend stacks, as it is based on the deployment of a compiled binary, which has to be installed on a mobile device from scratch every time.
End-user deployments for B2C apps are subject to app reviews and app release waiting periods, which is not prevalent in other stacks.
As a result, errors should be detected at the earliest stage (the famous &quot;shift-left&quot;) and mobile-app-specific code analyses and tests should be incorporated at every step of CI/CD to avoid issues being discovered by the end-user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code-signing is mandatory: Unlike most other stacks, code-signing is mandatory in mobile app development.
This introduces another layer of complexity on top of the already complex mobile CI/CD processes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In summary, mobile app development requires unique CI/CD practices, due to the specific needs of the mobile app ecosystem, the specialized expertise required, and the need for a separate pipeline for deployment.
By understanding and addressing these challenges, mobile app developers can successfully adopt CI/CD practices and ensure the delivery of high-quality mobile apps.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-do-we-progress-then&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-we-progress-then&quot; /&gt;How do we progress then?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mobile app development requires dedicated tools and approaches for CI/CD management.
However, in many cases, mobile developers themselves are tasked with managing CI/CD, which is not their core role.
This can result in significant time and productivity losses.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To optimize mobile CI/CD management, it is essential to have a dedicated team member who is knowledgeable in both mobile development and CI/CD.
Ideally, this person would have experience as a former mobile app developer who has transitioned into a CI/CD role.
Alternatively, someone who knows CI/CD and wants to help mobile app developers onboard the CI/CD train can also be valuable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In conclusion, by having dedicated team members who are knowledgeable in both mobile development and CI/CD, and by utilizing effective tools and approaches, mobile CI/CD management can be optimized to improve productivity and minimize time losses.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;flashback-to-my-previous-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#flashback-to-my-previous-job&quot; /&gt;Flashback to my previous job&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At my previous job, we evolved our mobile CI/CD system over time and ended up using Gitlab-ci, along with a set of specific Docker images.
Our standard image contained the latest version of all the required tools, including maven, ant, gradle, android SDK, android NDK, flutter, firebase, linters, and dependency checkers.
This image was cached on the &lt;a href=&quot;https://bruno.verachten.fr/2021/01/11/Arm-your-ci-with-fruits/&quot;&gt;runners&lt;/a&gt;, similar to &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-agents/&quot;&gt;Jenkins agents&lt;/a&gt;, so that jobs could start immediately.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also created specific images with various versions of the tools or with specific tools added.
Additionally, we linked an &lt;a href=&quot;https://github.com/DeviceFarmer/stf#readme&quot;&gt;Android Device Farm&lt;/a&gt; to Gitlab-ci, so that developers could test their newly built app on real Android devices directly from their pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2022, I resigned from my previous job and started working at CloudBees.
Soon after, my manager asked if I would be interested in replicating some of the work I had done with GitLab-CI, but this time using Jenkins.
I was intrigued and asked two questions.
First, does Jenkins work well with Docker (to which I got an honest &quot;sort of&quot; answer), and second, whether I could start from scratch without looking at what had worked for Android app development with Jenkins previously.
My goal was relying instead on my old GitLab habits, even if that meant failure.
To my surprise, my manager said, &quot;Go for it,&quot; and I began my journey to experiment, learn, and share my findings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Given my more than 8 years of experience with Mobile App CI/CD, I initially thought this would be a cakewalk.
But it turned out to be quite the ride…​&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;starting-with-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#starting-with-jenkins&quot; /&gt;Starting with Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I embarked on a new journey with Jenkins, despite having no prior experience with the tool.
As a result, I made every mistake a Jenkins newbie could possibly make.
To begin my learning process, I knew that starting with an empty Android application was the logical first step.
However, as the saying goes, it’s difficult to teach an old monkey new tricks.
Therefore, I decided to dive headfirst into rebuilding an Android Docker image, attempting to fit in all the tools I could think of, much like I had done previously with Gitlab.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my naivete, I believed that once I pushed the image to &lt;a href=&quot;https://hub.docker.com/repositories/gounthar&quot;&gt;DockerHub&lt;/a&gt;, Jenkins would somehow magically use it for my builds, and I would be done in a matter of days.
Looking back, it’s almost endearing to see how naive I was.
Simultaneously, I installed Jenkins through &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/docker/#on-windows&quot;&gt;Docker on my Windows laptop&lt;/a&gt; and experimented with a few tutorials, starting with the simplest jobs possible that worked.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After successfully pushing my bulky Docker image, filled with all the necessary tools, I moved onto creating an empty Android application, with plans to connect the dots later on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;android-app&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#android-app&quot; /&gt;Android app&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To start, I created a &lt;a href=&quot;https://github.com/gounthar/MyFirstAndroidAppBuiltByJenkins&quot;&gt;new repository&lt;/a&gt; on GitHub and cloned it onto my laptop.
From there, I opened up Android Studio and created a brand new application from scratch within that folder.
Once I had everything set up, I committed and pushed the app shell to GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To make sure the application could be built outside of my machine, I added a &lt;a href=&quot;https://github.com/gounthar/MyFirstAndroidAppBuiltByJenkins/blob/main/.github/workflows/android.yml&quot;&gt;GitHub Action file&lt;/a&gt;.
Thankfully, building a simple Android app is possible with GitHub Actions, as they provide Java and Android SDK in their &lt;a href=&quot;https://github.com/actions/runner-images#available-images&quot;&gt;Ubuntu:latest image&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this setup, my empty app could be built on Android Studio &lt;em&gt;and&lt;/em&gt; with GitHub Actions.
As a result, I was able to obtain my APKs on both platforms.
It was a satisfying milestone to achieve.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following the official documentation, I managed to install both the Jenkins controller and &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-agents/#on-windows&quot;&gt;agent&lt;/a&gt;.
However, as a beginner, I found the process unnecessarily complex.
Despite successfully running a Jenkins controller and agent on Docker images on my laptop, I encountered difficulties when trying to run my custom Android building Docker image on it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now I understand that there were other ways to approach the problem, but at the time, I was determined to stick with my old habits.
I knew that creating a specific agent by starting with the &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent&quot;&gt;SSH agent Docker image&lt;/a&gt; and adding the &lt;a href=&quot;https://developer.android.com/studio&quot;&gt;Android SDK&lt;/a&gt; was an option, but I was more comfortable using my custom Docker image and generic agents.
As the saying goes, &quot;when your only tool is a hammer, everything looks like a nail&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-free-tier-parenthesis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-free-tier-parenthesis&quot; /&gt;The Free Tier parenthesis&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, I ran into some issues with running my custom Docker image under Windows.
So, I decided to create two Jenkins agents on &lt;a href=&quot;https://www.oracle.com/fr/cloud/free/&quot;&gt;Oracle Cloud Free Tier&lt;/a&gt; machines instead.
I installed Java and Docker on these machines, and then created a Jenkins agent that was &lt;a href=&quot;https://www.jenkins.io/blog/2022/12/27/run-jenkins-agent-as-a-service/&quot;&gt;handled by systemd&lt;/a&gt;.
This allowed me to continue working on my project and explore different ways of using Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the Free Tier machines on &lt;a href=&quot;https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier.htm&quot;&gt;Oracle Cloud&lt;/a&gt; was set up with the Android SDK so that it could handle Android jobs, earning it the moniker &quot;JenkinsDroid&quot;.
Using this machine, I created a simple Android job on Jenkins that referenced my GitHub repository and initiated the build process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I gained confidence, I added more checks and bundle creation, and soon found myself with a long list of build steps in a &lt;a href=&quot;https://phoenixnap.com/kb/jenkins-build-freestyle-project#:~:text=tutorial%20for%20beginners.-,What%20is%20a%20Jenkins%20Freestyle%20Project%3F,steps%20and%20post%2Dbuild%20actions.&quot;&gt;FreeStyle project&lt;/a&gt;.
However, I realized that if the Jenkins controller were to restart for any reason, my current builds would be lost.
This was a major drawback, and I wanted to find a more robust solution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After some research, I discovered that &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/tour/hello-world/#what-is-a-jenkins-pipeline&quot;&gt;pipeline jobs&lt;/a&gt; are not affected by the controller restart issue.
As a result, I decided to switch to pipeline jobs to ensure that my builds would be safe even if the controller restarted.&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;from-freestyle-to-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#from-freestyle-to-pipeline&quot; /&gt;From FreeStyle to Pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a developer, I often try to find ways to make my work easier.
Admittedly, I can be a bit lazy when it comes to certain tasks.
That’s why I decided to use the &lt;a href=&quot;https://plugins.jenkins.io/declarative-pipeline-migration-assistant-api/&quot;&gt;Declarative Pipeline Migration Assistant&lt;/a&gt; to convert my FreeStyle project into a Pipeline project.
However, my first attempt at using this converted pipeline failed due to incorrect syntax.
It was back to the drawing board for me, and I had to learn the &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/&quot;&gt;Declarative Pipeline syntax&lt;/a&gt;.
Remember the old Apple ads from around 2009, where the answer to every need was &quot;there’s an app for that&quot;?
In the same way, Jenkins has a solution for almost every need.
One thing I appreciate about Jenkins is that it offers a lot of flexibility regardless of the version being used.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is an incredibly powerful tool, with a vast community contributing to its &lt;a href=&quot;https://plugins.jenkins.io/&quot;&gt;plugins&lt;/a&gt;.
With over &lt;a href=&quot;https://stats.jenkins.io/jenkins-stats/svg/svgs.html&quot;&gt;2,000 plugins available&lt;/a&gt;, it’s safe to say that if you have a need, there’s likely a plugin that can help you achieve it.
However, with so many options available, it can sometimes be overwhelming to choose the right one.
It’s important to note that some plugins may be outdated or incompatible with your Java or Jenkins version, so it’s always wise to double-check compatibility before installing.
Despite these potential challenges, the sheer number of available plugins is a testament to the versatility and flexibility of Jenkins.&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/2023/04/07/2023-04-07-android-and-jenkins-discovery/2023-03_plugins.png&quot; alt=&quot;History of the number of plugins since 2008 to March 2023&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To start with, I began with a small Pipeline description, gradually expanding it to incorporate more stages, additional tools, &lt;a href=&quot;https://www.perforce.com/blog/sca/what-static-analysis&quot;&gt;static analysis&lt;/a&gt;, compilation, unit testing, and ultimately, the creation of the release, which we will explore in a few weeks.
However, the worst possible thing happened: I lost everything.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As previously mentioned, my Jenkins controller instance was running on my Windows machine, running atop Docker.
One day, as I was trying to free up space for Android builds, I unintentionally entered a Docker command that removed all volumes, resulting in the loss of my jobs and their respective definitions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Despite taking precautions, things can still go wrong.
It was frustrating, but I learned from it and decided to store my Jenkinsfile in GitHub along with my other files, which gave me a sense of familiarity since GitLab-ci uses a similar approach.
With Jenkins, I could create a separate Pipeline for each branch with different agents, different Docker images, and different tools, which was very convenient.
However, it’s not perfect since a branch’s last commit/push is always used to start a job, and it’s impossible to build a specific branch explicitly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;using-a-simple-pipeline-with-multi-branches&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-a-simple-pipeline-with-multi-branches&quot; /&gt;Using a simple Pipeline with multi branches&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;status&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#status&quot; /&gt;Status&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s face it, unexpected issues can occur during a build.
While it is ideal to have everything reproducible at the click of a button, in the real world, a machine serving dependencies can go down, a link can break momentarily, or a docker image layer can go missing.
When using &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/docker/#dockerfile&quot;&gt;&lt;code&gt;dockerfile: true&lt;/code&gt;&lt;/a&gt;, the risks are even higher, as you’re building the tool you’ll be using for the build, and sometimes things can go out of control.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When a build fails due to missing dependencies on &lt;code&gt;Branch A&lt;/code&gt;, but a build on &lt;code&gt;Branch B&lt;/code&gt; starts because it’s the latest commit/push, what can you do?
It’s not a good idea to keep a simple pipeline project when working with multiple branches.
That’s why I switched to a Multibranch Pipeline Project later on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this point, I had several branches, each with a Jenkinsfile.
I also had Free Tier machines struggling to keep up with the heavy load.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;lets-make-things-a-bit-more-complex&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lets-make-things-a-bit-more-complex&quot; /&gt;Let’s make things a bit more complex&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I was testing different tools and stages using different Jenkinsfiles on various branches, I realized that using the same Docker image on all branches was not efficient.
I started exploring the idea of using a different Docker image per branch, based on the specific tools or tool versions required.
This made sense because using a generic Android image would result in additional download time during the build process for non-bundled tool versions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers prioritize fast pipelines, and a custom Docker image with the correct tool versions is a way to achieve this.
However, this custom image may not always be present in the Docker cache, resulting in slower builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To tackle this issue, I decided to automate the Docker image building process and use GitHub Actions to build and push the images to my Docker registry.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, achieving a &quot;fast&quot; pipeline (around 5 minutes) depends heavily on the agent’s specificity.
If it’s attached to only one project, then there’s hope that, even with various versions of the Docker image, the Docker cache would be large enough to ensure that builds fire up immediately.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To accomplish this, I had a potentially different Dockerfile per branch, and an image per branch, built using a GitHub Action and pushed to my Docker Hub repository.
At that point, I had a working declarative pipeline for each branch, as well as a separate Docker image for each branch.
Ultimately, this allowed me to generate an application binary that was ready to be deployed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ready? We’ll see that in the following blog post of this series.&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/2023/03/30/android-and-jenkins/</id>
<title>Android and Jenkins: what is the limit?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-03-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/03/30/android-and-jenkins/" />
<category term='jenkins'></category>
<category term='android'></category>
<category term='aarch64'></category>
<summary>
After reading the title, you may be thinking "Wait, what?
Is Jenkins somehow limited in building Android apps?"
You can relax, as I may have phrased it incorrectly.
We&#8217;re not talking about building Android apps with Jenkins, which has no limitations as far as I know.
We&#8217;re talking about building something with Jenkins, using an Android device as a Jenkins node, or potentially as a Jenkins controller.
Does this sounds appealing or strange enough to you?
Continue reading to learn more about the relationship between Android and Jenkins!


Jenkins and aarch64


I joined the Jenkins project in April 2022.
At that time, we could already find aarch64 docker images,...
</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/2023/03/29/2023-03-22-android-and-jenkins/love.png&quot; alt=&quot;jenkins hugging bugdroid&quot; width=&quot;500&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After reading the title, you may be thinking &quot;Wait, what?
Is Jenkins somehow limited in building Android apps?&quot;
You can relax, as I may have phrased it incorrectly.
We’re not talking about building Android apps with Jenkins, which has no limitations as far as I know.
We’re talking about building &lt;em&gt;something&lt;/em&gt; with Jenkins, using an Android device as a Jenkins node, or potentially as a Jenkins controller.
Does this sounds appealing or strange enough to you?
Continue reading to learn more about the relationship between Android and Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-and-aarch64&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-and-aarch64&quot; /&gt;Jenkins and &lt;code&gt;aarch64&lt;/code&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I joined the Jenkins project in April 2022.
At that time, we could already find &lt;code&gt;aarch64 docker&lt;/code&gt; images, for the agents or the controller, and regular installers for &lt;code&gt;aarch64&lt;/code&gt; Linux.
The &lt;a href=&quot;https://hub.docker.com/layers/jenkins/jenkins/2.305-jdk11/images/sha256-700c20a5cd0eb3c69a825baf8197166bb078361c3351aab6806a386573dbc829?context=explore&quot;&gt;oldest image&lt;/a&gt; for a controller I found was from August 2021, and the &lt;a href=&quot;https://hub.docker.com/layers/jenkins/jenkins/2.305-jdk11/images/sha256-700c20a5cd0eb3c69a825baf8197166bb078361c3351aab6806a386573dbc829?context=explore&quot;&gt;oldest image&lt;/a&gt; for an agent was from February 2022.
This is nothing new, as Jenkins works on &lt;code&gt;aarch64&lt;/code&gt; Linux and has been running on that CPU architecture for years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s pretty easy when using Linux on an &lt;code&gt;x86_64&lt;/code&gt; machine, but it can be more difficult on an &lt;code&gt;aarch64&lt;/code&gt; machine.
This is because the tools needed to build Android applications were not available until late 2021, with the release of Android Build Tools &lt;code&gt;31.0.0&lt;/code&gt;.
Of course, you can use &lt;a href=&quot;https://support.apple.com/en-us/HT211861&quot;&gt;Rosetta&lt;/a&gt; to build your applications and even combine it with &lt;a href=&quot;https://developer.ibm.com/tutorials/running-x86-64-containers-mac-silicon-m1/&quot;&gt;Docker&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my experience with Jenkins and &lt;code&gt;aarch64&lt;/code&gt;, I have several &lt;code&gt;aarch64&lt;/code&gt; Jenkins agents and controllers.
Some of them are using &lt;code&gt;docker&lt;/code&gt; and some of them are installed directly on the Linux machine thanks to the &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/linux/#debianubuntu&quot;&gt;standard instructions&lt;/a&gt;.
Thankfully, there has been nothing outstanding to worry about, as Jenkins works fine for me with &lt;code&gt;aarch64&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;android-and-aarch64&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#android-and-aarch64&quot; /&gt;Android and &lt;code&gt;aarch64&lt;/code&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Until recently, it was difficult to build Android applications on an &lt;code&gt;aarch64&lt;/code&gt; machine.
The main reason was that the &lt;a href=&quot;https://developer.android.com/studio/releases/build-tools&quot;&gt;Android build tools&lt;/a&gt; were not compatible with &lt;code&gt;aarch64&lt;/code&gt; machines.
Before version &lt;code&gt;31.0.0&lt;/code&gt;, there was a bug in the Android Build Tools that caused the &lt;code&gt;aapt2&lt;/code&gt; tool to crash when building resources on &lt;code&gt;aarch64&lt;/code&gt; machines.
This issue was resolved in version &lt;code&gt;31.0.0&lt;/code&gt;, which added native support for &lt;code&gt;aarch64&lt;/code&gt; and fixed the &lt;code&gt;aapt2&lt;/code&gt; crash on these machines.
Thanks to this, Android Build Tools are now natively compatible with &lt;code&gt;aarch64&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Isn’t that fantastic?
This meant there was no need to use Rosetta to build Android apps on &lt;code&gt;aarch64&lt;/code&gt; anymore.
Until I started writing this post, I was actually using build-tools &lt;code&gt;30.x&lt;/code&gt;.
I didn’t need to build Android apps on &lt;code&gt;aarch64&lt;/code&gt; machines, so upgrading was unnecessary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, a friend of mine works on an &lt;a href=&quot;https://en.wikipedia.org/wiki/Apple_M1&quot;&gt;M1 Mac&lt;/a&gt;, which happens to be an &lt;code&gt;aarch64&lt;/code&gt; machine, and wanted to build Android apps on his Mac.
He was working with Docker, which translates &lt;code&gt;x86-64&lt;/code&gt; to &lt;code&gt;aarch64&lt;/code&gt;, as long as you specify that you’re using an &lt;code&gt;x86-64&lt;/code&gt; image to begin with.
I know it’s strange that &lt;code&gt;x86-64&lt;/code&gt; is called &lt;code&gt;&lt;a href=&quot;https://unix.stackexchange.com/a/53416&quot;&gt;amd64&lt;/a&gt;&lt;/code&gt; in Docker, but that’s not the point.&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;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;android-agent&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;linux/amd64&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;../&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;unless-stopped&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&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;s&quot;&gt;android-agent-data:/home/jenkins:rw&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;../adbkey.pub:/home/jenkins/.android/adbkey.pub:rw&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;../adbkey.txt:/home/jenkins/.android/adbkey:rw&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&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;s&quot;&gt;JENKINS_AGENT_SSH_PUBKEY=ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBpNqXQ4x7fPPUBbYPxKF77Zqq6d35iPCD2chg644OUD&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;STF_HOST_NAME&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;...&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;We could theoretically build Android apps on &lt;a href=&quot;https://magpi.raspberrypi.com/articles/pi-3-interview&quot;&gt;Raspberry PI 3B+&lt;/a&gt; with &lt;a href=&quot;https://github.com/gounthar/MyFirstAndroidAppBuiltByJenkins/blob/aarch64/Dockerfile&quot;&gt;Jenkins&lt;/a&gt; from now on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the introduction, I stated that I wanted to build something with Jenkins on an Android device, and not the other way around.
The goal is to run parts of Jenkins (first an agent, then a controller, then a whole Jenkins instance thanks to Docker) on an Android device.
So why am I telling you about building Android apps on &lt;code&gt;aarch64&lt;/code&gt; machines with Jenkins?
Because it would be kind of ironic, and tons of fun, to build an Android app with Jenkins on an Android device!
That would even allow me to introduce you to the &lt;em&gt;Jenkinsception&lt;/em&gt; concept.
More on that in a future post.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;get-sshd-working-on-an-android-device&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-sshd-working-on-an-android-device&quot; /&gt;Get &lt;code&gt;sshd&lt;/code&gt; working on an Android device&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What does &lt;code&gt;sshd&lt;/code&gt; have to do with installing Jenkins?
Well, we have a few different ways to start and connect a Jenkins agent to a Jenkins controller, but the easiest one for me is to use an ssh agent.
The first step is to get &lt;code&gt;sshd&lt;/code&gt; working on an Android device.
There are various ways to access an Android device through SSH.
Here are some of them:&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://developer.android.com/studio/command-line/adb&quot;&gt;ADB&lt;/a&gt;: You can use the Android Debug Bridge (ADB) to connect to your Android device over SSH.
This requires you to enable USB debugging on your device and have ADB installed on your computer.
The following guide may not work any longer, but it’s a good starting point: &lt;a href=&quot;https://dtbaker.net/blog/howto-enable-ssh-on-android-and-network-adb/&quot;&gt;How to enable ssh on Android&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=org.galexander.sshd&quot;&gt;SimpleSSHD&lt;/a&gt;: SimpleSSHD is a lightweight and easy-to-use SSH server app for Android.
It supports key-based authentication, and you can configure it to run at startup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://termux.dev/en/&quot;&gt;Termux&lt;/a&gt;: Termux is a terminal emulator and Linux environment app that allows you to start an SSH server on your Android device.
You can then use any SSH client to connect to your device over SSH.
Unfortunately, updates for Termux are not available on the Google Play Store anymore, but you can still find it on &lt;a href=&quot;https://github.com/termux/termux-app#github&quot;&gt;GitHub&lt;/a&gt; or &lt;a href=&quot;https://github.com/termux/termux-app#f-droid&quot;&gt;F-Droid&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;It is important to note that SSH access to your device can pose security risks, so it is recommended to use caution and &lt;strong&gt;only&lt;/strong&gt; enable SSH access when necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Termux is my go-to choice when it comes to using some kind of Linux on Android.
There are packages available that will allow you to install new software, and package updates, like a &quot;real&quot; Linux distribution.
I almost feel at home when using it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While reading the &lt;a href=&quot;https://wiki.termux.com/wiki/Remote_Access&quot;&gt;Termux documentation&lt;/a&gt;, I discovered that Termux has an SSH server (&lt;a href=&quot;https://www.openssh.com/&quot;&gt;OpenSSH&lt;/a&gt;) built-in.
It’s not enabled by default, but it’s easy enough to configure.
The following instructions are available on the &lt;a href=&quot;https://wiki.termux.com/wiki/Remote_Access#OpenSSH&quot;&gt;Termux wiki&lt;/a&gt;, and I’ve added some details to make it easier to follow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;starting-and-stopping-the-openssh-server&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#starting-and-stopping-the-openssh-server&quot; /&gt;Starting and stopping the OpenSSH server&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since Termux does not use an &lt;a href=&quot;https://en.wikipedia.org/wiki/Systemd&quot;&gt;initialization system&lt;/a&gt;, services are started manually from the command line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To start the OpenSSH server, you need to execute this command: &lt;code&gt;sshd&lt;/code&gt;.
If you need to stop &lt;code&gt;sshd&lt;/code&gt;, just kill its process: &lt;code&gt;pkill sshd&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;SSH daemon logs to the Android system log, and you can view them by running &lt;code&gt;logcat -s &#39;sshd:*&#39;&lt;/code&gt;.
This is possible from either Termux or ADB.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;setting-up-password-authentication&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-up-password-authentication&quot; /&gt;Setting up password authentication&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Password authentication is enabled by default, making it easier to get started.
Before proceeding, make sure that you understand that password authentication is less secure than a pubkey-based one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ensure that everything is up-to-date and the &lt;code&gt;openssh&lt;/code&gt; package is installed:&lt;br /&gt;
&lt;/p&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; pkg upgradepkg &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;openssh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please note that &lt;code&gt;$PREFIX&lt;/code&gt; is a variable that points to the Termux installation directory.
It is usually &lt;code&gt;/data/data/com.termux/files&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Password authentication is enabled by default in the configuration file.
You can review the file at &lt;code&gt;$PREFIX/etc/ssh/sshd_config&lt;/code&gt;, and it should contain this data:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt; PrintMotd yes
 PasswordAuthentication yes
 Subsystem sftp /data/data/com.termux/files/usr/libexec/sftp-server&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your file does not look like this, you will have to edit the file.
Note that &lt;code&gt;vi&lt;/code&gt; is not installed by default, but &lt;code&gt;nano&lt;/code&gt; is.
You can use &lt;code&gt;nano&lt;/code&gt; to edit the file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Set a new password by executing the command &lt;code&gt;passwd&lt;/code&gt;.
While the program allows a minimal password length of one character, the recommended password length is more than eight to ten characters.
Passwords are not printed on the console.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt; passwd New password:
 Retype new password:
 New password was successfully set.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;setting-up-public-key-authentication&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-up-public-key-authentication&quot; /&gt;Setting up public key authentication&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Public key authentication is the recommended way for logging in using SSH.
You need to have a public/private key pair to use this type of authentication.
For a successful login, the public key must exist in the authorized keys list on the remote machine, while the private key should be kept safe on your local host.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the following example, it is assumed that you want to establish public key authentication between your PC (host) and your future Jenkins agent, which happens to be an Android device running Termux (remote).
It is also assumed that you’re running a Linux distribution on your PC, &lt;a href=&quot;https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux#WSL_2&quot;&gt;WSL2&lt;/a&gt;, or even &lt;a href=&quot;https://en.wikipedia.org/wiki/Cygwin&quot;&gt;Cygwin&lt;/a&gt;.
It would be better if both machines were using the same network, for example both are connected to the same Wi-Fi network.
It is also assumed that you know your Android device’s IP address.
If you have access to your router webpage, you should be able to see which IP has been assigned to your Android device.
If you don’t have access to the router webpage, you can find your IP address on an Android device by following these steps:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Open the Settings app on your Android device.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scroll down and tap on &quot;About phone&quot; or &quot;About device&quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look for the &quot;Status&quot; or &quot;Network&quot; section and tap it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find the &quot;IP address&quot; or &quot;Wi-Fi IP address&quot; option, which will display your device’s IP address.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alternatively, you can also find your IP address within Termux by typing the following command: &lt;code&gt;ip addr show&lt;/code&gt;.
Be aware that if the package is not installed yet, you will need to issue &lt;code&gt;pkg install iproute2&lt;/code&gt; first.
Look for the &lt;code&gt;inet&lt;/code&gt; line next to the &lt;code&gt;wlan0&lt;/code&gt; line that has your IP address given by your Wi-Fi router.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you do not have ssh keys, you can generate them.
In this example, we will generate an &lt;code&gt;RSA&lt;/code&gt; key.
On the PC, execute the command: &lt;code&gt;ssh-keygen -t rsa -b 2048 -f id_rsa&lt;/code&gt;, replacing &lt;code&gt;id_rsa&lt;/code&gt; with the name of your key.
For me it would be &lt;code&gt;ssh_key_for_jenkins_agent_2023-03-10&lt;/code&gt;.
The command shown above generates a private RSA key with a 2048-bit key length and saves it to the file &lt;code&gt;id_rsa&lt;/code&gt;.
In the same directory, you can find a file named &lt;code&gt;id_rsa.pub&lt;/code&gt;, and this is a public key.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me, the command was:&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; ssh-keygen &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; rsa &lt;span class=&quot;nt&quot;&gt;-b&lt;/span&gt; 2048 &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; ssh_key_for_jenkins_agent_2023-03-10
 Generating public/private rsa key pair.
 Enter passphrase &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;empty &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;no passphrase&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;:
 Enter same passphrase again:
 Your identification has been saved &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;ssh_key_for_jenkins_agent_2023-03-10
 Your public key has been saved &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;ssh_key_for_jenkins_agent_2023-03-10.pub
 The key fingerprint is:SHA256:yoykbWyCHuqrANFBkO41vuXMC7kLhsVfe8caLWQEUqk user@PC
 The key&lt;span class=&quot;s1&quot;&gt;&#39;s randomart image is:
 +---[RSA 2048]----+
 |.+o ..o.         |
 |.. . ...         |
 |o .  .  .        |
 | + oE  .         |
 |o = o . S        |
 |o+ B.* = o       |
 |++oo&amp;amp; = + +      |
 |= o=o+ . =       |
 |=+.o... .        |
 +----[SHA256]-----+&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 key was generated in the current directory, not in &lt;code&gt;$HOME/.ssh&lt;/code&gt;.
I tend to move the generated key in that &lt;code&gt;$HOME/.ssh&lt;/code&gt; directory (&lt;code&gt;mv ssh_key_for_jenkins_agent_2023-03-10* ~/.ssh&lt;/code&gt; for me).
I then change the directory to &lt;code&gt;$HOME/.ssh&lt;/code&gt; (&lt;code&gt;cd ~/.ssh&lt;/code&gt;) and change the permissions of the key (&lt;code&gt;chmod 600 ssh_key_for_jenkins_agent_2023-03-10&lt;/code&gt;).&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;
2048 bit is the minimal key length that is considered safe.
You can use higher values, but do not use a higher than 4096, as the remote server may not support that big of a key.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Copy the key to the remote machine (your Jenkins agent wannabe running Termux).
Password authentication must be enabled to install a public key on the remote machine.
Now execute: &lt;code&gt;ssh-copy-id -p 8022 -i id_rsa IP_ADDRESS&lt;/code&gt;, making sure to replace &lt;code&gt;id_rsa&lt;/code&gt; with the name of your key and &lt;code&gt;IP_ADDRESS&lt;/code&gt; with the IP address of your Android machine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alternatively, you can manually copy the content inside &lt;code&gt;id_rsa.pub&lt;/code&gt; (public key), which is already on the PC, and looks like &lt;code&gt;ssh-rsa &amp;lt;A LOT OF RANDOM STRINGS&amp;gt; user@host&lt;/code&gt;.
After copying, paste this content to the Termux file &lt;code&gt;$HOME/.ssh/authorized_keys&lt;/code&gt; (remote machine).
Before copying and pasting, you must connect through &lt;code&gt;ssh user@IP_ADDRESS -p 8022&lt;/code&gt;, replacing &lt;code&gt;IP_ADDRESS&lt;/code&gt; with the IP address of your Android machine.
Doing so enables you to copy the content of the public key, using any text editor available on PC, and paste it inside an ssh session handled by Termux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What looks strange to me is that &lt;code&gt;user&lt;/code&gt; could be just about anything.
I tried to log in without supplying a user, which means I was using my PC username, and it worked!
I tried to log in with a different username and this also worked.
When issuing the &lt;code&gt;whoami&lt;/code&gt; command inside Termux, it shows the username of the Termux user, which is &lt;code&gt;u0_a504&lt;/code&gt; in my case.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If everything went fine, you will see a message like this one:&lt;br /&gt;
&lt;/p&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; Number of key&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; added: 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your system has an ssh-agent, you should now &lt;a href=&quot;https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?platform=linux#adding-your-ssh-key-to-the-ssh-agent&quot;&gt;add your newly generated key to the agent&lt;/a&gt;.
After adding the key, try logging into the machine with: &lt;code&gt;ssh -p &#39;8022&#39; &#39;IP_ADDRESS&#39;&lt;/code&gt;
Be sure to replace &lt;code&gt;IP_ADDRESS&lt;/code&gt; with the IP address of your Android machine and check to make sure that only the key(s) you wanted were added.
If you don’t have an agent running, you will have to use a slightly different command: &lt;code&gt;ssh -i id_rsa -p &#39;8022&#39; &#39;IP_ADDRESS&#39;&lt;/code&gt;
Here, you need to replace &lt;code&gt;id_rsa&lt;/code&gt; with the name of your key and &lt;code&gt;IP_ADDRESS&lt;/code&gt; with the IP address of your Android machine.
That would display for me as:&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; ssh &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; ssh_key_for_jenkins_agent_2023-03-10 &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 8022 192.168.1.xx
 Welcome to Termux!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this point, password authentication can be disabled.
Using &lt;code&gt;nano&lt;/code&gt;, edit the file &lt;code&gt;$PREFIX/etc/ssh/sshd_config&lt;/code&gt;, and replace the line beginning &lt;code&gt;PasswordAuthentication&lt;/code&gt; with &lt;code&gt;PasswordAuthentication no&lt;/code&gt;.
Back in the Termux app, execute the command &lt;code&gt;pkill sshd &amp;amp;&amp;amp; sshd&lt;/code&gt; to restart the &lt;code&gt;sshd&lt;/code&gt; server with the updated configuration file.
Of course, if you were to do that from your PC, you would be disconnected and the ssh server would not be restarted.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now you can log in to the remote machine without a password.
Just execute the command &lt;code&gt;ssh -p &#39;8022&#39; &#39;IP_ADDRESS&#39;&lt;/code&gt;
For this command, replace &lt;code&gt;IP_ADDRESS&lt;/code&gt; with the IP address of your Android machine, or with the more complex command &lt;code&gt;-i&lt;/code&gt;, if your machine does not use an ssh agent.&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;installing-java-on-termux&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installing-java-on-termux&quot; /&gt;Installing Java on Termux&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We all know that Jenkins is written in Java.
We also know Android apps are written in Java or Kotlin, so while we could hope that we magically skip this step, I’m afraid we can’t.
The virtual machine that runs Android apps is not the same as the one that runs on your PC.
Later on, we’ll detail the main differences between the two.
The Android virtual machine (called dalvik) is available on Termux, but it is not capable of executing our agent.jar file, since the &lt;code&gt;java&lt;/code&gt; command is not available yet.&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;dalvikvm &lt;span class=&quot;nt&quot;&gt;-showversion&lt;/span&gt;
ART version 2.1.0 arm64
java &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
bash: /data/data/com.termux/files/usr/bin/java: No such file or directory&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the time being, let’s assume that we need to install Java on Termux.
Let’s find out which java versions are available on Termux:&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;pkg update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; pkg search openjdk
Checking availability of current mirror:
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; https://packages-cf.termux.dev/apt/termux-main: ok
Sorting...
Done
Full Text Search...
Done
openjdk-17/stable 17.0-25 aarch64
  Java development kit and runtime
openjdk-17-source/stable 17.0-25 all
  Source files &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;openjdk-17
openjdk-17-x/stable 17.0-25 aarch64
  Portion of openjdk-17 requiring X11 functionality&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nice.
Jenkins supports Java 17 since the &lt;a href=&quot;https://www.jenkins.io/changelog-old/#v2.355&quot;&gt;2.355&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.346.1&quot;&gt;2.346.1 LTS&lt;/a&gt; releases, so let’s go with OpenJDK 17.&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;pkg &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;openjdk-17&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now the &lt;code&gt;java&lt;/code&gt; command is available:&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;java &lt;span class=&quot;nt&quot;&gt;--version&lt;/span&gt;
openjdk 17-internal 2021-09-14
OpenJDK Runtime Environment &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 17-internal+0-adhoc..src&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 17-internal+0-adhoc..src, mixed mode&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;creating-a-jenkins-ssh-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-a-jenkins-ssh-agent&quot; /&gt;Creating a Jenkins ssh agent&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You should now be able to connect via &lt;code&gt;ssh&lt;/code&gt; to your Android device running Termux if you have issued the &lt;code&gt;sshd&lt;/code&gt; command.
Your &lt;code&gt;ssh&lt;/code&gt; server also knows about the &lt;code&gt;ssh&lt;/code&gt; key you generated on your PC.
We will now create a credential based on that key within Jenkins, that will allow you to connect to your Android device running Termux from Jenkins later on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;creating-a-jenkins-ssh-credential&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-a-jenkins-ssh-credential&quot; /&gt;Creating a Jenkins ssh credential&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this part, there is almost nothing specific to Android.
You can follow the &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-agents/&quot;&gt;official documentation&lt;/a&gt;, and there are instructions on how to &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-agents/#create-a-jenkins-ssh-credential&quot;&gt;create a Jenkins credential&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;setting-up-a-jenkins-ssh-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-up-a-jenkins-ssh-agent&quot; /&gt;Setting up a Jenkins ssh agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s now time to &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-agents/#setup-up-the-agent1-on-jenkins&quot;&gt;set up your agent&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use &lt;code&gt;Android&lt;/code&gt; as a label for your agent.
Choose the &lt;code&gt;Launch agent via SSH&lt;/code&gt; option.
The hostname should be your phone’s IP address, which was named &#39;IP_ADDRESS&#39; in the previous steps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The credentials should be the ones you created in the previous steps.
The remote root directory should be &lt;code&gt;/data/data/com.termux/files/home&lt;/code&gt;.
The host key verification strategy should be &lt;code&gt;Non-verifying Verification Strategy&lt;/code&gt;.
The &lt;code&gt;Launch method&lt;/code&gt; should be &lt;code&gt;Launch agent via SSH&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t forget to select the &lt;strong&gt;Advanced&lt;/strong&gt; option and change the port to &lt;code&gt;8022&lt;/code&gt;.
You could also specify the path of the &lt;code&gt;java&lt;/code&gt; executable you installed in the previous steps, which happens to be &lt;code&gt;/data/data/com.termux/files/usr/bin/java&lt;/code&gt;.
Since I have installed the &#39;Platform Labeller&#39; plugin, I have also checked the &#39;Automatic Platform Labels&#39; checkbox.
We’ll see later on if it can cope with Android devices that don’t use the &lt;code&gt;lsb_release&lt;/code&gt; command.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The very last thing to do is to select &lt;code&gt;Save&lt;/code&gt;.
You should now see the complete list of your defined agents.
While the agent has been created, it may have not started yet.
If that’s the case, select the name corresponding to your newly created agent (&#39;Android Phone&#39; for me) and select &lt;code&gt;Launch&lt;/code&gt; to start the agent.
After some time, you should see in the logs &lt;code&gt;Agent successfully connected and online&lt;/code&gt;, which means you can now use this agent to run your builds.&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;using-a-jenkins-ssh-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-a-jenkins-ssh-agent&quot; /&gt;Using a Jenkins ssh agent&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s create a new job and use our newly created agent to run it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The simplest job that comes to mind is a &lt;code&gt;Freestyle project&lt;/code&gt; that runs the &lt;code&gt;uname -a&lt;/code&gt; command.
That should give us some information about the Android device we are running on, while proving that the agent is working.
Once again, there is nothing specific to Android for this step, so you can follow the &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-agents/#delegating-the-first-job-to-agent1&quot;&gt;official documentation&lt;/a&gt;.
The only changes to the documentation I have made are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I have used the &lt;code&gt;Android&lt;/code&gt; label to make sure the job is run on the Android agent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have used the &lt;code&gt;uname -a&lt;/code&gt; command instead of the &lt;code&gt;echo $NODE_NAME&lt;/code&gt; command.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;Started by user admin
Running as SYSTEM[EnvInject] - Loading node environment variables.
Building remotely on Android Phone &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;aarch64 aarch64-unknown+check_lsb_release_installed aarch64-unknown+check_lsb_release_installed-unknown+check_lsb_release_installed android unknown+check_lsb_release_installed-unknown+check_lsb_release_installed unknown+check_lsb_release_installed&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;workspace /data/data/com.termux/files/home/workspace/Android First Job
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Android First Job] /bin/sh &lt;span class=&quot;nt&quot;&gt;-xe&lt;/span&gt; /data/data/com.termux/files/usr/tmp/jenkins13760213506108463207.sh
+ &lt;span class=&quot;nb&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;
Linux localhost 4.4.192-perf+ &lt;span class=&quot;c&quot;&gt;#1 SMP PREEMPT Fri Dec 10 13:53:37 WIB 2021 aarch64 Android&lt;/span&gt;
Finished: SUCCESS&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We now have a working Jenkins agent running on Android, thanks to Termux.
Now what?
Of course, we will be limited to the commands and packages that are &lt;a href=&quot;https://wiki.termux.com/wiki/Package_Management&quot;&gt;available&lt;/a&gt; on Termux.
For example, I can’t see &lt;code&gt;gcc&lt;/code&gt; in the list of available packages, which could be troublesome.&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;pkg search gcc
Checking availability of current mirror:
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; https://termux.astra.in.ua/apt/termux-main: ok
Sorting...
Done
Full Text Search...
Done&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No gcc?
You’re right, there is no &lt;code&gt;gcc&lt;/code&gt; in the official Termux repository.
However, the Termux community comes to the rescue with some repositories that provide additional packages, like &lt;a href=&quot;https://github.com/its-pointless/its-pointless.github.io&quot;&gt;gcc&lt;/a&gt;.
After installing the repository, we can install &lt;code&gt;gcc&lt;/code&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;pkg search gcc
Checking availability of current mirror:
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; https://termux.astra.in.ua/apt/termux-main: ok
Sorting...
Done
Full Text Search...
Done
gcc-6/termux 6.5.0-2 aarch64
  GNU C compiler
gcc-7/termux 7.4.0-2 aarch64
  GNU C compiler
gcc-8/termux 8.3.0-3 aarch64
  GNU C compiler
libgccjit-8-dev/termux 8.3.0-3 aarch64
  GCC just-in-time compilation
libgomp-7/termux 7.4.0-2 aarch64
  openmp library &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;gcc
libgomp-8/termux 8.3.0-3 aarch64
  openmp library &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;gcc-8&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, we have a few &lt;code&gt;gcc&lt;/code&gt; versions to try out.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What if we need &lt;code&gt;gcc&lt;/code&gt; 10, for example?
We would have to &lt;a href=&quot;https://bruno.verachten.fr/2019/11/07/compile-gcc9-on-rk3399/&quot;&gt;compile it ourselves&lt;/a&gt; like in the good old days.
This solves the problem for &lt;code&gt;gcc&lt;/code&gt;, but what about other packages?
We are somewhat limited by the availability of packages on Termux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What if we could work around that limitation though?
What about running Docker on Termux?
Docker has no limit on packages as long as we choose the right base image, right?
So, we could run a Jenkins agent on Termux through a Docker image, based on another distribution that happens to supply all the packages we need.
The &lt;em&gt;slight&lt;/em&gt; problem that may arise, is that Docker is not easily installed on Termux, and once installed, it won’t work out of the box.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;android-apps-are-running-some-kind-of-jvm-right-so-why-not-use-a-jenkins-inbound-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#android-apps-are-running-some-kind-of-jvm-right-so-why-not-use-a-jenkins-inbound-agent&quot; /&gt;Android apps are running some kind of JVM, right? So why not use a Jenkins inbound agent?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Android apps are written in Java or Kotlin programming languages, and they run on one of two Java Virtual Machines (JVM):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Android Runtime, known as &lt;a href=&quot;https://en.wikipedia.org/wiki/Android_Runtime&quot;&gt;ART&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dalvik Virtual Machine, known as &lt;a href=&quot;https://en.wikipedia.org/wiki/Dalvik_%28software%29&quot;&gt;DVM&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;It is possible to access the JVM from an &lt;code&gt;ADB&lt;/code&gt; shell and run Java code using the &lt;code&gt;dalvikvm&lt;/code&gt; command.
This is a command-line tool that allows you to execute Java code on the DalvikVM.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nevertheless, there are preliminary steps that you need to take before you can run Java code on an Android device:
* Compile your Java code into a &lt;code&gt;.class&lt;/code&gt; file
* Transform it into the &lt;code&gt;DEX&lt;/code&gt; format using the &lt;code&gt;d8&lt;/code&gt; tool
* Push the resulting  &lt;code&gt;.dex&lt;/code&gt; file to your Android device
* Run the Java class using the &lt;code&gt;dalvikvm&lt;/code&gt; command.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s possible to some extent to automate these steps, but it’s not trivial.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;dalvikvm&lt;/code&gt; command is a low-level tool that may not be suitable for running complex Java apps, which may need additional dependencies to function properly.
Even if that would work, it would be a very roundabout solution (which is fine with me), but where would we go from there?
I mean, we have a subset of the Linux commands available in the ADB shell, but we can’t install tools, packages, etc.
For example, how would we install &lt;code&gt;gcc&lt;/code&gt;?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So what could our Jenkins agent do?
Not so much I’m afraid…​
We could still use Termux, as we’ve seen earlier Termux uses the base shell that is available through ADB.
If we could launch the inbound agent through Dalvik, we would be able to use the Dalvik VM while using Termux, to keep the best of both worlds (Android &amp;amp; Linux-like).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another solution would be to create a library from the agent.jar file and integrate it into an Android app.
That part could work but then the resulting agent would be even more limited.
There wouldn’t be a shell available, as the app is sandboxed.
We would have an agent able to do almost nothing…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d like to know more nonetheless, so I’ll write down my thoughts about that in another article, once I’ve done my homework.&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/2023/03/27/repository-signing-keys-changing/</id>
<title>Jenkins 2.397 and 2.387.2: New Linux Repository Signing Keys</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-03-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/03/27/repository-signing-keys-changing/" />
<author>
<name>markewaite</name>
</author>
<category term='announcement'></category>
<category term='linux'></category>
<category term='platform'></category>
<summary>
Beginning March 28, 2023, the Jenkins weekly releases will use new repository signing keys for the Linux installation packages.
The same change will be made in Jenkins LTS releases beginning April 5, 2023.
Administrators of Linux systems must install the new signing keys on their Linux servers before installing Jenkins Jenkins weekly 2.397 or Jenkins LTS 2.387.2.


Debian/Ubuntu


Update Debian compatible operating systems (Debian, Ubuntu, Linux Mint Debian Edition, etc.) with the command:


Debian/Ubuntu LTS release

curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc &gt; /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list &gt; /dev/null



Debian/Ubuntu weekly release

curl -fsSL https://pkg.jenkins.io/debian/jenkins.io-2023.key |...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning March 28, 2023, the Jenkins weekly releases will use new repository signing keys for the Linux installation packages.
The same change will be made in Jenkins LTS releases beginning April 5, 2023.
Administrators of Linux systems &lt;strong&gt;must&lt;/strong&gt; install the new signing keys on their Linux servers &lt;strong&gt;before&lt;/strong&gt; installing Jenkins Jenkins weekly 2.397 or Jenkins LTS 2.387.2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;debianubuntu&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#debianubuntu&quot; /&gt;Debian/Ubuntu&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Update Debian compatible operating systems (Debian, Ubuntu, Linux Mint Debian Edition, etc.) with the command:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Debian/Ubuntu LTS release&lt;/div&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;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  /usr/share/keyrings/jenkins-keyring.asc &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;deb &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;signed-by&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/share/keyrings/jenkins-keyring.asc] &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  https://pkg.jenkins.io/debian-stable binary/ | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  /etc/apt/sources.list.d/jenkins.list &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Debian/Ubuntu weekly release&lt;/div&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;curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://pkg.jenkins.io/debian/jenkins.io-2023.key | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  /usr/share/keyrings/jenkins-keyring.asc &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;deb &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;signed-by&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/share/keyrings/jenkins-keyring.asc] &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  https://pkg.jenkins.io/debian binary/ | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  /etc/apt/sources.list.d/jenkins.list &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null&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;red-hatcentos&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#red-hatcentos&quot; /&gt;Red Hat/CentOS&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Update Red Hat compatible operating systems (Red Hat Enterprise Linux, Alma Linux, CentOS, Fedora, Oracle Linux, Rocky Linux, Scientific Linux, etc.) with the command:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Red Hat/CentOS LTS release&lt;/div&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;sudo &lt;/span&gt;rpm &lt;span class=&quot;nt&quot;&gt;--import&lt;/span&gt; https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Red Hat/CentOS weekly release&lt;/div&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;sudo &lt;/span&gt;rpm &lt;span class=&quot;nt&quot;&gt;--import&lt;/span&gt; https://pkg.jenkins.io/redhat/jenkins.io-2023.key&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;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;what-if-i-dont-update-the-repository-signing-key&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-if-i-dont-update-the-repository-signing-key&quot; /&gt;What if I don’t update the repository signing key?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Updates may be &lt;strong&gt;blocked&lt;/strong&gt; or interrupted by the operating system package manager (apt, yum, dnf) on operating systems that have not installed the new repository signing key.
Sample messages from the operating system may look like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Debian/Ubuntu&lt;/div&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;Reading package lists... Done
W: GPG error: https://pkg.jenkins.io/debian-stable binary/ Release:
    The following signatures couldn&lt;span class=&quot;s1&quot;&gt;&#39;t be verified because the public key is not available:
        NO_PUBKEY FCEF32E745F2C3D5
E: The repository &#39;&lt;/span&gt;https://pkg.jenkins.io/debian-stable binary/ Release&lt;span class=&quot;s1&quot;&gt;&#39; is not signed.
N: Updating from such a repository can&#39;&lt;/span&gt;t be &lt;span class=&quot;k&quot;&gt;done &lt;/span&gt;securely, and is therefore disabled by default.
N: See apt-secure&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;8&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; manpage &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;repository creation and user configuration details.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Red Hat/CentOS&lt;/div&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;Downloading packages:
warning: /var/cache/yum/x86_64/7/jenkins/packages/jenkins-2.397-1.1.noarch.rpm:
    Header V4 RSA/SHA512 Signature, key ID 45f2c3d5: NOKEY
Public key &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;jenkins-2.397-1.1.noarch.rpm is not installed&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;why-is-the-repository-signing-key-being-updated&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-is-the-repository-signing-key-being-updated&quot; /&gt;Why is the repository signing key being updated?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The repository signing key expires after 3 years so that it matches with the expiration dates of the jar file signing and the MSI signing certificate.
The updated GPG repository signing key is used in the weekly repositories and the stable repositories.&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;Operating systems that use Debian package management (apt) and operating systems that use Red Hat package management (yum and dnf) need the new repository signing key.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other operating systems like Windows, macOS, FreeBSD, OpenBSD, Solaris, and OpenIndiana are not affected.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/03/10/miniJen-and-RISC-V/</id>
<title>miniJen and RISCV</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-03-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/03/10/miniJen-and-RISC-V/" />
<category term='jenkins'></category>
<category term='miniJen'></category>
<category term='riscv'></category>
<summary>
Short Introduction


What is miniJen?
It&#8217;s the smallest Jenkins multi-cpu-architectures instance known to this day.





It&#8217;s composed of a 4 arm Cortex-A55 core RockChip controller (aarch64), a 4 arm Cortex-A7a core AllWinner agent (armv7l), a 4 arm Cortex-A53 core AllWinner agent (aarch64), and a single RV64GCV core AllWinner agent (RISC-V).




A bit of personal history


I&#8217;ve been an arm fanboy for years, it all started in 2014 or so when I bought a Raspberry Pi.
At that time, it reminded me of my younger days when I used to tinker with an HP-48SX calculator, using assembly language, discovering new methods, new instructions, and new backdoors every...
</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/2023/03/03/2023-03-03-miniJen-is-alive/image2.png&quot; alt=&quot;miniJen logo&quot; width=&quot;100&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;short-introduction&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#short-introduction&quot; /&gt;Short Introduction&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What is miniJen?
It’s the smallest Jenkins multi-cpu-architectures instance known to this day.&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/2023/03/03/2023-03-03-miniJen-is-alive/fosdem_2023_booth_display.jpg&quot; alt=&quot;miniJen as a FOSDEM display on the booth&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s composed of a 4 &lt;a href=&quot;https://en.wikipedia.org/wiki/Arm_(company)&quot;&gt;arm&lt;/a&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/ARM_Cortex-A55&quot;&gt;Cortex-A55&lt;/a&gt; core &lt;a href=&quot;https://en.wikipedia.org/wiki/Rockchip&quot;&gt;RockChip&lt;/a&gt; controller (&lt;a href=&quot;https://en.wikipedia.org/wiki/AArch64#ARMv8.2-A&quot;&gt;aarch64&lt;/a&gt;), a 4 arm &lt;a href=&quot;https://en.wikipedia.org/wiki/ARM_Cortex-A7&quot;&gt;Cortex-A7a&lt;/a&gt; core &lt;a href=&quot;https://en.wikipedia.org/wiki/Allwinner_Technology&quot;&gt;AllWinner&lt;/a&gt; agent (&lt;a href=&quot;https://en.wikipedia.org/wiki/ARM_architecture_family#AArch32&quot;&gt;armv7l&lt;/a&gt;), a 4 arm &lt;a href=&quot;https://en.wikipedia.org/wiki/ARM_Cortex-A53&quot;&gt;Cortex-A53&lt;/a&gt; core AllWinner agent (aarch64), and a single &lt;a href=&quot;https://linux-sunxi.org/D1#cite_note-riscv_extensions-4&quot;&gt;RV64GCV&lt;/a&gt; core AllWinner agent (&lt;a href=&quot;https://en.wikipedia.org/wiki/RISC-V&quot;&gt;&lt;code&gt;RISC-V&lt;/code&gt;&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;a-bit-of-personal-history&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-bit-of-personal-history&quot; /&gt;A bit of personal history&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been an arm fanboy for years, it all started in 2014 or so when I bought a &lt;a href=&quot;https://en.wikipedia.org/wiki/Raspberry_Pi&quot;&gt;Raspberry Pi&lt;/a&gt;.
At that time, it reminded me of my younger days when I used to tinker with an &lt;a href=&quot;https://en.wikipedia.org/wiki/HP_48_series&quot;&gt;HP-48SX&lt;/a&gt; calculator, using &lt;a href=&quot;https://literature.hpcalc.org/community/hp48sx-mldl.pdf&quot;&gt;assembly language&lt;/a&gt;, discovering new methods, new instructions, and new backdoors every other day.
Later on, when resin.io (now &lt;a href=&quot;https://blog.balena.io/resin-io-changes-name-to-balena-releases-open-source-edition/&quot;&gt;balena.io&lt;/a&gt;) ported &lt;a href=&quot;https://en.wikipedia.org/wiki/Docker_(software)&quot;&gt;Docker&lt;/a&gt; to the &lt;a href=&quot;https://linuxgizmos.com/open-source-resinos-adds-docker-to-armlinux-boards/&quot;&gt;arm processor&lt;/a&gt;, I then became obsessed with arm and Docker.&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/2023/03/10/2023-03-10-miniJen-and-RISC-V/docker-on-arm.png&quot; alt=&quot;Docker on arm&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I spent way too much time compiling FOSS for &lt;code&gt;arm32&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt;, and building docker images around them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was fun, it was exploratory, it was a way to learn new things…​ and it was a way to contribute to the FOSS community.
I made a lot of friends, and I gained a lot of knowledge.
I sometimes had to recompile gcc with…​ gcc to be able to recompile ffmpeg for example, and one thing led to another.
I had to recompile one library, then another, then a utility, then another library, then the kernel, then another library…​
Boy, that was fun!
These were good times.
I may sound nostalgic, and I think I am.
It was hard, but there were immediate or delayed benefits because everybody was benefiting from the community work.
For multiple reasons, such as energy saving, IoT, Edge Computing, server rooms, Cloud, or just for fun, arm was bound to be everywhere.
It was the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Colleagues, who also happen to be friends, used to call me &quot;&lt;em&gt;mister WhatIf&lt;/em&gt;&quot;.
Yes, I had way too many ideas, but if you want to find a good idea one of these days, you have to let tons of ideas, good or bad, make their way into the world.
So yes, basically I was spending most of my free time asking myself (and friends) &quot;&lt;em&gt;What if…​?&lt;/em&gt;&quot;.
Most of the time, these &quot;&lt;em&gt;What if…​?&lt;/em&gt;&quot; questions lead to an implementation on an arm SBC, due to how cheap and available they were at that time.
Some of these experiments were successful, and some were not.
Frankly, hosting a complete Gitlab server on a Raspberry Pi 3B was ambitious, but I learned a lot from them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back to arm: when the future becomes the present, it’s not that exciting anymore.
Arm is not as &lt;a href=&quot;https://twitter.com/jonmasters/status/1523041597683683328&quot;&gt;boring&lt;/a&gt; as X86, but most of the software now works on arm, from microcontrollers to the Cloud.
Even &lt;a href=&quot;https://arstechnica.com/gadgets/2022/02/lenovo-announces-the-first-arm-based-thinkpad/&quot;&gt;laptops&lt;/a&gt; and &lt;a href=&quot;https://www.apple.com/macbook-air-m2/&quot;&gt;MacBooks&lt;/a&gt; have seen the light of arm.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you don’t own any arm hardware, you can still develop for this architecture thanks to &lt;a href=&quot;https://www.qemu.org/docs/master/system/target-arm.html&quot;&gt;QEMU&lt;/a&gt; and &lt;a href=&quot;https://docs.docker.com/build/building/multi-platform/&quot;&gt;Docker&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You may come across sentiments such as:&lt;br&gt;
It’s not that hard to compile the software for arm anymore. &lt;br&gt;
It’s not that exciting anymore. &lt;br&gt;
It’s not that fun anymore. &lt;br&gt;
It’s not that exploratory anymore. &lt;br&gt;
It’s not that rewarding anymore. &lt;br&gt;
It’s not that challenging anymore. &lt;br&gt;
It’s not that cool anymore. &lt;br&gt;
It’s not that…​ well, you get the point.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I still love the arm ecosystem and all the people I’ve met, but it feels like the honeymoon time is gone and we’re in a more platonic relationship now.
It is stable, deep, and true, (I love the &lt;a href=&quot;https://www.arm.com/resources/developer-program&quot;&gt;arm community&lt;/a&gt;!) but the time has come to find another quest.&lt;/p&gt;
&lt;/div&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-risc-v-quest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-risc-v-quest&quot; /&gt;The &lt;code&gt;RISC-V&lt;/code&gt; quest&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been lurking in the &lt;a href=&quot;https://en.wikipedia.org/wiki/RISC-V&quot;&gt;&lt;code&gt;RISC-V&lt;/code&gt;&lt;/a&gt; community, projects, SoCs, SBCs, and vendors for a while now, and following the &lt;a href=&quot;https://riscv.org/&quot;&gt;RISC-V Foundation&lt;/a&gt; for quite some time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Until recently, I didn’t have any &lt;code&gt;RISC-V&lt;/code&gt; hardware to play with and I was not seeing myself buying a very expensive, but lame, &lt;code&gt;RISC-V&lt;/code&gt; SBC without any project in mind.
I was waiting for the right moment and the right project.
I’ve been working with Jenkins since April 2022, and with my love of arm being what it is, my first contributions were about &lt;code&gt;arm32&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt; for the Jenkins project.
During the summer of 2022, I spotted an interesting &lt;code&gt;RISC-V&lt;/code&gt; board called the &lt;a href=&quot;https://mangopi.org/mangopi_mqpro&quot;&gt;MQ-PRO&lt;/a&gt; from an unknown (to me) manufacturer called MangoPi.
The price was right, and even though the specs were not that good, the board was available.
At that time, the software support was not the best, but I was not afraid of that because of my personal history with arm.
However, I did not buy it because I was not sure if I would have the time to work on it.
At the beginning of September 2022, the amazing Michael Hurt organized a giveaway on his &lt;a href=&quot;https://twitter.com/Mingusdude&quot;&gt;Twitter account&lt;/a&gt;.&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/2023/03/10/2023-03-10-miniJen-and-RISC-V/giveaway.png&quot; alt=&quot;Michael Hurt Giveaway&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I won the board thanks to &lt;a href=&quot;https://twitter.com/Mingusdude/status/1565887135785312256&quot;&gt;my proposal&lt;/a&gt; linked to Jenkins.&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/2023/03/10/2023-03-10-miniJen-and-RISC-V/proposal.png&quot; alt=&quot;poddingue’s proposal&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At that time, I had no clear idea if &lt;a href=&quot;https://builds.shipilev.net/openjdk-jdk-riscv/&quot;&gt;Java&lt;/a&gt; would run on &lt;code&gt;RISC-V&lt;/code&gt;, and of course no clue if Jenkins would run on top of that.
I also knew &lt;a href=&quot;https://carlosedp.medium.com/docker-containers-on-risc-v-architecture-5bc45725624b&quot;&gt;Docker&lt;/a&gt; was not yet officially available for RISC-V.
That sounded way too fun not to try…​ especially since the board was basically free.
I then felt the same level of excitement I used to feel when I was working on &lt;code&gt;arm32&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt;.
This meant there was once again new territories to explore, new challenges to face, new friends to make, and new knowledge to gain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/qdHSuClqtic?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;the-risc-v-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-risc-v-journey&quot; /&gt;The &lt;code&gt;RISC-V&lt;/code&gt; journey&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;prerequisites-and-first-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#prerequisites-and-first-steps&quot; /&gt;Prerequisites and first steps&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I read in the &lt;a href=&quot;https://twitter.com/bretweber/status/1559631172623278081&quot;&gt;news&lt;/a&gt; that Ubuntu 22.04 was supplying a &lt;code&gt;RISC-V&lt;/code&gt; image, designed for the &lt;a href=&quot;https://linux-sunxi.org/Allwinner_Nezha&quot;&gt;AllWinner Nezha&lt;/a&gt;, that could work for this board.
The Nezha was the first &lt;a href=&quot;https://linux-sunxi.org/D1&quot;&gt;D1&lt;/a&gt;-based board made available to the public.
The MangoPi MQ-Pro came after that, but shares more or less the same set of components.
As strange as it may seem (a &lt;code&gt;RISC-V&lt;/code&gt; build by an &lt;code&gt;Arm&lt;/code&gt;bian contributor), I also found an &lt;a href=&quot;https://forum.armbian.com/topic/21465-armbian-image-and-build-support-for-risc-v/&quot;&gt;image&lt;/a&gt; built by a regular contributor of Armbian, &lt;a href=&quot;https://forum.armbian.com/profile/1215-balbes150/&quot;&gt;balbes150&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started by downloading &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=333&quot;&gt;&lt;code&gt;Armbian_22.08.0-trunk_Nezha_jammy_current_6.1.0_xfce_desktop.img&lt;/code&gt;&lt;/a&gt; from December 06, 2002, burned it thanks to &lt;a href=&quot;https://www.balena.io/etcher&quot;&gt;Balena Etcher&lt;/a&gt;, and was able to &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=663&quot;&gt;boot&lt;/a&gt; the board.
&lt;a href=&quot;https://twitter.com/bretweber&quot;&gt;bret.dk&lt;/a&gt; gave me an interesting pointer to &lt;a href=&quot;https://jamesachambers.com/&quot;&gt;James A. Chambers&#39;&lt;/a&gt; &lt;a href=&quot;https://jamesachambers.com/mangopi-mq-pro-d1-ubuntu-preview/&quot;&gt;blog post&lt;/a&gt; about the Ubuntu Preview for RISC-V.
In the blog post from James A. Chambers, there is a paragraph about OpenJDK Availability for RISC-V, and we can see that there is a wide range of OpenJDK versions, from 11 to 20, available here.
That was unexpected because I thought I would have to compile everything from scratch, make changes to the build system, and so on.&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/2023/03/03/2023-03-03-miniJen-is-alive/mq-pro.png&quot; alt=&quot;MangoPi MQ-Pro pic from the manufacturer&quot; width=&quot;500&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, the board is very minimalistic.
We only have two USB-C ports, with one being used for power, a microSD card slot, and a mini HDMI port.
My goal was to get this board on the Wi-Fi network, but how would that be possible without an Ethernet port?
Most of the time when I use Armbian, I just plug in an Ethernet cable, and I’m good to go, as the board uses DHCP by default.
I just have to search for a new machine appearing on the router webpage, and issue an &lt;code&gt;ssh&lt;/code&gt; command to connect to it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This time, I was kind of stuck.
I had no USB-C keyboard, no mini-HDMI cable, and no Ethernet plug to use.
What was I to do?
Once again, &lt;a href=&quot;https://twitter.com/bretweber&quot;&gt;bret.dk&lt;/a&gt; came to the rescue.
Bret does tons of reviews on &lt;a href=&quot;https://bret.dk/&quot;&gt;his blog&lt;/a&gt; and I found &lt;a href=&quot;https://bret.dk/waveshare-raspberry-pi-usb-ethernet-hat-review/&quot;&gt;one&lt;/a&gt; about an Ethernet/USB hat for the Raspberry Pi Zero W.
I bought the same hat, a USB-C hub just in case, and a mini-HDMI cable.
The hat never worked for me for some reason, but the USB-C hub did.
It’s an almost-no-name &lt;a href=&quot;https://www.amazon.fr/gp/product/B08GM2H1Q2&quot;&gt;generic hub&lt;/a&gt;, but it worked.
I managed to get Ethernet on it so that my board got an IP address from my router.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;linux-and-java-installation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#linux-and-java-installation&quot; /&gt;Linux and Java installation&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;linux&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#linux&quot; /&gt;Linux&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I could then &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=969&quot;&gt;log in&lt;/a&gt; thanks to &lt;code&gt;ssh&lt;/code&gt;, create an admin user, and so on.
I then &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=1239&quot;&gt;removed&lt;/a&gt; packages linked to &lt;code&gt;X11&lt;/code&gt; that I didn’t need for my use case.
Later on, I &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=2111&quot;&gt;configured&lt;/a&gt; a Wi-Fi connection, and &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=2220&quot;&gt;created&lt;/a&gt; a &lt;code&gt;jenkins&lt;/code&gt; user.
The next step logically, was to &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=2391&quot;&gt;install&lt;/a&gt; the default OpenJDK 17 build provided by Ubuntu.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;java&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java&quot; /&gt;Java&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I now know the default OpenJDK 17 build is a Zero VM build, so I also &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=2551&quot;&gt;installed&lt;/a&gt; a nightly build of Temurin’s &lt;a href=&quot;https://github.com/adoptium/temurin19-binaries/releases&quot;&gt;OpenJDK 19&lt;/a&gt; and &lt;a href=&quot;https://github.com/adoptium/temurin20-binaries/releases&quot;&gt;OpenJDK 20&lt;/a&gt;.
By the way, do you know what &lt;a href=&quot;https://twitter.com/adoptium/status/1435519863091564547&quot;&gt;Temurin&lt;/a&gt; is?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Temurin is both a chemical similar to caffeine and an anagram of &quot;runtime&quot;.
Oh, and a cool new free-to-use Java runtime from the Eclipse Foundation!
Enjoy.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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/2023/03/10/2023-03-10-miniJen-and-RISC-V/temurin.png&quot; alt=&quot;Temurin is almost caffeine&quot; width=&quot;500&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;zero-vm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#zero-vm&quot; /&gt;Zero VM&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You may wonder what a Zero VM build is, and why I want to use something else.
Zero VM builds come with pros and cons:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Zero VM is a Java Virtual Machine implementation that is designed to execute Java applications on systems that use architectures other than the x86 architecture.
It is specifically &lt;em&gt;optimized&lt;/em&gt; for systems that use ARM, PowerPC, and other non-x86 architectures.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://openjdk.org/projects/zero/&quot;&gt;Zero VM&lt;/a&gt; is part of the &lt;a href=&quot;https://openjdk.org/&quot;&gt;OpenJDK project&lt;/a&gt;, which is an open-source implementation of the Java SE platform.
Zero VM uses a technique called &quot;interpreter-only&quot; mode, which allows it to run on platforms that do not support just-in-time (JIT) compilation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In interpreter-only mode, Zero VM executes Java bytecode directly, without compiling it to native code (it does not use any assembler).
This approach typically results in slower performance compared to &lt;a href=&quot;https://developers.redhat.com/articles/2021/06/23/how-jit-compiler-boosts-java-performance-openjdk&quot;&gt;JIT&lt;/a&gt;-enabled VMs, but it has the advantage of being able to run on a wider range of platforms.
That’s why the developers got a working OpenJDK to build &lt;em&gt;this early&lt;/em&gt; for RISC-V.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, as much as I’m grateful for the Zero VM build, I’m also curious to see how Temurin’s builds perform on this board.
In other words, the board is already so slow that using a Zero VM will make it unusable.
There, I said it.
The default OpenJDK implementation is there just in case I need to use it for some reason, but I plan to only use Temurin’s builds.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;openjdk-19&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#openjdk-19&quot; /&gt;OpenJDK 19&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you may already know, JDK19 is almost &lt;a href=&quot;https://endoflife.date/java&quot;&gt;end of life&lt;/a&gt; (21st of March 2023), so I’m not going to use it for long, and Temurin does not provide steady &lt;code&gt;RISC-V&lt;/code&gt; nightly builds.
Speaking of end-of-life, I could not recommend enough &lt;a href=&quot;https://endoflife.date/&quot;&gt;endoflife.date&lt;/a&gt; which is an &lt;a href=&quot;https://github.com/endoflife-date/endoflife.date&quot;&gt;open-source&lt;/a&gt; project that aims to provide a simple way to find the end-of-life dates of software and operating systems.
It even provides an &lt;a href=&quot;https://endoflife.date/docs/api&quot;&gt;API&lt;/a&gt; to query the data.
Thanks a lot to &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Mark Waite&lt;/a&gt; for letting me know about this project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back to openJDK19, how did I find the last &lt;code&gt;RISC-V&lt;/code&gt; published nightly build?
While discussing with &lt;a href=&quot;https://twitter.com/sxaTech&quot;&gt;Stewart Addison&lt;/a&gt; on various GitHub issues related to Temurin on &lt;code&gt;RISC-V&lt;/code&gt; (and &lt;code&gt;aarch64&lt;/code&gt;), and later on through Temurin’s &lt;a href=&quot;https://adoptium.net/slack/&quot;&gt;Slack channel&lt;/a&gt;, we sympathized.
He mentioned that he had the same board, and gave me a link to the &lt;a href=&quot;https://ci.adoptopenjdk.net/job/build-scripts/job/jobs/job/jdk19u/job/jdk19u-linux-riscv64-temurin/14/&quot;&gt;latest &lt;code&gt;RISC-V&lt;/code&gt; build&lt;/a&gt; he could find.
So, that’s the version &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=2565&quot;&gt;I’m using&lt;/a&gt; for now.
Please note that your libc should be at least &lt;a href=&quot;https://sourceware.org/pipermail/libc-alpha/2022-February/136040.html&quot;&gt;&lt;code&gt;2.35&lt;/code&gt;&lt;/a&gt; for this build to work.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-risc-v-jenkins-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-risc-v-jenkins-agent&quot; /&gt;The &lt;code&gt;RISC-V&lt;/code&gt; Jenkins agent&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;installation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installation&quot; /&gt;Installation&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I then &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=3174&quot;&gt;added an &lt;code&gt;ssh&lt;/code&gt; key&lt;/a&gt; on the &lt;code&gt;RISC-V&lt;/code&gt; machine that would become an agent, &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=3125&quot;&gt;created&lt;/a&gt; a new node within the Jenkins UI, and installed the &lt;a href=&quot;https://www.youtube.com/watch?v=4KghHJEz5no&amp;amp;t=115s&quot;&gt;agent&lt;/a&gt; on it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;testing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing&quot; /&gt;Testing&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last thing to do before confirming that Jenkins works on &lt;code&gt;RISC-V&lt;/code&gt; was to launch a &lt;a href=&quot;https://www.youtube.com/live/xtI1nwwe70A?feature=share&amp;amp;t=3383&quot;&gt;simple &lt;code&gt;RISC-V&lt;/code&gt; job&lt;/a&gt;.
Spoiler alert, it did work!&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/2023/03/10/2023-03-10-miniJen-and-RISC-V/simplest-riscv-job-possible.png&quot; alt=&quot;Simplest RISC-V job ever&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next step was to install a &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;Pipeline&lt;/a&gt; that &lt;a href=&quot;https://github.com/gounthar/jenkins-temurin-riscv/blob/main/Jenkinsfile#L7&quot;&gt;downloads&lt;/a&gt; the latest &lt;a href=&quot;https://github.com/adoptium/temurin20-binaries/tree/6855a34aca01a3368b3feaf138784ea3a4c08c99&quot;&gt;nightly build of Temurin openJDK20&lt;/a&gt;, and installs it on the &lt;code&gt;RISC-V&lt;/code&gt; machine, overriding the one I installed previously.
This is done mostly thanks to the &lt;a href=&quot;https://github.com/cli/cli&quot;&gt;&lt;code&gt;gh&lt;/code&gt; command line tool&lt;/a&gt; that can do wonders when it comes to interacting with GitHub on the command line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;gh&lt;/code&gt; is open-source, and it’s even available for &lt;code&gt;RISC-V&lt;/code&gt;, but not directly in the &lt;a href=&quot;https://github.com/cli/cli/releases&quot;&gt;&lt;code&gt;gh&lt;/code&gt; GitHub releases&lt;/a&gt;.
As far as I know, &lt;code&gt;go&lt;/code&gt; is &lt;a href=&quot;https://go.dev/dl/&quot;&gt;not yet officially available&lt;/a&gt; for &lt;code&gt;RISC-V&lt;/code&gt;, and &lt;code&gt;gh&lt;/code&gt; is written in &lt;code&gt;go&lt;/code&gt;.
So what’s the catch?
Well, it’s open-source, and Ubuntu has a &lt;a href=&quot;https://packages.ubuntu.com/source/lunar/gh&quot;&gt;source package&lt;/a&gt; for it.
Even if I can’t see the binary package for &lt;code&gt;RISC-V&lt;/code&gt; on the &lt;a href=&quot;https://packages.ubuntu.com/lunar/gh&quot;&gt;Ubuntu package page&lt;/a&gt;, it magically appeared on my machine after an &lt;code&gt;apt install gh&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline uses openJDK19 to update openJDK20, and openJDK20 to update openJDK19.
The main Jenkins process is still running on the Zero VM openJDK17, which is something I’ll have to address later on.
That part worked, and I was pretty happy about the result.&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/2023/03/10/2023-03-10-miniJen-and-RISC-V/openjdk-job.png&quot; alt=&quot;OpenJDK RISC-V&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But what about a smoke test?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I mean, I’m not going to use Jenkins on &lt;code&gt;RISC-V&lt;/code&gt; if I can’t build a real-life project with it, right?
I asked in the community, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Mark Waite&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil/&quot;&gt;Basil Crow&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal/&quot;&gt;Damien Duportal&lt;/a&gt; all agreed that the best way to test Jenkins on &lt;code&gt;RISC-V&lt;/code&gt; was to build a few Jenkins plugins with it.
I started with an ambitious project, the &lt;a href=&quot;https://plugins.jenkins.io/git/&quot;&gt;git plugin&lt;/a&gt; itself.
Well, it was quite big and not ready for openJDK19, so I switched to a smaller one, the &lt;a href=&quot;https://plugins.jenkins.io/git-client/&quot;&gt;git client plugin&lt;/a&gt;.
Unfortunately, the results were similar and did not go well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I then switched to a very basic one, the &lt;a href=&quot;https://plugins.jenkins.io/jenkins-infra-test/&quot;&gt;infrastructure test plugin&lt;/a&gt;, which is used to test the Jenkins infrastructure as its name implies.
Bad luck occurred once again, as it was not ready for open JDK19 either.
In desperation, I switched to the &lt;a href=&quot;https://plugins.jenkins.io/platformlabeler/&quot;&gt;Platform Labeler&lt;/a&gt; which is ready for openJDK17, but it required way too much memory to be built.
Bummer!
I was stuck, and to this day, I haven’t found a Jenkins plugin that can be built with openJDK19 on &lt;code&gt;RISC-V&lt;/code&gt; with very little memory.
I have yet to find another kind of smoke test that would prove Jenkins works on &lt;code&gt;RISC-V&lt;/code&gt;, and the other options is to wait until a plugin is ready for openJDK19.&lt;/p&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;the-risc-v-future-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-risc-v-future-for-jenkins&quot; /&gt;The &lt;code&gt;RISC-V&lt;/code&gt; future for Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;back-to-the-future&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#back-to-the-future&quot; /&gt;Back to the future&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When it comes to Jenkins and the &lt;code&gt;RISC-V&lt;/code&gt; ecosystem, I swear I thought I was some kind of pioneer, like in the good old days of arm.
Guess what, I’m not!
I’ve finally done my homework and found out that Jenkins has been running on &lt;code&gt;RISC-V&lt;/code&gt; for a while now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In a &lt;a href=&quot;https://riscv.org/2021/05/risc-v-foundation-demonstrates-jenkins-on-risc-v-at-lfelc-spring-2021-virtual-summit/&quot;&gt;blog post from May 2021&lt;/a&gt; (which has unfortunately disappeared), the &lt;a href=&quot;https://riscv.org/&quot;&gt;&lt;code&gt;RISC-V&lt;/code&gt; Foundation&lt;/a&gt; demonstrated Jenkins running on a &lt;code&gt;RISC-V&lt;/code&gt; board with a Linux operating system.
The demo used the OpenSBI bootloader and the OpenJDK &lt;code&gt;RISC-V&lt;/code&gt; port to run Jenkins, and was able to successfully build and test a simple Java application.
The post includes detailed instructions for setting up Jenkins on &lt;code&gt;RISC-V&lt;/code&gt; and running a build job.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In a &lt;a href=&quot;https://www.youtube.com/watch?v=Bb07GswNYxM&quot;&gt;video of the presentation&lt;/a&gt; (which has unfortunately disappeared) given at the LFELC Spring 2021 Virtual Summit, we could see a demonstration of Jenkins running on &lt;code&gt;RISC-V&lt;/code&gt;.
The presentation was given by &lt;a href=&quot;https://www.linkedin.com/in/anup-v-patel/?originalSubdomain=in&quot;&gt;Anup Patel&lt;/a&gt;, who was at that time, a member of the &lt;code&gt;RISC-V&lt;/code&gt; Technical Steering Committee.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is &lt;a href=&quot;https://www.youtube.com/watch?v=6GQw6N0HmZQ&quot;&gt;another video&lt;/a&gt; (which has unfortunately disappeared) that shows Jenkins running on &lt;code&gt;RISC-V&lt;/code&gt;, presented by &lt;a href=&quot;https://en.wikipedia.org/wiki/Keith_Packard&quot;&gt;Keith Packard&lt;/a&gt; at the &lt;code&gt;RISC-V&lt;/code&gt; Workshop Taiwan 2021.
The video shows Jenkins running on a &lt;a href=&quot;https://www.sifive.com/boards/hifive-unmatched&quot;&gt;HiFive Unmatched&lt;/a&gt; development board, which is based on the SiFive Freedom U740 &lt;code&gt;RISC-V&lt;/code&gt; processor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In a &lt;a href=&quot;https://www.reddit.com/r/RISCV/comments/l8jl0a/jenkins_running_on_hifive_unmatched/&quot;&gt;Reddit thread from January 2021&lt;/a&gt; (which has unfortunately disappeared), a user reported running Jenkins on a HiFive Unmatched &lt;code&gt;RISC-V&lt;/code&gt; board using Ubuntu 20.04 and OpenJDK 11.
The user reported that Jenkins worked well on the &lt;code&gt;RISC-V&lt;/code&gt; board and was able to run build jobs without any issues.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why have these experiment proofs been removed?
Is that a coincidence, or am I acting undercover to remove any evidence of Jenkins running on &lt;code&gt;RISC-V&lt;/code&gt; before I attempt to do the same?
Just kidding, I have no idea, but if three years ago some people were able to run Jenkins on &lt;code&gt;RISC-V&lt;/code&gt;, I should be able to do the same today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;RISC-V&lt;/code&gt; board I’ve been using for this experiment is not the most powerful available on the market, so my success rate with Jenkins plugins was not very high.
I have another board that is way more powerful, so I’ll try again with it soon.
It’s the &lt;a href=&quot;https://www.starfivetech.com/en/site/boards&quot;&gt;StarFive VisionFive 2&lt;/a&gt; board which is based on a quad-core &lt;code&gt;RISC-V&lt;/code&gt; processor (the &lt;a href=&quot;https://www.starfivetech.com/en/site/soc&quot;&gt;StarFive JH7110&lt;/a&gt; 64 bit SoC with RV64GC).
It also sports 8GB of LPDDR4, so I should be able to build a few RAM-hungry Jenkins plugins with it, and why not, even run a Jenkins controller on it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have another board on my radar; it’s the Vision Five 2’s twin from Pine64, the &lt;a href=&quot;https://wiki.pine64.org/wiki/STAR64&quot;&gt;Star64&lt;/a&gt;.
At the time of writing, it’s not available yet, but I’ll definitely get one as soon as it’s available.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;when-will-risc-v-be-a-first-class-citizen-with-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#when-will-risc-v-be-a-first-class-citizen-with-jenkins&quot; /&gt;When will &lt;code&gt;RISC-V&lt;/code&gt; be a first-class citizen with Jenkins?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remember, Jenkins is an open-source project, but above all, it’s a community project.
Who am I to tell you when &lt;code&gt;RISC-V&lt;/code&gt; will be a first-class citizen with Jenkins?
I’m just a guy who’s trying to make it work.
I think it’s up to the community to decide when &lt;code&gt;RISC-V&lt;/code&gt; will be officially supported by Jenkins.
My guess would be when two major conditions are met:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Temurin is officially available for &lt;code&gt;RISC-V&lt;/code&gt;, meaning we’ll be able to download a binary package for &lt;code&gt;RISC-V&lt;/code&gt; from the &lt;a href=&quot;https://adoptium.net/temurin/releases/&quot;&gt;official AdoptOpenJDK website&lt;/a&gt;.&lt;/p&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/2023/03/10/2023-03-10-miniJen-and-RISC-V/temurin-supported-architectures.png&quot; alt=&quot;Temurin supported architectures&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Docker is officially available for &lt;code&gt;RISC-V&lt;/code&gt;, which means we’ll be able to download a binary package for &lt;code&gt;RISC-V&lt;/code&gt; from the &lt;a href=&quot;https://hub.docker.com/search?q=&amp;amp;type=image&amp;amp;image_filter=official&quot;&gt;official Docker website&lt;/a&gt;.&lt;/p&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/2023/03/10/2023-03-10-miniJen-and-RISC-V/docker-supported-architectures.png&quot; alt=&quot;Docker supported architectures&quot; width=&quot;839&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You may wonder, why do I need Temurin and Docker to be officially available for &lt;code&gt;RISC-V&lt;/code&gt; before saying Jenkins &lt;a href=&quot;https://www.jenkins.io/sigs/platform/&quot;&gt;supports&lt;/a&gt; &lt;code&gt;RISC-V&lt;/code&gt;?
As you know, the Java motto says:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;Write once, run anywhere&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s often abbreviated as &quot;WORA&quot;.
This motto reflects Java’s ability to be compiled into bytecode that can run on any platform with a Java Virtual Machine (JVM), without requiring recompilation for each specific platform.
The Jenkins war runs on top of the JVM; it is then considered CPU-architecture agnostic, which means it can run on any CPU architecture (as long as openJDK11+ can run on the machine, but take it with a grain of salt).
The Jenkins infrastructure owns, or borrows, machines of the supported CPU architectures and runs the war on them, so we can testify Jenkins works on these architectures.
Jenkins also supplies &lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins&quot;&gt;Docker images&lt;/a&gt; for the supported CPU architectures and tests them on the supported CPU architectures.
The Jenkins project does not own any &lt;code&gt;RISC-V&lt;/code&gt; machine, as far as I know.
We could provide a &lt;code&gt;RISC-V&lt;/code&gt; docker image, as &lt;code&gt;docker buildx&lt;/code&gt; allows us to build for various CPU architectures, but…​
Wouldn’t it be kind of hasty?
We wouldn’t be able to test on a Jenkins-owned, Jenkins-managed machine regularly.
It is then urgent to…​ wait.&lt;/p&gt;
&lt;/div&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;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&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/2023/03/09/jira-donation/</id>
<title>Jira for the Jenkins project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-03-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/03/09/jira-donation/" />
<category term='issues'></category>
<category term='jira'></category>
<summary>
The Jenkins project has used Jira Software for issue tracking since 2005.
Jira has been our issue and enhancement tracking system for almost as long as Jenkins core has existed.
Jenkins core and most Jenkins plugins track issues and enhancements through a Jira instance hosted for the Jenkins project by the Linux Foundation.







We&#8217;re pleased to announce that Atlassian has agreed to continue sponsoring the Jenkins project with a license to use Jira.
We&#8217;re deeply grateful to Atlassian for their support of open source software and especially for their support of the Jenkins project.
We extend our thanks to the Linux Foundation as well for...
</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;The Jenkins project has used &lt;a href=&quot;https://www.atlassian.com/software/jira&quot;&gt;Jira Software&lt;/a&gt; for issue tracking since 2005.
Jira has been our issue and enhancement tracking system for almost as long as Jenkins core has existed.
Jenkins core and most Jenkins plugins track issues and enhancements through a &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;Jira&lt;/a&gt; instance hosted for the Jenkins project by the Linux Foundation.&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/2023/03/09/2023-03-09-jira-for-jenkins/jira-for-jenkins.png&quot; alt=&quot;Atlassian sponsors Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re pleased to announce that Atlassian has agreed to continue sponsoring the Jenkins project with a license to use Jira.
We’re deeply grateful to Atlassian for their support of open source software and especially for their support of the Jenkins project.
We extend our thanks to the Linux Foundation as well for their continued hosting of Jira for the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;upgrade-schedule&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-schedule&quot; /&gt;Upgrade schedule&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As part of the sponsorship, the Linux Foundation will need to update Jira and restart it.
The upgrade will happen beginning at midnight, Saturday March 11, 2023 UTC (4:00 PM Seattle time on Friday March 10, 2023).
The system may be down for as much as 30 minutes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-and-jira-by-the-numbers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-and-jira-by-the-numbers&quot; /&gt;Jenkins and Jira by the numbers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project Jira installation includes over 70,000 issues collected over the course of 18 years.
Some examples of the breadth and depth in the issue tracker include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;350+ epics, including 5 phases of &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52012&quot;&gt;Java 11 transition&lt;/a&gt;, 3 phases of &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/67908&quot;&gt;Java 17 transition&lt;/a&gt;, and various improvement projects like &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/68446&quot;&gt;JAXB&lt;/a&gt;, &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/69083&quot;&gt;Jakarta Mail&lt;/a&gt;, &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/69988&quot;&gt;HttpClient&lt;/a&gt;, and  &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/70301&quot;&gt;WMI Windows agents&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 2000 components&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 130000 registered users&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over &lt;a href=&quot;https://issues.jenkins.io/secure/Dashboard.jspa?selectPageId=19342&quot;&gt;200 issues&lt;/a&gt; identified as &quot;friendly for new contributors&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dashboards like:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/secure/Dashboard.jspa?selectPageId=10120&quot;&gt;Top voted issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/secure/Dashboard.jspa?selectPageId=20340&quot;&gt;Core maintainers attention&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/secure/Dashboard.jspa?selectPageId=20741&quot;&gt;Configuration form modernization issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/secure/Dashboard.jspa?selectPageId=21754&quot;&gt;Open user experience regressions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We thank Atlassian for their donation to the Jenkins 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/2023/03/09/jenkins-newsletter/</id>
<title>Jenkins February 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-03-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/03/09/jenkins-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Highlights




FOSDEM 2023 insights


Jenkins is a mentor organization for Google Summer of Code


Several container image updates


Jenkins Awards voting is now open







Contributed by: Alyssa Tong


FOSDEM 2023

Returning to FOSDEM for the first in-person event since COVID was both exciting and nostalgic for our Jenkins contributors.
It was exciting to see the same crowd size and enthusiasm by attendees.
Many thanks to the wonderful FOSDEM organizers for yet another fantastic event!









Jenkins in Google Summer of Code (GSoC)

We are thrilled to have been accepted to the Google Summer of Code 2023!!
This will be Jenkins' eighth (8th) year participating with the program.
Weekly GSoC office hours have begun as...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins January Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#highlights&quot; /&gt;Highlights&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;FOSDEM 2023 insights&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins is a mentor organization for Google Summer of Code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Several container image updates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Awards voting is now open&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;fosdem-2023&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fosdem-2023&quot; /&gt;FOSDEM 2023&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Returning to FOSDEM for the first in-person event since COVID was both exciting and nostalgic for our Jenkins contributors.
It was exciting to see the same crowd size and enthusiasm by attendees.
Many thanks to the wonderful FOSDEM organizers for yet another fantastic event!&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image15.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;469&quot; /&gt;&lt;/span&gt;
&lt;/p&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image13.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;469&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-in-google-summer-of-code-gsoc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-in-google-summer-of-code-gsoc&quot; /&gt;Jenkins in Google Summer of Code (GSoC)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are thrilled to have been accepted to the Google Summer of Code 2023!!
This will be Jenkins&#39; eighth (8th) year participating with the program.
Weekly GSoC office hours have begun as well, with office hours every Thursday @ 16:00 UTC.
Refer to the &lt;a href=&quot;https://www.jenkins.io/events/&quot;&gt;Event Calendar&lt;/a&gt; for additional details.
If you missed the initial meetings, the recordings are below:&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://youtu.be/1glzTzCkMvw&quot;&gt;February 23, 2023&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/vqMHdAUy85U&quot;&gt;February 28, 2023&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;Join in on all GSoC discussions in our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;gitter&lt;/a&gt; channel.&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/2023/03/10/2023-03-10-jenkins-newsletter/image3.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;360&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-awards&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-awards&quot; /&gt;Jenkins Awards&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Award season is here!
Nominations are closed but voting is &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScUL4GAL-6wOjHKbT86ptKSStnglKM9_MKTQXzjgwimCDEtGw/viewform&quot;&gt;now open&lt;/a&gt;.
Congratulations to all the nominees and thank you for your contributions!
Check out our blog post about &lt;a href=&quot;https://www.jenkins.io/blog/2023/02/23/cdf-awards/&quot;&gt;the Jenkins awards&lt;/a&gt;.&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/2023/03/10/2023-03-10-jenkins-newsletter/image4.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;326&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div id=&quot;infrastructure&quot; 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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following FOSDEM, where most of the infrastructure team was present physically, February was a busy month for the Jenkins Infrastructure team:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In an effort to reduce bandwidth with JFrog (repo.jenkins-ci.org), Jenkins continuous integration jobs are now using significantly less internet bandwidth thanks to the artifact caching proxy implemented by the team.
The artifact caching proxy is implemented on our three cloud providers, so that artifacts can be downloaded from a local cache rather than accessing the artifact repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins LTS &lt;code&gt;2.375.3&lt;/code&gt; is now used on all of our controllers, less than 3 days after its release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have removed all Jenkins deprecated plugins on all of our controllers such as jquery, momentjs, and ace-editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We upgraded all six of our Kubernetes clusters from the &lt;code&gt;1.23&lt;/code&gt; to &lt;code&gt;1.24&lt;/code&gt; baseline in the three cloud providers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All of the private and internal web services are now using TLS with certificates provided by Let’s Encrypt, along with Azure DNS challenge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We contributed to Docker documentation after catching issues with the Docker CE &lt;code&gt;23.x&lt;/code&gt; fresh release and Docker BuildX on Ubuntu.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;February was a busy month for the Jenkins project.
We want to highlight several blog posts from various authors such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Our &lt;a href=&quot;https://www.jenkins.io/blog/2023/02/21/thoughts-on-FOSDEM-2023/&quot;&gt;FOSDEM recap&lt;/a&gt;, including insights from the Jenkins participants at the event&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/blog/2023/02/23/cdf-awards/&quot;&gt;Jenkins contributor awards&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multiple posts regarding &lt;a href=&quot;https://www.jenkins.io/blog/2023/02/01/gsoc-update/&quot;&gt;Google Summer of Code&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/2023/02/23/gsoc2023-announcement/&quot;&gt;our participation&lt;/a&gt; from &lt;a href=&quot;https://www.jenkins.io/blog/authors/jmmeessen&quot;&gt;Jean-Marc Meessen&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our &lt;a href=&quot;https://www.jenkins.io/blog/2023/02/07/jenkins-newsletter/&quot;&gt;January newsletter&lt;/a&gt; from the Jenkins SIG leaders&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.jenkins.io/blog/2023/02/28/build-msi-locally/&quot;&gt;tutorial on building a Jenkins MSI&lt;/a&gt; on a Windows machine by &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&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;We’ve also received numerous pull requests from contributors that are getting started with Jenkins, as well as several excited participants of the Google Summer of Code.
For all of the work and energy you’re putting into the Jenkins project, we extend our deepest gratitude.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins governance board met once in February, resolved several action items, and noted the progress on projects with sponsors like JFrog and Atlassian.
We’re sincerely grateful for the sponsorships provided by those generous companies and many other companies.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As part of our ongoing work, we are considering CentOS 7 and its eventual end of life.
There is a proposal to deprecate the Centos &lt;code&gt;7&lt;/code&gt; Jenkins controller Docker images.
When we decide to deprecate these images, we’ll publish an announcement and a &lt;a href=&quot;https://github.com/jenkinsci/jep&quot;&gt;JEP&lt;/a&gt;.
Before it is fully deprecated, we’ll also release a merged version of the &lt;code&gt;centos&lt;/code&gt; and &lt;code&gt;centos7&lt;/code&gt; image as the very last CentOS &lt;code&gt;7&lt;/code&gt; Docker image.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In regards to our Docker images, there were several updates here as well:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The latest updates are now part of the agent images such as:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ssh-agent: Upgraded Git version on Windows to 2.39.2.windows.1 (&lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/209&quot;&gt;#209&lt;/a&gt;) @github-actions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;docker-agent: Upgraded Git version on Windows to 2.39.2.windows.1 (&lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/376&quot;&gt;#376&lt;/a&gt;) @github-actions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inbound agent:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Upgraded the parent image jenkins/agent version to 3107.v665000b_51092-4 (&lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/pull/331&quot;&gt;#331&lt;/a&gt;) @github-actions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgraded the parent image jenkins/agent version to 3107.v665000b_51092-3 (&lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/pull/330&quot;&gt;#330&lt;/a&gt;) @github-actions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgraded updatecli/updatecli-action from 2.19.0 to 2.20.1 (&lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/pull/329&quot;&gt;#329&lt;/a&gt;) &lt;a href=&quot;https://github.com/dependabot&quot;&gt;@dependabot&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Windows controller image is not updated as often as the rest.
It’s been more than one year without any updates, and we may choose to drop it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With the release of Debian 12 (“bookworm”), Debian will no longer deliver OpenJDK 11.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Thankfully, the end of life date for Debian’s openJDK11 won’t happen until 2026 or 2027.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Jenkins documentation will be updated when it goes out, so that we describe the use and installation of Jenkins with openJDK17.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;New platforms:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RISC-V support is far from official for Jenkins, but tests are progressing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;User experience improvements continued to arrive in February, thanks to contributions from &lt;a href=&quot;https://www.jenkins.io/blog/authors/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt;, &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/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, &lt;a href=&quot;https://github.com/mawinter69&quot;&gt;Markus Winter&lt;/a&gt;, and others.
Look for the improvements in recent weekly releases and in the new Jenkins &lt;code&gt;2.387.1&lt;/code&gt; LTS release.&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/pipeline-graph-view&quot;&gt;pipeline graph viewer plugin&lt;/a&gt; continues to improve its user interface.
Refer to the video highlights in the &lt;a href=&quot;https://community.jenkins.io/t/user-experience-sig-march-1-2023/6057&quot;&gt;&lt;span class=&quot;underline&quot;&gt;User Experience SIG recording&lt;/span&gt;&lt;/a&gt;.
Additionally, build logs are now viewed from the main panel with easier navigation.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kguerroudj&quot;&gt;Kevin Guerroudj&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Two security advisories have been published during the month of February:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One regarding &lt;a href=&quot;https://www.jenkins.io/security/advisory/2023-02-15/&quot;&gt;plugins&lt;/a&gt;, including 5 plugins that were affected and have been fixed, with one vulnerable to a sandbox bypass vulnerability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One regarding &lt;a href=&quot;https://www.jenkins.io/security/advisory/2023-02-09/&quot;&gt;Docker images&lt;/a&gt; and fixing the vulnerabilities &lt;a href=&quot;https://github.com/git/git/security/advisories/GHSA-c738-c5qq-xg89&quot;&gt;CVE-2022-23521&lt;/a&gt; and &lt;a href=&quot;https://github.com/git/git/security/advisories/GHSA-475x-2q3q-hvwq&quot;&gt;CVE-2022-41903&lt;/a&gt; present in git, making remote code execution possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The security team recommends that users update as soon as possible.&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;&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/2023/03/09/jenkins-awards-2023-candidates/</id>
<title>Jenkins Contributor Awards - Voting Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-03-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/03/09/jenkins-awards-2023-candidates/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='awards'></category>
<category term='cdcon'></category>
<summary>
The 2023 Jenkins award nomination period has ended and voting is now open!
Voting will take place until March 28, when the voting period closes, and the winners will be announced at this year&#8217;s cdCon.


2023 Award categories and nominees


This year we have three awards, each with several nominees:




Most Valuable Jenkins Advocate:



Alexander Brandes


Alex Earl


Bruno Verachten


Jean-Marc Meessen


Kris Stern


Mark Waite





Most Valuable Jenkins Contributor:



Alexander Brandes


Damien Duportal


Jan Faracik





Jenkins Security MVP:



Damien Duportal


Daniel Beck


Devin Nusbaum


Kevin Guerroudj


Valdes Che Zogou









Voting


To vote for the Jenkins awards, please use this Google form.
Please be aware that this form is only for Jenkins awards, as other projects are hosting their own voting process.




Awards timeline...
</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/2023/02/23/2023-02-23-cdf-awards/image1.png&quot; alt=&quot;CDF Community Awards 2023&quot; width=&quot;839&quot; height=&quot;129&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2023 Jenkins award nomination period has ended and &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScUL4GAL-6wOjHKbT86ptKSStnglKM9_MKTQXzjgwimCDEtGw/viewform&quot;&gt;voting is now open&lt;/a&gt;!
Voting will take place until March 28, when the voting period closes, and the winners will be announced at this year’s &lt;a href=&quot;https://events.linuxfoundation.org/cdcon-gitopscon/&quot;&gt;cdCon&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;2023-award-categories-and-nominees&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2023-award-categories-and-nominees&quot; /&gt;2023 Award categories and nominees&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we have three awards, each with several nominees:&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/6035&quot;&gt;&lt;strong&gt;Most Valuable Jenkins Advocate&lt;/strong&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/slide&quot;&gt;Alex Earl&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jmMeessen&quot;&gt;Jean-Marc Meessen&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/krisstern&quot;&gt;Kris Stern&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/6033&quot;&gt;&lt;strong&gt;Most Valuable Jenkins Contributor&lt;/strong&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/6034&quot;&gt;&lt;strong&gt;Jenkins Security MVP&lt;/strong&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dwnusbaum&quot;&gt;Devin Nusbaum&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Kevin-CB&quot;&gt;Kevin Guerroudj&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ValdesChe&quot;&gt;Valdes Che Zogou&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;voting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voting&quot; /&gt;Voting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To vote for the Jenkins awards, please use &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScUL4GAL-6wOjHKbT86ptKSStnglKM9_MKTQXzjgwimCDEtGw/viewform&quot;&gt;this Google form&lt;/a&gt;.
Please be aware that this form is &lt;em&gt;only&lt;/em&gt; for Jenkins awards, as other projects are hosting their own voting process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;awards-timeline-2023&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#awards-timeline-2023&quot; /&gt;Awards timeline 2023&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;Nominations close: Friday, March 3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting opens: Wednesday, March 8&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting closes: Tuesday, March 28&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Winners announced at &lt;a href=&quot;https://events.linuxfoundation.org/cdcon-gitopscon/&quot;&gt;cdCon + GitOpsCon&lt;/a&gt;: May 8 - 9, 2023&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;2022-winners&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2022-winners&quot; /&gt;2022 Winners&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can view the award guidelines, definitions, and previous winners on the &lt;a href=&quot;https://github.com/cdfoundation/foundation/blob/main/CDF%20Awards%20Guidelines.md&quot;&gt;CD Foundation awards&lt;/a&gt; page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to the 2022 &lt;a href=&quot;https://cd.foundation/blog/2022/10/06/community-awards-2022-winners-%f0%9f%8f%86/&quot;&gt;CD Foundation Community Award Winners&lt;/a&gt; announced at cdCon 2022 in Austin Texas!
&lt;a href=&quot;https://youtu.be/42_Dy72gnwE&quot;&gt;Watch the ceremony on YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/42_Dy72gnwE?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&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/03/03/miniJen-is-alive/</id>
<title>miniJen is alive!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-03-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/03/03/miniJen-is-alive/" />
<category term='jenkins'></category>
<category term='miniJen'></category>
<category term='riscv'></category>
<category term='aarch64'></category>
<category term='arm32'></category>
<category term='fosdem'></category>
<summary>
The Jenkins multi-architecture CPU instance









What is that contraption?


Nope, it&#8217;s not a robot of some sort, it won&#8217;t move by itself.
It&#8217;s not Cerebro from Professor Xavier; no, it can&#8217;t fly either.
What you&#8217;re looking at is a Jenkins instance.
It is composed of a controller (the &#8220;brain&#8221; or conductor) and three agents (the workers or musicians if we continue a little further with the metaphor).


During FOSDEM, we displayed the aarch64 Jenkins controller dashboard on an another computer screen using the same Wi-Fi network.


These boards are not microcontrollers, they are miniature computers running GNU/Linux, like the famous Raspberry Pi.


This Jenkins instance was featured in...
</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;The Jenkins multi-architecture CPU 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/2023/03/03/2023-03-03-miniJen-is-alive/fosdem_2023_booth_display.jpg&quot; alt=&quot;miniJen as a FOSDEM display on the booth&quot; width=&quot;839&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;what-is-that-contraption&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-that-contraption&quot; /&gt;What is that contraption?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nope, it’s not a robot of some sort, it won’t move by itself.
It’s not &lt;a href=&quot;https://en.wikipedia.org/wiki/Cerebro&quot;&gt;Cerebro&lt;/a&gt; from Professor Xavier; no, it can’t &lt;a href=&quot;https://all3dp.com/2/raspbery-pi-drone-simply-explained/&quot;&gt;fly&lt;/a&gt; either.
What you’re looking at is a Jenkins &lt;a href=&quot;https://www.jenkins.io/doc/#what-is-jenkins&quot;&gt;instance&lt;/a&gt;.
It is composed of a &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-agents/#using-jenkins-agents&quot;&gt;controller&lt;/a&gt; (the “brain” or conductor) and three &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-agents/&quot;&gt;agents&lt;/a&gt; (the workers or musicians if we continue a little further with the metaphor).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During &lt;a href=&quot;https://fosdem.org/2023/&quot;&gt;FOSDEM&lt;/a&gt;, we displayed the &lt;code&gt;aarch64&lt;/code&gt; Jenkins controller dashboard on an another computer screen using the same Wi-Fi network.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These boards are not &lt;a href=&quot;https://en.wikipedia.org/wiki/Microcontroller&quot;&gt;microcontrollers&lt;/a&gt;, they are miniature computers running &lt;a href=&quot;https://en.wikipedia.org/wiki/Linux&quot;&gt;GNU/Linux&lt;/a&gt;, like the famous &lt;a href=&quot;https://en.wikipedia.org/wiki/Raspberry_Pi&quot;&gt;Raspberry Pi&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This Jenkins instance was featured in the &lt;a href=&quot;https://hackaday.com/2023/03/01/fosdem-2023-an-open-source-conference-literally/&quot;&gt;Hackaday blog post&lt;/a&gt; about FOSDEM.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;hardware&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hardware&quot; /&gt;Hardware&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The controller runs on a &lt;a href=&quot;https://www.friendlyelec.com/index.php?route=product/product&amp;amp;product_id=287&quot;&gt;NanoR5S&lt;/a&gt;, sold as a &lt;a href=&quot;https://en.wikipedia.org/wiki/Router_(computing)&quot;&gt;router&lt;/a&gt; (thus the three &lt;a href=&quot;https://en.wikipedia.org/wiki/Modular_connector#8P8C&quot;&gt;RJ45&lt;/a&gt; connectors).&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/2023/03/03/2023-03-03-miniJen-is-alive/NanoPi_R5S-01B.png&quot; alt=&quot;NanoPi R5S pic from the manufacturer&quot; width=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s a 4GB &lt;a href=&quot;https://en.wikipedia.org/wiki/AArch64&quot;&gt;&lt;code&gt;aarch64&lt;/code&gt;&lt;/a&gt; (or &lt;code&gt;armv8&lt;/code&gt;) &lt;a href=&quot;https://wiki.friendlyelec.com/wiki/index.php/File:Rockchip_RK3568B2_Datasheet_V1.0.pdf&quot;&gt;4 cores&lt;/a&gt; running &lt;a href=&quot;https://wiki.friendlyelec.com/wiki/index.php/FriendlyCore_(based_on_ubuntu-core_with_Qt)&quot;&gt;friendlyCore&lt;/a&gt;, a distribution from the manufacturer (&lt;a href=&quot;https://friendlyelec.com/&quot;&gt;friendlyElec&lt;/a&gt;) on a &lt;a href=&quot;https://cdn.kernel.org/pub/linux/kernel/v5.x/ChangeLog-5.10&quot;&gt;5.10.x kernel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The smallest board is a 4 cores &lt;a href=&quot;https://en.wikipedia.org/wiki/ARM_architecture_family#32-bit_architecture&quot;&gt;&lt;code&gt;arm32&lt;/code&gt;&lt;/a&gt; agent with 512MB of RAM running &lt;a href=&quot;https://en.wikipedia.org/wiki/Armbian&quot;&gt;Armbian&lt;/a&gt; with a 5.10.x kernel too.&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/2023/03/03/2023-03-03-miniJen-is-alive/NanoPi_Duo2-2.png&quot; alt=&quot;NanoPi Duo2 pic from the manufacturer&quot; width=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s also a board coming from the &lt;a href=&quot;https://friendlyelec.com/&quot;&gt;friendlyElec&lt;/a&gt; manufacturer, the &lt;a href=&quot;https://www.friendlyelec.com/index.php?route=product/product&amp;amp;path=69&amp;amp;product_id=244&amp;amp;sort=p.price&amp;amp;order=ASC&quot;&gt;NanoPi Duo2&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The pink board next to the &lt;code&gt;arm32&lt;/code&gt; board is a &lt;a href=&quot;https://en.wikipedia.org/wiki/RISC-V&quot;&gt;&lt;code&gt;RISC-V&lt;/code&gt;&lt;/a&gt; board running &lt;a href=&quot;https://forum.armbian.com/topic/21465-armbian-image-and-build-support-for-risc-v/&quot;&gt;Armbian&lt;/a&gt; with just 1 core, 1GB of RAM and a &lt;a href=&quot;https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.1&quot;&gt;6.1.x kernel&lt;/a&gt;.&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/2023/03/03/2023-03-03-miniJen-is-alive/mq-pro.png&quot; alt=&quot;MangoPi MQ-Pro pic from the manufacturer&quot; width=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s a MangoPi &lt;a href=&quot;https://mangopi.org/mqpro&quot;&gt;MQ-Pro&lt;/a&gt; from &lt;a href=&quot;https://mangopi.org/&quot;&gt;MangoPi&lt;/a&gt;, one of the first &lt;code&gt;RISC-V&lt;/code&gt; boards available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latest board just next to the &lt;code&gt;RISC-V&lt;/code&gt; board with a slightly different shade of pink is an &lt;code&gt;aarch64&lt;/code&gt; board also from &lt;a href=&quot;https://mangopi.org/&quot;&gt;MangoPi&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://world.taobao.com/item/662901818090.htm&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/03/03/2023-03-03-miniJen-is-alive/mq-quad.png&quot; alt=&quot;MangoPi MQ-Quad pic from a taobao store&quot; width=&quot;500&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is a 4 cores agent with 1GB of RAM running a fork of Armbian with &lt;a href=&quot;https://cdn.kernel.org/pub/linux/kernel/v5.x/ChangeLog-5.16&quot;&gt;kernel 5.16.x&lt;/a&gt;.
It’s a &lt;a href=&quot;https://mangopi.org/mqquad&quot;&gt;MangoPi MQ-Quad&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;dont-try-to-fool-me-there-are-no-cables-between-the-boards&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dont-try-to-fool-me-there-are-no-cables-between-the-boards&quot; /&gt;Don’t try to fool me, there are no cables between the boards!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The boards all have Wi-Fi, and they are all connected to the same Wi-Fi network, provided by a router or my phone, depending on the location.
You can spot their small Wi-Fi antennas hanging in the first pic, except for the router which has no integrated Wi-Fi (it uses a &lt;a href=&quot;https://www.realtek.com/en/products/communications-network-ics/item/rtl8821cu&quot;&gt;USB Wi-Fi dongle&lt;/a&gt; you can see in the pic).
One day, the R5S controller will also be a router for miniJen, but for now, it’s just a Jenkins controller.
How come the controller can contact and control the agents? We’re not using IP addresses, but hostnames ending in &lt;code&gt;.local&lt;/code&gt;, thanks to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Avahi_(software)&quot;&gt;Avahi&lt;/a&gt; daemon.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-that-big-box-with-cables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-that-big-box-with-cables&quot; /&gt;What is that big box with cables?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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/2023/03/03/2023-03-03-miniJen-is-alive/pine-power.png&quot; alt=&quot;PinePower powering very astemious boards picture courtesy of HackaDay’s author https://hackaday.com/author/aryavoronova/[Arya Voronova]&quot; width=&quot;839&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These boards are powered thanks to a &lt;a href=&quot;https://www.pine64.org/&quot;&gt;Pine64&lt;/a&gt; &lt;a href=&quot;https://www.pine64.org/pinepowerdesktop/&quot;&gt;power supply&lt;/a&gt;.
Most of the time, you can see they don’t use much current.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;3d-printed-parts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3d-printed-parts&quot; /&gt;3D printed parts&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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/2023/03/03/2023-03-03-miniJen-is-alive/round-booth-display-2023-02-02-transparent.png&quot; alt=&quot;The 3DDesign on the 2nd of February 2023&quot; width=&quot;839&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The frame looks strange, I know. I wanted to use a torus because it’s a cool-looking shape, and tentacles because it’s even more cool-looking than a torus.&lt;br&gt;
It has been designed thanks to &lt;a href=&quot;https://openscad.org/&quot;&gt;openSCAD&lt;/a&gt;, an …​ open-source &lt;a href=&quot;https://en.wikipedia.org/wiki/Computer-aided_design&quot;&gt;computer-aided design&lt;/a&gt; tool &amp;amp; language (yes, there is such a thing as 3D Design as code), and printed at home on a &lt;a href=&quot;https://eryone.com/fdm/show/1.html&quot;&gt;printer&lt;/a&gt; running an open-source firmware, &lt;a href=&quot;https://marlinfw.org/&quot;&gt;Marlin&lt;/a&gt;.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Should you want to replicate this at home, you can find the &lt;a href=&quot;https://github.com/MerryKombo/3DDesign/tree/MQ-Pro/assets/Booth%20Display&quot;&gt;source code&lt;/a&gt; on my &lt;a href=&quot;https://github.com/gounthar&quot;&gt;GitHub&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;genesis-and-near-future&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#genesis-and-near-future&quot; /&gt;Genesis and near future&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have made a few &lt;a href=&quot;https://www.youtube.com/@jeanquinze/streams&quot;&gt;live streams&lt;/a&gt; during the build of miniJen, and should do some more for the upcoming modifications.
I also have a few videos on the same &lt;a href=&quot;https://www.youtube.com/@jeanquinze/featured&quot;&gt;channel&lt;/a&gt; about Jenkins and other boards, so don’t hesitate to have a look.&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/02/28/build-msi-locally/</id>
<title>How to build an unsigned Jenkins MSI on your Windows machine</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-02-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/02/28/build-msi-locally/" />
<category term='jenkins'></category>
<category term='windows'></category>
<category term='msi'></category>
<summary>
Should you ever need to rebuild a Jenkins MSI on your Windows machine, here is a way to do it.


Pre-requisites


Jenkins WAR file

First, you should download the Jenkins war file that will be inside the MSI file.
You can access it from the official Jenkins website or from the Jenkins update center.


Check the Jenkins download page to download the latest weekly version of Jenkins for example.
You can always access the direct link to get the latest weekly version, but you won&#8217;t necessarily know which version number you are using.
Just saying.



Git

There are quite a few ways to install Git on Windows, but the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Should you ever need to rebuild a Jenkins MSI on your Windows machine, here is a way to do it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;pre-requisites&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pre-requisites&quot; /&gt;Pre-requisites&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-war-file&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-war-file&quot; /&gt;Jenkins WAR file&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, you should download the Jenkins war file that will be inside the MSI file.
You can access it from the official Jenkins website or from &lt;a href=&quot;https://updates.jenkins.io/&quot;&gt;the Jenkins update center&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check the &lt;a href=&quot;https://www.jenkins.io/download/&quot;&gt;Jenkins download page&lt;/a&gt; to download the latest weekly version of Jenkins for example.
You can always access &lt;a href=&quot;https://updates.jenkins.io/latest/jenkins.war&quot;&gt;the direct link&lt;/a&gt; to get the latest weekly version, but you won’t necessarily know which version number you are using.
Just saying.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;git&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#git&quot; /&gt;Git&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are quite a few ways to install Git on Windows, but the most straightforward way is to see what the &lt;a href=&quot;https://git-scm.com/download/win&quot;&gt;official Git website recommends&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;install-msbuild&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#install-msbuild&quot; /&gt;Install MSBuild&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can install &lt;a href=&quot;https://aka.ms/vs/17/release/vs_BuildTools.exe&quot;&gt;MSBuild&lt;/a&gt; from Visual Studio or from the &lt;a href=&quot;https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022&quot;&gt;Build Tools for Visual Studio&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This command line tool is used to build the MSI file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;install-net-framework-3-5&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#install-net-framework-3-5&quot; /&gt;Install .NET Framework 3.5&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You may already have it installed on your machine, but not activated.
You can activate it from the Windows Features dialog box.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To access this dialog box, press the keys &lt;kbd&gt;⊞ Win&lt;/kbd&gt; + &lt;kbd&gt;R&lt;/kbd&gt;, then enter the command &lt;code&gt;appwiz.cpl&lt;/code&gt; and push enter.
Search for&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Turn Windows features on or off.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tick the &lt;code&gt;.NET Framework 3.5&lt;/code&gt; entry and install.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
now run Windows Update to check for security updates.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If it is not installed yet, you can install &lt;a href=&quot;https://dotnet.microsoft.com/en-us/download/dotnet-framework/net35-sp1&quot;&gt;.NET Framework 3.5&lt;/a&gt; from the Windows Features.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;check-if-you-have-powershell&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#check-if-you-have-powershell&quot; /&gt;Check if you have PowerShell&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In recent versions of Windows, PowerShell is already installed and accessible through the &lt;a href=&quot;https://support.microsoft.com/en-us/windows/command-prompt-and-windows-powershell-for-windows-11-6453ce98-da91-476f-8651-5c14d5777c20&quot;&gt;terminal&lt;/a&gt; application.
At the time of writing, the pre-installed version is &lt;code&gt;5.1.22621.963&lt;/code&gt;.
You can also install the latest version from the &lt;a href=&quot;https://apps.microsoft.com/store/detail/powershell/9MZ1SNWT0N5D&quot;&gt;Microsoft Store&lt;/a&gt; (7.3.2 at the time of writing).&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You could also install PowerShell from GitHub by issuing the following 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;powershell&quot;&gt;&lt;span class=&quot;n&quot;&gt;winget&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Microsoft.PowerShell&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;winget&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 would give an output similar to:&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;powershell&quot;&gt;&lt;span class=&quot;n&quot;&gt;Found&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PowerShell&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Microsoft.PowerShell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Version:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;7.3.2.0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Publisher:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Microsoft&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Corporation&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Publisher&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Url:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;https://github.com/PowerShell/PowerShell/&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Publisher&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Support&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Url:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;https://github.com/PowerShell/PowerShell/issues&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Author:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Microsoft&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Corporation&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Moniker:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;pwsh&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Description:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PowerShell&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;is&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cross-platform&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Windows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Linux&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;macOS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;automation&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;tool/framework&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;that&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;works&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;well&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;your&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;existing&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;tools&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;is&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;optimized&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dealing&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;structured&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e.g.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;CSV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;XML&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;etc.&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;REST&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;APIs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;models.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;It&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;command-line&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;an&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;associated&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;scripting&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;framework&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;processing&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cmdlets.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Homepage:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;https://microsoft.com/PowerShell&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;License:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;MIT&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;License&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Url:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Copyright:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Copyright&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Microsoft&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Corporation&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Copyright&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Url:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;https://github.com/PowerShell/PowerShell/blob/master/LICENSE.txt&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Release&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Notes&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Url:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;https://github.com/PowerShell/PowerShell/releases/tag/v7.3.2&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Tags:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;command-line&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cross-platform&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;open-source&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;powershell&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;pwsh&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Installer:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Installer&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Type:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;wix&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Installer&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Url:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;https://github.com/PowerShell/PowerShell/releases/download/v7.3.2/PowerShell-7.3.2-win-x64.msi&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Installer&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;SHA256:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a4f7d081c5f74bc8d6c75f1dfee382b7fd9335361181748fee590ecdbc96cb26&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Release&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Date:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;2023-01-24&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;You can see that the latest version is &lt;code&gt;7.3.2&lt;/code&gt; and that the installer is a &lt;code&gt;.msi&lt;/code&gt; file located on GitHub.
Just follow the link provided with your browser and install PowerShell from this file once it has downloaded.&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;build-the-msi&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-the-msi&quot; /&gt;Build the MSI&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;clone-the-jenkins-packaging-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#clone-the-jenkins-packaging-repository&quot; /&gt;Clone the Jenkins packaging repository&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Choose your &lt;code&gt;git&lt;/code&gt; tool and clone the &lt;a href=&quot;https://github.com/jenkinsci/packaging.git&quot;&gt;Jenkins packaging repository&lt;/a&gt; on your machine.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;prepare-the-build&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#prepare-the-build&quot; /&gt;Prepare the build&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open a &lt;code&gt;terminal&lt;/code&gt; window and go to the folder where you cloned the repository.
For example &lt;code&gt;C:\jenkinsci\packaging\&lt;/code&gt;.
You now have to declare where you downloaded the Jenkins war file, so the build script can find 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;powershell&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;War&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;USERPROFILE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;\jenkins.war&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;If you have previously moved it into your repository clone folder, you can use this command instead:&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;powershell&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;War&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;C:\jenkinsci\packaging\msi\build\jenkins.war&quot;&lt;/span&gt;&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;build-the-msi-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-the-msi-2&quot; /&gt;Build the MSI&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enter the subfolder &lt;code&gt;msi\build&lt;/code&gt; and run the following 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;powershell&quot;&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;\build.ps1&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;You should get an output similar to:&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;powershell&quot;&gt;&lt;span class=&quot;n&quot;&gt;Extracting&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;components&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;JenkinsVersion&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;2.392&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Restoring&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;packages&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;before&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;All&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;packages&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;listed&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;packages.config&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;are&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;already&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;installed.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Building&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;MSI&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MSBuild&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;17.4.0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;18d5aef85&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;NET&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Framework&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Build&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;started&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;01/12/2022&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;20:53:30.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Project&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;C:\jenkinsci\packaging\msi\build\jenkins.wixproj&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;targets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SetConstants:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EncodedVersion&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;2.255&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;3920&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Compile:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Skipping&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Compile&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;because&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;files&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;are&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;up-to-date&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;respect&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;files.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AssignCultures:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Culture:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;en-US&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Link:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\jenkinsci\packaging\msi\build\packages\WiX.3.11.1\build\..\tools\Light.exe&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-out&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\jenkinsci\packaging\msi\build\bi&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n\Release\en-US\jenkins-2.392.msi&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-pdbout&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\jenkinsci\packaging\msi\build\bin\Release\en-US\jenkins-2.392.wixpdb&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-sw1076&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-cultures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;en-US&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ext&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\Support\users\jenkinsci\packaging\packaging\msi\build\packages\WiX.3.11.1\build\..\tools\\WixUIExtension.dll&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ext&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\jenkinsci\packaging\msi\bu&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ild\packages\WiX.3.11.1\build\..\tools\\WixNetFxExtension.dll&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ext&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\jenkinsci\packaging\msi\build\packages\WiX.3.11.1\build\..\tools\\WixUtilExtension.dll&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ext&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;\msiext-1.5\WixExtensions\WixCommonUIExtension.dll&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-ext&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\jenkinsci\packaging\msi\build\packages\WiX.3.11.1\build\..\tools\\WixFirewallExtension.dll&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-fv&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-loc&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;jenkins_en-US.wxl&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-spdb&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-contentsfile&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj\Release\jenkins.wixproj.BindContentsFileListen-US.txt&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-outputsfile&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj\Release\jenkins.wixproj.BindOutputs&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;FileListen-US.txt&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-builtoutputsfile&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj\Release\jenkins.wixproj.BindBuiltOutputsFileListen-US.txt&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-wixprojectfile&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\jenkinsci\packaging\msi\build\jenkins.wixproj&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj\Release\jenkins.wixobj&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Windows&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Installer&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;XML&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Toolset&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Linker&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;3.11.1.2318&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Copyright&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;NET&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Foundation&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;contributors.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;All&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;rights&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reserved.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jenkins&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\jenkinsci\packaging\msi\build\bin\Release\en-US\jenkins-2.392.msi&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Done&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Building&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Project&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;C:\jenkinsci\packaging\msi\build\jenkins.wixproj&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;targets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;


&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Build&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;succeeded.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Warning&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Elapsed&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;00:00:08.26&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;locate-the-generated-msi-file&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#locate-the-generated-msi-file&quot; /&gt;Locate the generated MSI file&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The MSI file is located in the &lt;code&gt;.\bin\Release\en-US\&lt;/code&gt; folder.
In this folder, you will find the generated MSI file and its &lt;code&gt;sha256&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;powershell&quot;&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ls&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Directory:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;C:\jenkinsci\packaging\msi\build\bin\Release\en-US&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;


&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Mode&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                 &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;LastWriteTime&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;         &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Length&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;                 &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-------------&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;         &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;------&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;/12/2022&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;20:53&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;105107456&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;jenkins-2.392.msi&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;----&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;/12/2022&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;20:53&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;             &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;84&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;jenkins-2.392.msi.sha256&lt;/span&gt;&lt;/code&gt;&lt;/pre&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/2023/02/23/gsoc2023-announcement/</id>
<title>Google Summer of Code 2023… Here We Come!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-02-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/02/23/gsoc2023-announcement/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
We are thrilled to announce that Jenkins has been accepted to Google Summer of Code 2023!
This will be Jenkins' seventh year as a mentoring organization.


Congratulations to all 172 accepted open-source organizations!


As a mentoring organization for the past six years, Jenkins has mentored 31 GSoC students by 85+ different mentors, bringing together over 107 strangers for a common idea - Jenkins!


At the heart of it, GSoC is more than just a mentoring program.
The intention is to welcome and engage with new contributors in open source.
It is about giving a little of your day to make a lifetime of difference, not only...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are thrilled to announce that Jenkins has been accepted to &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code 2023&lt;/a&gt;!
This will be Jenkins&#39; seventh year as a mentoring organization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to all &lt;a href=&quot;https://summerofcode.withgoogle.com/programs/2023/organizations&quot;&gt;172 accepted open-source organizations&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a mentoring organization for the past six years, Jenkins has mentored 31 GSoC students by 85+ different mentors, bringing together over 107 strangers for a common idea - Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the heart of it, GSoC is more than just a mentoring program.
The intention is to welcome and engage with new contributors in open source.
It is about giving a little of your day to make a lifetime of difference, not only for the GSoC contributors, but also for the many Jenkins users who will benefit from the improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to welcome new GSoC contributors to the Jenkins family.
We think you will enjoy this valuable experience while developing your technical skills.
You will gain insights into how the community works.
The best part will be learning from people who are passionate about Jenkins
but more importantly they are passionate about wanting to make a difference for another individual (GSoC contributors) and for the betterment of the project as a whole.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For detailed information on Jenkins GSoC 2022, see &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/&quot;&gt;the completed projects&lt;/a&gt;.&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/gsoc/2023/GSoC2023-here_we_come.png&quot; alt=&quot;Here we come&quot; /&gt;&lt;/span&gt;
&lt;/p&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;GSoC is &lt;a href=&quot;https://opensource.googleblog.com/2023/02/mentor-organizations-announced-for.html&quot;&gt;officially announced&lt;/a&gt;, and please expect more potential GSoC contributors to contact projects in our &lt;a href=&quot;https://www.jenkins.io/projects/gsoc#contacts&quot;&gt;Gitter and Discourse channels&lt;/a&gt;.
Many communications will also happen in SIG and sub-project channels.
We will be working hard in order to help potential participants to find interesting projects, to explore the relevant domain(s),
and to prepare their project proposals before the deadline on April 4th (UTC).
Then we will process the applications, select projects, and assign mentor teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All information about the Jenkins GSoC is available on its &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;sub-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;how-do-i-apply&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-apply&quot; /&gt;How do I apply?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors&quot;&gt;Information for students&lt;/a&gt; page for full application guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage interested participants to reach out to the Jenkins community early and to start exploring project ideas.
We also encourage participants to join the weekly &lt;a href=&quot;https://docs.google.com/document/d/1UykfAHpPYtSx-r_PQIRikz2QUrX1SG-ySriz20rVmE0/edit?usp=sharing&quot;&gt;Jenkins GSoC office hours&lt;/a&gt;.
These meetings are set up for participants to meet org admins and mentors, and to ask questions.
Also, join our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;Gitter channel&lt;/a&gt; and our &lt;a href=&quot;https://community.jenkins.io/c/contributing/gsoc/6&quot;&gt;Discourse server&lt;/a&gt; to receive information about such incoming events in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The application period starts on March 20th (UTC), but you should prepare now!
Use the time before the application period to discuss and improve your project proposals.
We also recommend that you become familiar with Jenkins and start exploring your proposal areas.
Project ideas include quick-start guidelines and reference newbie-friendly issues, which may help with your initial study.
If you do not see anything interesting, you can &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;propose your own project idea&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;i-want-to-be-a-mentor-is-it-too-late&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-want-to-be-a-mentor-is-it-too-late&quot; /&gt;I want to be a mentor. Is it too late?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s not!
We are looking for more project ideas and for Jenkins contributors or users who are passionate about Jenkins and want to be a mentor.
No hardcore experience is required, as mentors can study the project internals together with GSoC contributors and technical advisors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can either propose a new project idea or join an existing one.
See the &lt;a href=&quot;https://www.jenkins.io/blog/2022/12/09/GSoC-the-gift-of-mentorship//&quot;&gt;Call for mentors post&lt;/a&gt;
and &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors&quot;&gt;Information for mentors&lt;/a&gt; for details.
If you want to propose a new project, please do so as soon as possible so that potential GSoC contributors have time to explore them and prepare their proposals.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year mentorship does &lt;strong&gt;NOT&lt;/strong&gt; require strong expertise in Jenkins development.
The objective is to guide participants and to get involved into the Jenkins community.
GSoC org admins will help to find advisors if special expertise is required.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;important-dates-for-gsoc-2023&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates-for-gsoc-2023&quot; /&gt;Important dates for GSoC 2023&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;February 22 - March 19&lt;/strong&gt; - Potential GSoC contributors discuss application ideas with mentoring organizations.
Show &lt;a href=&quot;https://community.jenkins.io/c/contributing/gsoc/6&quot;&gt;us&lt;/a&gt; your proposal!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;March 20&lt;/strong&gt; - The GSoC contributor application period begins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;April 4&lt;/strong&gt; - GSoC contributor application deadline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;May 4&lt;/strong&gt; - Accepted GSoC contributor projects are announced.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;May 4 - May 28&lt;/strong&gt; - Community Bonding Period | GSoC contributors get to know mentors, read documentation, and get up to speed to begin working on their projects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;May 29&lt;/strong&gt; - Coding officially begins!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;July 14&lt;/strong&gt; - Midterm evaluation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;August 21 - August 28&lt;/strong&gt; - Final week: GSoC contributors submit their final work product.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;September 5&lt;/strong&gt; - Initial results of Google Summer of Code 2022 are published.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;November 6&lt;/strong&gt; - Final date for all GSoC contributors to submit their final work product.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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 more info.&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/2023/02/23/cdf-awards/</id>
<title>Jenkins Contributor Awards - Nominations Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-02-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/02/23/cdf-awards/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='awards'></category>
<category term='cdcon'></category>
<summary>
The Jenkins project is a part of the Continuous Delivery Foundation, which gives out awards to recognize all the work from this community and the progress made in the name of Continuous Delivery.


View the award guidelines, definitions, and previous winners: here.


2023 Award Categories


CDF Awards



Continuous Enthusiast → Nominate someone


Top CDF Ambassador → Nominate someone


Top CDF Contributor → Nominate someone


Top Documenter → Nominate someone


Top CDF End User (Nominated by the TOC)





Jenkins Awards



Most Valuable Jenkins Advocate → Nominate someone


Most Valuable Jenkins Contributor → Nominate someone


Jenkins Security MVP → Nominate someone





Tekton Awards

Last year, Tekton graduated meaning they now get three awards!




Most Valuable Tekton Advocate


Most...
</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/2023/02/23/2023-02-23-cdf-awards/image1.png&quot; alt=&quot;CDF Community Awards 2023&quot; width=&quot;839&quot; height=&quot;129&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project is a part of the Continuous Delivery Foundation, which gives out awards to recognize all the work from this community and the progress made in the name of Continuous Delivery.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;View the award guidelines, definitions, and previous winners: &lt;a href=&quot;https://github.com/cdfoundation/foundation/blob/main/CDF%20Awards%20Guidelines.md&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;2023-award-categories&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2023-award-categories&quot; /&gt;2023 Award Categories&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cdf-awards&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cdf-awards&quot; /&gt;CDF Awards&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Continuous Enthusiast → &lt;a href=&quot;https://github.com/cdfoundation/foundation/issues/432&quot;&gt;Nominate someone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Top CDF Ambassador → &lt;a href=&quot;https://github.com/cdfoundation/foundation/issues/431&quot;&gt;Nominate someone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Top CDF Contributor → &lt;a href=&quot;https://github.com/cdfoundation/foundation/issues/430&quot;&gt;Nominate someone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Top Documenter → &lt;a href=&quot;https://github.com/cdfoundation/foundation/issues/433&quot;&gt;Nominate someone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Top CDF End User &lt;em&gt;(Nominated by the TOC)&lt;/em&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;jenkins-awards&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-awards&quot; /&gt;Jenkins Awards&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Most Valuable Jenkins Advocate → &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/6035&quot;&gt;Nominate someone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most Valuable Jenkins Contributor → &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/6033&quot;&gt;Nominate someone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Security MVP → &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/issues/6034&quot;&gt;Nominate someone&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;tekton-awards&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tekton-awards&quot; /&gt;Tekton Awards&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last year, Tekton graduated meaning they now get three 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 Tekton Advocate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most Valuable Tekton Contributor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tekton Security MVP&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;→ &lt;a href=&quot;https://github.com/tektoncd/community/issues/961&quot;&gt;Nominate someone for the Tekton awards&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-awards&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-awards&quot; /&gt;Project Awards&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CDEvents: Most Valuable Contributor → &lt;a href=&quot;https://github.com/cdevents/community/issues/20&quot;&gt;Nominate someone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ortelius: Most Valuable Contributor → &lt;a href=&quot;https://github.com/ortelius/ortelius/issues/555&quot;&gt;Nominate someone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pyrsia: Most Valuable Contributor → &lt;a href=&quot;https://github.com/pyrsia/pyrsia/issues/1615&quot;&gt;Nominate someone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Screwdriver: Most Valuable Contributor → &lt;a href=&quot;https://github.com/screwdriver-cd/screwdriver/issues/2834&quot;&gt;Nominate someone&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;Note: Each project can decide how to elect their Most Valuable Contributor.&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;nomination-process&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nomination-process&quot; /&gt;Nomination Process&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nomination process takes place on GitHub to make the process open to all.
If you don’t have a GitHub account, you can send us the nomination by email, and we will post it there on your behalf.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;awards-timeline-2023&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#awards-timeline-2023&quot; /&gt;Awards Timeline 2023&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;Nominations close: Friday, March 3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting opens: Wednesday, March 8&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting closes: Tuesday, March 28&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Winners announced at &lt;a href=&quot;https://events.linuxfoundation.org/cdcon-gitopscon/&quot;&gt;cdCon + GitOpsCon&lt;/a&gt;: May 8 – 9, 2023&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;2022-winners&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2022-winners&quot; /&gt;2022 Winners&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to the 2022 &lt;a href=&quot;https://cd.foundation/blog/2022/10/06/community-awards-2022-winners-%f0%9f%8f%86/&quot;&gt;CD Foundation Community Award Winners&lt;/a&gt; announced at cdCon 2022 in Austin Texas.
&lt;a href=&quot;https://youtu.be/42_Dy72gnwE&quot;&gt;Watch the ceremony on YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/42_Dy72gnwE?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&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/02/21/thoughts-on-FOSDEM-2023/</id>
<title>Thoughts on FOSDEM 2023</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-02-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/02/21/thoughts-on-FOSDEM-2023/" />
<category term='jenkins'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='fosdem'></category>
<category term='gsoc'></category>
<category term='open-source'></category>
<category term='outreach'></category>
<summary>
What better way to kick off the new year, than by returning for an in-person event at one of the most popular open source gatherings of all, FOSDEM!
On February 4 &amp; 5, contributors from the Jenkins project and thousands of other open-source enthusiasts traveled from around the world to flock to FOSDEM.
Located in Brussels, Belgium, FOSDEM is an opportunity to renew relationships, forge new bonds, and share the incredible work that is being advanced by the open-source ecosystem.








There was a heightened sense of excitement and nostalgia surrounding FOSDEM, and we can clearly see why:




















We asked our Jenkins contributors for their...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What better way to kick off the new year, than by returning for an in-person event at one of the most popular open source gatherings of all, &lt;a href=&quot;https://fosdem.org/2023/about/&quot;&gt;FOSDEM&lt;/a&gt;!
On February 4 &amp;amp; 5, contributors from the Jenkins project and thousands of other open-source enthusiasts traveled from around the world to flock to FOSDEM.
Located in Brussels, Belgium, FOSDEM is an opportunity to renew relationships, forge new bonds, and share the incredible work that is being advanced by the open-source 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/post-images/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image7.png&quot; alt=&quot;Brussels at night.&quot; width=&quot;839&quot; height=&quot;631&quot; /&gt;&lt;/span&gt;
&lt;/p&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image12.png&quot; alt=&quot;Shops in brussels.&quot; width=&quot;839&quot; height=&quot;1115&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was a heightened sense of excitement and nostalgia surrounding FOSDEM, and we can clearly see why:&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image15.png&quot; alt=&quot;The Jenkins booth at FOSDEM 2023.&quot; width=&quot;839&quot; height=&quot;631&quot; /&gt;&lt;/span&gt;
&lt;/p&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image14.png&quot; alt=&quot;The Jenkins crowd at FOSDEM 2023.&quot; width=&quot;839&quot; height=&quot;631&quot; /&gt;&lt;/span&gt;
&lt;/p&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image13.png&quot; alt=&quot;Excited contributors at the Jenkins booth.&quot; width=&quot;839&quot; height=&quot;631&quot; /&gt;&lt;/span&gt;
&lt;/p&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image5.png&quot; alt=&quot;Jenkins participation banner at FOSDEM.&quot; width=&quot;200&quot; height=&quot;458&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image9.png&quot; alt=&quot;Jenkins stickers!&quot; width=&quot;200&quot; height=&quot;300&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image8.png&quot; alt=&quot;A self contained Jenkins agent.&quot; width=&quot;200&quot; height=&quot;300&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image3.jpg&quot; alt=&quot;Self contained Jenkins agent.&quot; width=&quot;200&quot; height=&quot;300&quot; /&gt;&lt;/span&gt;
&lt;/span&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image4.png&quot; alt=&quot;Full crowd shot of FOSDEM and Jenkins.&quot; width=&quot;839&quot; height=&quot;631&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We asked our Jenkins contributors for their thoughts as they returned to FOSDEM, and this is what they had to say:&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/authors/gounthar/&quot;&gt;Bruno Verachten&lt;/a&gt;&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image1.jfif&quot; alt=&quot;image&quot; width=&quot;235&quot; height=&quot;235&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What an amazing experience!
I met people I’ve interacted with for the first time in various open-source communities, and we decided on partnerships between our communities.
One Oreboot member soldered an SPI chip on my RISC-V Jenkins agent (in a corridor, using a chair as a workbench) to free it from U-Boot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are two things I’d like to point out:
* People love Jenkins, lots of them came to the booth to testify.
* Open source is not just a GitHub punchcard, it’s way more about sharing knowledge and empowering people.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Bruno Verachten
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/smerle33&quot;&gt;Stéphane Merle&lt;/a&gt;&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/smerle-on-the-booth.png&quot; alt=&quot;image&quot; width=&quot;235&quot; height=&quot;106&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
What I will retain from FOSDEM is the diversity of the stands and the public, and an impeccable organization of FOSDEM, from the stand organizer’s point of view.
To be able to meet in real life the people whom we discuss and work every day for Jenkins, (Oleg, Alexander, …) is a real pleasure.
Hearing testimonials from Jenkins users about their love of Jenkins and the particular uses they have for it has also done us a lot of good.
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Stéphane Merle
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault/&quot;&gt;Alexander Brandes&lt;/a&gt;&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/alexander-brandes-on-the-booth.png&quot; alt=&quot;image&quot; width=&quot;235&quot; height=&quot;312&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
I had a fantastic time at FOSDEM this year.
I was happy to meet people from the Jenkins community, some of whom I had only interacted with online before.
This was my first FOSDEM, and I was blown away by the number of people who were interested in Jenkins and wanted to learn more about it.
I was able to hear about different stories and use cases of Jenkins, which really helped to broaden my understanding of the platform and how it is being used in the real world.
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Alexander Brandes
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/jmmeessen/&quot;&gt;Jean-Marc Meessen&lt;/a&gt;&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image2.png&quot; alt=&quot;image&quot; width=&quot;235&quot; height=&quot;132&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
It was with great pleasure that I could attend this incredible event.
Meeting contributors and members of the community in person was such a change after these years hiding from the pandemic.
I particularly enjoyed the great conversations on so many subjects such as the Jenkins day to day experience, where the project is heading (or should head to), and particularly, my personal pet interests: &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;GSoC&lt;/a&gt; or how to start contributing.
Even after attending this conference since 2009, my amazement never fades for this incredible explosion of ideas, enthusiasm, diversity, dedication, and generosity for the Open Source movement.
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Jean-Marc Meessen
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many thanks to the FOSDEM organizers for their hard work and dedication to make this event possible for so many open-source communities.
We can’t wait to do this again in 2024!&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/2023/02/21/2023-02-21-thoughts-on-FOSDEM-2023/image10.png&quot; alt=&quot;Brussels love for FOSDEM and Jenkins.&quot; width=&quot;839&quot; height=&quot;631&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&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/2023/02/07/jenkins-newsletter/</id>
<title>Jenkins January 2023 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-02-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/02/07/jenkins-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
Highlights




Jenkins in GSoC planning is in full steam ahead.


General availability of new development tools on ci.jenkins.io: Maven, JDK, Playwright.


98 pull requests were merged from 38 different authors in January.


Jenkins 2.375.2 released January 11, 2023.
Over 350 positive ratings.


A sandbox bypass vulnerability was corrected among 37 other vulnerabilities.
The security team recommends users to upgrade.


Debian 12 (“bookworm”) will not deliver OpenJDK 11







Contributed by: Alyssa Tong




The GSoC Org admin team kicked the new year off with all things GSoC!



We hosted a webinar for new mentors.


Finalized the GSoC 2023
project ideas list.


This post encapsulates current progress and what’s next.


There’s still time to
become a mentor and or...
</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/2023/02/07/2023-02-07-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins January Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#highlights&quot; /&gt;Highlights&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;Jenkins in GSoC planning is in full steam ahead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;General availability of new development tools on ci.jenkins.io: Maven, JDK, Playwright.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;98 pull requests were merged from 38 different authors in January.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins 2.375.2 released January 11, 2023.
Over 350 positive ratings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A sandbox bypass vulnerability was corrected among 37 other vulnerabilities.
The security team recommends users to upgrade.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Debian 12 (“bookworm”) will not deliver OpenJDK 11&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The GSoC Org admin team kicked the new year off with all things GSoC!&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We hosted a &lt;a href=&quot;https://youtu.be/gGTZtKjVlK0&quot;&gt;webinar&lt;/a&gt; for new mentors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finalized the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/project-ideas/&quot;&gt;GSoC 2023
project ideas list.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2023/02/01/gsoc-update/&quot;&gt;This post&lt;/a&gt; encapsulates current progress and what’s next.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There’s still time to
&lt;a href=&quot;https://community.jenkins.io/t/jenkins-in-gsoc-2023-mentors-org-admins-project-ideas-wanted/4387&quot;&gt;become a mentor and or propose project idea(s)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Bumped our controllers to LTS 2.375.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;General availability of new development tools on ci.jenkins.io:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Maven 3.8.7&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK 8u362-b09&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK 11.0.18+10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK 17.0.6+10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK 19.0.2+7&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Playwright (headless web-browser testing)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Started to decrease download bandwidth from JFrog (repo.jenkins-ci.org)  to our infrastructure by enabling artifact caching for plugins builds on  ci.jenkins.io.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A lot of “under-the-hood” network and performances related work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cleaned up deprecated plugins from all of our controllers (momentjs, jquery bundle and ace-editor bundle).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/02/07/2023-02-07-jenkins-newsletter/documentation.png&quot; alt=&quot;Documentation Update&quot; /&gt;
Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the month of January, 98 pull requests were merged from 38  different authors.
We are also preparing for the 2023 edition of Google  Summer of Code, by encouraging folks to share ideas or join as mentors.
We published one blog post, which was the &lt;a href=&quot;https://www.jenkins.io/blog/2023/01/12/jenkins-newsletter/&quot;&gt;2022 recap&lt;/a&gt; and contained tons of highlights for the last year of the Jenkins project.
Thanks to all of the new and returning contributors for their hard work already in the new year, and the continued efforts that are bound to happen.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;Governance&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.375.2 released January 11, 2023.
Over 350 positive &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.375.2&quot;&gt;ratings&lt;/a&gt; with only 1  issue reported to have required a rollback for 4 users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nine most recent Jenkins weekly releases (2.381 - 2.389) have received positive &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.389&quot;&gt;ratings&lt;/a&gt; as well, with 40-50 positive ratings and only 1 reported rollback in each of those 9 weekly releases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to everyone that has done such great work on Jenkins core and its recent releases.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker images&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;New platforms:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;UBI9 with JDK17 proposed and maintained by Oliver Gondza from RedHat, who’s also maintainer of the UBI8 container image.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3318&quot;&gt;Zombie images&lt;/a&gt; fixed. Hurray!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java updates were deployed to infra and container images (except for Windows containers):&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;8u362&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;11.0.18&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;17.0.6&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;19.0.2&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Debian 12 (“bookworm”) will not deliver OpenJDK 11.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The end of life date for Debian’s openJDK11 won’t happen until 2026 or 2027.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is no urge to drop jdk11 support for Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We will change the documentation nonetheless when it goes out, so that  we describe the use of Jenkins with openJDK17.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK Support for Jenkins&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins&#39; enhancement proposal for required JDK11 is final!
Congrats.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins user experience continues to improve. Recent weekly releases have included hiding of potentially sensitive values in system properties and in environment variables, navigation improvements with more breadcrumb entries, changes to the plugin manager, and internal updates to various libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A sandbox bypass vulnerability was corrected and announced in the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2023-01-24/&quot;&gt;January security advisory&lt;/a&gt; among 37 others vulnerabilities.
The security team recommends users to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The security team continues to improve the tooling and automation to  increase the security of the project.
We are pleased to have added  support for plugin developers to suppress findings coming from our custom CodeQL rules.
See &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/OMe_zN8-Tkc/m/Nnqv14sbBAAJ&quot;&gt;the message&lt;/a&gt; in the mailing list.&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/02/01/gsoc-update/</id>
<title>&quot;On your marks, get set, ...&quot;</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-02-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/02/01/gsoc-update/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='community'></category>
<category term='events'></category>
<category term='developer'></category>
<summary>
In a couple of days, the Jenkins GSoC 2023 preparation will culminate with our official Organization Application.
It is now time to shed some light on what is coming next.





Since December 2022, we have actively prepared the Jenkins project for the 2023 edition of Google Summer of Code (GSoC).
This entailed collecting and discussing project ideas, setting up a mentoring team, and giving advice on how to build the necessary "GSoC Jenkins muscle".


Our application will be submitted shortly, and on February 22, we will know if we are part of the adventure again.


Although we are waiting for Google&#8217;s decision, we will start...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a couple of days, the Jenkins GSoC 2023 preparation will culminate with our official Organization Application.
It is now time to shed some light on what is coming next.&lt;/p&gt;
&lt;/div&gt;
&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/gsoc/opengraph.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since December 2022, we have actively prepared the Jenkins project for the 2023 edition of &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code&lt;/a&gt; (GSoC).
This entailed collecting and discussing project ideas, setting up a mentoring team, and giving advice on how to build the necessary &quot;GSoC Jenkins muscle&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our application will be submitted shortly, and on February 22, we will know if we are part of the adventure again.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although we are waiting for Google’s decision, we will start the next GSoC phase without delay.
In this phase, the candidates will prepare their detailed GSoC application with the help of the Jenkins Community.
The proposals are based on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/project-ideas/&quot;&gt;2023 project ideas&lt;/a&gt;.
The phase will culminate with the selection of the students/contributors participating in this year’s GSoC.
The deadline for the application is April 4.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please carefully review the guidelines for a successful application on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors/&quot;&gt;Information for GSoC Contributors&lt;/a&gt; page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a nutshell, select a project idea and begin thinking about how you will build a proposal to convince the mentors that you are the best candidate to bring the project to a successful end.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will help you through the currently available channels such as &lt;a href=&quot;https://community.jenkins.io/&quot;&gt;the Community forum&lt;/a&gt; and &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;Gitter&lt;/a&gt;, and also with weekly on-line &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#office-hours&quot;&gt;office-hours&lt;/a&gt;.
During these meetings you can ask for any clarification, disambiguation, or precision on the project ideas or the GSoC program.
These sessions will be recorded so that everyone can benefit from them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before setting up the weekly Office Hours, we will organize a poll to determine a time that suits the timezones of most of the candidates.
Last year, we held sessions at 14h00 UTC for Europe and Asia, and 03h00 UTC for the US and the Pacific.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the Jenkins participation in GSoC 2023 is confirmed, you can actively start working on your draft proposal.
Make these drafts available to the Jenkins Community for review via &lt;a href=&quot;https://community.jenkins.io&quot;&gt;the community forum&lt;/a&gt;.
Previous years&#39; experience shows that proposals not submitted for the public discussion and review process, are not selected due to being less convincing.
This may be a new and uncomfortable way of approaching such candidatures for you, but it is the Open Source way Further discussion and review is rewarding and gives you the best chances to be selected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Collaborate as much as you can, as it is the best way to have a strong and successful proposal.
Actively use the &lt;a href=&quot;https://community.jenkins.io/c/contributing/gsoc/6&quot;&gt;GSoC Community topic&lt;/a&gt;, the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;GSoC Gitter channel&lt;/a&gt;, or the Office Hour sessions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;some-useful-preparation-notes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-useful-preparation-notes&quot; /&gt;Some useful preparation notes&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/blog/2022/11/23/get-prepared-for-gsoc/&quot;&gt;GSoC 2023: how to get prepared &lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recording of the &lt;a href=&quot;https://youtu.be/k_sTkGtTix8&quot;&gt;GSoC 2023: A Guide to Better Preparations for Candidates&lt;/a&gt; session.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2023/01/12/jenkins-newsletter/</id>
<title>Jenkins 2022 Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2023-01-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2023/01/12/jenkins-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
2022 was a fruitful year for Jenkins!
Across the Jenkins project, we experienced growth and strong contributions.
We want to share deep gratitude to the corporate sponsorships and individual contributions that made it possible to take Jenkins to the next level.
We also look forward to welcoming new friends to collaborate with us in working together to make Jenkins even better.
There&#8217;s still a lot to do within the project, and in 2023, we plan to integrate many more improvements, while sustaining a diversified, inclusive, and welcoming community.


Happy reading!


Got Inspiration?
We would love to highlight your cool Jenkins innovations.
Share your story, and you could be...
</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/2023/01/12/jenkins-newsletter/recap.png&quot; alt=&quot;Jenkins 2022 recap Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2022 was a fruitful year for Jenkins!
Across the Jenkins project, we experienced growth and strong contributions.
We want to share deep gratitude to the corporate sponsorships and individual contributions that made it possible to take Jenkins to the next level.
We also look forward to welcoming new friends to collaborate with us in working together to make Jenkins even better.
There’s still a lot to do within the project, and in 2023, we plan to integrate many more improvements, while sustaining a diversified, inclusive, and welcoming community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Happy reading!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Got Inspiration?
We would love to highlight your cool Jenkins innovations.
Share &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScMCGOMtn2hGpfXsbyssGhVW1LwlW4LkXCIaKINKDQU2m6ieg/viewform&quot;&gt;your story&lt;/a&gt;, and you could be in the next Jenkins newsletter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#highlights&quot; /&gt;Highlights&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;New board members and new officers &lt;a href=&quot;#elected&quot;&gt;elected&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#modern-ui&quot;&gt;UI modernized&lt;/a&gt; with new themes, icons, menus, forms, and buttons&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#platform&quot;&gt;Java 11&lt;/a&gt; replaces Java 8 as minimum supported Java version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 17 is supported&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#security-fixes&quot;&gt;Security fixes&lt;/a&gt; and security process improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#documentation&quot;&gt;Pipeline documentation&lt;/a&gt; improvements in both layout and content&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins in &lt;a href=&quot;#outreach&quot;&gt;Google Summer of Code 2023&lt;/a&gt; is accepting project ideas and volunteer mentors&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;elected&quot; 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/2023/01/12/jenkins-newsletter/governance.png&quot; alt=&quot;Governance Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins governance board thanks &lt;a href=&quot;https://www.jenkins.io/blog/authors/ewelinawilkosz&quot;&gt;Ewelina Wilkosz&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt; for their two years of service as board members.
We’re so glad to have talented people serving on the Jenkins governance board.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;December 2022 brought two new members to the Jenkins governance board.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We welcome &lt;a href=&quot;https://www.jenkins.io/blog/authors/uhafner&quot;&gt;Dr. Ullrich Hafner&lt;/a&gt; of the Department of Computer Science and Mathematics at the Munich University of Applied Sciences as a new member of the board.
In his role as professor, he tries to win new Jenkins contributors by letting students develop new features and test cases in their student projects and theses.
He has been an active contributor in the Jenkins project since 2007, mostly in &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness&quot;&gt;the acceptance test harness&lt;/a&gt; and the static code analysis suite (which is now replaced by the &lt;a href=&quot;https://plugins.jenkins.io/warnings-ng&quot;&gt;Warnings Next Generation Plugin&lt;/a&gt;).&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/uhafner.jpg&quot; alt=&quot;image&quot; width=&quot;230&quot; height=&quot;230&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also welcome &lt;a href=&quot;https://github.com/NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt; as a new member of the board.
Alexander is a Jenkins Core maintainer and the maintainer of the &lt;a href=&quot;https://plugins.jenkins.io/jobConfigHistory&quot;&gt;Job Configuration History&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/ionicons-api&quot;&gt;Ionicons API&lt;/a&gt; plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;He is a release team member and actively involved in Jenkins Long Term Support releases and weekly releases.
He served as release lead for five of the twelve Jenkins LTS releases in 2022.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to these two new governance board members, we welcome the new documentation officer, &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;.
Kevin leads Jenkins documentation office hours, reviews and merges documentation pull requests, and is actively involved in Jenkins Special Interest Groups.&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/kmartens27.jpeg&quot; alt=&quot;image&quot; width=&quot;230&quot; height=&quot;230&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re grateful for the Jenkins officers that are continuing their service for another year, including:&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/timja&quot;&gt;Tim Jacomb&lt;/a&gt; - Release Officer&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; - Security Officer&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; - Infrastructure Officer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; - Events Officer&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;security-fixes&quot; 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/2023/01/12/jenkins-newsletter/security.png&quot; alt=&quot;Security Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins security team was incredibly active this year, not only in resolving security concerns, but also providing insight to users through security advisories.
The information below provides overall statistics from the Security team in 2022.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;publication&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#publication&quot; /&gt;Publication&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/advisories/#2022&quot;&gt;16 Security advisories&lt;/a&gt; (stable year over year).&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Only 5 impacting Jenkins core (also stable).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Around 400 CVEs published, which was more than all previous years.&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;day-to-day&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-to-day&quot; /&gt;Day to day:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Approximately 580 SECURITY tickets handled.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Which is ~20% of the total number of tickets since 2009.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Around 70 hosting requests proactively audited (introduced in Q2 of 2022).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Around 80 UI related PRs audited in Jenkins core (introduced in Q3 of 2022).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had to deal with even more CVEs with fancy names like &lt;a href=&quot;https://www.jenkins.io/blog/2022/03/31/spring-rce-CVE-2022-22965/&quot;&gt;Spring4Shell&lt;/a&gt;.
We analyzed and understood them to confirm that they don’t affect Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;delivery&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#delivery&quot; /&gt;Delivery&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;General availability for the Jenkins custom rules in CodeQL (&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/OMe_zN8-Tkc/m/5Tf0OnNWAgAJ&quot;&gt;message&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved tooling for the SECURITY tickets handling.&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/2023/01/12/jenkins-newsletter/infrastructure.png&quot; alt=&quot;Infrastructure Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2022 was an eventful year for the Jenkins Infrastructure team as well, leading to various updates and improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ci.jenkins.io now has:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;General availability for Windows 2022 server use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK19 availability for developers, providing new functionalities and edge testing options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes has been upgraded to version 1.23 to support Azure, AWS, and DigitalOcean.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://jfrog.com/&quot;&gt;JFrog&lt;/a&gt; sponsored migration of &lt;a href=&quot;https://repo.jenkins-ci.org/ui/&quot;&gt;repo.jenkins-ci.org&lt;/a&gt; to their new AWS platform, which provides improved performance for artifact downloads.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download mirrors (&lt;a href=&quot;https://get.jenkins.io/war/2.386/jenkins.war?mirrorstats&quot;&gt;get.jenkins.io&lt;/a&gt;):&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A new download mirror for Jenkins was added in Asia. We want to thank &lt;a href=&quot;https://servanamanaged.com/&quot;&gt;Servana&lt;/a&gt; for providing the mirror!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The mirror mirror.gruenehoelle.nl, located in the Netherlands, that had been available previously has been decommissioned.
Thank you for the service!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Infrastructure team was also able to review and clean up unused Azure resources, leading to $1,000 of monthly savings!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;platform&quot; 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/2023/01/12/jenkins-newsletter/platform-modernization.png&quot; alt=&quot;Platform Modernization Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several upgrades were made to modernize the Jenkins platform.
These include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 11 is now required for Jenkins platform and plugin development.&lt;/p&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/2022/12/14/require-java-11/&quot;&gt;Build toolchain changes&lt;/a&gt; arrived in parent pom 4.52.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 11 provides a better baseline to work from, ensuring that the benefits such as performance and memory improvements are felt across the platform.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins now has more Java 11 installations than Java 8 installations of Jenkins core!&lt;/p&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/2022-12-require-java-11/jvms.png&quot; alt=&quot;image&quot; width=&quot;403&quot; height=&quot;275&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Jenkins now fully supports Java 17.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Previously, Java 17 was only available in a preview mode, but with the LTS release of &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.361.1&quot;&gt;2.361.1&lt;/a&gt;, Java 17 functionality is fully available in Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Migration of Linux installation packages from System V init to &lt;code&gt;systemd&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Users have requested this migration since 2017.
The &lt;a href=&quot;https://www.jenkins.io/blog/2022/03/25/systemd-migration/#motivation&quot;&gt;goals of the migration&lt;/a&gt; were achieved: to provide unification of service management implementation and better integration between Jenkins core and service management framework.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/basil&quot;&gt;Basil Crow&lt;/a&gt; for his work on the migration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Staying on top of new backend and frontend dependency updates providing better testing, processing, and performance across Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Container image updates:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added new platform support, such as arm/v7 and aarch64.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removed support for ppc64le.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Released the final, definitive version of the JDK8 containers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removed the deprecated install-plugins.sh script from Docker images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There were also &quot;Exit&quot; and &quot;Restart&quot; &lt;a href=&quot;https://www.jenkins.io/blog/2022/05/27/docker-image-new-lifecycle/&quot;&gt;lifecycle changes&lt;/a&gt; added to the Docker images. As a result, users must ensure they have a Container Restart Policy in their container.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The ANTLR 2 grammars and code were upgraded to ANTLR 4, making it easier for Jenkins to read and parse through various programming languages.
This means Jenkins core can now compile with more languages!&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Thanks to &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/basil&quot;&gt;Basil Crow&lt;/a&gt; for all of their hard work on completing this transition!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This was included in the 2.376 Jenkins weekly release.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Platform documentation&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A short &lt;a href=&quot;https://www.jenkins.io/doc/book/platform-information/support-policy-servlet-containers/&quot;&gt;guide&lt;/a&gt; about web containers and servlet container support was created.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins releases are now guided by release leads thanks to our release officer, &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt;.
2022 release leads have included:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt; - 2.361.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cathychan&quot;&gt;Cathy Chan&lt;/a&gt; - 2.319.2 and 2.332.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/imonteroperez&quot;&gt;Ildefonso Montero&lt;/a&gt; - 2.319.3 and 2.332.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/krisstern&quot;&gt;Kris Stern&lt;/a&gt; - 2.361.1, 2.361.2, and 2.375.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt; - 2.332.3, 2.346.1, 2.346.2, 2.346.3, 2.361.3, and 2.375.1&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Platform Work In Progress:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For further development, experiments with RISC-V agents with JDK17/19/20 need to be performed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Additional experiments with Windows 2022 server needs to be performed as well.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&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/2023/01/12/jenkins-newsletter/localization-simplification.png&quot; alt=&quot;Localization simplification Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;crowdin-for-plugin-localization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#crowdin-for-plugin-localization&quot; /&gt;CrowdIn for plugin localization&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt; for helping get &lt;a href=&quot;https://crowdin.com/enterprise&quot;&gt;CrowdIn&lt;/a&gt; connected with &lt;a href=&quot;https://www.jenkins.io/doc/developer/crowdin/crowdin-integration/#setup-a-crowdin-project&quot;&gt;Jenkins&lt;/a&gt;.
This will make the plugin localization process easier, allowing for any user to contribute to localizing plugin documentation.
&lt;a href=&quot;https://crowdin.jenkins.io/&quot;&gt;This page&lt;/a&gt; shows the plugins that have localization work currently open.
It also provides some insight as to how many changes have been made and how many people have been contributing to the project.&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/2023/01/12/jenkins-newsletter/jenkins-crowdin.png&quot; alt=&quot;Jenkins Crowdin&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;utf-8-encoding&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#utf-8-encoding&quot; /&gt;UTF-8 encoding&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project also updated how it reads jelly files, making the transition to using UTF-8.
This was possible once the transition to Java 11 completed.
By utilizing UTF-8, developers and users can build more reliably and have modern property files read correctly.
This also aligns Jenkins&#39; ability to read different types of property files, provided the encoding is the same.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;modern-ui&quot; 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/2023/01/12/jenkins-newsletter/ui_ux.png&quot; alt=&quot;User Experience Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins LTS and weekly releases in 2022 included significant user experience improvements thanks to the work of &lt;a href=&quot;https://www.jenkins.io/blog/authors/janfaracik&quot;&gt;Jan Faracik&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, &lt;a href=&quot;https://github.com/NotMyFault&quot;&gt;Alexander Brandes&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt;, and many others.
Table layouts, menu entries, icons, themes, breadcrumbs, and more were updated to give Jenkins a new, fresh look in 2022.&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/2023/01/12/jenkins-newsletter/jenkins-modern-look.png&quot; alt=&quot;jenkins modern look&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;themes-and-icons&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#themes-and-icons&quot; /&gt;Themes and icons&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins now has much broader support for themes.
The &lt;a href=&quot;https://plugins.jenkins.io/dark-theme&quot;&gt;dark theme&lt;/a&gt; is now installed on over 6,000 Jenkins controllers worldwide.
The &lt;a href=&quot;https://plugins.jenkins.io/material-theme&quot;&gt;material theme&lt;/a&gt; is also available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/blog/2022/06/20/svg-icon-migration/&quot;&gt;transition to scalable vector graphics (SVG) icons&lt;/a&gt; improved the appearance of Jenkins icons.
The SVG icons are specifically selected to work well across a wide range of resolutions and across multiple themes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;menus-and-forms&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#menus-and-forms&quot; /&gt;Menus and forms&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The menus of configuration forms moved from the top of each configuration page to the side panel.
The side panel locations are more familiar for users and make better use of screen space that was previously empty.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-look&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-look&quot; /&gt;New look&lt;/h3&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/2023/01/12/jenkins-newsletter/jenkins-modern-look-2.png&quot; alt=&quot;jenkins modern look 2&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The improvements to look and feel have made Jenkins more comfortable for users and easier to navigate.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s next?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tim Jacomb and Jan Faracik shared their ideas for further improvements to the Jenkins UI.
Watch their DevOps World 2022 talk, &lt;a href=&quot;https://www.techstrongevents.com/devops-world-2022/v/s-1130969?i=-sEhHYKccv3MgOrJkeyuyY4jp29rM6m-&quot;&gt;&quot;Transformation of the Jenkins User Interface and Where It’s Going Next&quot;&lt;/a&gt; (registration required to view the video).&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;documentation&quot; 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/2023/01/12/jenkins-newsletter/jenkins-io-improvements.png&quot; alt=&quot;Jenkins io improvements Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, the Jenkins project saw documentation contributions from new and seasoned Jenkins users.
These contributions included blog posts, documentation additions and updates, documentation migration, and other improvements.
All of this has helped expand and empower the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the year, Jenkins project saw 48 blog posts, submitted by 23 different authors.
There were 814 contributions throughout 2022.
These contributions are a result of the community and collaboration with various projects throughout the year, such as &lt;a href=&quot;https://www.jenkins.io/blog/2022/04/11/She-Code-Africa-contributhon/&quot;&gt;She Code Africa Contributhon&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/2022/10/31/jenkins-google-summer-of-code-archive-2022/&quot;&gt;Google Summer of Code&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/2022/11/17/hacktoberfest-recap/&quot;&gt;Hacktoberfest&lt;/a&gt;.
Our deepest gratitude and appreciation go out to all Jenkins contributors and the open-source community beyond.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;pipeline-steps-reference&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-steps-reference&quot; /&gt;Pipeline Steps Reference&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the work of &lt;a href=&quot;https://www.jenkins.io/blog/authors/vihaanthora&quot;&gt;Vihaan Thora&lt;/a&gt;, contributing via &lt;a href=&quot;https://www.jenkins.io/blog/2022/10/10/pipeline-steps-improvement-gsoc-report/#project-specific-guidance&quot;&gt;Google Summer of Code&lt;/a&gt;, the &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/&quot;&gt;Pipeline Steps&lt;/a&gt; reference page provides simplified search for Pipeline steps.
The reference page is invaluable for developers when working in Jenkins and utilizing plugins.
The updates include search functionality, UI improvements, and faster page loading.&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/2023/01/12/jenkins-newsletter/image5.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;388&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;algolia-search&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#algolia-search&quot; /&gt;Algolia search&lt;/h3&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/2023/01/12/jenkins-newsletter/image6.png&quot; alt=&quot;image&quot; width=&quot;275&quot; height=&quot;52&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins documentation site search has been updated to use the latest version of &lt;a href=&quot;https://www.algolia.com/&quot;&gt;Algolia&lt;/a&gt;.
We recognize and thank &lt;a href=&quot;https://www.jenkins.io/blog/authors/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt; for his work on site search and on the &lt;a href=&quot;https://plugins.jenkins.io&quot;&gt;plugins site&lt;/a&gt;.
We thank &lt;a href=&quot;https://algolia.com&quot;&gt;Algolia&lt;/a&gt; for donating the search functionality.
The site search now provides more relevant results and suggestions for users.
A visual update was included as part of the upgrade, resulting in the new look and feel.&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/2023/01/12/jenkins-newsletter/image7.png&quot; alt=&quot;image&quot; width=&quot;363&quot; height=&quot;317&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div id=&quot;outreach&quot; 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/2023/01/12/jenkins-newsletter/outreach-and-advocacy.png&quot; alt=&quot;Outreach and advocacy Update&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2022, the Jenkins project was able to collaborate on and complete several projects.
This included launching two new sites for community engagement and involvement:&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://community.jenkins.io/&quot;&gt;community.jenkins.io&lt;/a&gt; now provides a space for community discourse and communication.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;stories.jenkins.io&lt;/a&gt; is a site dedicated to sharing the experiences and stories of Jenkins users, developers, and contributors that Jenkins has impacted.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Throughout the year, the Jenkins project participated in:&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/sigs/gsoc/&quot;&gt;Google Summer of Code 2022&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2022/04/11/She-Code-Africa-contributhon/&quot;&gt;She Code Africa Contributhon 2022&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/&quot;&gt;Hacktoberfest 2022&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;We collaborated with new Jenkins users all over the globe, improved many areas of Jenkins, and celebrated the successes of the community!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project is also excited to share what’s to come in 2023:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins in GSoC 2023 : &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/project-ideas/&quot;&gt;Call for Project Ideas&lt;/a&gt; + &lt;a href=&quot;https://www.jenkins.io/blog/2022/12/09/GSoC-the-gift-of-mentorship/&quot;&gt;Call for Mentors&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=k_sTkGtTix8&quot;&gt;A Guide to Better Preparations&lt;/a&gt; is a great resource for potential GSoC candidates, who want to get started and increase their chance of getting accepted into the program.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2023/&quot;&gt;FOSDEM&#39;23&lt;/a&gt;: Jenkins will have a devstand at FOSDEM (Feb 4-5, 2023).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.socallinuxexpo.org/scale/20x&quot;&gt;SCALE 20x&lt;/a&gt;: Jenkins will have a booth presence at SCALE (March 9-12, 2023).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, we want to &lt;a href=&quot;https://www.jenkins.io/blog/2022/11/24/jenkins-sponsor-appreciation/&quot;&gt;thank our partners and sponsors&lt;/a&gt; over the year, as so much of this is possible with the help of their contributions.&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;&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/12/27/run-jenkins-agent-as-a-service/</id>
<title>Create a new Jenkins node, and run your Jenkins agent as a service</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-12-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/12/27/run-jenkins-agent-as-a-service/" />
<author>
<name>gounthar</name>
</author>
<category term='systemd'></category>
<category term='agent'></category>
<category term='node'></category>
<summary>
Table of Contents

Pre-requisites

Java
Jenkins user
Docker


Create a new node in Jenkins

Node creation in the UI
Node configuration


Run your Jenkins agent as a service





In this tutorial, we will review how to start a Jenkins agent as a Linux service with systemd.
When using Docker for my agents, entering the correct options on the command line should cause the agents to restart automatically.
Sometimes, such as when you want to use the famous Dockerfile: true option, you need to start the agent manually with a java command and not with Docker (for various security reasons).
Then you need to restart it manually if you have to reboot, or...
</summary>
<content type='html'>
&lt;div id=&quot;toc&quot; class=&quot;toc&quot;&gt;
&lt;div id=&quot;toctitle&quot;&gt;Table of Contents&lt;/div&gt;
&lt;ul class=&quot;sectlevel1&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#pre-requisites&quot;&gt;Pre-requisites&lt;/a&gt;
&lt;ul class=&quot;sectlevel2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#java&quot;&gt;Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#jenkins-user&quot;&gt;Jenkins user&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#docker&quot;&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#create-a-new-node-in-jenkins&quot;&gt;Create a new node in Jenkins&lt;/a&gt;
&lt;ul class=&quot;sectlevel2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#node-creation-in-the-ui&quot;&gt;Node creation in the UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#node-configuration&quot;&gt;Node configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#run-your-jenkins-agent-as-a-service&quot;&gt;Run your Jenkins agent as a service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this tutorial, we will review how to start a Jenkins agent as a Linux service with &lt;code&gt;systemd&lt;/code&gt;.
When using &lt;code&gt;Docker&lt;/code&gt; for my agents, entering the correct options on the command line should cause the agents to restart automatically.
Sometimes, such as when you want to use the famous &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/docker/&quot;&gt;&lt;code&gt;Dockerfile: true&lt;/code&gt;&lt;/a&gt; option, you need to start the agent manually with a &lt;code&gt;java&lt;/code&gt; command and not with Docker (for various security reasons).
Then you need to restart it manually if you have to reboot, or if you forget to use &lt;code&gt;nohup&lt;/code&gt; to start it in the background, and then close the terminal.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;pre-requisites&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pre-requisites&quot; /&gt;Pre-requisites&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s say we’re starting with a fresh Ubuntu 22.04 Linux installation.
To get an agent working, we’ll need to do some preparation.
Java is necessary for this process, and  Docker allows us to use Docker for our agents instead of installing everything directly on the machine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java&quot; /&gt;Java&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently, openjdk 11 is recommended, and openjdk 17 is supported.
Let’s go with openjdk 17:&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;sudo &lt;/span&gt;apt-get update
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--no-install-recommends&lt;/span&gt; openjdk-17-jdk-headless&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s now verify if &lt;code&gt;java&lt;/code&gt; works for us:&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;java &lt;span class=&quot;nt&quot;&gt;-version&lt;/span&gt;
openjdk version &lt;span class=&quot;s2&quot;&gt;&quot;17.0.3&quot;&lt;/span&gt; 2022-04-19
OpenJDK Runtime Environment &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 17.0.3+7-Ubuntu-0ubuntu0.22.04.1&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
OpenJDK 64-Bit Server VM &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;build 17.0.3+7-Ubuntu-0ubuntu0.22.04.1, mixed mode, sharing&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 class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-user&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-user&quot; /&gt;Jenkins user&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While creating an agent, be sure to separate rights, permissions, and ownership for users.
Let’s create a user for Jenkins:&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;sudo &lt;/span&gt;adduser &lt;span class=&quot;nt&quot;&gt;--group&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--home&lt;/span&gt; /home/jenkins &lt;span class=&quot;nt&quot;&gt;--shell&lt;/span&gt; /bin/bash jenkins&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;docker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker&quot; /&gt;Docker&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, to get a recent version of Docker, we should install the &lt;code&gt;docker-ce&lt;/code&gt; package and a few others with a particular repo.
First, let’s add the needed dependencies to add the repo:&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;sudo &lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;ca-certificates curl gnupg lsb-release&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my case, these packages were already installed and up to date.
The next step is to add Docker’s official GPG key:&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;sudo mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; /etc/apt/keyrings
curl &lt;span class=&quot;nt&quot;&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg | &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;gpg &lt;span class=&quot;nt&quot;&gt;--dearmor&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; /etc/apt/keyrings/docker.gpg&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, we can set up the repo:&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;echo&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;deb [arch=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;dpkg &lt;span class=&quot;nt&quot;&gt;--print-architecture&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;lsb_release &lt;span class=&quot;nt&quot;&gt;-cs&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; stable&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/docker.list &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last thing to do is to update the list of available packages, and then install the latest version of Docker:&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;sudo &lt;/span&gt;apt-get update
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io docker-compose-plugin&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re - like me - running a recent version of Ubuntu or Debian, you won’t need to create the &lt;code&gt;docker&lt;/code&gt; group, because it has been created with the installation of Docker.
On the contrary, you can then issue a &lt;code&gt;sudo groupadd docker&lt;/code&gt; command to create the &lt;code&gt;docker&lt;/code&gt; group.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, let’s add our current user to the &lt;code&gt;docker&lt;/code&gt; group:&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;sudo &lt;/span&gt;usermod &lt;span class=&quot;nt&quot;&gt;-aG&lt;/span&gt; docker &lt;span class=&quot;nv&quot;&gt;$USER&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;And if you’re not using the default user, but &lt;code&gt;jenkins&lt;/code&gt;, you can do the same:&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;sudo &lt;/span&gt;usermod &lt;span class=&quot;nt&quot;&gt;-aG&lt;/span&gt; docker jenkins
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;usermod &lt;span class=&quot;nt&quot;&gt;-aG&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now log out, and log back in so that your group membership is updated.
If you get any error, just reboot the machine, this sometimes happens.
&lt;code&gt;¯_(ツ)_/¯&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mandatory ``Hello World!&#39;&#39; Docker installation test:&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;docker run hello-world
Unable to find image &lt;span class=&quot;s1&quot;&gt;&#39;hello-world:latest&#39;&lt;/span&gt; locally
latest: Pulling from library/hello-world
2db29710123e: Pull &lt;span class=&quot;nb&quot;&gt;complete
&lt;/span&gt;Digest: sha256:53f1bbee2f52c39e41682ee1d388285290c5c8a76cc92b42687eecf38e0af3f0
Status: Downloaded newer image &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the &lt;span class=&quot;s2&quot;&gt;&quot;hello-world&quot;&lt;/span&gt; image from the Docker Hub.
    &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;amd64&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 docker run &lt;span class=&quot;nt&quot;&gt;-it&lt;/span&gt; ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nice!&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;create-a-new-node-in-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#create-a-new-node-in-jenkins&quot; /&gt;Create a new node in Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quoting the official &lt;a href=&quot;https://www.jenkins.io/doc/book/managing/nodes/&quot;&gt;documentation&lt;/a&gt;,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nodes are the &quot;machines&quot; on which build agents run.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;and also:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Agents manage the task execution on behalf of the Jenkins controller by using executors.
An agent is actually a small (170KB single jar) Java client process that connects to a Jenkins controller and is assumed to be unreliable.
An agent can use any operating system that supports Java.
Tools required for builds and tests are installed on the node where the agent runs; they can be installed directly or in a container (Docker or Kubernetes).&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To conclude:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In practice, nodes and agents are essentially the same but it is good to remember that they are conceptually distinct.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will now create a new node in Jenkins, using our Ubuntu machine as the node, and then launch an agent on this node.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;node-creation-in-the-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#node-creation-in-the-ui&quot; /&gt;Node creation in the UI&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go to your Jenkins dashboard&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;em&gt;Manage Jenkins&lt;/em&gt; option in the main menu&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;em&gt;Manage Nodes and clouds&lt;/em&gt; item&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/2022-12-02-run-jenkins-agent-as-a-service/manage-nodes-and-clouds.png&quot; alt=&quot;Jenkins UI&quot; title=&quot;Manage Nodes and Clouds&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go to New Node option in the side menu&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fill in the &lt;em&gt;Node name&lt;/em&gt; (&lt;em&gt;My New Ubuntu 22.04 Node with Java and Docker installed&lt;/em&gt; for me) and type (&lt;em&gt;Permanent Agent&lt;/em&gt; for me)&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/2022-12-02-run-jenkins-agent-as-a-service/new-node.png&quot; alt=&quot;Jenkins UI&quot; title=&quot;New node&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Click on the &lt;em&gt;Create&lt;/em&gt; button&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the &lt;em&gt;Description&lt;/em&gt; field, enter if you want a human-readable description of the node (&lt;em&gt;My New Ubuntu 22.04 Node with Java and Docker installed&lt;/em&gt; for me) -&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let &lt;code&gt;1&lt;/code&gt; as the number of executors for the time being.
A good value to start with would be the number of CPU cores on the machine (unfortunately for me, it’s &lt;code&gt;1&lt;/code&gt;) - As &lt;em&gt;Remote root directory&lt;/em&gt;, enter the directory where you want to install the agent (&lt;code&gt;/home/jenkins&lt;/code&gt; for me)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An agent should have a directory dedicated to Jenkins.
It is best to use an absolute path, such as &lt;code&gt;/var/jenkins&lt;/code&gt; or &lt;code&gt;c:\jenkins&lt;/code&gt;.
This should be a path local to the agent machine.
There is no need for this path to be visible from the controller.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Regarding the &lt;em&gt;Labels&lt;/em&gt; field, enter the labels you want to assign to the node (&lt;code&gt;ubuntu linux docker jdk17&lt;/code&gt; for me), which makes four labels.
This will help you group multiple agents into one logical group)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the &lt;em&gt;Usage&lt;/em&gt; now, choose &lt;em&gt;Use this node as much as possible&lt;/em&gt; for the time being, you will be able to restrict later on the kind of jobs that can be run on this node.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The last thing to set up now: choose &lt;em&gt;Launch agent by connecting it to the controller&lt;/em&gt; .
That means that you will have to launch the agent on the node itself and that the agent will then connect to the controller.
That’s pretty handy when you want to build Docker images, or when your process will use Docker images…
You could also have the controller launch an agent directly via Docker remotely, but then you would have to use Docker in Docker, which is complicated &lt;em&gt;and&lt;/em&gt; insecure.&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;node-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#node-configuration&quot; /&gt;Node configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;em&gt;Save&lt;/em&gt; button will create the node within Jenkins, and lead you to the &lt;em&gt;Manage nodes and clouds&lt;/em&gt; page.
Your new node will appear &lt;em&gt;brown&lt;/em&gt; in the list, and you can click on it to see its details.
The details page displays your java command line to start the agent.&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/2022-12-02-run-jenkins-agent-as-a-service/java-command-to-launch-the-agent.png&quot; alt=&quot;Jenkins UI&quot; title=&quot;Command to launch the agent&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This command looks like that for me:&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;curl &lt;span class=&quot;nt&quot;&gt;-sO&lt;/span&gt; http://my_ip:8080/jnlpJars/agent.jar
java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; agent.jar &lt;span class=&quot;nt&quot;&gt;-jnlpUrl&lt;/span&gt; http://my_ip:8080/computer/My%20New%20Ubuntu%2022%2E04%20Node%20with%20Java%20and%20Docker%20installed/jenkins-agent.jnlp &lt;span class=&quot;nt&quot;&gt;-secret&lt;/span&gt; my_secret &lt;span class=&quot;nt&quot;&gt;-workDir&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/home/jenkins&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;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-12-27-run-jenkins-agent-as-a-service/curl-and-java-launch-agent.svg&quot; alt=&quot;Terminal&quot; title=&quot;New agent starting&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can now go back into Jenkins’ UI, select the &lt;strong&gt;Back to List&lt;/strong&gt; menu item on the left side of the screen, and see that your new agent is running.&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/2022-12-02-run-jenkins-agent-as-a-service/new-node-looks-fine.png&quot; alt=&quot;Jenkins UI&quot; title=&quot;New node looks fine&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After this is running, there are a few more actions that need to be completed.
Whenever you close the terminal you launched the agent with, the agent will stop.
If you ever have to reboot the machine after a kernel update, you will have to restart the agent manually too.
Therefore, you should keep the agent running by declaring it as a service.&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;run-your-jenkins-agent-as-a-service&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#run-your-jenkins-agent-as-a-service&quot; /&gt;Run your Jenkins agent as a service&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Create a directory called &lt;code&gt;jenkins&lt;/code&gt; or &lt;code&gt;jenkins-service&lt;/code&gt; in your home directory or anywhere else where you have access, for example &lt;code&gt;/usr/local/jenkins-service&lt;/code&gt;.
If the new directory does not belong to the current user home, give it the right owner and group after creation.
For me, it would look like the following:&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;sudo mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; /usr/local/jenkins-service
&lt;span class=&quot;nb&quot;&gt;sudo chown &lt;/span&gt;jenkins /usr/local/jenkins-service&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Move the &lt;code&gt;agent.jar&lt;/code&gt; file that you downloaded earlier with the &lt;code&gt;curl&lt;/code&gt; command to this directory.&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;mv &lt;/span&gt;agent.jar /usr/local/jenkins-service&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now (in &lt;code&gt;/usr/local/jenkins-service&lt;/code&gt;) create a &lt;code&gt;start-agent.sh&lt;/code&gt; file with the Jenkins &lt;code&gt;java&lt;/code&gt; command we’ve seen earlier as the file’s content.&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;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/jenkins-service
&lt;span class=&quot;c&quot;&gt;# Just in case we would have upgraded the controller, we need to make sure that the agent is using the latest version of the agent.jar&lt;/span&gt;
curl &lt;span class=&quot;nt&quot;&gt;-sO&lt;/span&gt; http://my_ip:8080/jnlpJars/agent.jar
java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; agent.jar &lt;span class=&quot;nt&quot;&gt;-jnlpUrl&lt;/span&gt; http://my_ip:8080/computer/My%20New%20Ubuntu%2022%2E04%20Node%20with%20Java%20and%20Docker%20installed/jenkins-agent.jnlp &lt;span class=&quot;nt&quot;&gt;-secret&lt;/span&gt; my_secret &lt;span class=&quot;nt&quot;&gt;-workDir&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/home/jenkins&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Make the script executable by executing &lt;code&gt;chmod +x start-agent.sh&lt;/code&gt; in the directory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now create a &lt;code&gt;/etc/systemd/system/jenkins-agent.service&lt;/code&gt; file with the following content:&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;o&quot;&gt;[&lt;/span&gt;Unit]
&lt;span class=&quot;nv&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;Jenkins Agent

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Service]
&lt;span class=&quot;nv&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;jenkins
&lt;span class=&quot;nv&quot;&gt;WorkingDirectory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/home/jenkins
&lt;span class=&quot;nv&quot;&gt;ExecStart&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/bin/bash /usr/local/jenkins-service/start-agent.sh
&lt;span class=&quot;nv&quot;&gt;Restart&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;always

&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Install]
&lt;span class=&quot;nv&quot;&gt;WantedBy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;multi-user.target&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We still have to enable the daemon with the following 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;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;systemctl &lt;span class=&quot;nb&quot;&gt;enable &lt;/span&gt;jenkins-agent.service&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s have a look at the system logs before starting the daemon:&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;journalctl &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now start the daemon with the following 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;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;systemctl start jenkins-agent.service&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can see some interesting logs in the &lt;code&gt;journalctl&lt;/code&gt; output:&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;Aug 03 19:37:27 ubuntu-machine systemd[1]: Started Jenkins Agent.
Aug 03 19:37:27 ubuntu-machine &lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;8821]: pam_unix&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt;:session&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;: session closed &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;user root
Aug 03 19:37:28 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:28 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
Aug 03 19:37:28 ubuntu-machine bash[8826]: INFO: Using /home/jenkins/remoting as a remoting work directory
Aug 03 19:37:28 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:28 PM org.jenkinsci.remoting.engine.WorkDirManager setupLogging
Aug 03 19:37:28 ubuntu-machine bash[8826]: INFO: Both error and output logs will be printed to /home/jenkins/remoting
Aug 03 19:37:28 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:28 PM hudson.remoting.jnlp.Main createEngine
Aug 03 19:37:28 ubuntu-machine bash[8826]: INFO: Setting up agent: My New Ubuntu 22.04 Node with Java and Docker installed
Aug 03 19:37:28 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:28 PM hudson.remoting.Engine startEngine
Aug 03 19:37:28 ubuntu-machine bash[8826]: INFO: Using Remoting version: 3046.v38db_38a_b_7a_86
Aug 03 19:37:28 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:28 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
Aug 03 19:37:28 ubuntu-machine bash[8826]: INFO: Using /home/jenkins/remoting as a remoting work directory
Aug 03 19:37:29 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:29 PM hudson.remoting.jnlp.Main&lt;span class=&quot;nv&quot;&gt;$CuiListener&lt;/span&gt; status
Aug 03 19:37:29 ubuntu-machine bash[8826]: INFO: Locating server among &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;http://controller_ip:58080/]
Aug 03 19:37:29 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:29 PM org.jenkinsci.remoting.engine.JnlpAgentEndpointResolver resolve
Aug 03 19:37:29 ubuntu-machine bash[8826]: INFO: Remoting server accepts the following protocols: &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;JNLP4-connect, Ping]
Aug 03 19:37:29 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:29 PM hudson.remoting.jnlp.Main&lt;span class=&quot;nv&quot;&gt;$CuiListener&lt;/span&gt; status
Aug 03 19:37:29 ubuntu-machine bash[8826]: INFO: Agent discovery successful
Aug 03 19:37:29 ubuntu-machine bash[8826]:   Agent address: controller_ip
Aug 03 19:37:29 ubuntu-machine bash[8826]:   Agent port:    50000
Aug 03 19:37:29 ubuntu-machine bash[8826]:   Identity:      31:c4:f9:31:46:c3:eb:72:64:a3:c7:d6:c7:ea:32:2f
Aug 03 19:37:29 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:29 PM hudson.remoting.jnlp.Main&lt;span class=&quot;nv&quot;&gt;$CuiListener&lt;/span&gt; status
Aug 03 19:37:29 ubuntu-machine bash[8826]: INFO: Handshaking
Aug 03 19:37:29 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:29 PM hudson.remoting.jnlp.Main&lt;span class=&quot;nv&quot;&gt;$CuiListener&lt;/span&gt; status
Aug 03 19:37:29 ubuntu-machine bash[8826]: INFO: Connecting to controller_ip:50000
Aug 03 19:37:29 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:29 PM hudson.remoting.jnlp.Main&lt;span class=&quot;nv&quot;&gt;$CuiListener&lt;/span&gt; status
Aug 03 19:37:29 ubuntu-machine bash[8826]: INFO: Trying protocol: JNLP4-connect
Aug 03 19:37:29 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:29 PM org.jenkinsci.remoting.protocol.impl.BIONetworkLayer&lt;span class=&quot;nv&quot;&gt;$Reader&lt;/span&gt; run
Aug 03 19:37:29 ubuntu-machine bash[8826]: INFO: Waiting &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;ProtocolStack to start.
Aug 03 19:37:30 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:30 PM hudson.remoting.jnlp.Main&lt;span class=&quot;nv&quot;&gt;$CuiListener&lt;/span&gt; status
Aug 03 19:37:30 ubuntu-machine bash[8826]: INFO: Remote identity confirmed: 31:c4:f9:31:46:c3:eb:72:64:a3:c7:d6:c7:ea:32:2f
Aug 03 19:37:30 ubuntu-machine bash[8826]: Aug 03, 2022 7:37:30 PM hudson.remoting.jnlp.Main&lt;span class=&quot;nv&quot;&gt;$CuiListener&lt;/span&gt; status
Aug 03 19:37:30 ubuntu-machine bash[8826]: INFO: Connected&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can now check the status with the command below, and the output should be similar to what is shown here.&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;sudo &lt;/span&gt;systemctl status jenkins-agent.service
● jenkins-agent.service - Jenkins Agent
     Loaded: loaded &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;/etc/systemd/system/jenkins-agent.service&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; enabled&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
     Active: active &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;running&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; since Wed 2022-08-03 19:37:27 UTC&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; 4min 0s ago
   Main PID: 8825 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;bash&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
      Tasks: 22 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;limit: 1080&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
     Memory: 63.1M
        CPU: 9.502s
     CGroup: /system.slice/jenkins-agent.service
             ├─8825 /bin/bash /usr/local/jenkins-service/start-agent.sh
             └─8826 java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; agent.jar &lt;span class=&quot;nt&quot;&gt;-jnlpUrl&lt;/span&gt; http://controller_ip:8080/computer/My%20New%20Ubuntu%2022%2E04%20Node%20with%20Java%20and%20Docker%20installed/jenkins-agent.jnlp &lt;span class=&quot;nt&quot;&gt;-secret&lt;/span&gt; my_secret&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just for fun, we can now reboot the machine and see in the UI if the agent is still running once the boot is finished!&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/2022/12/14/require-java-11/</id>
<title>Jenkins plugin development requires Java 11 or newer</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-12-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/12/14/require-java-11/" />
<author>
<name>basil</name>
</author>
<category term='announcement'></category>
<category term='developer'></category>
<category term='jenkins'></category>
<summary>
🚀 Java Platform update


Jenkins has required Java 11 or newer
since 2.361.1 LTS (released on September 7, 2022)
and has supported Java 17 since 2.346.1 LTS (released on June 16, 2022).
At the time, more users were running Jenkins on Java 8 than on Java 11,
and a negligible number of users were running Jenkins on Java 17.
In recent months, usage of Java 11 has surpassed usage of Java 8,
and usage of Java 17 has entered a phase of rapid adoption:





With all known production issues on Java 17 resolved, we continue to encourage users to upgrade to Java 17,
particularly in light of the fact...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;java-platform-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-platform-update&quot; /&gt;🚀 Java Platform update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has &lt;a href=&quot;https://www.jenkins.io/blog/2022/06/28/require-java-11/&quot;&gt;required Java 11 or newer&lt;/a&gt;
since &lt;a href=&quot;https://github.com/jenkinsci/jenkins/releases/tag/jenkins-2.361.1&quot;&gt;2.361.1 LTS&lt;/a&gt; (released on September 7, 2022)
and has supported Java 17 since &lt;a href=&quot;https://github.com/jenkinsci/jenkins/releases/tag/jenkins-2.346.1&quot;&gt;2.346.1 LTS&lt;/a&gt; (released on June 16, 2022).
At the time, more users were running Jenkins on Java 8 than on Java 11,
and a negligible number of users were running Jenkins on Java 17.
In recent months, usage of Java 11 has surpassed usage of Java 8,
and usage of Java 17 has entered a phase of rapid adoption:&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/2022-12-require-java-11/jvms.png&quot; alt=&quot;JVMS by date as of November 2022&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With all &lt;em&gt;known&lt;/em&gt; production issues on Java 17 resolved, we continue to encourage users to upgrade to Java 17,
particularly in light of the fact that many Java vendors plan to stop providing free public updates for Java 11 &lt;a href=&quot;https://en.wikipedia.org/wiki/Java_version_history#Release_table&quot;&gt;on or after October 2024&lt;/a&gt;.
Report any issues running on Java 17 in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/67908&quot;&gt;JENKINS-67908&lt;/a&gt;.
The &lt;a href=&quot;https://plugins.jenkins.io/versioncolumn/&quot;&gt;Versions Node Monitors&lt;/a&gt; plugin, which helps keep track of Java versions across agents, has also been recently updated.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;changes-for-plugin-developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#changes-for-plugin-developers&quot; /&gt;👷 Changes for plugin developers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the migration to Java 11 now well underway for both end users and Jenkins core alike,
the focus has shifted to the plugin development toolchain.
With &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-development/choosing-jenkins-baseline/&quot;&gt;the developer documentation&lt;/a&gt; now recommending 2.361.4 as a baseline for plugins,
this raises the question about when to require Java 11 for plugin development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Historically the Jenkins project has supported old baselines for a long time in the plugin build toolchain,
with recent versions of the plugin build toolchain supporting baselines up to two (2) years old.
This provides a high degree of flexibility for plugin maintainers and ultimately end users.
For the reasons given on &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/pjfvsMw-EMM/m/OIw_hveUBwAJ&quot;&gt;the developer mailing list&lt;/a&gt;, however,
this level of compatibility could not be preserved throughout the transition to Java 11.
We therefore took the decision to require a baseline of 2.361 or newer for plugins in recent releases of the plugin build toolchain,
about a year ahead of our usual timeline.
This unusually aggressive timeline does not represent a change in policy for the Jenkins project
but is rather an exception to the rule to facilitate migration to a number of breaking changes in the upstream Java community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Such a transition constitutes a &lt;a href=&quot;https://en.wikipedia.org/wiki/Flag_day_(computing)&quot;&gt;flag day&lt;/a&gt;, or breaking change.
Below are answers to frequently asked questions,
inspired by Uma Chingunde’s excellent framework for &lt;a href=&quot;https://umach.medium.com/communicating-organizational-changes-6277e4b47cff&quot;&gt;communicating organizational changes&lt;/a&gt; and building on the excellent &lt;a href=&quot;https://community.jenkins.io/t/solving-failing-parent-pom-upgrade-from-4-51-to-4-52-cheatsheet/4958&quot;&gt;cheat sheet&lt;/a&gt; started by Jean-Marc Meessen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-is-the-change&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-change&quot; /&gt;What is the change?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning with &lt;a href=&quot;https://github.com/jenkinsci/plugin-pom/releases/tag/plugin-4.52&quot;&gt;4.52&lt;/a&gt;,
the plugin build toolchain requires Java 11 or newer and Jenkins 2.361 or newer.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;when-is-the-change-effective&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#when-is-the-change-effective&quot; /&gt;When is the change effective?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The change is effective as of plugin parent POM 4.52, which was released on December 1, 2022.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-is-it-happening&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-is-it-happening&quot; /&gt;Why is it happening?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Due to a large number of breaking changes in the upstream Java community,
it became impractical to support both Java 8 and Java 11 in the same build toolchain.
For more details, see &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/pjfvsMw-EMM/m/OIw_hveUBwAJ&quot;&gt;the developer mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;who-is-affected-by-the-change&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#who-is-affected-by-the-change&quot; /&gt;Who is affected by the change?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This change affects all plugin developers,
particularly those who receive updates to the plugin build toolchain via Dependabot pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-action-do-i-need-to-take&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-action-do-i-need-to-take&quot; /&gt;What action do I need to take?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At a high level, three actions need to be taken, the third of which depends on the first two:&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;Adjust the &lt;code&gt;Jenkinsfile&lt;/code&gt; to use Java 11 or newer, removing any Java 8 configuration(s).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the baseline to 2.361 or newer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the plugin parent POM to 4.52 or newer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will elaborate on each of these three points below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;adjust-the-jenkinsfile-to-use-java-11-or-newer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adjust-the-jenkinsfile-to-use-java-11-or-newer&quot; /&gt;Adjust the &lt;code&gt;Jenkinsfile&lt;/code&gt; to use Java 11 or newer&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, consult the matrix of build configurations in the plugin’s &lt;code&gt;Jenkinsfile&lt;/code&gt;.
The goal is to ensure the plugin is building on Java 11 and 17 and not on Java 8,
as recommended in &lt;a href=&quot;https://github.com/jenkinsci/archetypes/blob/master/common-files/Jenkinsfile&quot;&gt;the latest version of the archetype&lt;/a&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;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;buildPlugin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;useContainerAgent:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Set to `false` if you need to use Docker for containerized tests&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;configurations:&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;nl&quot;&gt;platform:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;jdk:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;17&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;nl&quot;&gt;platform:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;jdk:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;11&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;Note the explicit &lt;code&gt;configurations&lt;/code&gt; entry with two versions: Java 11 and 17.
If there is an explicit configuration for Java 8, remove it — Java 8 is no longer supported as of plugin parent POM 4.52.&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;If you are not already using container agents, we recommend adding &lt;code&gt;useContainerAgent: true&lt;/code&gt; (but this is not mandatory).
Doing so results in &lt;code&gt;ci.jenkins.io&lt;/code&gt; spawning a &lt;a href=&quot;https://github.com/jenkins-infra/documentation/blob/main/ci.adoc#container-agents&quot;&gt;container agent&lt;/a&gt; for executing the build instead of a virtual machine,
which is usually faster to start and reduces costs for the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some older &lt;code&gt;Jenkinsfile&lt;/code&gt;s may not have an explicit list of configurations:&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;buildPlugin&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;Such builds will use &lt;a href=&quot;https://github.com/jenkins-infra/pipeline-library/blob/master/vars/buildPlugin.groovy&quot;&gt;the defaults for &lt;code&gt;buildPlugin()&lt;/code&gt;&lt;/a&gt;,
which (at the time of this writing) are Java 8 on Linux and Windows.
Since plugin parent POM 4.52 and newer require Java 11, such a configuration is incompatible,
and it should be changed to an explicit configuration that includes Java 11 and 17 as shown above.&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;
At some point in the future, the default may change from Java 8 to Java 11; however, such a change was considered premature at the time of this writing.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that changes to a plugin’s &lt;code&gt;Jenkinsfile&lt;/code&gt; require write access to take effect in pull request builds.
If you submit a pull request to a repository to which you do not have write access,
any &lt;code&gt;Jenkinsfile&lt;/code&gt; changes will be ignored with this message:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;Jenkinsfile&lt;/code&gt; has been modified in an untrusted revision&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pending &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/46795&quot;&gt;JENKINS-46795&lt;/a&gt;,
the pull request will need to be refiled by someone with write access
to ensure the &lt;code&gt;Jenkinsfile&lt;/code&gt; changes take effect.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;update-the-baseline-to-2-361-or-newer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update-the-baseline-to-2-361-or-newer&quot; /&gt;Update the baseline to 2.361 or newer&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The process for updating the baseline is described in &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-development/choosing-jenkins-baseline/&quot;&gt;the developer documentation&lt;/a&gt;.
To summarize, set the &lt;code&gt;jenkins.version&lt;/code&gt; property in &lt;code&gt;pom.xml&lt;/code&gt; to 2.361 or newer:&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;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;jenkins.version&amp;gt;&lt;/span&gt;2.361.4&lt;span class=&quot;nt&quot;&gt;&amp;lt;/jenkins.version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/properties&amp;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 baseline is often encoded in one other place in &lt;code&gt;pom.xml&lt;/code&gt;: the version of the &lt;a href=&quot;https://github.com/jenkinsci/bom&quot;&gt;plugin BOM&lt;/a&gt;.
Check the &lt;code&gt;&amp;lt;dependencyManagement&amp;gt;&lt;/code&gt; section for an entry with the group ID &lt;code&gt;io.jenkins.tools.bom&lt;/code&gt; and an artifact ID that starts with &lt;code&gt;bom-&lt;/code&gt;.
If there is such an entry,
and if it is using a line older than the baseline,
then update it to match the baseline.
For the latest version, see &lt;a href=&quot;https://github.com/jenkinsci/bom/releases&quot;&gt;the list of BOM releases&lt;/a&gt;.
At the time of this writing, the latest version is 1750.v0071fa_4c4a_e3:&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;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependencyManagement&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.jenkins.tools.bom&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;bom-2.361.x&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1750.v0071fa_4c4a_e3&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;import&lt;span class=&quot;nt&quot;&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;type&amp;gt;&lt;/span&gt;pom&lt;span class=&quot;nt&quot;&gt;&amp;lt;/type&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependencyManagement&amp;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;For more information about the plugin BOM, see its &lt;a href=&quot;https://github.com/jenkinsci/bom&quot;&gt;&lt;code&gt;README&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;update-the-plugin-parent-pom-to-4-52-or-newer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update-the-plugin-parent-pom-to-4-52-or-newer&quot; /&gt;Update the plugin parent POM to 4.52 or newer&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Having completed the above prerequisites,
the plugin parent POM can be successfully upgraded to 4.52 or newer.
For the latest version, see &lt;a href=&quot;https://github.com/jenkinsci/plugin-pom/releases&quot;&gt;the list of plugin parent POM releases&lt;/a&gt;.
At the time of this writing, the latest version is 4.53:&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;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;parent&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.jenkins-ci.plugins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;plugin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;4.53&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;relativePath&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/parent&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;java-level&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-level&quot; /&gt;Java level&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some plugins may have a &lt;code&gt;Jenkinsfile&lt;/code&gt; with an older &lt;code&gt;javaLevel&lt;/code&gt; property,
and some plugins may have a &lt;code&gt;pom.xml&lt;/code&gt; file with a &lt;code&gt;java.level&lt;/code&gt; property.
These have been deprecated since &lt;a href=&quot;https://github.com/jenkinsci/plugin-pom/releases/tag/plugin-4.40&quot;&gt;plugin parent POM 4.40&lt;/a&gt;.
If present, they should be deleted.
At the time of this writing, their presence will log a warning.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
At some point in the future, this warning will be changed to an error and will fail the build.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;other-flag-days&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-flag-days&quot; /&gt;Other flag days&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When updating the plugin parent POM from a version older than 4.39,
you may run into an error like the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[ERROR] Failed to execute goal &lt;code&gt;org.jenkins-ci.tools:maven-hpi-plugin:3.38:hpi&lt;/code&gt; (&lt;code&gt;default-hpi&lt;/code&gt;) on project &lt;code&gt;azure-credentials&lt;/code&gt;: Missing &lt;code&gt;target/classes/index.jelly&lt;/code&gt;. Delete any &lt;code&gt;&amp;lt;description&amp;gt;&lt;/code&gt; from &lt;code&gt;pom.xml&lt;/code&gt; and create &lt;code&gt;src/main/resources/index.jelly&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was a flag day introduced in &lt;a href=&quot;https://github.com/jenkinsci/plugin-pom/releases/tag/plugin-4.39&quot;&gt;4.39&lt;/a&gt;.
See the release notes for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Similarly, be on the lookout for warnings like these:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[WARNING] &lt;code&gt;&amp;lt;connection&amp;gt;scm:git:git://github.com/${gitHubRepo}.git&amp;lt;/connection&amp;gt;&lt;/code&gt; is invalid because &lt;code&gt;git://&lt;/code&gt; URLs are deprecated. Replace it with &lt;code&gt;&amp;lt;connection&amp;gt;scm:git:https://github.com/${gitHubRepo}.git&amp;lt;/connection&amp;gt;&lt;/code&gt;. In the future this warning will be changed to an error and will break the build.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now is a good time to address them as suggested, though doing so is not mandatory.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;is-there-an-example-i-can-follow&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#is-there-an-example-i-can-follow&quot; /&gt;Is there an example I can follow?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes! Consult &lt;a href=&quot;https://github.com/jenkinsci/text-finder-plugin/pull/138&quot;&gt;jenkinsci/text-finder-plugin#138&lt;/a&gt; for an example.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-happens-if-i-fail-to-take-action&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-happens-if-i-fail-to-take-action&quot; /&gt;What happens if I fail to take action?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nothing will happen in the immediate future if you do not cross this flag day.
You can still build and release plugins with Java 8 and their current baseline.
In the long term, however, an out-of-date plugin build toolchain creates the risk of plugin compatibility testing (PCT) failures
and negatively impacts the Jenkins core development team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you neglect to update the baseline to 2.361 or newer, you will receive the following error:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This version of &lt;code&gt;maven-hpi-plugin&lt;/code&gt; requires Jenkins 2.361 or later.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you neglect to update the &lt;code&gt;Jenkinsfile&lt;/code&gt; to remove any Java 8 configurations (or try to build locally with Java 8),
you will receive a low-level class version error:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[ERROR] Failed to execute goal &lt;code&gt;org.jenkins-ci.tools:maven-hpi-plugin:3.38:validate&lt;/code&gt; (&lt;code&gt;default-validate&lt;/code&gt;) on project &lt;code&gt;text-finder&lt;/code&gt;: Execution &lt;code&gt;default-validate&lt;/code&gt; of goal &lt;code&gt;org.jenkins-ci.tools:maven-hpi-plugin:3.38:validate&lt;/code&gt; failed: Unable to load the mojo &lt;code&gt;validate&lt;/code&gt; in the plugin &lt;code&gt;org.jenkins-ci.tools:maven-hpi-plugin:3.38&lt;/code&gt; due to an API incompatibility: &lt;code&gt;org.codehaus.plexus.component.repository.exception.ComponentLookupException&lt;/code&gt;: &lt;code&gt;org/jenkinsci/maven/plugins/hpi/ValidateMojo&lt;/code&gt; has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whom-should-i-contact-for-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whom-should-i-contact-for-help&quot; /&gt;Whom should I contact for help?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have doubts or if the information in this post does not work for you,
do not hesitate to discuss the matter on &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/pjfvsMw-EMM/m/OIw_hveUBwAJ&quot;&gt;the developer mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-future-work-is-planned&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-future-work-is-planned&quot; /&gt;What future work is planned?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We recognize that maintaining plugin builds can be onerous for many,
especially when crossing flag days like this.
Like &lt;a href=&quot;http://www.linker-aliens.org&quot;&gt;linkers and loaders&lt;/a&gt;,
Jenkins plugin build maintenance is a sub-specialty within a sub-specialty.
In the long term, we aspire and hope to automate much of this build maintenance
to allow the community to focus its attention on the delivery of features and bug fixes.
In the meantime, we appreciate the community’s patience and support as we pass through these periods of transition.&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/2022/12/09/jfrog-maintenance/</id>
<title>Maintenance with downtime of JFrog Artifactory (repo.jenkins-ci.org) 18 of December of 2022</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-12-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/12/09/jfrog-maintenance/" />
<category term='jenkins'></category>
<category term='jfrog'></category>
<category term='artifactory'></category>
<category term='repo.jenkins-ci.org'></category>
<category term='infra'></category>
<summary>
Maintenance with downtime of JFrog Artifactory (repo.jenkins-ci.org) December 18, 2022







December 18, 2022: our sponsor JFrog will proceed to perform maintenance of our "jenkinsci" Artifactory instance.


Expect a complete downtime of about 6 hours due to the nature of this maintenance.
The maintenance involves cloud migration from Google Cloud to Amazon Web Services.




Impacts


Only Jenkins contributors will be impacted, as no releases or builds on ci.jenkins.io or on developer machines will succeed during the downtime.
Jenkins users won&#8217;t be impacted, as plugin downloads, update center, and websites such as jenkins.io and https://plugins.jenkins.io will continue working as expected.


We&#8217;ll update the Jenkins Infrastructure Status Page with the...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;maintenance-with-downtime-of-jfrog-artifactory-repo-jenkins-ci-org-december-18-2022&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#maintenance-with-downtime-of-jfrog-artifactory-repo-jenkins-ci-org-december-18-2022&quot; /&gt;Maintenance with downtime of JFrog Artifactory (repo.jenkins-ci.org) December 18, 2022&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://jfrog.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/jfrog.png&quot; alt=&quot;JFrog&quot; width=&quot;20%&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;December 18, 2022: our sponsor &lt;a href=&quot;https://jfrog.com/&quot;&gt;JFrog&lt;/a&gt; will proceed to perform maintenance of our &quot;jenkinsci&quot; Artifactory instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Expect a complete downtime of about 6 hours due to the nature of this maintenance.
The maintenance involves cloud migration from Google Cloud to Amazon Web Services.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;impacts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#impacts&quot; /&gt;Impacts&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Only Jenkins contributors will be impacted, as no releases or builds on ci.jenkins.io or on developer machines will succeed during the downtime.
Jenkins users won’t be impacted, as plugin downloads, update center, and websites such as &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;jenkins.io&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io&quot; class=&quot;bare&quot;&gt;https://plugins.jenkins.io&lt;/a&gt; will continue working as expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll update the &lt;a href=&quot;https://status.jenkins.io&quot;&gt;Jenkins Infrastructure Status Page&lt;/a&gt; with the exact downtime window.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;artifactory-service-repo-jenkins-ci-org-a-backbone-of-the-jenkins-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#artifactory-service-repo-jenkins-ci-org-a-backbone-of-the-jenkins-project&quot; /&gt;Artifactory Service repo.jenkins-ci.org: a backbone of the Jenkins project&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Despite not being directly used by the usual Jenkins users, the &lt;a href=&quot;https://repo.jenkins-ci.org&quot;&gt;repo.jenkins-ci.org&lt;/a&gt; service is crucial for any contributor to the Jenkins project as it hosts all the development dependencies and released binaries as the source of truth.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The entire Jenkins Infrastructure uses this repository to build and publish Jenkins itself, and also all of its plugins and side projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s also heavily used by the &lt;a href=&quot;https://www.jenkins.io/security/team/&quot;&gt;Jenkins Security Team&lt;/a&gt; as part of their advisory publication.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This migration is an important requirement to ensure that JFrog is able to monitor the service and provide the best availability and infrastructure health.
If you are curious or interested, you can find more details on the Jenkins Infrastructure issue tracker: &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3288&quot;&gt;Jenkins Infrastructure Helpdesk Issue #3288&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/2022/12/09/GSoC-the-gift-of-mentorship/</id>
<title>[GSoC] &#39;Tis the Season to Give the Gift of Mentorship</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-12-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/12/09/GSoC-the-gift-of-mentorship/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='community'></category>
<category term='events'></category>
<category term='developer'></category>
<summary>
'Tis the season of gift giving and what better way than to give the gift of mentorship.


Jenkins is a big supporter and contributor of programs like Google Summer of Code (GSoC), She Code Africa, and Outreachy.
We believe in the value and advancements in helping new, and in many cases under-represented contributors to the open source.
There is also a special 'je ne sais quoi' that comes with giving your time and sharing your knowledge.


During this season of giving, we have opportunities for you to give the gift of mentorship.
Jenkins in Google Summer of Code welcomes any Jenkins user interested in making...
</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/gsoc/Merry_Mentor.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&#39;Tis the season of gift giving and what better way than to give the gift of mentorship.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is a big supporter and contributor of programs like &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code (GSoC)&lt;/a&gt;, &lt;a href=&quot;https://shecodeafrica.org/&quot;&gt;She Code Africa&lt;/a&gt;, and &lt;a href=&quot;https://www.outreachy.org/&quot;&gt;Outreachy&lt;/a&gt;.
We believe in the value and advancements in helping new, and in many cases under-represented contributors to the open source.
There is also a special &#39;je ne sais quoi&#39; that comes with giving your time and sharing your knowledge.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this season of giving, we have opportunities for you to give the gift of mentorship.
Jenkins in Google Summer of Code welcomes any Jenkins user interested in making a lifelong impact to new contributors new of open source.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-does-mentorship-require&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-does-mentorship-require&quot; /&gt;What does mentorship require?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You know enough about the Jenkins code to guide the GSoC contributor on coding.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;as-a-mentor-you-will&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#as-a-mentor-you-will&quot; /&gt;As a mentor, you will:&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;Allocate 5-8 mentoring hours per week, for 10-22 weeks depending on the size of the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide Jenkins specific code reviews on pull-requests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Review new contributors&#39; proposals and presentations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Complete two (2) evaluation documents from Google.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Collaborate with another mentor on the chosen project, ensuring that no one is working alone.&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-will-you-work-on&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-will-you-work-on&quot; /&gt;What will you work on?&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;You may choose to be a mentor/co-mentor for any of the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2023/project-ideas/&quot;&gt;listed project ideas&lt;/a&gt;.
Please note, this list is still evolving.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can also &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;propose&lt;/a&gt; a project that is near and dear to your heart.&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;additional-info&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#additional-info&quot; /&gt;Additional info:&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://developers.google.com/open-source/gsoc/timeline&quot;&gt;GSoC 2023 program timeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors/&quot;&gt;In depth information for mentors&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;We look forward to welcoming you as mentors to this rewarding program!
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;Reach out to us on the GSoC SIG Gitter chat&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/2022/12/05/jenkins-newsletter/</id>
<title>Jenkins November 2022 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-12-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/12/05/jenkins-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
November 2022





Welcome to the Jenkins Newsletter! This is a compilation of progress within the project, highlighted by Jenkins Special Interest Groups (SIGs) for the month of November.


Got Inspiration? We would love to highlight your cool Jenkins innovations.
Share your story and you could be in the next Jenkins newsletter.
View previous editions of the Jenkins Newsletter here!


Happy reading!




Highlights:




Congratulations to the new officers and members of the governance board.


Pipeline Utility Steps Plugin was impacted by
CVE-2022-33980,
leading to a remote code execution in Jenkins.


New "jenkinsci" NPM official account for Jenkins project.


ssh-agent docker image is now using a correct volume for agent workspace.


Jenkins 2.375.1 was released...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;november-2022&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#november-2022&quot; /&gt;November 2022&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-10-13-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins November 2022 Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome to the Jenkins Newsletter! This is a compilation of progress within the project, highlighted by Jenkins Special Interest Groups (SIGs) for the month of November.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Got Inspiration? We would love to highlight your cool Jenkins innovations.
Share &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScMCGOMtn2hGpfXsbyssGhVW1LwlW4LkXCIaKINKDQU2m6ieg/viewform&quot;&gt;your story&lt;/a&gt; and you could be in the next Jenkins newsletter.
View previous editions of the Jenkins Newsletter &lt;a href=&quot;https://www.jenkins.io/blog/tags/newsletter/&quot;&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Happy reading!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#highlights&quot; /&gt;Highlights:&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;Congratulations to the new officers and members of the governance board.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline Utility Steps Plugin was impacted by
&lt;a href=&quot;https://commons.apache.org/proper/commons-configuration/security.html#CVE-2022-33980_prior_to_2.8.0.2C_RCE_when_applied_to_untrusted_input&quot;&gt;CVE-2022-33980&lt;/a&gt;,
leading to a remote code execution in Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New &quot;jenkinsci&quot; NPM official account for Jenkins project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ssh-agent docker image is now using a &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/commit/9abba2cf2b286ad35bdb0df634c3e471da373478&quot;&gt;correct volume&lt;/a&gt; for agent workspace.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins 2.375.1 was released with more improvements to the user interface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins.io is now using Algolia v3 for its search feature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins in Google Summer of Code 2023, preparations to help new contributors prepare effective proposals.&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;governance-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#governance-update&quot; /&gt;Governance Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2022 Jenkins elections are complete.
Thanks to Kevin Martens for the &lt;a href=&quot;https://www.jenkins.io/blog/2022/11/17/jenkins-election-candidates-and-results/&quot;&gt;blog post&lt;/a&gt; announcing the results of the election and thanks to Damien Duportal for running the election process.
We are glad to have received 65 registrations to vote in the election.
That is less than the 81 registered voters we had in 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Elected officers and members of the Jenkins governance board will begin their service December 3, 2022.
Special thanks to the members of the governance board that have completed their two-year service:&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/halkeye/&quot;&gt;Gavin Mogan&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2021/03/22/governance-updates/#about-ewelina-wilkosz&quot;&gt;Ewelina Wilkosz&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;Congratulations to the new members of the governance board.&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/uhafner/&quot;&gt;Ullrich Hafner&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/notmyfault/&quot;&gt;Alexander Brandes&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;Congratulations also to the newly elected officers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Release Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;timja&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat/&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck/&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27/&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal/&quot;&gt;Damien Duportal&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;Governance board meetings are held every two weeks. Meeting notes and
recordings of the meetings are available on the &lt;a href=&quot;https://community.jenkins.io/tag/governance&quot;&gt;&lt;em&gt;Jenkins community site&lt;/em&gt;&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;security-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-update&quot; /&gt;Security Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://github.com/Wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One security advisory during November about plugins&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Usually the vulnerabilities in third party dependencies are not impacting the final product, it is worth mentioning when there is a true
positive case.
Pipeline Utility Steps Plugin was impacted by &lt;a href=&quot;https://commons.apache.org/proper/commons-configuration/security.html#CVE-2022-33980_prior_to_2.8.0.2C_RCE_when_applied_to_untrusted_input&quot;&gt;CVE-2022-33980&lt;/a&gt;, leading to a remote code execution in Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;infrastructure-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#infrastructure-update&quot; /&gt;Infrastructure Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://github.com/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Upgrade of our controllers to the latest LTS &lt;code&gt;2.375.1&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New &quot;jenkinsci&quot; NPM official account for Jenkins project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK17 for Windows provided to developers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://meetings.jenkins-ci.org/&quot;&gt;https://meetings.jenkins-ci.org/&lt;/a&gt; website (archive Board meeting minutes) is recovered and back.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deprecated &quot;windows-slaves&quot; plugin removed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Azure networks are now code-managed to ease management (future support of IPv6 and network performances)&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;platform-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#platform-update&quot; /&gt;Platform Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://github.com/gounthar&quot;&gt;Bruno Verachten&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker Images for Jenkins changes:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JDK17: added &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/commit/0217d06c19e989737d5dd3ed7e0116e628c2bf2f&quot;&gt;ARMv7 support&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Monthly Base OS &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/commit/a1ca8ef2224f46cd688abd71d624764adc3606e8&quot;&gt;updates&lt;/a&gt; and autumn cleanup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Huge work (not finished yet) to ensure “latest” version &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/issues/271&quot;&gt;being overridden&lt;/a&gt; by older releases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/docker-agent/commit/a5272d089460267362a2ccebb3f9b36931adb16d&quot;&gt;Automatic tracking&lt;/a&gt; of remoting and JDK versions implemented: we will get faster updates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A LOT of fixes (missing packages such as &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/commit/70c7dba8237b2e7c808c88bb007efa771904d6fd&quot;&gt;curl&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/commit/e8a6599dff3f38e45d720d32dfb2d2d1f07662af&quot;&gt;ssh, git&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/commit/acde0aa06e3de1c95e02f5a742c912cc02654042&quot;&gt;less, patch&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ssh-agent is now using &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/commit/9abba2cf2b286ad35bdb0df634c3e471da373478&quot;&gt;correct volume&lt;/a&gt; for agent workspace.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New platforms:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Experiments with Windows 2022: working with Jenkins Infrastructure to build these images.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Experiments with JDK19: ANTLR 2 to ANTLR 4 transition complete, Jenkins core compiles.&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;user-experience-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#user-experience-update&quot; /&gt;User Experience Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.375.1 was released on November 30, 2022 with more improvements to the user interface.
Special thanks to Jan Faracik, Tim Jacomb, Alexander Brandes, Wadeck Follonier, Daniel Beck, and many others that were involved in the most recent improvements to the user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The weather icons have been updated to be more recognizable. They continue to work well in both light themes and dark themes.&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/2022-12-05-jenkins-newsletter/10000000000003C00000021C2C1F8B51560D56F4.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;350&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin manager navigation has moved from the top of the page to the side panel. The search field is more visible.&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/2022-12-05-jenkins-newsletter/10000000000003C00000021C7524A94118BE3493.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;350&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The User Experience SIG is also pleased to note a valuable improvement in the &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.380&quot;&gt;Jenkins 2.380 weekly release&lt;/a&gt;.
The tooltips that were previously provided by the unmaintained and long outdated YahooUI JavaScript library are now being provided by the Tippy.js JavaScript framework.
Special thanks to Jan Faracik for his work removing that use of the YahooUI JavaScript library.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;documentation-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-update&quot; /&gt;Documentation Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://github.com/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins.io is now using Algolia v3 for its search feature.
This update has not only improved searching on the Jenkins site, but also provided a new search UI, which provides helpful suggestions.
Massive thanks to Gavin Mogan for working on this and improving the Jenkins.io search.&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/2022-12-05-jenkins-newsletter/1000020100000240000000403C0CC85DFBCE3E67.png&quot; alt=&quot;image&quot; width=&quot;576&quot; height=&quot;63&quot; /&gt;&lt;/span&gt;
&lt;/p&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/2022-12-05-jenkins-newsletter/10000201000004B2000002B55DF2DC7EFDD5C5DB.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;360&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Algolia has graciously upgraded our search from their legacy v2 to the super pretty and useful v3 apis.
This includes a new fully accessible popup. I just love being able to goto jenkins.io and hitting ctrl+k to
search.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;said &lt;a href=&quot;https://www.jenkins.io/blog/authors/halkeye/&quot;&gt;Gavin Mogan&lt;/a&gt;, current Jenkins Board Member, maintainer of the Jenkins plugin site, and plugin site API.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;advocacy-outreach-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#advocacy-outreach-update&quot; /&gt;Advocacy &amp;amp; Outreach Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributed by: &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins gets ready for Google Summer of Code 2023!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Google recently announced the GSoC &lt;a href=&quot;https://developers.google.com/open-source/gsoc/timeline&quot;&gt;2023 program timeline&lt;/a&gt;, and the Advocacy &amp;amp; Outreach SIG has responded!
We’ve established the &lt;a href=&quot;https://www.jenkins.io/blog/2022/11/23/get-prepared-for-gsoc/&quot;&gt;GSoC early preparations for applicants - steps to effective submission&lt;/a&gt; post to help future contributors with the process.
On December 20, 2022 at 4PM UTC there will be a walk through of this process via a webinar.
We would like this to be an interactive webinar so bring your questions.
See &lt;a href=&quot;https://www.jenkins.io/events/&quot;&gt;Event Calendar&lt;/a&gt; (See GSoC 2023 - Contributor webinar: How to get ready) for login details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are still in great need of &lt;a href=&quot;https://www.jenkins.io/blog/2022/11/16/gsoc-2023/&quot;&gt;project idea proposals and mentors&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GSoC project ideas are coding projects that potential GSoC contributors can accomplish in 10-22 weeks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The coding projects can be new features, plugins, test frameworks, infrastructure, etc. Anyone can submit a project idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentoring takes about 5 to 8 hours of work per week (more at the start, less at the end).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors provide guidance, coaching, and sometimes a bit of cheerleading. They review GSoC contributor proposals, pull requests and contributor presentations at the evaluation phase.&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/2022/11/24/jenkins-sponsor-appreciation/</id>
<title>Jenkins Sponsor Appreciation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-11-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/11/24/jenkins-sponsor-appreciation/" />
<category term='community'></category>
<category term='sponsors'></category>
<category term='governance'></category>
<summary>
The Jenkins project would like to take a moment and share deep gratitude to our sponsors.
Sponsorship of the Jenkins project is key to the maintenance and development of Jenkins.
There are different ways in which our sponsor organizations support the Jenkins project, such as infrastructure, necessary development tools, funding, and providing mirrors to connect Jenkins to the community.


For supporting Jenkins distribution, build, test, and deployment infrastructure, we would like to thank JFrog, AWS, Oracle, DigitalOcean, Datadog, Docker, PagerDuty, Fastly, GitHub and OSU Open Source Labs.


&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;


We also want to recognize and thank GitHub, JFrog, Atlassian, Linux Foundation, Netlify, and 1Password for providing...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project would like to take a moment and share deep gratitude to our sponsors.
Sponsorship of the Jenkins project is key to the maintenance and development of Jenkins.
There are different ways in which our sponsor organizations support the Jenkins project, such as infrastructure, necessary development tools, funding, and providing mirrors to connect Jenkins to the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For supporting Jenkins distribution, build, test, and deployment infrastructure, we would like to thank &lt;a href=&quot;https://jfrog.com/&quot;&gt;JFrog&lt;/a&gt;, &lt;a href=&quot;https://aws.amazon.com/&quot;&gt;AWS&lt;/a&gt;, &lt;a href=&quot;https://www.oracle.com/&quot;&gt;Oracle&lt;/a&gt;, &lt;a href=&quot;https://www.digitalocean.com/&quot;&gt;DigitalOcean&lt;/a&gt;, &lt;a href=&quot;https://www.datadoghq.com&quot;&gt;Datadog&lt;/a&gt;, &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt;, &lt;a href=&quot;https://www.pagerduty.com/&quot;&gt;PagerDuty&lt;/a&gt;, &lt;a href=&quot;https://www.fastly.com&quot;&gt;Fastly&lt;/a&gt;, &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; and &lt;a href=&quot;https://osuosl.org/&quot;&gt;OSU Open Source Labs&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://jfrog.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/jfrog.png&quot; alt=&quot;JFrog&quot; width=&quot;15%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://aws.amazon.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/aws.png&quot; alt=&quot;AWS&quot; width=&quot;25%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.oracle.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/oracle.png&quot; alt=&quot;Oracle&quot; width=&quot;35%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.digitalocean.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/digital-ocean.png&quot; alt=&quot;DigitalOcean&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://osuosl.org/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/osuosl.png&quot; alt=&quot;OSU Open Source Labs&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.datadoghq.com&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/datadog.png&quot; alt=&quot;Datadog&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.docker.com&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/docker.png&quot; alt=&quot;Docker&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.pagerduty.com&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/pagerduty.png&quot; alt=&quot;PagerDuty&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.fastly.com&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/fastly.png&quot; alt=&quot;Fastly&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     &lt;/span&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also want to recognize and thank &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;, &lt;a href=&quot;https://jfrog.com/&quot;&gt;JFrog&lt;/a&gt;, &lt;a href=&quot;https://www.atlassian.com/&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;https://www.linuxfoundation.org/&quot;&gt;Linux Foundation&lt;/a&gt;, &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt;, and &lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt; for providing tools to track Jenkins development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://github.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/github.png&quot; alt=&quot;GitHub&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://jfrog.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/jfrog.png&quot; alt=&quot;JFrog&quot; width=&quot;15%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.atlassian.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/atlassian.png&quot; alt=&quot;Atlassian&quot; width=&quot;40%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://1password.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/1password.png&quot; alt=&quot;1Password&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.netlify.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/netlify.png&quot; alt=&quot;Netlify&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.linuxfoundation.org/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/linux-foundation.png&quot; alt=&quot;Linux Foundation&quot; width=&quot;27%&quot; /&gt;&lt;/a&gt;     &lt;/span&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Massive thanks to &lt;a href=&quot;https://www.algolia.com/&quot;&gt;Algolia&lt;/a&gt; for providing site search for the primary Jenkins documentation and plugins sites.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.algolia.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/algolia.png&quot; alt=&quot;Algolia&quot; width=&quot;40%&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also want to share deep gratitude for operational funding from &lt;a href=&quot;https://cd.foundation/&quot;&gt;CD Foundation&lt;/a&gt;, &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;, &lt;a href=&quot;https://aws.amazon.com/&quot;&gt;AWS&lt;/a&gt;, and &lt;a href=&quot;https://www.digitalocean.com/&quot;&gt;DigitalOcean&lt;/a&gt;.
Without funding, the community would have less opportunities to work on and develop Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://cd.foundation/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/cdf.png&quot; alt=&quot;CD Foundation&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/cloudbees.png&quot; alt=&quot;CloudBees&quot; width=&quot;16%&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://aws.amazon.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/aws.png&quot; alt=&quot;AWS&quot; /&gt;&lt;/a&gt;     
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.digitalocean.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/digital-ocean.png&quot; alt=&quot;DigitalOcean&quot; width=&quot;30%&quot; /&gt;&lt;/a&gt;     &lt;/span&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, we want to thank the various organizations that host mirrors for Jenkins worldwide distribution.
Thank you to &lt;a href=&quot;https://osuosl.org/&quot;&gt;OSU Open Source Labs&lt;/a&gt;, &lt;a href=&quot;https://xmission.com/&quot;&gt;XMission&lt;/a&gt;, &lt;a href=&quot;https://www.tsinghua.edu.cn/&quot;&gt;Tsinghua University&lt;/a&gt;, &lt;a href=&quot;https://www.yamagata-u.ac.jp/&quot;&gt;Yamagata University&lt;/a&gt;, &lt;a href=&quot;https://gruenehoelle.nl/&quot;&gt;Gruenehoelle NL&lt;/a&gt;, &lt;a href=&quot;https://belnet.be/&quot;&gt;Belgian Education and Research Network&lt;/a&gt;, and &lt;a href=&quot;https://www.rwth-aachen.de/&quot;&gt;RWTH Aachen University&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2022 has been a fantastic year for the Jenkins project, and it would not be possible without all of the support from our sponsors and community!&lt;/p&gt;
&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/11/23/get-prepared-for-gsoc/</id>
<title>GSoC 2023: how to get prepared</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-11-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/11/23/get-prepared-for-gsoc/" />
<category term='gsoc'></category>
<category term='gsoc2023'></category>
<category term='community'></category>
<category term='events'></category>
<category term='developer'></category>
<summary>
We are happy to see a lot of questions on how to prepare efficiently to submit a powerful project submission.
This is key to be selected and participate in the coming Google Summer of Code (GSoC).
This blog post is addressed to those who ask these questions.





First of all, welcome to the Jenkins Community!
Thank you for your interest in Jenkins in general and for GSoC 2023 in particular.


Only a limited number of GSoC slots are made available by Google.
We will select the best proposals with the highest chance for a successful outcome.
It is thus a wise step to prepare early.
It will put...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to see a lot of questions on how to prepare efficiently to submit a powerful project submission.
This is key to be selected and participate in the coming Google Summer of Code (GSoC).
This blog post is addressed to those who ask these questions.&lt;/p&gt;
&lt;/div&gt;
&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/gsoc/opengraph.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First of all, welcome to the Jenkins Community!
Thank you for your interest in Jenkins in general and for GSoC 2023 in particular.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Only a limited number of GSoC slots are made available by Google.
We will select the best proposals with the highest chance for a successful outcome.
It is thus a wise step to prepare early.
It will put all the chances on your side.
You will find hereafter some advice about activities to build the muscle required to be selected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The objective is to build&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;functional knowledge of Jenkins,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;understanding of the basics of plugins and Jenkins core internals and development,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;improvements of your java development skills (the main programing language of this project),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;practical experiences by contributing to an Open Source project.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First of all, install and run your own Jenkins server.
You can install it on your own machine, on a spare server, or even in the Cloud (some Cloud vendors offer free tiers).
Configure it to build a real application, preferably using descriptive pipeline syntax.
Install, configure, and use a couple of plugins.
This will help you to get a functional understanding and a practical experience of the product.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To build your Java/Jenkins &quot;development muscle&quot;, start proposing fixes or enhancements in the form of pull requests.
You can find open newbie friendly issues &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=labels%20%3D%20newbie-friendly&quot;&gt;via this query&lt;/a&gt;.
Issues describe problems that need fixing or enhancement ideas.
To move forward, use the documentation available on &lt;a href=&quot;https://www.jenkins.io/doc/developer/&quot;&gt;jenkins.io&lt;/a&gt; or ask for advice/help on the developer mailing list, Discourse, or the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#contacts&quot;&gt;Gitter channels&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another way to get experience is to follow the suggestions of the &lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/&quot;&gt;&lt;strong&gt;&quot;Improve a Plugin Tutorial&quot;&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And of course read the rules and general advice specific to Google Summer of Code: &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors/&quot;&gt;GSoC studends&lt;/a&gt; and &lt;a href=&quot;https://opensource.googleblog.com/2022/11/get-ready-for-google-summer-of-code-2023.html&quot; class=&quot;bare&quot;&gt;https://opensource.googleblog.com/2022/11/get-ready-for-google-summer-of-code-2023.html&lt;/a&gt;.
Also a useful reading are &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#previous-years&quot;&gt;previous year’s submission&lt;/a&gt; and recorded meetings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remember it is always a good idea to let others know about your contributions to the community especially via IRC conversations, GitHub issues, as well as pull requests.
Be sure to ask questions when and where appropriate.
Open-source software development is a group endeavour, and we are here to offer guidance to help you to become a part of the community.
Therefore open and honest communication is always encouraged and is highly appreciated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will hold an online meeting where we will come back on these advises and answer any question you might have.
The meeting will take place on Tuesday December 20, 2022 at 16:00 UTC.
The Zoom meeting link is &lt;a href=&quot;https://zoom.us/j/92664728323&quot; class=&quot;bare&quot;&gt;https://zoom.us/j/92664728323&lt;/a&gt;.
It will be recorded.&lt;/p&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;The jenkins GSoC team is currently assembling project ideas for candidates to explore and submit.
We are also recruiting mentors and preparing our application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In January, we will organise one or several meetings where the project ideas will be explained in details.
Candidates will have the possibility to ask questions to clarify any doubts.
We will also explain how to proceed to prepare a good submission.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/11/17/jenkins-election-candidates-and-results/</id>
<title>Jenkins Elections Announcement</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-11-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/11/17/jenkins-election-candidates-and-results/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
Hello all, voter registration and candidate nominations for the 2022 Jenkins elections are now complete.
Thanks to everyone who registered to vote and to all those who submitted nominations.
Special thanks to the candidates that have accepted the nominations.


As in years past, when a particular role receives only one nomination, an election is not required.
This year, all the board and officer positions are uncontested, with one person nominated to fill each available position.
This announcement shares the candidates and their statements, and serves as an announcement that the candidates have been elected and will begin their service December 3, 2022.


New Board Members


Board Member...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello all, voter registration and candidate nominations for the 2022 Jenkins elections are now complete.
Thanks to everyone who registered to vote and to all those who submitted nominations.
Special thanks to the candidates that have accepted the nominations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As in years past, when a particular role receives only one nomination, an election is not required.
This year, all the board and officer positions are uncontested, with one person nominated to fill each available position.
This announcement shares the candidates and their statements, and serves as an announcement that the candidates have been elected and will begin their service December 3, 2022.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-board-members&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-board-members&quot; /&gt;New Board Members&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;board-member-alexander-brandes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#board-member-alexander-brandes&quot; /&gt;Board Member - &lt;a href=&quot;https://www.jenkins.io/blog/authors/notmyfault/&quot;&gt;Alexander Brandes&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am a Jenkins user, contributor to the Jenkins project, and core maintainer.
I maintain many plugins, and have helped organize Jenkins online meetups, which I also have been part of.
I attend and take part in documentation and user experience office hours frequently.
Previously, I led community initiatives, such as the &lt;a href=&quot;https://www.meetup.com/jenkins-online-meetup/events/285677298/&quot;&gt;Jenkins plugin integration with Crowdin&lt;/a&gt; and participated in the &lt;a href=&quot;https://www.jenkins.io/blog/2022/06/28/require-java-11/#acknowledgments&quot;&gt;Java 11 and 17 support campaigns&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I truly believe in Jenkins&#39; future and would be happy to serve on the Jenkins governance board.
I would like to make Jenkins a great place to contribute, and to get more beginners and regular contributors involved in the community on a regular basis.
Onboarding more individual contributors would be one of my key targets, for example, through Jenkins&#39; continued participation in Google Summer of Code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the technical aspect, I plan to move automatic plugin and component releases forward, and focus on the support and extension of modern technologies, such as Java 17 and beyond.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Student of business science&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/NotMyFault&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;board-member-ullrich-hafner&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#board-member-ullrich-hafner&quot; /&gt;Board Member - &lt;a href=&quot;https://www.jenkins.io/blog/authors/uhafner/&quot;&gt;Ullrich Hafner&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been an active contributor in the Jenkins project since 2007.
Currently, I am the maintainer of several Jenkins plugins, mostly in the area of build result visualization using modern JS based user interfaces: for example, I am the maintainer of the warnings, code coverage and git-forensics plugins as well as several UI related JS wrapper plugins like Bootstrap or ECharts.
I am a member of the Jenkins UX SIG and I was a member of the Jenkins Governance Board during the 2019/2021 term.
I am a professor of Software Engineering at the University of Applied Sciences Munich, where I also try to win new Jenkins contributors by letting students develop new features in their student projects and theses.
I am also helping new contributors (and students) in our Jenkins forums or by giving some talks in our Jenkins Meetups.
It would be a pleasure for me to serve again as a member of the governance board.
On the board, I can help the Jenkins project evolve and follow a strict vision that will focus on the needs of the users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: University of Applied Sciences Munich&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/uhafner&quot;&gt;Github&lt;/a&gt;&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;new-officers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-officers&quot; /&gt;New Officers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;release-officer-tim-jacomb&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#release-officer-tim-jacomb&quot; /&gt;Release Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;Tim Jacomb&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been a user of Jenkins for the last 10 years and a regular contributor since 2018.
I began with maintaining the Slack plugin, and over the last couple of years, I have expanded my experience with several more plugins and the Jenkins core.
These are some of the components I maintain when I have time: Slack, Azure Key Vault, Junit, most of the Database plugins, Dark theme, Plugin installation manager, Jenkins Helm chart, and Configuration as code plugin.
I am also a member of the Jenkins infrastructure team, and I was involved in the release automation project and the mirrors modernisation effort, along with the day to day support helping people regain access to accounts etc.
As a Release Officer I would like to increase automation, ease onboarding of new contributors to the release team, and ensure that responsibilities rotate among people so that I wouldn’t be a bottleneck for any task.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Kainos&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/timja&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;events-officer-alyssa-tong&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#events-officer-alyssa-tong&quot; /&gt;Events Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat/&quot;&gt;Alyssa Tong&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It has been a privilege for me to be part of the Jenkins community and serve as Events Officer in 2022.
I am honored to serve as Events Officer for another term.
I am passionate about open source, collaboration, and education.
My goal is to build welcoming communities, and coordinating events is part of this role.
More importantly, I strive to bring the community together through events and conferences, so we can share best practices and collaborate for the betterment of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: CloudBees&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/alyssat&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;security-officer-wadeck-follonier&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-officer-wadeck-follonier&quot; /&gt;Security Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck/&quot;&gt;Wadeck Follonier&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I joined the Jenkins adventure in 2017, as part of the Jenkins Security team and was coached by Oleg Nenashev and Daniel Beck about how to best contribute to the community effort, especially related to security tasks.
I am working full time at CloudBees, managing two teams, including the security team dedicated to Jenkins.
I was inspired by Daniel’s work in terms of tooling, to create an application helping both the security people and the maintainers through multiple bot commands (in SECURITY tickets and in Hosting request).
During the year as the Security Officer, I spent a good amount of my time onboarding the future experts, finding ways to increase efficiency of the team by left shifting tasks, to reduce the size of our backlog and to put the focus on important tasks.
For the next year, I would like to continue the effort to make Jenkins an even more secure place.
One of the topic that I want to push forward is about the Content Security Policy introduction in the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: CloudBees&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Wadeck&quot;&gt;Github&lt;/a&gt;
&lt;a href=&quot;https://www.linkedin.com/in/wadeck/&quot;&gt;Linkedin&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;documentation-officer-kevin-martens&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-officer-kevin-martens&quot; /&gt;Documentation Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27/&quot;&gt;Kevin Martens&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am a technical documentation writer, and have been contributing to the Jenkins project consistently over the last seven months.
I helped create the Blue Ocean status statement that is now in the documentation, DevOps World material, and was a mentor for the Jenkins Documentation area of Hacktoberfest 2022.
I have recently been added to the copy-editor team due to my involvement with the Jenkins Documentation SIG and contributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I continue to learn by contributing &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27/&quot;&gt;blog posts&lt;/a&gt; to Jenkins and the &lt;a href=&quot;https://cd.foundation/blog/2022/09/07/jenkins-18th-birthday-%f0%9f%8e%82-and-retrospective/&quot;&gt;CD Foundation&lt;/a&gt;, documentation updates and creation, and screenshot updates.
I have also contributed to recent LTS release changelogs and upgrade guides, and am currently reviewing the weekly release lines.
I review open pull requests, issues, and feedback, so that we can discuss further with the community and work to improve as needed.
I’ve also developed a passion for open source, through reviewing documentation and building my own Jenkins environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am currently hosting the EU Docs office hours, and would love to expand my knowledge, along with others.
I want to empower the community further to increase activity and investment in the Jenkins project.
My main goal is to help extend the community and ensure the documentation is accessible for both new and experienced users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: CloudBees&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kmartens27&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;infrastructure-officer-damien-duportal&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#infrastructure-officer-damien-duportal&quot; /&gt;Infrastructure Officer - &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal/&quot;&gt;Damien Duportal&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am a Software Engineer working as a SRE for the Jenkins public infrastructure and as an IT teacher.
I am active in the Platform SIG, and have been using Jenkins for over a decade.
I am a fervent open-source citizen and active in other communities including Docker, Asciidoctor and Updatecli.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: CloudBees&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dduportal&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We want to congratulate the nominees and share thanks to the community for joining us in this year’s election.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/11/17/hacktoberfest-recap/</id>
<title>Hacktoberfest in Jenkins 2022</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-11-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/11/17/hacktoberfest-recap/" />
<author>
<name>kmartens27</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<category term='newcomer'></category>
<category term='outreach-programs'></category>
<summary>
As November continues, we want to share some highlights from Hacktoberfest 2022!
This year&#8217;s edition was incredibly busy with lots of interesting ideas, great work, new Jenkins contributors, and returning contributors.
We want to thank all of the contributors and mentors for all of their hard work, as none of this would be possible without them.


Hacktoberfest is an event to highlight and celebrate open-source projects like Jenkins.
The main idea of the event is contributing to and improving open-source software.
People are invited to submit pull requests and engage with open-source software in a variety of ways, such as contributing to plugins, creating documentation,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As November continues, we want to share some highlights from Hacktoberfest 2022!
This year’s edition was incredibly busy with lots of interesting ideas, great work, new Jenkins contributors, and returning contributors.
We want to thank all of the contributors and mentors for all of their hard work, as none of this would be possible without them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;Hacktoberfest&lt;/a&gt; is an event to highlight and celebrate open-source projects like Jenkins.
The main idea of the event is contributing to and improving open-source software.
People are invited to submit pull requests and engage with open-source software in a variety of ways, such as contributing to plugins, creating documentation, providing localization, and reviewing code.
Many products and services are based on open-source software, so giving back in this way continues the cycle of development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/faq/&quot;&gt;Jenkins&lt;/a&gt;, Hacktoberfest is an opportunity to collaborate with and expand the community, while learning and sharing with all experience levels.
These contributions are what keeps Jenkins moving forward, so having an opportunity to celebrate both the project and the people is amazing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;hacktoberfest-results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hacktoberfest-results&quot; /&gt;Hacktoberfest results&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During October, the Jenkins project received 613 pull requests from 117 different contributors.
All of these helped to improve Jenkins, create new resources, and meet the needs of Jenkins users.
From these, 531 pull requests are completed, meaning they have been merged or flagged as &quot;hacktoberfest-approved&quot;.
They were submitted by 95 different contributors, with 42 participants qualifying for &lt;a href=&quot;https://hacktoberfest.com/participation/#contributors&quot;&gt;swag&lt;/a&gt; with Jenkins contributions alone!
A total of 1,183 manually created pull requests were submitted during October in the jenkins-ci and jenkins-infra organizations.
Overall, this appears to be a 10 to 15 percent increase in the average number of monthly submissions.
With this in mind, we want to highlight some new and returning Jenkins contributors, including their experiences and advice for other users.
These contributors were selected at random, as Hacktoberfest had such high levels of participation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-jenkins-contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-jenkins-contributors&quot; /&gt;New Jenkins contributors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, we’d like to share some insight from &lt;a href=&quot;https://github.com/Jagrutiti&quot;&gt;Jagruti Tiwari&lt;/a&gt;.
Jagruti is based in Mumbai, India and active in various areas of open source.
This immersion is the main component of her strategy to explore and learn new things.
She is not afraid of challenges and have received assistance from the friendly, open-source communities.
She is inspired by thought leaders such as Ankita Tripathi.
Jagruti’s contributions to Jenkins during Hacktoberfest include documentation, code examples, and testing.
She has also provided reviews for other community members, which supports the open-source spirit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, we want to introduce &lt;a href=&quot;https://github.com/OmkarBorhade98&quot;&gt;Omkar Borhade&lt;/a&gt; from Pune, India.
Omkar just started as a software engineer, after graduating as a Mechanical Engineer.
He is new to open source, and this was his first time participating in Hacktoberfest.
His goal was to become more familiar the Jenkins project.
This was achieved by a lot of reading, approaching issues with an open mind, and providing documentation.
As a new contributor, he shared that it can be difficult to understand the issue and what is needed for resolution.
This knowledge comes with experience, so have some patience when getting started.&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/2022-11-14-hacktoberfest-recap/omkar.png&quot; alt=&quot;Omkar Borhade&quot; width=&quot;20%&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/krisstern&quot;&gt;Kris Stern&lt;/a&gt; is a full-stack software engineer based out of Hong Kong SAR, China.
He has previously trained as an observational astrophysicist with a PhD in physics, and is currently studying part-time for a master’s degree in computer science.
This is his third Hacktoberfest, and first Hacktoberfest contributing to Jenkins.
He has contributed to open source previously for astronomy, but shifted focus since graduating.
His goals during Hacktoberfest were giving back to the Jenkins community and acquiring more software development skills along the way.&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/2022-11-14-hacktoberfest-recap/krisstern.png&quot; alt=&quot;Kris Stern&quot; width=&quot;20%&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;returning-jenkins-contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#returning-jenkins-contributors&quot; /&gt;Returning Jenkins contributors&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://github.com/jimklimov&quot;&gt;Jim Klimov&lt;/a&gt; is a regular Jenkins contributor.
Jim is based in the Czech Republic, and has been working in open source for quite some time.
He has worked on various enterprise document workflow and messaging systems, and is currently a DevOps architect.
He is the creator and maintainer of several Jenkins plugins.
Along with his own experience, he also learned a lot from previous contributors.
Having this knowledge feels like standing on the shoulders of giants.
This is his second Hacktoberfest in Jenkins, but Jim contributes all year round.
Challenges that have come up for Jim include maintainability expectations to get pull requests merged, and architecture becoming more costly as time goes on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/highflyer910&quot;&gt;Teona Mushambadze&lt;/a&gt; is another contributor who submitted work to Jenkins during Hacktoberfest.
Teona created three new logos: &lt;a href=&quot;https://www.jenkins.io/artwork/#turkey&quot;&gt;Turkey&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/artwork/#georgia&quot;&gt;Georgia&lt;/a&gt;, and a &lt;a href=&quot;https://www.jenkins.io/artwork/#nerd&quot;&gt;Jenkins nerd&lt;/a&gt; themed logo.
These logos help connect Jenkins to users globally and extend the community even further.
She is a freelance developer, and this is her first time contributing to Jenkins in Hacktoberfest.
Her motivation when starting was curiosity and learning more about open source.
Through her contributions, she has learned how to work with someone else’s code.
There have been challenges when new tools are installed, but don’t work as expected.
However, these are learning experiences, as each one is an opportunity to understand what is causing the behavior.&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/2022-11-14-hacktoberfest-recap/teona.png&quot; alt=&quot;Teona Mushambadze&quot; width=&quot;20%&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/StefanSpieker&quot;&gt;Stefan Spieker&lt;/a&gt; is a solutions architect and DevOps engineer from Aachen, Germany.
He has been participating in Hacktoberfest since 2019, with a strong focus on Jenkins core and plugin development.
Hacktoberfest was the trigger to start participating, and Stefan has continued to contribute regularly.
Stefan likes to contribute to open source in his free time and has found that there are always ways to improve.
For Hacktoberfest, this included updating projects that still have spotbugs disabled and adopting a plugin to become a maintainer.
Since he uses open-source software daily, especially in his professional life, Stefan embraces this by giving back as an OSS consumer.
He is an advocate for others contributing to open source, and has encouraged colleagues to participate in any capacity they can.
Stefan feels that the first pull request is always toughest, due to the challenges of setting up an initial environment and meeting approval expectations of a maintainer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kaltepeter&quot;&gt;Kayla Altepeter&lt;/a&gt; is a senior engineer from Minneapolis, Minnesota and has been participating in Hacktoberfest since 2018.
Despite having less bandwidth to dedicate to this year, Kayla shared the Hacktoberfest information with her colleagues.
This resulted in another person contributing, which encouraged Kayla to participate in this year’s event.
Open source is mission critical for her own fun projects and the projects built at work.
Kayla contributes to Jenkins because Jenkins is how product code is delivered.
She also shared that Jenkins maintainers have been responsive and helpful when it comes to creating, reviewing, and merging pull requests.
This collaboration is a hallmark of open source and important to the continued progress of Jenkins.&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/2022-11-14-hacktoberfest-recap/kayla.png&quot; alt=&quot;Kayla Altepeter&quot; width=&quot;20%&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;contributor-insights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributor-insights&quot; /&gt;Contributor insights&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The thrill you get from knowing that countless people are using something you built is something a swag can never match.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If an issue is too hard to solve at the moment, take a break from it and try out a different one.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Jagruti Tiwari
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributing to open source also gives a feeling of satisfaction that the projects you are contributing to are used by several people on this planet and your contributions are benefiting them in one way or another.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you are new, it does feel scary and confusing.
Patience is important in the beginning.
Don’t be afraid to ask your doubts.
Find good first issues that you are comfortable with.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since, my all contributions for this Hacktoberfest were to Jenkins project, I would like to thank Jenkins and team to accepts my commits, guiding me in the resolution of issues and helping me to learn and grow by the means of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Omkar Borhade
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For people hesitating, there is nothing to fear.
Start with the easiest issues, and step after step it gets more fun.
You will notice how you grow as a developer.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Teona Mushambadze
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I think open source is important because besides its utility it is also a great way to organize knowledge and to build communities with a common set of interests or purposes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes engaging in open source means tinkering with new tech and going at it alone.
It is challenging at times but also tremendously rewarding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes it is hard to get started, and it takes time and perseverance to make things work the way they are intended.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Kris Stern
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Find a project that interests you, with technologies or approaches you want to learn, go tinker, and post pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In any case, you would learn more about the world, project, yourself, interactions and patience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Documentation is one area almost everyone can do better, and almost anyone can help improve.
It is easy to overlook something as &quot;apparent&quot; after a decade of experience with a project when it is really non-trivial for a newcomer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In case of Jenkins core, plugin or shared library contributions, keep in mind that Java IDEs like NetBeans or IDEA can be very helpful to step through the server sources with a debugger.
Peppering code with temporary &lt;code&gt;printlns&lt;/code&gt; only goes so far, sometimes you will need real tools.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Jim Klimov
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To those that hesitate: I encourage everyone to try it out.
We have within Jenkins a great community, which tries to help so that the PR also gets merged eventually.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Stefan Spieker
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are afraid to contribute, find a repo with clear steps to remove that hurdle and just try to set it up locally.
If you can do that, you can open a pull request and someone will probably offer to help if you get stuck.
Finding orgs that have a good chat or helpful maintainers makes it easier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Fixing a small bug that affects you is great because you know the issue.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Kayla Altepeter
&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/2022/11/16/gsoc-2023/</id>
<title>Google Summer of Code 2023 Call for Project Ideas and Mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-11-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/11/16/gsoc-2023/" />
<category term='gsoc'></category>
<category term='gsoc2022'></category>
<category term='community'></category>
<category term='events'></category>
<category term='developer'></category>
<summary>
Google Summer of Code (GSoC) is a global, online mentoring program focused on introducing students and new contributors to open source software development.
GSoC contributors work on a 10-22 weeks programming project with the guidance of mentors from their open source organization.
During GSoC, participating contributors are paired with mentors from open source organizations, gaining exposure to real-world software development techniques.
GSoC contributors will learn from experienced open source developers while writing code for real-world projects!
A small stipend is provided as an incentive.


See GSoC contributor eligibility here.


We are looking for project ideas and mentors to participate in GSoC 2023.
GSoC project ideas are coding...
</summary>
<content type='html'>
&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 students and new contributors to open source software development.
GSoC contributors work on a 10-22 weeks programming project with the guidance of mentors from their open source organization.
During GSoC, participating contributors are paired with mentors from open source organizations, gaining exposure to real-world software development techniques.
GSoC contributors will learn from experienced open source developers while writing code for real-world projects!
A small stipend is provided as an incentive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See GSoC contributor eligibility &lt;a href=&quot;https://summerofcode.withgoogle.com/get-started&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are looking for project ideas and mentors to participate in GSoC 2023.
GSoC project ideas are coding projects that potential GSoC contributors can accomplish in about 10-22 weeks.
The coding projects can be new features, plugins, test frameworks, infrastructure, etc.
Anyone can submit a project idea, but of course we like it even better if you mentor your project idea.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please send us your project ideas before the beginning of February so they can get a proper review by the GSoC committee and by the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 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;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Create a pull-request with your idea in a .adoc file in the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/tree/master/content/projects/gsoc/2023/project-ideas&quot;&gt;project ideas&lt;/a&gt;.
It is not necessary to submit a Google Doc, but it will still work if you want to do that.
See the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;instructions&lt;/a&gt; on submitting ideas which include an .adoc template and some examples.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 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;/h3&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;.
Note that being a GSoC mentor does not require expert knowledge of Jenkins.
Mentors do not work alone. We make sure that every project has at least two mentors.
GSoC org admins will help to find technical advisers, so you can study together with your GSoC contributor.
Mentoring takes about 5 to 8 hours of work per week (more at the start, less at the end).
Mentors provide guidance, coaching, and sometimes a bit of cheerleading.
They review GSoC contributor proposals, pull-requests and contributor presentations at the evaluation phase.
They fill in the Google provided final evaluations at the end of the coding period.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-do-you-get-in-exchange&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-do-you-get-in-exchange&quot; /&gt;What do you get in exchange?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentor interaction is a vital part of GSoC.
In return for mentoring, a GSoC contributor works on your project full time for 10-22 weeks.
Think about the projects that you’ve always wanted to do but never had the time…
Mentoring is also an opportunity to improve your management and people skills, while giving back to the community.
GSoC is a fantastic program and the Jenkins project is looking forward to participating in GSoC again in 2023!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For any question, 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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/11/04/jenkins-newsletter/</id>
<title>Jenkins October 2022 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-11-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/11/04/jenkins-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
October 2022





Welcome to the Jenkins Newsletter!
This is a compilation of progress within the project, highlighted by Jenkins Special Interest Groups (SIGs) for the month of October.


View previous editions of the Jenkins Newsletter here!


Happy reading!




Security Update




One security advisory during October about plugins



28 impacted plugins


8 without fixes, as explained in our process


4 plugins were suspended from distribution


Due to the corrections applied for SECURITY-2824 in the Groovy sandbox, we strongly recommend you to update as soon as possible.





We got several questions / reports related to Text4Shell (CVE-2022-42889)



The Security team did an investigation and nothing in the Jenkins ecosystem is affected.


Due to the communication...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;october-2022&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#october-2022&quot; /&gt;October 2022&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-10-13-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins September Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome to the Jenkins Newsletter!
This is a compilation of progress within the project, highlighted by Jenkins Special Interest Groups (SIGs) for the month of October.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;View previous editions of the Jenkins Newsletter &lt;a href=&quot;https://www.jenkins.io/blog/tags/newsletter/&quot;&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Happy reading!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;security-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-update&quot; /&gt;Security Update&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;One security advisory during October about plugins&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;28 impacted plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8 without fixes, as explained in our process&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4 plugins were suspended from distribution&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Due to the corrections applied for SECURITY-2824 in the Groovy sandbox, we strongly recommend you to update as soon as possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We got several questions / reports related to Text4Shell (&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2022-42889&quot;&gt;CVE-2022-42889&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Security team did an investigation and nothing in the Jenkins ecosystem is affected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Due to the &lt;a href=&quot;https://commons.apache.org/proper/commons-text/security.html&quot;&gt;communication from Apache&lt;/a&gt; about why it’s not a vulnerability like Log4Shell, we do not plan to publish a blog post about our analysis.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;infrastructure-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#infrastructure-update&quot; /&gt;Infrastructure Update&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;Hacktoberfest support: ~15% more builds for a cost decrease of $2.000!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fall cleanup of accounts.jenkins.io and wiki.jenkins.io (Unified designs, dependencies updates, bug fixes)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade of our controllers to the new LTS 2.361.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade of Kubernetes to 1.23.x for the 6 clusters (Amazon, Digital Ocean and Azure)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Request for volunteers to host download mirrors in India&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security Advisories support (Jenkins Infrastructure is the first user!)&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;platform-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#platform-update&quot; /&gt;Platform Update&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;Very last JDK8 &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/pull/292&quot;&gt;docker images&lt;/a&gt; have been released&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/pull/165&quot;&gt;Preparation&lt;/a&gt; of the three agents repos merging while solving a &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/issues/131&quot;&gt;bug&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Loss of the ppc64le loaner machine from IBM, some reference &lt;a href=&quot;https://github.com/jenkins-infra/helpdesk/issues/3198&quot;&gt;cleaning&lt;/a&gt; to do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK17 aarch64 docker image bug &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/issues/308&quot;&gt;discovered&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/309&quot;&gt;solved&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;First &lt;a href=&quot;https://riscv.org/&quot;&gt;RISC-V&lt;/a&gt; &lt;a href=&quot;https://mangopi.org/mqpro&quot;&gt;machine&lt;/a&gt; received, tests should happen in the coming months&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JVM stats for October: Java 8 fell from 153,205 to 139,827; Java 11 rose from 137,332 to 141,387; and Java 17 rose from 11,173 to 14,420. There are now more users on Java 11 than Java 8.&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;user-experience-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#user-experience-update&quot; /&gt;User Experience Update&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;http://accounts.jenkins.io&quot;&gt;accounts.jenkins.io&lt;/a&gt; page has been significantly updated thanks to the work of Tim Jacomb, Alexander Brandes, and Gavin Mogan.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At a high level, Tim and Alex made major dependency updates.
Tim was also able to update the UI to be more modern and synchronize with the &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;jenkins.io&lt;/a&gt; interface.
Gavin was able to create and add the page header &amp;amp; footer, so that page transitions are seamless.
This work to keep Jenkins aligned and up to date is greatly appreciated, and necessary to keep it modern.&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/2022-11-04-jenkins-newsletter/image10.png&quot; alt=&quot;image&quot; width=&quot;416&quot; height=&quot;272&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;http://wiki.jenkins.io&quot;&gt;old Jenkins wiki&lt;/a&gt; site has also received a face lift, as it has been updated with the stylesheets used for the accounts page update.
Despite the wiki being deprecated, finding and reading information on the site is much easier.
This is yet another way to make the page transitions more seamless throughout Jenkins.&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/2022-11-04-jenkins-newsletter/image12.png&quot; alt=&quot;image&quot; width=&quot;407&quot; height=&quot;258&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;documentation-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-update&quot; /&gt;Documentation Update&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-11-04-jenkins-newsletter/image5.png&quot; alt=&quot;image&quot; width=&quot;236&quot; height=&quot;132&quot; /&gt; The annual Jenkins board members and officers election is here!
Thanks &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27/&quot;&gt;Kevin Martens&lt;/a&gt; for thoroughly laying out the &lt;a href=&quot;https://www.jenkins.io/blog/2022/10/20/jenkins-election-announcement/&quot;&gt;voter registration and nomination process&lt;/a&gt;.
Nominate yourself or someone you know. But hurry because nominations end on November 10, 2022.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Can’t think of anyone to nominate?
We’d gladly take your vote!
&lt;a href=&quot;https://community.jenkins.io/g/election-voter-2022&quot;&gt;Voter registration&lt;/a&gt; is open now until November 17.
The voting period will begin on November 17 - December 2, 2022.
The election process page in Jenkins has been updated accordingly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;advocacy-outreach-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#advocacy-outreach-update&quot; /&gt;Advocacy &amp;amp; Outreach Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;google-summer-of-code-2022-ended&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-summer-of-code-2022-ended&quot; /&gt;Google Summer of Code 2022 Ended&lt;/h3&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/2022-11-04-jenkins-newsletter/image9.png&quot; alt=&quot;image&quot; width=&quot;457&quot; height=&quot;256&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to all GSoC contributors!
Thank you for your contributions!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins GSoC 2022 ended in October with the successful completion of all 4 projects.
Below are the final reporting from each projects:&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/2022/10/10/pipeline-steps-improvement-gsoc-report/&quot;&gt;Pipeline Steps Documentation Generator Improvements&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/vihaanthora/&quot;&gt;Vihaan Thora&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2022/10/10/plugin-health-scoring-system-report/&quot;&gt;Plugin Health Scoring System&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/dheerajodha/&quot;&gt;Dheeraj Singh Johna&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2022/09/07/jenkinsfile-runner-as-github-actions/&quot;&gt;Jenkinsfile Runner Action for GitHub Actions&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/yiminggong/&quot;&gt;Yiming Gong&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/projects/automatic-git-cache-maintenance/&quot;&gt;Automatic Git Cache Maintenance on the Controller&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/hrushikeshrao/&quot;&gt;Hrushikesh Rao&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;Demos were represented during the Jenkins Online Meetup.
The recording can be found &lt;a href=&quot;https://youtu.be/fM2SMbppRxw&quot;&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This program isn’t possible without the dedication of all the mentors.
Hats off to all Jenkins GSoC mentors!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hacktoberfest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hacktoberfest&quot; /&gt;Hacktoberfest&lt;/h3&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/2022-11-04-jenkins-newsletter/image6.png&quot; alt=&quot;image&quot; width=&quot;81&quot; height=&quot;118&quot; /&gt;
Participation in the 2022 edition of this worldwide event was strong.
117 seasoned but also first-time contributors submitted 613 eligible PRs.
From these, 531 PRs are &quot;Hacktoberfest complete&quot; (merged or flagged as hacktoberfest-approved).
They were submitted by 95 contributors (among them 42 qualify for the swag just with Jenkins contribution).&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations and many thanks to those who contributed but also to those who advised/guided/reviewed/coached these contributors.&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/10/31/jenkins-google-summer-of-code-archive-2022/</id>
<title>Jenkins In Google Summer of Code 2022</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-10-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/10/31/jenkins-google-summer-of-code-archive-2022/" />
<author>
<name>alyssat</name>
</author>
<category term='jenkins'></category>
<category term='gsoc'></category>
<category term='contribute'></category>
<summary>
The Jenkins project participated in Google Summer of Code 2022.
Congratulations to all participants and we thank all participants for their contributions.
Now that the event is over, this page contains an archive of the 2022 specific information.


Projects


All four projects have been successfully completed in 2022.
You can find the project information on the project pages:




Plugin Health Scoring System by Dheeraj Singh Jodha


Jenkinsfile Runner Action for GitHub Actions by Yiming Gong


Automatic git cache maintenance on the controller by Hrushikesh Rao


Pipeline Step Documentation Generator Improvements by Vihaan Thora




These were proposed and selected from the list of GSoC 2022 project ideas.




Demos and results


Recordings

Midterm project demos





Final...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project participated in Google Summer of Code 2022.
Congratulations to all participants and we thank all participants for their contributions.
Now that the event is over, this page contains an archive of the 2022 specific information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;projects&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#projects&quot; /&gt;Projects&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All four projects have been successfully completed in 2022.
You can find the project information on the project pages:&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/2022/projects/plugin-health-scoring-system/&quot;&gt;Plugin Health Scoring System&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/dheerajodha/&quot;&gt;Dheeraj Singh Jodha&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/projects/jenkinsfile-runner-action-for-github-actions&quot;&gt;Jenkinsfile Runner Action for GitHub Actions&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/yiminggong/&quot;&gt;Yiming Gong&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/projects/automatic-git-cache-maintenance&quot;&gt;Automatic git cache maintenance on the controller&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/hrushikeshrao/&quot;&gt;Hrushikesh Rao&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/projects/pipeline-step-documentation-generator&quot;&gt;Pipeline Step Documentation Generator Improvements&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/vihaanthora/&quot;&gt;Vihaan Thora&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;These were proposed and selected from the list of &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/project-ideas/&quot;&gt;GSoC 2022 project ideas&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;demos-and-results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demos-and-results&quot; /&gt;Demos and results&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;recordings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#recordings&quot; /&gt;Recordings&lt;/h3&gt;
&lt;div class=&quot;videoblock text-center&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Midterm project demos&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/loLSNdCv6K4?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock text-center&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Final project demos&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/fM2SMbppRxw?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Final blog posts:&lt;/p&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/2022/10/10/pipeline-steps-improvement-gsoc-report/&quot;&gt;Pipeline Steps Documentation Generator Improvements&lt;/a&gt; by Vihaan Thora&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2022/10/10/plugin-health-scoring-system-report/&quot;&gt;Plugin Health Scoring System&lt;/a&gt; by Dheeraj Singh Jodha&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2022/09/07/jenkinsfile-runner-as-github-actions/&quot;&gt;Jenkinsfile Runner Action for GitHub Actions&lt;/a&gt; by Yiming Gong&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;org-admins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#org-admins&quot; /&gt;Org admins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC Organization admins in 2022: &lt;a href=&quot;https://github.com/jmMeessen&quot;&gt;Jean-Marc Meessen&lt;/a&gt;, &lt;a href=&quot;https://github.com/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&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;other-materials&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-materials&quot; /&gt;Other materials&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;GSoC 2022 project ideas&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Public communication channel: &lt;a href=&quot;https://community.jenkins.io/c/contributing/gsoc/6&quot;&gt;GSoC Discourse&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;GSoC Gitter channel&lt;/a&gt; for real time topics related to Jenkins in GSoC.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#previous-years&quot;&gt;Previous years&lt;/a&gt; GSoC.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/10/20/jenkins-election-announcement/</id>
<title>Jenkins Board and Officer Elections 2022</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-10-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/10/20/jenkins-election-announcement/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
We are excited to announce the 2022 Jenkins Governance Board elections!
The nomination and voter registration period is now open.
Nominations can be submitted for two governance board positions, and all five officer positions (Security, Events, Release, Infrastructure, and Documentation).


Many thanks to Gavin Mogan and Ewelina Wilkosz for serving on the Jenkins Governance Board.
We also want to thank Damien Duportal as Infrastructure Lead, Wadeck Follonier as Security Officer, Alyssa Tong as Events Officer, Tim Jacomb as Release Officer, and Mark Waite as Documentation Officer for all of their work over the last term.


These roles are crucial to the expanding community and continued...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to announce the 2022 Jenkins Governance Board elections!
The nomination and voter registration period is now open.
Nominations can be submitted for two &lt;a href=&quot;https://www.jenkins.io/project/board&quot;&gt;governance board&lt;/a&gt; positions, and all five &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;officer&lt;/a&gt; positions (Security, Events, Release, Infrastructure, and Documentation).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many thanks to &lt;a href=&quot;https://github.com/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt; and &lt;a href=&quot;https://github.com/ewelinawilkosz&quot;&gt;Ewelina Wilkosz&lt;/a&gt; for serving on the &lt;a href=&quot;https://www.jenkins.io/project/board/&quot;&gt;Jenkins Governance Board&lt;/a&gt;.
We also want to thank &lt;a href=&quot;https://github.com/dduportal&quot;&gt;Damien Duportal&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#infrastructure&quot;&gt;Infrastructure Lead&lt;/a&gt;, &lt;a href=&quot;https://github.com/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#security&quot;&gt;Security Officer&lt;/a&gt;, &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#events&quot;&gt;Events Officer&lt;/a&gt;, &lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;, and &lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt; for all of their work over the last term.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These roles are crucial to the expanding community and continued progress of Jenkins.
This is an opportunity for Jenkins contributors and community members to sign up to vote in elections, and acknowledge other community members by nominating them for a position.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The election consists of 4 phases:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nomination of candidates (October 20 - November 10)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voter registration (October 20 - November 17)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting (November 17 - December 2)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Results announcement (December 7)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;voting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voting&quot; /&gt;Voting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Participation in the election process requires registering an account with &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt; and at least one &lt;a href=&quot;#contributing&quot;&gt;contribution&lt;/a&gt; made before September 1, 2022.
When registering, you can use an existing Github account or create a new account specifically for &lt;a href=&quot;https://community.jenkins.io&quot;&gt;the Jenkins community&lt;/a&gt;.
We ask all community members who are interested in voting, and meet the requirements, to join the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2022&quot;&gt;election-voter-2022&lt;/a&gt; group on &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt; during the registration period.
Previous elections utilized their own groups, so joining the &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2022&quot;&gt;election-voter-2022 group&lt;/a&gt; is required for participation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have made the decision to trust participants and not require that you provide evidence of contribution as part of your voter registration.
We reserve the right to ban any account from the election process if we identify abuse.
Once registration is over, a list of email addresses will be sent to the &lt;a href=&quot;https://civs.cs.cornell.edu&quot;&gt;Condorcet Internet Voting Service&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing&quot; /&gt;Contributing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As shown on the &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Participate and Contribute&lt;/a&gt; page, there are many different ways to contribute to Jenkins. You can contribute by:&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/participate/connect/&quot;&gt;Connecting with the community&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/meet/&quot;&gt;Joining or organizing a meetup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/code/&quot;&gt;Contributing code to Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/help/&quot;&gt;Helping Jenkins users&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/internationalization/&quot;&gt;Translating Jenkins resources&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/test/&quot;&gt;Testing Jenkins core and plugins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/document/&quot;&gt;Contributing to Jenkins documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/design/&quot;&gt;Creating art or updating the Jenkins UI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/review-changes/&quot;&gt;Reviewing open pull requests&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;Donating to Jenkins&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;Since contributions can vary, there is no way to measure contributions accurately.
All contributions to Jenkins and its community are welcome!&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;nominations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nominations&quot; /&gt;Nominations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the registration period, we invite community members to nominate candidates by sending a message to the &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election-committee&lt;/a&gt; group.
In your message, please include the name of the nominee, the specific position and your reasons for nominating that person.
The nomination period ends on &lt;strong&gt;November 10&lt;/strong&gt;.
Nominees will be notified, and asked to confirm that they are interested in running as a candidate.
The list of candidates will be announced on November 17.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Anyone can nominate candidates.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the 2022 election, nominations are open for the following positions:&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/project/governance/#governance-board&quot;&gt;Board members&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&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;li&gt;
&lt;p&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;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;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&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;Additional information about the roles can be found on the &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;team leads&lt;/a&gt; page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;election&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#election&quot; /&gt;Election&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On November 17, candidates will be announced, and all registered voters will be notified by email to participate using the &lt;a href=&quot;https://civs.cs.cornell.edu&quot;&gt;Condorcet Voting System&lt;/a&gt;.
Registration to vote closes as soon as candidates are announced on November 17.
All votes must be submitted by December 2.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results&quot; /&gt;Results&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As soon as the votes are counted, the results will be published.
The new term starts on December 3, when the newly elected members will transition to their roles.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-dates-for-the-2022-elections&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-dates-for-the-2022-elections&quot; /&gt;Key dates for the 2022 elections&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;October 20&lt;/strong&gt;: Voter registration and nominations open&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;November 10&lt;/strong&gt;: Nomination deadline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;November 17&lt;/strong&gt;: Candidates announced, voter registration closes, voting period begins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;December 02&lt;/strong&gt;: Voting period ends&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;December 07&lt;/strong&gt;: Results announced&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-information&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-information&quot; /&gt;Key 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;Anyone can nominate a candidate, by sending a private message to the &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election-committee&lt;/a&gt; group.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voters must register for the election by joining the public &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2022&quot;&gt;election-voter-2022&lt;/a&gt; group no later than &lt;strong&gt;November 17th&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Participant emails are shared with the &lt;a href=&quot;https://civs.cs.cornell.edu&quot;&gt;Condorcet Voting System&lt;/a&gt;, which will invite users by email to participate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the invitations are sent from the &lt;a href=&quot;https://civs.cs.cornell.edu&quot;&gt;Condorcet Voting System&lt;/a&gt;, registration closes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After the election, every member of the group &lt;a href=&quot;https://community.jenkins.io/g/election-voter-2022&quot;&gt;election-voter-2022&lt;/a&gt; will receive a “2022 Election Participant” badge on &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After the election, every nominee will receive a “2022 Election Nominee” badge on &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&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;Thank you, as always, and don’t forget to register to vote by November 17!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/10/13/jenkins-newsletter/</id>
<title>Jenkins September 2022 Newsletter</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-10-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/10/13/jenkins-newsletter/" />
<category term='jenkins'></category>
<category term='newsletter'></category>
<category term='community'></category>
<category term='contribute'></category>
<summary>
September 2022





Welcome to the Jenkins Newsletter!
This is a compilation of progress within the project, highlighted by Jenkins Special Interest Groups (SIGs) for the month of September.


Happy reading!




Security Update




Two security advisories during September with "special" nature for Jenkins core



One was only impacting very specifically configured instance


The other was only impacting three successive weekly releases









Infrastructure Update




Dropping JDK8 from all agents and controllers processes with the 2.361.1 September LTS


Joint-work with JFrog (our sponsor) to decrease the bandwidth usage (50 Tb per month, should be under 10 Tb per month) of the Jenkins' Maven repository repo.jenkins-ci.org


Digital Ocean renewed their sponsorship with increased credits ($18,000...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;september-2022&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#september-2022&quot; /&gt;September 2022&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-10-13-jenkins-newsletter/centered-newsletter.png&quot; alt=&quot;Jenkins September Newsletter&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome to the Jenkins Newsletter!
This is a compilation of progress within the project, highlighted by Jenkins Special Interest Groups (SIGs) for the month of September.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Happy reading!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;security-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-update&quot; /&gt;Security Update&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;Two security advisories during September with &quot;special&quot; nature for Jenkins core&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One was only impacting very specifically configured instance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The other was only impacting three successive weekly releases&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;infrastructure-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#infrastructure-update&quot; /&gt;Infrastructure Update&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;Dropping JDK8 from all agents and controllers processes with the 2.361.1 September LTS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Joint-work with JFrog (our sponsor) to decrease the bandwidth usage (50 Tb per month, should be under 10 Tb per month) of the Jenkins&#39; Maven repository repo.jenkins-ci.org&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Digital Ocean renewed their sponsorship with increased credits ($18,000 for 1 year)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Observability of ci.jenkins.io for plugin developers using Datadog’s (also a sponsor) metric collection on ephemeral agents. We hope to also use traces in the future&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New &quot;All-in-one&quot; agent template built with Packer: whether your builds are running on a VM or a container, in AWS, Azure or Digital Ocean, you have the same tools in the same locations&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;platform-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#platform-update&quot; /&gt;Platform Update&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;Loaner computers for ppc64le are gone&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IBM suspended the loaner machine program&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;arm/v7 agent Docker images&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Linux packages use systemd instead of System V init&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exit lifecycle change in the Docker images&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blue Ocean container image deprecation (jenkinsci:blueocean)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Container repository management for Jenkins agents&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Simplifying the release process&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JDK 11 now required since Jenkins 2.357 and 2.361.1 LTS&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ongoing minor tasks&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dropping Java 8 from the Docker agents - merged, not yet released&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugins beginning to require Java 11, ongoing process&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins works with Java 17 since 2.355 and 2.346.1 LTS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ongoing, a few recent reports, working well&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins infra planning to put one or more of the infra machines on JDK 17&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Timeline indicates end of Java 11 first level maintenance Sep 2023, security fixes for several more years after end of first level maintenance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More than 11,000 Java 17 installs reporting worldwide with Jenkins in September&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;documentation-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-update&quot; /&gt;Documentation Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;digitalocean-and-jenkins-partnership-continues-to-grow&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#digitalocean-and-jenkins-partnership-continues-to-grow&quot; /&gt;DigitalOcean and Jenkins partnership continues to grow!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to DigitalOcean’s generosity, Jenkins has access to more resources than ever before, such as utilizing the DigitalOcean platform to continue development and share progress made.
We can dedicate our time and resources more fully, allowing users to engage and make an impact.
Read the story &lt;a href=&quot;https://www.jenkins.io/blog/2022/09/19/digital-ocean-sponsorship/&quot;&gt;on our blog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#&quot; /&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-10-13-jenkins-newsletter/image6.png&quot; alt=&quot;image&quot; width=&quot;247&quot; height=&quot;139&quot; /&gt;&lt;/span&gt;

&lt;/h3&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java-11-or-newer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-11-or-newer&quot; /&gt;Java 11 or Newer&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning with Jenkins 2.357 (released on June 28, 2022) and the forthcoming 2.361.1 LTS release, Jenkins requires Java 11 or newer.
Additionally, beginning with Jenkins 2.355 (released on June 14, 2022) and Jenkins 2.346.1 LTS (released on June 22, 2022), Jenkins supports Java 17.
Plugins have already been prepared in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/68446&quot;&gt;JENKINS-68446&lt;/a&gt;.
Use the Plugin Manager to upgrade all plugins before &lt;em&gt;and&lt;/em&gt; after upgrading to Jenkins 2.357.
Read the &lt;a href=&quot;https://www.jenkins.io/blog/2022/06/28/require-java-11/&quot;&gt;blog post about Java 11 requirement&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#-2&quot; /&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-10-13-jenkins-newsletter/image3.png&quot; alt=&quot;image&quot; width=&quot;239&quot; height=&quot;139&quot; /&gt;&lt;/span&gt;

&lt;/h3&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;thinking-about-contributing-to-open-source&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thinking-about-contributing-to-open-source&quot; /&gt;Thinking About Contributing to Open Source?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ponder no more!
We’ve created the &lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/&quot;&gt;&quot;Improve a plugin&quot;&lt;/a&gt; developer tutorial for new contributors.
We’d love to work with you!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-blue-ocean&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-blue-ocean&quot; /&gt;About Blue Ocean&lt;/h3&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;title&quot;&gt;Blue Ocean status&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean will not receive further functionality updates.
Blue Ocean will continue to provide easy-to-use Pipeline visualization, but it will not be enhanced further.
It will only receive selective updates for significant security issues or functional defects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alternative options for Pipeline visualization, such as the &lt;a href=&quot;https://plugins.jenkins.io/pipeline-stage-view/&quot;&gt;Pipeline: Stage View&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/pipeline-graph-view/&quot;&gt;Pipeline Graph View&lt;/a&gt; plugins, are available and offer some of the same functionality.
While not complete replacements for Blue Ocean, contributions are encouraged from the community for continued development of these plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/getting-started/#snippet-generator&quot;&gt;Pipeline syntax snippet generator&lt;/a&gt; assists users as they define Pipeline steps with their arguments.
It is the preferred tool for Jenkins Pipeline creation, as it provides online help for the Pipeline steps available in your Jenkins controller.
It uses the plugins installed on your Jenkins controller to generate the Pipeline syntax.
Refer to the &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/&quot;&gt;Pipeline steps reference&lt;/a&gt; page for information on all available Pipeline steps.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;advocacy-outreach-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#advocacy-outreach-update&quot; /&gt;Advocacy &amp;amp; Outreach Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-she-code-africa-contributhon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-she-code-africa-contributhon&quot; /&gt;Jenkins &amp;amp; She Code Africa Contributhon&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This program aimed to create a more diverse, inclusive, and innovative culture within the African open source ecosystem, by matching African women in technology with sponsor and mentor open source organizations.
The 6 mentees joined the Jenkins project came from Nigeria, Kenya, and Ghana.
They brought 3 different projects to the Jenkins community:&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/2022/08/04/expanding-open-source-in-Africa/#inclusive-naming&quot;&gt;Inclusive naming&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2022/08/04/expanding-open-source-in-Africa/#screenshot-updates&quot;&gt;Screenshot updates&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2022/08/04/expanding-open-source-in-Africa/#pipeline-help&quot;&gt;Pipeline help&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;Many thanks to the dedicated mentors from the Jenkins project: &lt;a href=&quot;https://www.jenkins.io/blog/authors/ajard/&quot;&gt;Angélique Jard&lt;/a&gt;, &lt;a href=&quot;https://github.com/kmartens27&quot;&gt;Kevin Martens&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/kwhetstone/&quot;&gt;Kristin Whetstone&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Mark Waite&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the full blog post &lt;a href=&quot;https://www.jenkins.io/blog/2022/08/04/expanding-open-source-in-Africa/&quot;&gt;Expanding Open Source in Africa&lt;/a&gt;.&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/2022-10-13-jenkins-newsletter/image5.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;350&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;scale19x&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#scale19x&quot; /&gt;SCaLE19X&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was great to have returned to in person events!
Thank you SCaLE for hosting us.
See you again in March 2023!&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/2022-10-13-jenkins-newsletter/image2.png&quot; alt=&quot;image&quot; width=&quot;327&quot; height=&quot;154&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;google-summer-of-code-midterm-status-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-summer-of-code-midterm-status-update&quot; /&gt;Google Summer of Code Midterm Status Update&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2022 GSoC Contributors worked hard to improve the following projects.
In a midterm webinar, they presented their progress, lessons learned and achievements:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recording is at: &lt;a href=&quot;https://youtu.be/loLSNdCv6K4&quot;&gt;[Jenkins Online Meetup]: GSoC Midterm Status Update &amp;amp; Demos - July 21, 2022&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Slides are at: &lt;a href=&quot;https://docs.google.com/presentation/d/1t2vuNn1NFpDusnw0m4vdFw6WBQMeU6kccv_K1v2L6R0/edit?usp=sharing&quot;&gt;Jenkins Online Meetup - GSoC 2022 Midterm Demos&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Plugin Health Scoring System by
&lt;a href=&quot;https://github.com/dheerajodha&quot;&gt;Dheeraj Singh Jodha&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkinsfile Runner Action for GitHub Actions by
&lt;a href=&quot;https://github.com/Cr1t-GYM&quot;&gt;Yiming Gong&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic git cache maintenance on the controller by
&lt;a href=&quot;https://github.com/hrushi20&quot;&gt;Hrushikesh Rao&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline Step Documentation Generator Improvements by
&lt;a href=&quot;https://github.com/vihaanthora&quot;&gt;Vihaan Thora&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Link to all projects:
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;Google Summer of Code in Jenkins&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;hacktoberfest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hacktoberfest&quot; /&gt;Hacktoberfest&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jmMeessen&quot;&gt;jmMeessen&lt;/a&gt;&lt;/strong&gt; announced …&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September was the perfect time to prepare for Hacktoberfest.
We got a jump start by finding projects to contribute to, adding &quot;Hacktoberfest&quot; tag to projects, or getting familiarized with Git.
To get the deets see the &lt;a href=&quot;https://www.jenkins.io/blog/2022/09/15/preptember/&quot;&gt;blog post about Preptember&lt;/a&gt;.&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/2022-10-13-jenkins-newsletter/image7.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;264&quot; /&gt;&lt;/span&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/2022/10/10/plugin-health-scoring-system-report/</id>
<title>Plugin Health Scoring System</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-10-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/10/10/plugin-health-scoring-system-report/" />
<author>
<name>dheerajodha</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2022'></category>
<category term='healthscore'></category>
<category term='probes'></category>
<category term='plugins'></category>
<summary>
The goal of this blog is to showcase the work done during the Google Summer of Code 2022 coding phases.
For a detailed description of the project, please see the project page.



Overview




About Project


Phase 1


Phase 2


Next Steps


Acknowledgments


Useful Links







About Project


Plugin maintenance is an extremely important phase of a plugin&#8217;s lifecycle.
Jenkins is constantly developing, which raises the need for thousands of plugins to catch up with the latest developments.
This allows them to stay useful for a broader set of users.


We aim to fulfill this need, by introducing a metric system to calculate the health score of Jenkins plugins.
This health score measures the plugin&#8217;s development...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock center center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/gsoc/2022/plugin-health-score/introducing-the-plugin-health-scoring-system.png&quot; alt=&quot;GSoC&quot; height=&quot;400&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal of this blog is to showcase the work done during the Google Summer of Code 2022 coding phases.
For a detailed description of the project, please see the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/projects/plugin-health-scoring-system/&quot;&gt;project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&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-project&quot;&gt;About 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;#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;#acknowledgments&quot;&gt;Acknowledgments&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;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-project&quot; /&gt;About Project&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugin maintenance is an extremely important phase of a plugin’s lifecycle.
Jenkins is constantly developing, which raises the need for thousands of plugins to catch up with the latest developments.
This allows them to stay useful for a broader set of users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We aim to fulfill this need, by introducing a metric system to calculate the health score of Jenkins plugins.
This health score measures the plugin’s development maturity level with the help of accurate numeric figures.
This score attempts to provide an accurate picture of how much care and help a plugin needs, and makes it easier for contributors to contribute.
This score also allows users to make a conscious decision before installing or using a plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were two coding phases in the GSoC 2022:&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&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;In this phase, we worked on setting up the project and followed best practices while doing so.
The whole application is dockerized so that it is easier for anyone to spin up this project and test it out locally.
There’s continuous integration (CI) in place for the project to make sure that new changes are tested automatically.
The useful details from the Jenkins Update Center are stored inside the database to run analysis without constantly polling the Update Center.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;deliverables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliverables&quot; /&gt;Deliverables&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a spring boot project connected with a PostgreSQL DB (&lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/pull/3&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dockerize the whole application (&lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/pull/7&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setup continuous integration for the project (&lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/pull/10&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Store plugin details from the update center, inside the DB in JSON format (&lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/pull/18&quot;&gt;PR&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;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;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://github.com/jenkins-infra/plugin-health-scoring/milestone/1?closed=1&quot;&gt;View Milestone 1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Online Meetup Phase 1: &lt;a href=&quot;https://docs.google.com/presentation/d/1t2vuNn1NFpDusnw0m4vdFw6WBQMeU6kccv_K1v2L6R0/edit#slide=id.g13dcaed2105_0_0&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Online Meetup Phase 1: Demo and Presentation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/loLSNdCv6K4?rel=0&amp;amp;start=1089&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&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 this phase, the probe engine for the probes was designed.
Processes like reading the update center and executing the probe engine are now running on a schedule, without the need to restart the application.
Probes created at this time are getting run by the probe engine, and are listed on the UI to highlight the current state of the project.
Thanks to the helm chart that has been created to allow an easy deployment on Kubernetes, the site &lt;a href=&quot;https://plugin-health.jenkins.io&quot;&gt;plugin-health.jenkins.io&lt;/a&gt; is live.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;deliverables-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliverables-2&quot; /&gt;Deliverables&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Design the Probe engine for the probes (&lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/pull/19&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Schedule the reading of the update center and probe engine execution (&lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/pull/20&quot;&gt;PR#1&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/pull/30&quot;&gt;PR#2&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;List the available probes of the application (&lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/pull/27&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a probe (&lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring/pull/33&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a Helm chart to deploy the application on Kubernetes (&lt;a href=&quot;https://github.com/jenkins-infra/helm-charts/pull/212&quot;&gt;PR&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://plugin-health.jenkins.io&quot;&gt;plugin-health.jenkins.io&lt;/a&gt; to view a list of active probes. A big thanks to the Jenkins Infrastructure team (especially &lt;a href=&quot;https://www.jenkins.io/blog/authors/hlemeur&quot;&gt;Hervé Le Meur&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal&quot;&gt;Damien Duportal&lt;/a&gt;) for their help and support throughout.&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;resources-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources-2&quot; /&gt;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://github.com/jenkins-infra/plugin-health-scoring/milestone/2?closed=1&quot;&gt;View Milestone 2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Online Meetup Phase 2: &lt;a href=&quot;https://docs.google.com/presentation/d/1HOHRVFOfH07TnBfbGh3xAqakA3NfmKni_7FYyCx-llw/edit#slide=id.p&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Online Meetup Phase 2: Demo and Presentation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/fM2SMbppRxw?rel=0&amp;amp;start=342&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&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;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add more probes to the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate the plugin health scores based on the data extracted by the probes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the health scores via a JSON file, similar to how Jenkins Update Center does it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Render the detailed report of the health score of each plugin by fetching the JSON data generated above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Stretch Goal] Display Plugin health score on Plugin Manager.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&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;I’m extremely grateful to have been given this opportunity to contribute to the Jenkins project. I owe it to my mentors for being able to help take this project forward and learn lots of things along the way. Shoutout to &lt;a href=&quot;https://www.jenkins.io/blog/authors/alecharp&quot;&gt;Adrien Lecharpentier&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/jleon/&quot;&gt;Jake Leon&lt;/a&gt;. They invested tremendous time and energy in mentoring me and driving this project forward. They synced with me weekly and made sure that I was learning and that we were taking this project forward, 1 PR at a time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I asked all kinds of questions about this project, and Jake has been kind enough to answer all of them and help me understand this project and its future with his expertise. And a BIG shoutout to him for devoting his time to helping me prepare for my presentations by offering many tips on making effective slides and speaking well. His coaching helped me put across my points more powerfully, and made it all so easy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I also want to thank Adrien for being one of the best mentors I’ve ever had. The amount of time he spent moving this project forward and sharing his expertise with me is unparalleled. And for that, I’m deeply grateful to be mentored by him. It’s an absolute privilege to get this opportunity to learn from him.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also, thanks to the org admins, &lt;a href=&quot;https://www.jenkins.io/blog/authors/jmmeessen&quot;&gt;Jean-Marc Meessen&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern/&quot;&gt;Kris Stern&lt;/a&gt;, for always keeping me and other contributors on our toes and assisting us with any blockers and concerns by organizing weekly stand-up calls.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&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://plugin-health.jenkins.io&quot;&gt;plugin-health.jenkins.io&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-health-scoring&quot;&gt;GitHub repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1Dxyli1LPlHdFxLoE9zFtr_3bTjnwQDMZGCxcGS79Z_I/edit&quot;&gt;Architecture Diagram&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1HTbcWh5C1KrCgEzgqeVEPyfr1H5fH5eTj8KpbWrWsSY/edit#heading=h.efprktbggbop&quot;&gt;GSoC Proposal Document&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_GSoC-Plugin_Health_Score:gitter.im&quot;&gt;Gitter channel&lt;/a&gt; or &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt; in case you have any question(s) or feedback.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&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;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/10/10/pipeline-steps-improvement-gsoc-report/</id>
<title>Pipeline Steps Documentation Generator Improvements</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-10-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/10/10/pipeline-steps-improvement-gsoc-report/" />
<author>
<name>vihaanthora</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2022'></category>
<category term='pipeline'></category>
<category term='steps'></category>
<category term='layout'></category>
<category term='documentation'></category>
<summary>
About


Pipeline Steps Documentation Generator Improvements is a project under Google Summer of Code 2022, and this project aims to improve the steps documentation generated for Pipeline jobs, which is used by thousands of Pipeline developers worldwide.


Some initial parts of the project involved changes to the UI of the website.
I spent most of the community bonding period thinking about possible improvements, understanding the code base (for jenkins.io and pipeline-steps-doc-generator), and creating website wireframes that can be shared with the community.
This phase helped me communicate with my mentors and plan my project out, at least to a level where I could distinguish...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about&quot; /&gt;About&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://www.jenkins.io/projects/gsoc/2022/projects/pipeline-step-documentation-generator/&quot;&gt;Pipeline Steps Documentation Generator Improvements&lt;/a&gt; is a project under Google Summer of Code 2022, and this project aims to improve the steps documentation generated for Pipeline jobs, which is used by thousands of Pipeline developers worldwide.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some initial parts of the project involved changes to the UI of the website.
I spent most of the community bonding period thinking about possible improvements, understanding the code base (for jenkins.io and pipeline-steps-doc-generator), and creating website wireframes that can be shared with the community.
This phase helped me communicate with my mentors and plan my project out, at least to a level where I could distinguish tasks for the two coding phases.
I created an &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/68650&quot;&gt;epic&lt;/a&gt; to generate and maintain tickets. Below is a summary of the two coding phases.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;coding-phase-i&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coding-phase-i&quot; /&gt;Coding Phase - I&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;Updating sidebar scrolling for Jenkins documentation&lt;/strong&gt; (&lt;a href=&quot;https://issues.jenkins.io/browse/WEBSITE-799&quot;&gt;ticket&lt;/a&gt;) -
The sidebar required independent scrolling from the main content to improve the navigation on longer pages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Listing plugins on Pipeline Steps Reference&lt;/strong&gt; (&lt;a href=&quot;https://issues.jenkins.io/browse/WEBSITE-803&quot;&gt;ticket&lt;/a&gt;) -
I had included this idea in my proposal, but seeing the outcome, we decided that this does not add much value to the steps documentation for the users.
This gave rise to the idea of adding a search filter instead. See the discussion in this &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/5245&quot;&gt;PR&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adding search filter&lt;/strong&gt; (&lt;a href=&quot;https://issues.jenkins.io/browse/WEBSITE-807&quot;&gt;ticket&lt;/a&gt;) -
There are more than 1500 steps listed on the Pipeline Steps Reference page, and filtering them becomes a much required feature for the users.
With this change, users can now type in any string, and the content of the page is changed dynamically according to the input.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Separating declarative steps generation from main class&lt;/strong&gt; (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/68811&quot;&gt;ticket&lt;/a&gt;) -
A small but helpful change was to separate all the functions that generate declarative Pipeline steps from the main (&lt;code&gt;PipelineStepExtractor&lt;/code&gt;) class.
This would not only make the main class more readable but also isolate the specific functions related to declarative steps, making the code more modular.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shifting parameter data types&lt;/strong&gt; (&lt;a href=&quot;https://issues.jenkins.io/browse/WEBSITE-801&quot;&gt;ticket&lt;/a&gt;) -
This was an initiative to reduce the overall length of each plugin page listed on Pipeline Steps Reference.
The idea was to move the parameter data type (an essential piece of information regarding a step’s parameter that a user might want to know) from the bottom of the help text to inline with the name of the parameter/property.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Releasing pipeline-metadata-utils&lt;/strong&gt; (&lt;a href=&quot;https://issues.jenkins.io/browse/WEBSITE-806&quot;&gt;ticket&lt;/a&gt;) -
&lt;code&gt;pipeline-metadata-utils&lt;/code&gt; is a tool that can be imported onto a project as a maven dependency. It provides a &lt;code&gt;HyperLocalPluginManager&lt;/code&gt; that can be used to query plugins and build documentation with its help. My work involved updating and refining the code base and writing tests for the same. The released artifact is available in the Jenkins &lt;a href=&quot;https://repo.jenkins-ci.org/ui/repos/tree/General/releases/org/jenkins-ci/infra/pipeline-metadata-utils&quot;&gt;artifact repository&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Midterm Meetup&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1t2vuNn1NFpDusnw0m4vdFw6WBQMeU6kccv_K1v2L6R0/edit#slide=id.g13dcaed2105_0_25&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Presentation Recording -&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&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/loLSNdCv6K4?rel=0&amp;amp;start=3154&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;coding-phase-ii&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coding-phase-ii&quot; /&gt;Coding Phase - II&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;Label deprecated plugins&lt;/strong&gt; (&lt;a href=&quot;https://issues.jenkins.io/browse/WEBSITE-808&quot;&gt;ticket&lt;/a&gt;) -
Earlier, the only way to determine if a plugin was deprecated was to visit the plugin site.
This can be remediated by adding a label saying so on Pipeline Steps Reference itself.
In this way, users can also find all deprecated plugins that provide Pipeline steps by simply searching &quot;(deprecated)&quot; in the search filter provided.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Separate configured parameter classes&lt;/strong&gt; (&lt;a href=&quot;https://issues.jenkins.io/browse/WEBSITE-809&quot;&gt;ticket&lt;/a&gt;) -&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Many plugin pages included enormous amounts of documentation on a single page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Currently, there are 625 plugins listed on Pipeline Steps Reference. The total size of the Asciidocs that hold their respective documentation is around 16.7 MB. Out of these 625 plugins, 8 of them contribute to 85% of the total size of the Asciidocs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There were many issues associated with this -&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Slow loading&lt;/strong&gt; - some pages, such as &lt;code&gt;workflow-multibranch&lt;/code&gt; took more than 15 to 20 seconds to load. This was due to the laggy action on javascript in collapsing the lists on the 4 MB large page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Difficult navigation&lt;/strong&gt; - once the user expanded a parameter containing deeply nested documentation, it became tough to keep track of the hierarchy levels within the documentation (it’s not easy to eyeball indentation :P). The only possible way to get back to a legible starting point was to refresh the page, which was not a quick thing to do, as mentioned above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Redundant content&lt;/strong&gt; - upon some investigation, it was found that there are several occurrences of redundant documentation. Redundant content is never good for any piece of documentation, and hence, this problem needed to be solved.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This problem is solved with the help of configuration-based post-processing of the generated AsciiDocs. A file would contain a list of parameter classes that are then searched in all AsciiDocs and localized in a single document, one by one. This new document is then referenced by all the depending documents with the help of a hyperlink. The tasks done under this ticket were -&lt;/p&gt;
&lt;div class=&quot;openblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create Java class &lt;code&gt;ProcessAsciiDoc&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write tests and Javadoc comments for it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add instructions to use the configuration file in the README of &lt;code&gt;pipeline-steps-doc-generator&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add around 36 parameter classes to the configuration as a starting point.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The results obtained after running the processing layer with the initial configuration file were pretty encouraging. More than &lt;strong&gt;2 MBs of redundancy&lt;/strong&gt; was removed, and the new size of the AsciiDocs is around 14.4 MBs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The larger pages saw a significant drop in size -&lt;/p&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3334%;&quot;&gt;
&lt;/col&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;Name&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Previous Size (in KBs)&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 Size (in KBs)&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;workflow-multibranch&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;4967&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;688&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;pipeline-groovy-lib&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;2267&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;564&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;workflow-scm-step&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;373&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;96&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Final Meetup&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1fswNO3qyeq7iwe9UWK2dWTBncTarSdujwqXWMgYKjIU/edit?usp=sharing&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Presentation Recording -&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&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/fM2SMbppRxw?rel=0&amp;amp;start=2193&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-scope&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-scope&quot; /&gt;Future Scope&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;Identify the plugin that a particular parameter class belongs to.
This can be done by manipulating the getPluginNameFromDescriptor method supplied by &lt;code&gt;pipeline-metadata-utils`&lt;/code&gt; such that it takes the class name and returns the plugin name corresponding to that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reduce the manual work required to configure the parameters and make the processing layer more robust towards inconsistencies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improve the time complexity associated with running the processing layer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Possible future GSoC goal&lt;/strong&gt; - Integrate the snippet generator with jenkins.io.&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-and-insights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements-and-insights&quot; /&gt;Acknowledgements and Insights&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am grateful to my mentor, Kristin, and the community at &lt;a href=&quot;https://app.gitter.im/#/room/#jenkins/docs:matrix.org&quot;&gt;docs-sig&lt;/a&gt;. Their support was essential in making this project successful. I got consistent ideas and feedback from them throughout the project’s tenure.
Here are some tips for new contributors who wish to participate in GSoC at Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Make sure you ask your queries in the right channel. This will maximize the chances of an accurate and fast reply.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t rely on others to solve every error you get. Try to figure it out yourself, and after an honest attempt, mention your query on the channel and all that you have tried.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attend office hours regularly as soon as they begin for the next edition of GSoC. They are a great way to communicate with the mentors and understand the project idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Draft your proposal as soon as possible and gather feedback to maximize your chance of getting accepted. Make sure you add value to the original idea and include some implementation details in the proposal.&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-specific-guidance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-specific-guidance&quot; /&gt;Project-specific guidance&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After the separation of &lt;code&gt;pipeline-metadata-utils&lt;/code&gt;, the code has become more abstract and relatively straightforward to dive into for newer contributors. You need not understand everything to start making changes to the code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;PipelineStepExtractor&lt;/code&gt; is the main class responsible for initializing the reactor in which the mock Jenkins instance is set up. It then uses the &lt;code&gt;HyperLocalPluginManager&lt;/code&gt; to query the plugins and return all the information as a Java map.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ToAsciiDoc&lt;/code&gt; is responsible for formatting the Java map as an AsciiDoc and contains several functions to handle the different sections in a plugin page. Hence, if your goal is to change the presentation of the documentation while keeping the content static, you will probably need to make changes in this class only.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ProcessAsciiDoc&lt;/code&gt; is a string algorithm-based class responsible for matching the configuration keywords to their occurrences in the produced AsciiDocs. It currently follows a brute-force approach and is not very immune to complex configurations. Hence, there is a lot of scope for improvement in this class. If you want to improve something, feel free to tag my GitHub handle (&lt;code&gt;@vihaanthora&lt;/code&gt;) in the issue/pull request you create.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The other classes will not require change unless a particular requirement arises.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Try to find bugs in the generated documentation by browsing through random AsciiDocs under Pipeline Steps Reference and create an issue on the project’s GitHub repository. If you want to seek clarification about some anomaly, you can write a brief description about it on the docs-sig gitter channel, and we’ll try to respond whenever possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find all the important links on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/projects/pipeline-step-documentation-generator/&quot;&gt;project page&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/10/03/scaling-out-iOS-builds-on-AWS-with-EC2-mac/</id>
<title>Scaling out iOS builds on AWS with EC2 mac</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-10-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/10/03/scaling-out-iOS-builds-on-AWS-with-EC2-mac/" />
<category term='community'></category>
<category term='contribute'></category>
<category term='aws'></category>
<category term='aws-ec2-mac'></category>
<category term='mac'></category>
<category term='iOS'></category>
<category term='baremetal'></category>
<category term='type-2-virtualization'></category>
<summary>
Scaling out iOS builds on AWS with EC2 mac


Introduction

The number of mobile application subscriptions are
increasing annually, trending towards 8 billion and
combined number of apps in the app stores are close to 6
million. Mobile application development has become prevalent, not just
for consumer facing businesses but also with the remote workforce. Many
large enterprises also support an internal app store catering to
organization specific functionalities. As a result of this growth
combined with the cloud first approach, there is a need to deploy mobile
application development infrastructure with scale in mind from day 1.


Let’s start by looking at a skeleton view of typical iOS continuous
integration and...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/Jenkins-DevOps.png&quot; alt=&quot;Jenkins DevOps&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;scaling-out-ios-builds-on-aws-with-ec2-mac&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#scaling-out-ios-builds-on-aws-with-ec2-mac&quot; /&gt;Scaling out iOS builds on AWS with EC2 mac&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;introduction&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introduction&quot; /&gt;Introduction&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The number of mobile application subscriptions are
&lt;span class=&quot;underline&quot;&gt;increasing&lt;/span&gt; annually, trending towards 8 billion and
combined number of apps in the app stores are close to &lt;span class=&quot;underline&quot;&gt;6
million&lt;/span&gt;. Mobile application development has become prevalent, not just
for consumer facing businesses but also with the remote workforce. Many
large enterprises also support an internal app store catering to
organization specific functionalities. As a result of this growth
combined with the cloud first approach, there is a need to deploy mobile
application development infrastructure with scale in mind from day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s start by looking at a skeleton view of typical iOS continuous
integration and continuous delivery (CI/CD) pipelines. For the purpose
of this blog, we can split it into two distinct phases, (1) Local
Integrated Development Environment (IDE) based design and development of
the iOS app which typically takes place on a macOS device, and
(2) Building, testing, and publishing the app to the Appstore. This can
occur on the same macOS device if it is with a a single developer
project, however team based development, typically runs on separate
build and test infrastructure. Although some aspects of this discussion
can be applied to stand up a fleet of developer machines for phase 1,
the focus will be placed on the topic at hand which is scalable build
pipelines for the second phase.&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/2022-09-30-scaling-out-iOS-builds-on-AWS-with-EC2-mac/image1.png&quot; alt=&quot;image&quot; width=&quot;622&quot; height=&quot;194&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Figure-1: iOS Application development steps&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Amazon EC2 Mac instances allow customers to bootstrap macOS environments
in the cloud and use these for building, testing, signing, and
publishing iOS applications with the security, scalability, and
flexibility of the cloud. EC2 Mac instances are offered as bare-metal
instances running on top of single-tenant, Dedicated Hosts in compliance
with macOS licensing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Integration with services like AWS Auto Scaling and AWS Systems Manager
with the SSM agent included in the Amazon Machine Images (AMIs), means
that the fundamental building blocks to facilitate automation needed for
setting up a CI/CD pipeline for iOS app builds is readily available. The
AWS Partner Network (APN) is a global community of partners that
leverages programs, expertise, and resources to build, market, and sell
customer offerings. AWS Marketplace is built to accelerate innovation
available via the cloud while balancing the needs for speed and agility
with governance and control. Both software delivery automation products
like CI from CloudBees and virtualization solution like Anka from Veertu
are offered on AWS Marketplace. These products work with the fundamental
building blocks to further remove the undifferentiated heavy lifting of
scaling out the iOS app build workloads. Let’s look at the options to
scale out build pipelines with EC2 Mac instances.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;queuing-builds-using-sqs-and-aws-systems-manager&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#queuing-builds-using-sqs-and-aws-systems-manager&quot; /&gt;Queuing builds using SQS and AWS Systems Manager&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;EC2 Mac instances based AMIs have a Systems Manager agent included. This
enables EC2 Mac instances to become a managed node under the Systems
Manager inventory. We can then use “Run Command”, a capability of AWS
Systems Manager, to remotely and securely run automation scripts on EC2
Mac instances. In this case, we will use Run Command to execute our
build scripts. Configuring the event source trigger for Run Command
could be achieved by a simple well-known pattern utilizing CodeCommit,
SNS topic, SQS queue and Lambda worker as depicted below.&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/2022-09-30-scaling-out-iOS-builds-on-AWS-with-EC2-mac/image2.png&quot; alt=&quot;image&quot; width=&quot;625&quot; height=&quot;272&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Figure-2: Multiple Build Jobs invoked by SSM Agent on EC2 Mac.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This pattern can be extended to a fleet of EC2 Macs instances all while
relying on Systems Manager capabilities to retrieve the state of the
fleet and invoke operations on individual nodes. Complex scenarios with
multiple build pipelines would necessitate the need for a more feature
rich build orchestrator than the rudimentary event-based sourcing
pattern shown. For that, let’s look at what we can achieve with a
popular automation server called Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;orchestrating-multiple-builds-with-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#orchestrating-multiple-builds-with-jenkins&quot; /&gt;Orchestrating multiple builds with Jenkins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has a powerful extension and plugin system that allows
developers to write plugins affecting nearly every aspect of Jenkins&#39;
behavior. Jenkins can be run on AWS in several different ways, directly
on EC2, using ECS Fargate as serverless or even EKS. To focus more on
the iOS builds let’s assume a simple single node Jenkins setup running
on EC2 Linux like shown in Figure-3. Using plugins like
&lt;span class=&quot;underline&quot;&gt;Configuration as code&lt;/span&gt;, &lt;span class=&quot;underline&quot;&gt;SSH build agents&lt;/span&gt; you
can define several parameters that simplifies deploying Jenkins to AWS,
more on this here&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/2022-09-30-scaling-out-iOS-builds-on-AWS-with-EC2-mac/image3.png&quot; alt=&quot;image&quot; width=&quot;616&quot; height=&quot;220&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Figure-3: Multiple Build Jobs invoked by Jenkins Agent on EC2 Mac
instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has the notion of a node, which in this case is an EC2 Mac
instance, and executors, think of them as multiple processes within the
node. If you configure the number of executors on the node as 2, you can
in theory run two Xcode build jobs on a single EC2 Mac instance. Jenkins
will handle the job orchestration as well as queuing up multiple jobs
for each executor on the node. You can have several iOS build pipelines
consuming the same build infrastructure. However, once the amount of
time the build jobs waiting in the queue for an executor to be available
increases, you may want to scale out into another EC2 Mac instance.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;auto-scaling-with-ec2-mac-instances&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#auto-scaling-with-ec2-mac-instances&quot; /&gt;Auto-scaling with EC2 Mac instances&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AWS Auto Scaling lets you build scaling plans that automate how groups
of different resources respond to changes in demand. One of the features
includes manual scaling operations typically used when you want an
external event to make the decision of scaling up or down the number of
instances in the group. In the case of scaling out Jenkins iOS builds,
the queue depth can be one of those variables. EC2 fleet plugin has
several options, including scaling up based on jobs waiting in the queue
and scaling down when nodes are idle.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Adding a new launched EC2 Mac instance from the auto scaling group to
the Jenkins controller is achieved by either SSH-based or JNLP-based
registration. More on those &lt;span class=&quot;underline&quot;&gt;here&lt;/span&gt;. Note however
that EC2 Mac dedicated hosts require a 24-hour minimum allocation
period, adhering to the macOS Software Licensing Agreement
(&lt;span class=&quot;underline&quot;&gt;SLA&lt;/span&gt;), before they can be released.&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/2022-09-30-scaling-out-iOS-builds-on-AWS-with-EC2-mac/image4.png&quot; alt=&quot;image&quot; width=&quot;620&quot; height=&quot;282&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Figure-4: Multiple EC2 Mac instance executor nodes under an Auto Scaling
group.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;type-2-virtualization-with-ec2-mac-instances&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#type-2-virtualization-with-ec2-mac-instances&quot; /&gt;Type-2 virtualization with EC2 Mac instances&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Apple Silicon and macOS has virtualization and a hypervisor framework
built into it that lets you create guest virtual machines (VM) on top of
the host. EC2 Mac instances are bare metal EC2 instances and will let
you use this virtualization features to run up to 2 guest VM’s adhering
to the macOS SLA’s. &lt;span class=&quot;underline&quot;&gt;Anka build&lt;/span&gt; is one option that lets you
leverage this granularity along with their CI/CD plugin for Jenkins to
orchestrate multiple build jobs across a fleet of EC2 Mac instances.
Another option is &lt;span class=&quot;underline&quot;&gt;Tart&lt;/span&gt; that integrates into Cirrus labs CI
to accomplish similar goals. Here is a quick depiction on how this would
work from a Jenkins perspective, removing the well documented additional
components included in the individual products to make this happen.&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/2022-09-30-scaling-out-iOS-builds-on-AWS-with-EC2-mac/image5.png&quot; alt=&quot;image&quot; width=&quot;622&quot; height=&quot;442&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Figure-4: Type-2 virtualization enabling two guest virtual machines on
EC2 Mac.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An example of how to combine the benefits of these several layers of
scale out from AWS Autoscaling and macOS type-2 virtualization into one
cohesive build fleet is illustrated in the diagram below.&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/2022-09-30-scaling-out-iOS-builds-on-AWS-with-EC2-mac/image6.png&quot; alt=&quot;image&quot; width=&quot;615&quot; height=&quot;291&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Figure-5: Combining all scale-out options together.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;Conclusion:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post we have walked through several options available to
scale out iOS builds using Amazon EC2 Mac instances. We have also looked
at the integration options available with a popular automation tool,
Jenkins. Several of the options discussed here are implemented as
solutions published by AWS with links available in the reference section
for further reading.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to these individual articles to dive deep into the many aspects
and options discussed in this blog and some more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anka Type-2 virtualization: &lt;a href=&quot;https://aws.amazon.com/blogs/compute/getting-started-with-anka-on-ec2-mac-instances/&quot; class=&quot;bare&quot;&gt;https://aws.amazon.com/blogs/compute/getting-started-with-anka-on-ec2-mac-instances/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;SQS based build agent: &lt;a href=&quot;https://github.com/sebsto/swift-build-agent-sqs&quot; class=&quot;bare&quot;&gt;https://github.com/sebsto/swift-build-agent-sqs&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;iOS pipeline with ec2 mac: &lt;a href=&quot;https://aws.amazon.com/blogs/compute/unify-your-ios-mobile-app-ci-cd-pipeline-with-amazon-ec2-mac-instances-2/&quot; class=&quot;bare&quot;&gt;https://aws.amazon.com/blogs/compute/unify-your-ios-mobile-app-ci-cd-pipeline-with-amazon-ec2-mac-instances-2/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;TeamCity: &lt;a href=&quot;https://aws.amazon.com/blogs/apn/implementing-macos-build-agents-into-teamcity-using-amazon-ec2-mac-instances/&quot; class=&quot;bare&quot;&gt;https://aws.amazon.com/blogs/apn/implementing-macos-build-agents-into-teamcity-using-amazon-ec2-mac-instances/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Auto-scaling: &lt;a href=&quot;https://aws.amazon.com/blogs/compute/implementing-autoscaling-for-ec2-mac-instances/&quot; class=&quot;bare&quot;&gt;https://aws.amazon.com/blogs/compute/implementing-autoscaling-for-ec2-mac-instances/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Virtualbuddy: &lt;a href=&quot;https://github.com/insidegui/VirtualBuddy&quot; class=&quot;bare&quot;&gt;https://github.com/insidegui/VirtualBuddy&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tart: &lt;a href=&quot;https://github.com/cirruslabs/tart&quot; class=&quot;bare&quot;&gt;https://github.com/cirruslabs/tart&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ec2-macos-init: &lt;a href=&quot;https://github.com/aws/ec2-macos-init&quot; class=&quot;bare&quot;&gt;https://github.com/aws/ec2-macos-init&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Harness: &lt;a href=&quot;https://developer.harness.io/docs/continuous-integration/use-ci/set-up-build-infrastructure/vm-build-infrastructure/define-macos-build-infra-with-anka-registry/&quot; class=&quot;bare&quot;&gt;https://developer.harness.io/docs/continuous-integration/use-ci/set-up-build-infrastructure/vm-build-infrastructure/define-macos-build-infra-with-anka-registry/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Fastlane: &lt;a href=&quot;https://docs.fastlane.tools/&quot; class=&quot;bare&quot;&gt;https://docs.fastlane.tools/&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/09/21/improve-a-plugin-tutorial/</id>
<title>Improve a plugin tutorial</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-09-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/09/21/improve-a-plugin-tutorial/" />
<category term='tutorial'></category>
<category term='developer'></category>
<summary>
Many new contributors may hesitate to contribute to a Jenkins plugin.
They may be concerned that the time commitment is too great.
They may be worried that they lack the technical skills to maintain a plugin.
They may not feel adequate to handle issues related to a Jenkins plugin.


This blog post introduces the "Improve a plugin" developer tutorial for new contributors.
The tutorial is a result of the "Contributing to Open Source" workshop (document and slides) that was held at DevOps World 2021.


It includes links to segments of the five part video series, Modernizing Jenkins plugins.
Special thanks to Darin Pope for hosting the video...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many new contributors may hesitate to contribute to a Jenkins plugin.
They may be concerned that the time commitment is too great.
They may be worried that they lack the technical skills to maintain a plugin.
They may not feel adequate to handle issues related to a Jenkins plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post introduces the &lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/&quot;&gt;&quot;Improve a plugin&quot;&lt;/a&gt; developer tutorial for new contributors.
The tutorial is a result of the &quot;Contributing to Open Source&quot; workshop (&lt;a href=&quot;https://docs.google.com/document/d/1PKYIpPlRVGsBqrz0Ob1Cv3cefOZ5j2xtGZdWs27kLuw/edit?usp=sharing&quot;&gt;document&lt;/a&gt; and &lt;a href=&quot;https://docs.google.com/presentation/d/1jk8kxC0R59YNO7fY7akx2zmn07WTsZwJo5Ub0khoO0w/edit?usp=sharing&quot;&gt;slides&lt;/a&gt;) that was held at DevOps World 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It includes links to segments of the five part video series, &lt;a href=&quot;https://www.youtube.com/playlist?list=PLvBBnHmZuNQIwIZ86HL39uot6751EOd-f&quot;&gt;Modernizing Jenkins plugins&lt;/a&gt;.
Special thanks to Darin Pope for hosting the video series.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/Fev8KfFsPZE?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;small-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#small-steps&quot; /&gt;Small steps&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A series of small steps can help new contributors contribute to Jenkins development, improve a plugin, and develop the confidence to adopt a Jenkins plugin.
Each of the steps is valuable even if the new contributor decides that they do not want to adopt the plugin.
Each of the steps will assist the maintainers of the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The steps include:&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/doc/developer/tutorial-improve/add-a-jenkinsfile/&quot;&gt;Add a Jenkinsfile&lt;/a&gt; to evaluate the plugin and its pull requests on ci.jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/update-parent-pom/&quot;&gt;Update the parent pom&lt;/a&gt; to use the most recent features of the Jenkins plugin build environment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/update-base-jenkins-version/&quot;&gt;Update base Jenkins version&lt;/a&gt; to access the most recent features of Jenkins core&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/update-scm-url/&quot;&gt;Update the SCM URL&lt;/a&gt; to replace a reference to an unsupported git communictions protocol&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/add-more-spotbugs-checks/&quot;&gt;Enable additional spotbugs checks&lt;/a&gt; to improve the static analysis checks of the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/automate-dependency-update-checks/&quot;&gt;Enable dependency management&lt;/a&gt; to automate dependency update detection and evaluation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/enable-incrementals/&quot;&gt;Enable incremental builds&lt;/a&gt; to support parallel development of components&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/migrate-documentation-to-github/&quot;&gt;Migrate documentation to GitHub&lt;/a&gt; to simplify plugin documentation updates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/add-a-contributing-guide/&quot;&gt;Add a contributing guide&lt;/a&gt; to better welcome other contributors to the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/add-a-link-to-report-an-issue/&quot;&gt;Add a link to “Report an Issue”&lt;/a&gt; so that users know the correct location to report bugs, enhancements, and security issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial-improve/replace-jsr-305-annotations/&quot;&gt;Replace Nonnull and CheckForNull annotations&lt;/a&gt; to modernize the spotbugs static analysis&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/09/19/digital-ocean-sponsorship/</id>
<title>Digital Ocean and Jenkins partnership continues to grow!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-09-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/09/19/digital-ocean-sponsorship/" />
<author>
<name>kmartens27</name>
</author>
<category term='jenkins'></category>
<category term='digitalocean'></category>
<category term='community'></category>
<summary>
We are excited to announce that the relationship between DigitalOcean and Jenkins continues to grow!
We want to thank DigitalOcean for providing such incredible support to the Jenkins project.


DigitalOcean has provided a substantial donation of $18,000 to the Jenkins project.
This is in addition to their previous sponsorship.
Combining these, DigitalOcean has granted over $20,000 to the Jenkins project.
The funding aspect is clear, but there are several other benefits to working with DigitalOcean in this capacity.
Jenkins has access to more resources than ever before, such as utilizing the DigitalOcean platform to continue development and share progress made.
We can dedicate our time and resources...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.digitalocean.com&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-09-19-digital-ocean-sponsorship/DO-horizontal.png&quot; alt=&quot;DO horizontal&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to announce that the relationship between DigitalOcean and Jenkins continues to grow!
We want to thank DigitalOcean for providing such incredible support to the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;DigitalOcean has provided a substantial donation of $18,000 to the Jenkins project.
This is in addition to their &lt;a href=&quot;https://www.jenkins.io/blog/2022/05/04/DigitalOcean/&quot;&gt;previous sponsorship&lt;/a&gt;.
Combining these, DigitalOcean has granted over &lt;strong&gt;$20,000&lt;/strong&gt; to the Jenkins project.
The funding aspect is clear, but there are several other benefits to working with DigitalOcean in this capacity.
Jenkins has access to more resources than ever before, such as utilizing the DigitalOcean platform to continue development and share progress made.
We can dedicate our time and resources more fully, allowing users to engage and make an impact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This sponsorship also increases the impact that we can have as a community, when it comes to ongoing projects and events like &lt;a href=&quot;https://hacktoberfest.com/&quot;&gt;Hacktoberfest&lt;/a&gt;, which DigitalOcean organizes and hosts.
DigitalOcean is proving their commitment to open source, which matches our desire to improve Jenkins in any way and by any means.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are new to &lt;a href=&quot;https://digitalocean.com/&quot;&gt;DigitalOcean&lt;/a&gt; and would like to learn more, use our promo code &lt;code&gt;DOJENKINS100&lt;/code&gt; to get $100 credit to use over your first 60 days (only valid for new accounts).&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/09/15/preptember/</id>
<title>Hacktoberfest Preptember</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-09-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/09/15/preptember/" />
<author>
<name>jmMeessen</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<category term='newcomer'></category>
<category term='outreach-programs'></category>
<summary>
Once again, Hacktoberfest is back!
During this October event, everyone can celebrate and support open-source by contributing changes and can earn limited edition swag.


September is the perfect time to prepare for Hacktoberfest.
Get a jump start by finding projects to contribute to, adding "Hacktoberfest" tag to your projects, or familiarizing yourself with Git.


The Jenkins community will participate once again in the event.
We invite you to contribute to Jenkins projects but also, as maintainers, to welcome and help newcomers.



Contributors


This is what contributors need to know to participate and complete Hacktoberfest:




Register anytime between September 26 and October 31


Pull requests can be made in any...
</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/hacktoberfest/hacktoberfest_2022.svg&quot; alt=&quot;Hacktoberfest&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once again, &lt;a href=&quot;https://hacktoberfest.com&quot;&gt;Hacktoberfest&lt;/a&gt; is back!
During this October event, everyone can celebrate and support open-source by contributing changes and can earn limited edition swag.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September is the perfect time to prepare for Hacktoberfest.
Get a jump start by finding projects to contribute to, adding &quot;Hacktoberfest&quot; tag to your projects, or familiarizing yourself with Git.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community will participate once again in the event.
We invite you to contribute to Jenkins projects but also, as maintainers, to welcome and help newcomers.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is what &lt;strong&gt;contributors&lt;/strong&gt; need to know to participate and complete Hacktoberfest:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Register anytime between September 26 and October 31&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull requests can be made in any &lt;a href=&quot;https://github.com/orgs/jenkinsci/repositories?q=hacktoberfest&quot;&gt;jenkinsci&lt;/a&gt; or &lt;a href=&quot;https://github.com/orgs/jenkins-infra/repositories?q=hacktoberfest&quot;&gt;jenkins-infra&lt;/a&gt; GitHub project that’s participating in Hacktoberfest (look for the &quot;hacktoberfest&quot; topic)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Project maintainers must accept your pull requests for them to count toward your total&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Have 4 pull requests accepted between October 1 and October 31 to complete Hacktoberfest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The first 40,000 participants (maintainers and contributors) who complete Hacktoberfest can elect to receive one of two prizes: a tree planted in their name, or the Hacktoberfest 2022 t-shirt&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins specific details can be found on the &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest&quot;&gt;Jenkins Hacktoberfest page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some good resources for beginners can be found here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Intro to Open Source&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/tutorial_series/an-introduction-to-open-source&quot;&gt;Introduction to GitHub and Open Source projects&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://opensource.guide/how-to-contribute/&quot;&gt;How to contribute to Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/what-is-open-source&quot;&gt;What is Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DigitalOcean: &lt;a href=&quot;https://www.digitalocean.com/community/cheatsheets/how-to-use-git-a-reference-guide&quot;&gt;How to use Git&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sharpen your skills&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.github.com/training-kit/&quot;&gt;GitHub training kit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://guides.github.com/introduction/flow/&quot;&gt;Understanding the GitHub flow&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorial_series/an-introduction-to-open-source&quot;&gt;An introduction to Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://opensource.com/article/19/5/how-get-job-doing-open-source&quot;&gt;How Open Source contributions can boost your career&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.blog/2015-01-21-how-to-write-the-perfect-pull-request/&quot;&gt;How to write the perfect Pull Request&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.to/chrissiemhrk/git-commit-message-5e21&quot;&gt;How to write a good commit message&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A good introduction to Jenkins contribution is the series &lt;a href=&quot;https://www.youtube.com/playlist?list=PLvBBnHmZuNQIwIZ86HL39uot6751EOd-f&quot;&gt;Modernizing Jenkins plugins&lt;/a&gt; recorded livestreams.
Or even better, join us at our workshop at &lt;a href=&quot;https://reg.devopsworld.com/flow/cloudbees/devopsworld22/Landing/page/welcome&quot;&gt;DevOps World&lt;/a&gt; on September 27, 2022 (use discount code: &lt;strong&gt;DW22JENKINSRTE&lt;/strong&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;maintainers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#maintainers&quot; /&gt;Maintainers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins and plugin &lt;strong&gt;maintainers&lt;/strong&gt; need also to get ready for Hacktoberfest by preparing your project for contributions by following these best practices:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add the &quot;hacktoberfest&quot; topic to your repository to OPT-IN TO HACKTOBERFEST and indicate you’re looking for contributions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the &quot;hacktoberfest&quot; label to issues you want contributors to help with in your GitHub project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a CONTRIBUTING.md file with contribution guidelines to your repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose issues that have a well-defined scope and are self-contained&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adopt a code of conduct to create a greater sense of inclusion and community for contributors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be ready to review pull requests, accepting those that are valid by merging them, leaving an overall approving review, or by adding the &quot;hacktoberfest-accepted&quot; label&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reject any spammy requests you receive by labeling them as &quot;spam&quot; and any other invalid contributions by closing them or labeling them as &quot;invalid&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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/2022/09/14/create-iOS-unity-build-pipelines-on-AWS-with-Jenkins-and-EC2-Mac-instances/</id>
<title>Create iOS Unity build pipelines on AWS with Jenkins and EC2 Mac instances</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-09-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/09/14/create-iOS-unity-build-pipelines-on-AWS-with-Jenkins-and-EC2-Mac-instances/" />
<category term='contributor-summit'></category>
<category term='events'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='devopsworld2022'></category>
<category term='aws'></category>
<category term='game-development'></category>
<category term='mac'></category>
<category term='aws-ec2-mac'></category>
<category term='mac'></category>
<summary>
Create iOS Unity build pipelines on AWS with Jenkins and EC2 Mac instances


Every mobile game, whether it is a multiplayer or standalone game, must
build binaries. Developers of high budget, high profile AAA and AA games
tend to lean towards managing a build farm, whereas independent
developers (indies) may rely on local or third-party solutions. Managing
compute infrastructure is a time consuming and ongoing task for many
companies and developers, especially in relation to iOS builds, which
require applications to be signed before submission to the App Store.
Given the overhead required to run and maintain a local build
environment, it rarely makes sense to maintain physical build...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/Jenkins-DevOps.png&quot; alt=&quot;Jenkins DevOps&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;create-ios-unity-build-pipelines-on-aws-with-jenkins-and-ec2-mac-instances&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#create-ios-unity-build-pipelines-on-aws-with-jenkins-and-ec2-mac-instances&quot; /&gt;Create iOS Unity build pipelines on AWS with Jenkins and EC2 Mac instances&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every mobile game, whether it is a multiplayer or standalone game, must
build binaries. Developers of high budget, high profile AAA and AA games
tend to lean towards managing a build farm, whereas independent
developers (indies) may rely on local or third-party solutions. Managing
compute infrastructure is a time consuming and ongoing task for many
companies and developers, especially in relation to iOS builds, which
require applications to be signed before submission to the App Store.
Given the overhead required to run and maintain a local build
environment, it rarely makes sense to maintain physical build farms for
many teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Amazon EC2 Mac instances launched at re:Invent 2020, introduced macOS as
a supported instance type for the first time. Later in 2022, Apple
M1-based Mac instances were released, enabling Apple silicon in the
cloud alongside the x86 architecture. Today, EC2 Mac instances are being
leveraged by thousands of customers today to build and run their macOS
workloads on the AWS cloud. By using EC2 Mac instances in combination
with EC2 Spot instances and Jenkins CI/CD, Unity developers were able to
build scalable, cost efficient, and fast iOS pipelines for building,
testing, signing, and publishing to the App Store.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post, we discover how to build a scalable and
cost-efficient iOS build pipeline on AWS that can be deployed within
hours.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;overview-of-solution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview-of-solution&quot; /&gt;Overview of solution&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This solution is possible due to Unity`s ability to split a build
process into two parts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Xcode Project preparation: a first phase involving processing
compute-intensive images, videos, music, and compiling additional
assets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Xcode Build, packaging, and signature: the second and final phase of
building an iOS app which must be done using macOS, an EC2 Mac instance
in our solution.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The high-level architecture looks like the following:&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/2022-09-14-Create-iOS-Unity-build-pipelines/image1.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;217&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will build upon these concepts and will use EC2 Spot instances for
the compute-heavy phase of asset compilation in conjunction with the EC2
Autoscaling feature. We will also use an EC2 Mac instance to complete
the second, final Xcode build step. For the whole pipeline,
orchestration is done with Jenkins CI/CD. We
will also use the ability of the Unity engine to be Dockerized to
implement scalability and flexibility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Services and dependencies used in our solution are shown on the
following diagram:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#&quot; /&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-09-14-Create-iOS-Unity-build-pipelines/image2.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;250&quot; /&gt;&lt;/span&gt;

&lt;/h3&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;key-pieces&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-pieces&quot; /&gt;Key pieces&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog I will not explain the solution step by step; instead, I
will emphasize key pieces of the solution, which you can setup on your
own. You can follow the whole procedure by going through the workshop
&lt;a href=&quot;https://catalog.us-east-1.prod.workshops.aws/workshops/43e96ac6-6d4f-4d99-af97-3ac2a5987391/en-US/020-build-farms/060-labs-unity-mac&quot;&gt;here&lt;/a&gt;,
a repository with code and a sample project can be found
&lt;a href=&quot;https://github.com/aws-samples/unity-aws-ec2-mac-build-farm&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;networking-template&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#networking-template&quot; /&gt;Networking template&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To setup the whole solution, I have created the following
&lt;a href=&quot;https://static.us-east-1.prod.workshops.aws/public/b40b1644-6805-40c7-888e-7a5b080112ab/static/templates/template_full.yaml&quot;&gt;CloudFormation
template&lt;/a&gt;. It prepares the environment by creating a VPC, subnets, a
Jenkins Manager installation and an EC2 bastion host. To deploy the
stack in us-east-2 (Ohio) region, click the button:
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-09-14-Create-iOS-Unity-build-pipelines/image3.png&quot; alt=&quot;image&quot; width=&quot;112&quot; height=&quot;21&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The stack incorporates VPC with two availability zones (AZs), and with
two private and two public subnets. To follow best practices, we will
place Jenkins Manager and execution nodes within the private subnet. The
stack also sets up a bastion host in order to access resources in the
private subnet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Internal resources will use NAT gateway to reach the internet in two
availability zones to reduce inter-AZ traffic costs.&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/2022-09-14-Create-iOS-Unity-build-pipelines/image4.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;295&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;unity-container-and-build-server&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#unity-container-and-build-server&quot; /&gt;Unity container and build server&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The demonstration
&lt;a href=&quot;https://github.com/aws-samples/unity-aws-ec2-mac-build-farm&quot;&gt;repository&lt;/a&gt;
includes a sample Unity project to build. The Unity engine can be
containerized—the Linux-based solution uses Docker to pull a specific
Unity version from a repository, set up a license, and build the Xcode
project. Since the process is compute-heavy, the types of instance used
in this case is a C5.4xlarge instance, which are compute-optimized
instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Unity part that needs to be legally validated&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to build a Unity project and create an Xcode project in a
production environment, you will need a license. For that, Unity
provides several options: in our example, we will use “Unity Build
Server” licenses. (You can read more
&lt;a href=&quot;https://unity.com/products/unity-build-server&quot;&gt;here&lt;/a&gt;.) Here are some AWS
cloud-specific steps to implement in order to ensure the Build Server is
setup in resilient way.&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;Build server installations maintain a number of “seats” or licenses
which are loaned to workers and released after the build process is
done; however, the build server is bound to number of cores on the
instance, as well as the network interface’s MAC address. This means
that once you “bind” seats to an instance of Build Server and you need
to launch it on a new instance, if the number of cores or network
interface do not match, you will lose your seats. In order to avoid such
a problem, you’ll need to provision an additional ENI, attach it to the
instance, and use its MAC address to bind Build Server to that ENI’s
address. Once that is done, you can launch new instances from AMIs with
Build server, attach the ENI, and your licenses are secure and assigned.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To ensure that the process is automated, set up an autoscaling group
(ASG) with the Build Server AMI— a single instance—and set it to attach
the specific ENI to any new instance each time it is launched.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For a multi-AZ setup, you need two separate build servers with their
own distinct seat groups.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can expose Build Server via
&lt;a href=&quot;https://docs.aws.amazon.com/general/latest/gr/rande.html&quot;&gt;AWS Service
Endpoint&lt;/a&gt; by setting up a Network Load Balancer in front of the Build
Server instance’s ASG and providing a link to the endpoint to your
consumers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unity editor within workers need to be configured in order to connect
to Build server. This can be achieved by providing configuration file
each time a Docker container is started via Jenkinsfile. Configuration
might look like the following:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;licensingServiceBaseUrl&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;\{http(s)://\{server dns name}}&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;enableEntitlementLicensing&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;enableFloatingApi&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;clientConnectTimeoutSec&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;clientHandshakeTimeoutSec&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;and the file should be saved as
&#39;/usr/share/unity3d/config/services-config.json&#39; of the container. The
License server DNS name can be stored in Secrets Manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;End of Unity Part&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;ec2-mac-and-secrets-manager&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ec2-mac-and-secrets-manager&quot; /&gt;EC2 Mac and Secrets Manager&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to build and sign iOS applications, we need an EC2 Mac
instance. To launch an Amazon EC2 Mac instance, you must first allocate
a dedicated host in Amazon EC2. A dedicated host is a physical server
that is wholly allocated for your use. Please keep in mind that
currently EC2 Mac dedicated hosts cannot be released earlier than 24
hours after being launched. There is no restriction on how often you can
launch an EC2 Mac instance on a dedicated host, however. Depending on
the architecture (mac1 for x86, mac2 for Apple silicon), you will need
different dedicated hosts.&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/2022-09-14-Create-iOS-Unity-build-pipelines/image5.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;117&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the instance is launched, you will need to enable VNC to connect to
it via the graphical user interface (GUI). That process is described
&lt;a href=&quot;https://catalog.us-east-1.prod.workshops.aws/workshops/43e96ac6-6d4f-4d99-af97-3ac2a5987391/en-US/020-build-farms/060-labs-unity-mac/015-environment-and-ec2-mac/040-ec2-mac-setup/020-enable-graphical-remote-desktop&quot;&gt;here&lt;/a&gt;.&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/2022-09-14-Create-iOS-Unity-build-pipelines/image6.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;499&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;EC2 Mac instances use most of the same tools that you have already been
using with other EC2 instances. These instances live in the VPC, support
IAM, support user data, and can boot from EBS volumes, so you can create
golden AMIs with all the required software installed; for example,
Xcode. EC2 Mac instances can be configured by Systems Manager, for
example to install patches. It is also integrated with Cloudwatch for
logs. Basically, treat it the same as any EC2 instance that you need to
configure and then use as a part of the unattended CI/CD pipeline to run
your builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our case, the instance also needs to have Java and Xcode installed,
as well as an IAM role to call to other services, such as Amazon Secrets
Manager.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;build-signing-and-aws-secrets-manager&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-signing-and-aws-secrets-manager&quot; /&gt;Build signing and AWS Secrets Manager&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To sign the build for the App Store, we need to have a signing
certificate and a provisioning profile. It is possible to also generate
an application package that can later be signed by another certificate.
This is common for companies that want to separate test environments’
certificates from their production environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The development certificate, its password, and the provisioning profile
can be stored in AWS Secrets Manager, a great way to save your secrets
and have secure access to resources.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To set up a temporary keychain with signature files, you can use either
&lt;a href=&quot;https://fastlane.tools/&quot;&gt;Fastlane&lt;/a&gt; or create the temporary keychain
manually.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;linux-worker-instances&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#linux-worker-instances&quot; /&gt;Linux worker instances&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order for Linux workers to be able to run build instructions from
Jenkins, several features have to be enabled for Linux worker instances:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker engine and Java must be installed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The attached EBS storage has to be large enough to incorporate the
docker images&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The instance’s security group should allow communication from Jenkins
Manager node port 22 (Manager node uses ssh to connect to the worker and
setup agent)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jenkins-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-setup&quot; /&gt;Jenkins setup&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins uses a manager node to orchestrate builds. Build jobs will run
either on EC2 Mac or on EC2 Spot instances managed by the EC2 Fleet
plugin. Jenkins manager stores configurations, provides a user
interface, and orchestrates build jobs. It can also store build
artifacts, however I find it’s better to use Amazon S3 as it provides
virtually unlimited storage, and can easily be used from within Jenkins
pipeline.&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/2022-09-14-Create-iOS-Unity-build-pipelines/image7.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;319&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to orchestrate Linux build instances, Jenkins needs the
following plugins:&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/2022-09-14-Create-iOS-Unity-build-pipelines/image8.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;195&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;strong&gt;Docker&lt;/strong&gt; and &lt;strong&gt;Docker pipeline&lt;/strong&gt; plugins allow us to run docker
pipeline steps. These are required to launch Unity containers and run
the first part of the build within.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;strong&gt;EC2 Fleet&lt;/strong&gt; plugin allows for simple integration with Autoscaling
groups, significantly reducing the overhead of launching new instances,
starting a Jenkins agent, and running a build. The EC2 Fleet plugin is
decoupled from the Auto Scaling group, which allows for full control of
the kinds of instances to be launched. This way, we can utilize the full
power of Spot instances as temporary workers, thus significantly
reducing costs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to orchestrate Mac instances, the instance has to have port 22
enabled as well as Java installed. You can add the instance manually, or
launch it via CloudFormation or Terraform and use the self-registration
method described &lt;a href=&quot;https://www.jenkins.io/doc/book/managing/nodes/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please note that currently dynamic provisioning of EC2 Mac instances via
Auto Scaling groups is not possible due to the minimum 24 hour
reservation time for which an EC2 Mac dedicated host has to be reserved.
However, we can use several Jenkins executors on a single EC2 Mac
instance:&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/2022-09-14-Create-iOS-Unity-build-pipelines/image9.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;336&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, labels can be used in order to separate kinds of workers within a
pipeline. Note that on a screenshot above I use label “mac”.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;build-pipeline-and-running-a-build&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-pipeline-and-running-a-build&quot; /&gt;Build pipeline and running a build&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every Jenkins pipeline can be described using a &lt;strong&gt;Jenkinsfile&lt;/strong&gt; file. It
is a YAML-formatted document which describes all the steps for the
pipeline. You can read more
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/jenkinsfile/&quot;&gt;here&lt;/a&gt;. I already
have such a file stored in my repository. The file contents are
following:&lt;/p&gt;
&lt;/div&gt;
&lt;details&gt;
&lt;summary class=&quot;title&quot;&gt;Click to reveal the Jenkinsfile&lt;/summary&gt;
&lt;div class=&quot;content&quot;&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;none&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;UNITY_PROJECT_DIR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;UnityProjectSample&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;IMAGE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;unityci/editor&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;UNITY_VERSION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;2021.3.6f1-ios-1.0&#39;&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Build parameters&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;UNITY_LICENSE_FILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;UNITY_LICENSE_FILE&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;PROVISIONING_PROFILE_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;UnityBuildSample-profile&#39;&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// secret from Secrets Manager&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;TEAM_ID_KEY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;TEAM_ID&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;LICENSE_SERVER_ENDPOINT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;LICENSE_SERVER_ENDPOINT&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;SIGNING_CERT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;SIGNING_CERT&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;SIGNING_CERT_PRIV_KEY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;SIGNING_CERT_PRIV_KEY&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;SIGNING_CERT_PRIV_KEY_PASSPHRASE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;SIGNING_CERT_PRIV_KEY_PASSPHRASE&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;APPLE_WWDR_CERT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;APPLE_WWDR_CERT&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;PROVISIONING_PROFILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PROVISIONING_PROFILE&#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;build Unity project on spot&#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;agent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;unityci/editor:2021.3.6f1-ios-1.0&#39;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;-u root:root&#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;// install stuff for Unity, build xcode project, archive the result&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
                    printenv
                    echo &quot;===Installing stuff for unity&quot;
                    apt-get update
                    apt-get install -y curl unzip zip
                    curl &quot;https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip&quot; -o
                    &quot;awscliv2.zip&quot;
                    unzip -o awscliv2.zip
                    ./aws/install
                    apt-get install sudo
                    # Following section can be uncommented if Unity Build server is used
                    # just to push it through
                    # sudo mkdir -p /usr/share/unity3d/config/
                    # endpoint=`aws secretsmanager get-secret-value \
                    # --secret-id $LICENSE_SERVER_ENDPOINT --output text --query
                    # &#39;SecretString&#39; | cut -d &#39;&quot;&#39; -f4`
                    # configfile=&#39;\{
                    # &quot;licensingServiceBaseUrl&quot;: &quot;&#39;$endpoint&#39;&quot;,
                    # &quot;enableEntitlementLicensing&quot;: true,
                    # &quot;enableFloatingApi&quot;: true,
                    # &quot;clientConnectTimeoutSec&quot;: 5,
                    # &quot;clientHandshakeTimeoutSec&quot;: 10
                    # }&#39;
                    # Copying Unity .ulf license file from S3 to container
                    # aws s3 cp &quot;s3://$\{S3_BUCKET}/Unity_2021.3.6f1-ios-1.0.ulf&quot;
                    # &quot;/root/.local/share/unity3d/Unity/Unity_lic.ulf&quot;
                    # mkdir -p &quot;/root/.local/share/unity3d/Unity&quot;
                    # aws secretsmanager get-secret-value --secret-id $UNITY_LICENSE_FILE
                    # --output text --query SecretBinary |
                    # base64 -d &amp;gt; &quot;/root/.local/share/unity3d/Unity/Unity_lic.ulf&quot;
                    # echo &quot;===Building Xcode project&quot;
                    # We also pull in additional repository with actual Unity Project.
                    # We have several configuration files for our build configuration
                    # You can find those in UnityProjectSample folder
                    rm nodulus -rf
                    git clone https://github.com/Hyperparticle/nodulus.git
                    cp -nR nodulus/* UnityProjectSample/
                    cd $UNITY_PROJECT_DIR
                    mkdir -p ./iOSProj
                    mkdir -p ./Build/iosBuild
                    xvfb-run --auto-servernum --server-args=&#39;-screen 0 640x480x24&#39; \
                        /opt/unity/Editor/Unity \
                        -quit \
                        -batchmode \
                        -nographics \
                        -executeMethod ExportTool.ExportXcodeProject \
                        -buildTarget iOS \
                        -customBuildTarget iOS \
                        -customBuildName iosBuild \
                        -customBuildPath ./Build/iosBuild \
                        -logFile /dev/stdout
                    echo &quot;===Zipping Xcode project&quot;
                    zip -r iOSProj iOSProj
                    &#39;&#39;&#39;&lt;/span&gt;
                    &lt;span class=&quot;c1&quot;&gt;// pick up archive xcode project&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;dir&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;$\{env.UNITY_PROJECT_DIR}&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;n&quot;&gt;stash&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;includes:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;iOSProj.zip&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;xcode-project&#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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;chmod -R 777 .&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;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;build and sign iOS app on mac&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// we don&#39;t need the source code for this stage&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;skipDefaultCheckout&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;agent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;mac&quot;&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;}&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;HOME_FOLDER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;/Users/jenkins&#39;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;PROJECT_FOLDER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;iOSProj&#39;&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;unstash&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;xcode-project&#39;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
                    pwd
                    ls -l
                    # Remove old project and unpack a new one
                    rm -rf $\{PROJECT_FOLDER}
                    unzip iOSProj.zip
                    &#39;&#39;&#39;&lt;/span&gt;

                    &lt;span class=&quot;c1&quot;&gt;// create export options file&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;writeFile&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;file:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;$\{env.PROJECT_FOLDER}/ExportOptions.plist&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;text:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;
                    &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
                    &amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot;
                    &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;
                    &amp;lt;plist version=&quot;1.0&quot;&amp;gt;
                        &amp;lt;dict&amp;gt;
                            &amp;lt;key&amp;gt;signingStyle&amp;lt;/key&amp;gt;
                            &amp;lt;string&amp;gt;manual&amp;lt;/string&amp;gt;
                        &amp;lt;/dict&amp;gt;
                    &amp;lt;/plist&amp;gt;
                &quot;&quot;&quot;&lt;/span&gt;

                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
                PATH=$PATH:/usr/local/bin
                cd $\{PROJECT_FOLDER}
                # Update project settings
                # sed -i &quot;&quot; &#39;s|^#!/bin/sh|#!/bin/bash|&#39; MapFileParser.sh
                # extra backslash for groovy
                TEAM_ID=`aws secretsmanager get-secret-value \
                    --secret-id $TEAM_ID_KEY --output text --query &#39;SecretString&#39; | cut -d &#39;&quot;&#39; -f4`
                # extra backslash for groovy
                sed -i &quot;&quot; &quot;s/DEVELOPMENT_TEAM = \\&quot;\\&quot;/DEVELOPMENT_TEAM = $TEAM_ID/g&quot; Unity-iPhone.xcodeproj/project.pbxproj
                #############################################
                # setup certificates in a temporary keychain
                #############################################

                echo &quot;===Setting up a temporary keychain&quot;
                pwd
                # Unique keychain ID
                MY_KEYCHAIN=&quot;temp.keychain.`uuidgen`&quot;
                MY_KEYCHAIN_PASSWORD=&quot;secret&quot;
                security create-keychain -p &quot;$MY_KEYCHAIN_PASSWORD&quot; &quot;$MY_KEYCHAIN&quot;
                # Append the temporary keychain to the user search list
                # double backslash for groovy
                security list-keychains -d user -s &quot;$MY_KEYCHAIN&quot; $(security list-keychains -d user | sed s/\\&quot;//g)
                # Output user keychain search list for debug
                security list-keychains -d user
                # Disable lock timeout (set to &quot;no timeout&quot;)
                security set-keychain-settings &quot;$MY_KEYCHAIN&quot;
                # Unlock keychain
                security unlock-keychain -p &quot;$MY_KEYCHAIN_PASSWORD&quot; &quot;$MY_KEYCHAIN&quot;
                echo &quot;===Importing certs&quot;
                # Import certs to a keychain; bash process substitution doesn&#39;t work with security for some reason
                aws secretsmanager get-secret-value --secret-id $SIGNING_CERT --output text --query SecretBinary | base64 -d -o /tmp/cert &amp;amp;&amp;amp; security -v import /tmp/cert -k &quot;$MY_KEYCHAIN&quot; -T &quot;/usr/bin/codesign&quot;
                rm /tmp/cert
                PASSPHRASE=`aws secretsmanager get-secret-value \
                    --secret-id $SIGNING_CERT_PRIV_KEY_PASSPHRASE --output text --query &#39;SecretString&#39; | cut -d &#39;&quot;&#39; -f4`
                aws secretsmanager get-secret-value --secret-id $SIGNING_CERT_PRIV_KEY --output text --query SecretBinary |
base64 -d -o /tmp/priv.p12 &amp;amp;&amp;amp;
                security -v import /tmp/priv.p12 -k &quot;$MY_KEYCHAIN&quot; -P &quot;$PASSPHRASE&quot; -t priv -T &quot;/usr/bin/codesign&quot;
                rm /tmp/priv.p12; PASSPHRASE=&#39;&#39;
                #aws secretsmanager get-secret-value --secret-id $APPLE_WWDR_CERT --output text --query SecretBinary | \
                # base64 -d -o /tmp/cert &amp;amp;&amp;amp;
                # security -v import /tmp/cert -k &quot;$MY_KEYCHAIN&quot;
                # rm /tmp/cert
                # Dump keychain for debug
                security dump-keychain &quot;$MY_KEYCHAIN&quot;
                # Set partition list (ACL) for a key
                security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $MY_KEYCHAIN_PASSWORD $MY_KEYCHAIN
                # Get signing identity for xcodebuild command
                security find-identity -v -p codesigning $MY_KEYCHAIN
                # double backslash for groovy
                CODE_SIGN_IDENTITY=`security find-identity -v -p codesigning $MY_KEYCHAIN | awk &#39;/ *1\\)/ \{print $2}&#39;`
                echo code signing identity is $CODE_SIGN_IDENTITY
                security default-keychain -s $MY_KEYCHAIN
                #############################################
                # setup provisioning profile
                #############################################
                echo ===setting up a provisioning profile
                pwd
                # # if the provisioning profile already exists, don&#39;t overwrite
                # PROV_PROFILE_FILENAME=&quot;$\{HOME}/Library/MobileDevice/Provisioning Profiles/$\{PROVISIONING_PROFILE_NAME}.mobileprovision&quot;
                # if [ ! -f &quot;$PROV_PROFILE_FILENAME&quot; ]; then
                # aws secretsmanager get-secret-value --secret-id $PROVISIONING_PROFILE --output text --query SecretBinary | \
                # base64 -d -o &quot;$\{PROV_PROFILE_FILENAME}&quot;
                # fi
                # # lock, since multiple jobs can use the same provisioning profile
                # if [ -f &quot;$\{PROV_PROFILE_FILENAME}.lock&quot; ]; then
                # n=`cat &quot;$\{PROV_PROFILE_FILENAME}.lock&quot;`
                # n=$((n+1))
                # else
                # n=1
                # fi
                # echo $n &amp;gt; &quot;$\{PROV_PROFILE_FILENAME}.lock&quot;
                #############################################
                # Build
                #############################################
                echo ===Building
                pwd
                # xcodebuild -scheme Unity-iPhone -sdk iphoneos -configuration AppStoreDistribution archive -archivePath &quot;$PWD/build/Unity-iPhone.xcarchive&quot; CODE_SIGN_STYLE=&quot;Manual&quot; PROVISIONING_PROFILE_SPECIFIER_APP=&quot;$PROVISIONING_PROFILE_NAME&quot; CODE_SIGN_IDENTITY=$CODE_SIGN_IDENTITY OTHER_CODE_SIGN_FLAGS=&quot;--keychain=$MY_KEYCHAIN&quot; -UseModernBuildSystem=0
                xcodebuild -scheme Unity-iPhone -sdk iphoneos -configuration AppStoreDistribution archive -archivePath &quot;$PWD/build/Unity-iPhone.xcarchive&quot; CODE_SIGN_STYLE=&quot;Manual&quot; CODE_SIGN_IDENTITY=$CODE_SIGN_IDENTITY OTHER_CODE_SIGN_FLAGS=&quot;--keychain=$MY_KEYCHAIN&quot; -UseModernBuildSystem=0 CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO
                # Generate ipa
                echo ===Exporting ipa
                pwd
                # xcodebuild -exportArchive -archivePath &quot;$PWD/build/Unity-iPhone.xcarchive&quot; -exportOptionsPlist ExportOptions.plist -exportPath &quot;$PWD/build&quot;
                #############################################
                # Upload
                #############################################
                # Upload to S3
                # /usr/local/bin/aws s3 cp ./build/*.ipa s3://$\{S3_BUCKET}/
                #############################################
                # Cleanup
                #############################################
                # Delete keychain - should be moved to a post step, but this would require a global variable or smth
                security delete-keychain &quot;$MY_KEYCHAIN&quot;
                # Delete a provisioning profile if no jobs use it anymore
                n=0
                if [ -f &quot;$\{PROV_PROFILE_FILENAME}.lock&quot; ]; then
                n=`cat &quot;$\{PROV_PROFILE_FILENAME}.lock&quot;`
                n=$((n-1))
                echo $n &amp;gt; &quot;$\{PROV_PROFILE_FILENAME}.lock&quot;
                fi
                if [ &quot;$n&quot; -le &quot;0&quot; ]; then
                rm -f &quot;$\{PROV_PROFILE_FILENAME}&quot;
                rm -f &quot;$\{PROV_PROFILE_FILENAME}.lock&quot;
                fi
                &#39;&#39;&#39;&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
                    #############################################
                    # cleanup
                    #############################################
                    zip -r iOSProj/build/Unity-iPhone.zip iOSProj/build/Unity-iPhone.xcarchive
                    rm -rf iOSProj/build/Unity-iPhone.xcarchive
                    &#39;&#39;&#39;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;archiveArtifacts&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;artifacts:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/Unity-iPhone.zip&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;onlyIfSuccessful:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;caseSensitive:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;n&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;success&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;Success ^_^&#39;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;failure&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;Failed :(&#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;/div&gt;
&lt;/details&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The key pieces of the file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;agent – describes which instances the build should run on. In my case
label “mac” is used to separate EC2 Mac instances from Spot instances&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;environment – describes environment variables used by the build&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;stage(‘Name’) – describes separate stage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;docker – describes docker image that is pulled and is later used to
run Unity build in&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;xvfb-run /opt/unity/Editor/Unity – runs unity editor in headless mode
within a container&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;security create-keychain – creates private keychain to store secrets
like signing certificate. The keychain is later deleted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To pass Artifacts between stages, Jenkins` &lt;strong&gt;stash&lt;/strong&gt; function is used&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And once done, the basic pipeline should look like the following:&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/2022-09-14-Create-iOS-Unity-build-pipelines/image10.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;247&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;final-architecture&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#final-architecture&quot; /&gt;Final architecture&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the all the key pieces mentioned in this post are assembled, the
final picture is as following:&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/2022-09-14-Create-iOS-Unity-build-pipelines/image11.png&quot; alt=&quot;image&quot; width=&quot;624&quot; height=&quot;344&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also refer to the
&lt;a href=&quot;https://d1.awsstatic.com/architecture-diagrams/ArchitectureDiagrams/unity-build-pipeline-ios-games-on-aws-cloud-ra.pdf?did=wp_card&amp;amp;trk=wp_card&quot;&gt;full
diagram&lt;/a&gt; with additional details explained. For this diagram, we assume
that code and Docker images are located within the AWS account as well,
to reduce data transfer charges and improve latency.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;main-solution-benefits-and-costs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#main-solution-benefits-and-costs&quot; /&gt;Main solution benefits and costs&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are several factors that are important to consider when building
this solution:&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;Unity version control.&lt;br&gt;
This solution allows for flexible control of which Unity version is used
for the build. By simply using tagging for Docker images, the pipeline
can run different versions of Unity without changing the configuration
of the pipeline in general.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Flexible Xcode version control&lt;br&gt;
By utilizing AMI images for EC2 Mac, it is possible to build a library
of iOS and preinstalled Xcode versions to quickly launch on EC2 Mac
hosts. This process can be further automated by using tools like Packer
or EC2 Image Builder to create AMIs for different versions of
environments.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Cost benefits when using Spot instances and using less Mac instances&lt;br&gt;
Since this solution implements a split-build approach, it allows us to
take 30 to 70% of the computing time from EC2 Mac instances. This allows
for better parallelization of builds and reduces time required by the
EC2 Mac instance to process the code, resulting in much faster builds in
general. Spot instances are also used instead of on-demand instances.
Thus, depending on a build, the approach can reduce the cost by around
30-40%.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;It is also possible to setup “layers” of EC2 Mac instances by using
several Macs for development and production builds separately, this
allows for secure separation of environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatization of the pipeline via versioned Jenkinsfiles and Amazon
CloudFormation templates allows for consistent and controllable approach
to build environments.&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;Conclusion&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post explains key pieces of the of cost-effective Unity build
pipeline. It utilizes a mechanism of separation of the build to Linux
instances and EC2 Mac instances. The compute-heavy part can be done on
cost-efficient Spot instances, which reduces load to Mac instances and
allows for more parallel builds at a time. We went through Unity and iOS
build environments, key elements, licensing, workers and overall CI/CD
process automation with Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This approach has already been adopted by our Game tech clients:
&lt;a href=&quot;https://aws.amazon.com/ec2/instance-types/mac/customers/&quot; class=&quot;bare&quot;&gt;https://aws.amazon.com/ec2/instance-types/mac/customers/&lt;/a&gt; - Riot Games,
Pokemon Company and others. The pipelines speed being improved up to
400% (Pokemon Company), Improving management time (Riot games) and
reduced complexity (Jamcity).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will be speaking more on this topic at the &lt;a href=&quot;https://www.jenkins.io/blog/2022/09/13/jenkins-contributor-summit-2022-agenda-orlando-florida/&quot;&gt;Jenkins Contributor Summit&lt;/a&gt;, on September 27 at &lt;a href=&quot;https://reg.devopsworld.com/flow/cloudbees/devopsworld22/Landing/page/welcome&quot;&gt;DevOps World in Orlando, Florida&lt;/a&gt;. Hope to see you there!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Suggested tags:&lt;/strong&gt;
&lt;a href=&quot;https://aws.amazon.com/blogs/gametech/tag/amazon-game-development/&quot;&gt;Amazon Game Development&lt;/a&gt;,
Amazon EC2 Mac,
&lt;a href=&quot;https://aws.amazon.com/blogs/gametech/tag/aws-for-games/&quot;&gt;AWS for Games&lt;/a&gt;,
&lt;a href=&quot;https://aws.amazon.com/blogs/gametech/tag/aws-game-development/&quot;&gt;AWS game development&lt;/a&gt;,
&lt;a href=&quot;https://aws.amazon.com/blogs/gametech/tag/aws-game-tech/&quot;&gt;AWS Game Tech&lt;/a&gt;,
&lt;a href=&quot;https://aws.amazon.com/blogs/gametech/tag/unity/&quot;&gt;Unity&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/ol&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;&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/2022/09/13/jenkins-contributor-summit-2022-agenda-orlando-florida/</id>
<title>Jenkins Contributor Summit 2022 Agenda - Orlando, Florida</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-09-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/09/13/jenkins-contributor-summit-2022-agenda-orlando-florida/" />
<category term='contributor-summit'></category>
<category term='events'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='devopsworld2022'></category>
<summary>
We wanted to share the agenda to the Contributor Summit in Orlando, Florida - as it stands at the moment.


Entry fee:

No cost to attend. Sign up via the sign up sheet (room capacity: 30).
Event is in person only.



Location:

Orlando World Center Marriott: 8701 World Center Dr, Orlando, FL 32821 (Room: Magnolia 19)



Key dates:



Sept 27 - Contributor Summit @ 9AM - 5PM


Sept 28 &amp; 29 - Main conference (use discount code: DW22JENKINSRTE)





Contact



SIG - Advocacy &amp; Outreach


Contact - Alyssa Tong and Bruno Verachten


Community via community forum





Description

The Jenkins Contributor Summit brings together current and future contributors to the Jenkins project. At this event we...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/Jenkins-DevOps.png&quot; alt=&quot;Jenkins DevOps&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We wanted to share the agenda to the Contributor Summit in Orlando, Florida - as it stands at the moment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;entry-fee&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#entry-fee&quot; /&gt;Entry fee:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No cost to attend. Sign up via the &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLSfg0t1iAlfyBU5GS9ihJy67gWTSIlr261NnqOGcc40nkrjb3w/viewform?usp=sf_link&quot;&gt;sign up sheet&lt;/a&gt; (room capacity: 30).
Event is in person only.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;location&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#location&quot; /&gt;Location:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Orlando World Center Marriott: 8701 World Center Dr, Orlando, FL 32821 (Room: Magnolia 19)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;key-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-dates&quot; /&gt;Key dates:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sept 27 - Contributor Summit @ 9AM - 5PM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sept 28 &amp;amp; 29 - &lt;a href=&quot;https://reg.devopsworld.com/flow/cloudbees/devopsworld22/Landing/page/welcome&quot;&gt;Main conference&lt;/a&gt; (use discount code: &lt;strong&gt;DW22JENKINSRTE&lt;/strong&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;contact&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contact&quot; /&gt;Contact&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/sigs/advocacy-and-outreach/&quot;&gt;SIG - Advocacy &amp;amp; Outreach&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contact - Alyssa Tong and Bruno Verachten&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Community via &lt;a href=&quot;https://community.jenkins.io/t/jenkins-contributor-summit-2022-agenda-orlando-florida/3579&quot;&gt;community forum&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;description&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#description&quot; /&gt;Description&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor Summit brings together current and future contributors to the Jenkins project. At this event we will talk about the current state of the project and its future evolution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The summit will include project updates by the Governance Board, working and special interest groups. We will also organize breakout sessions to discuss key initiatives in the project and its roadmap. Topics include but are not limited to: architecture changes, Jenkins Security, Cloud Native Jenkins, interoperability, documentation, and user experience. We will also have lightning talks and demos of the new and upcoming Jenkins features. We will also organize a track for newcomer contributors who want to participate in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;agenda&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#agenda&quot; /&gt;Agenda&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Intro, summit overview - 3 min - Bruno Verachten&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;State of Jenkins - one of Jenkins Board members, 7 min - Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Project/SIG Updates, 5-10 min each. SIG leaders, officers, et al. to summarize the current state&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Release officer - Tim Jacomb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security officer - Wadeck Follonier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure officer - Damien Duportal&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Platform SIG - Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events officer - Alyssa Tong&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation officer - Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Advocacy and Outreach SIG - Mark Waite &amp;amp; Jean-Marc Meessen&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Google Summer of Code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;She Code Africa&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User Experience SIG - Tim Jacomb &amp;amp; Jan Faracik&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What’s next for Java - Mark Waite&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 17&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin health scoring project - Jake Leon&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Inspiring plugin health improvements by scoring the current status&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ignite Talks / Demos&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Darin Pope&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Volunteers from audience&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rapidly build and test your iOS Apps with Jenkins on EC2 Mac - Sudhir Reddy [10 mim]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Migrating Jenkins Unity CI/CD build farms to AWS EC2 Mac instances - Sergey Kruson [10 min]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;End user presentations/demos (5 min each]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline experiences - how they use Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mobile development - Bruno Verachten&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Administering large Jenkins instances - Damien Duportal&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pre-built Jenkins test configurations with Docker - Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choosing your tests wisely - Kohsuke Kawaguchi (tbc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security - Wadeck Follonier&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hacktoberfest and onboarding new contributors - Jean-Marc &amp;amp; Bruno Verachten&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Future of Jenkins&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;UI - Jan Faracik &amp;amp; Tim Jacomb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Testing improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Internationalization and localization - Mark Waite and Alexander Brandes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;First time contributor tasks - Mark Waite &amp;amp; Darin Pope&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More cloud&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re in the neighborhood please join us and meet the many Jenkins contributors and users. We look forward to seeing you there!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alyssa Tong and Bruno Verachten&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/09/07/jenkinsfile-runner-as-github-actions/</id>
<title>A near Feature-complete version of Jenkinsfile Runner Actions as GitHub Actions</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-09-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/09/07/jenkinsfile-runner-as-github-actions/" />
<author>
<name>YimingGong</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2022'></category>
<category term='jenkinsfile-runner'></category>
<category term='github-actions'></category>
<summary>
Abstract


Jenkinsfile Runner Action for GitHub Actions aims at providing customized environments and useful GitHub Actions for the users.
Therefore, users can execute the Jenkins pipeline in the GitHub Actions runners.
It enables running Jenkins pipelines in a Function-as-a-Service context.
Users can customize their environment by setting up base images, configuring the Jenkins Configuration-as-Code plugin,
extending vanilla images or providing initial hooks for the temporary Jenkins controller.
Several examples about how to set up secrets, Jenkins plugins and integrate with other GitHub Actions can be seen below.
This project is based on the Jenkinsfile runner, which is a command line tool for the Jenkins pipeline execution engine.




Implementation


Jenkinsfile...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;abstract&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#abstract&quot; /&gt;Abstract&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkinsfile Runner Action for GitHub Actions aims at providing customized environments and useful GitHub Actions for the users.
Therefore, users can execute the Jenkins pipeline in the GitHub Actions runners.
It enables running Jenkins pipelines in a Function-as-a-Service context.
Users can customize their environment by setting up base images, configuring the Jenkins Configuration-as-Code plugin,
extending vanilla images or providing initial hooks for the temporary Jenkins controller.
Several examples about how to set up secrets, Jenkins plugins and integrate with other GitHub Actions can be seen below.
This project is based on the &lt;a href=&quot;https://github.com/jenkinsci/jenkinsfile-runner/&quot;&gt;Jenkinsfile runner&lt;/a&gt;, which is a command line tool for the Jenkins pipeline execution engine.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;implementation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementation&quot; /&gt;Implementation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkinsfile Runner Action for GitHub Actions help users fetch necessary dependencies,
and wrap the entrypoint for Jenkinsfile Runner in one GitHub Action.
Users can use them in the workflow definitions just like other GitHub Actions.
Based on this big idea, I developed five GitHub Actions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;runtime-type-actions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#runtime-type-actions&quot; /&gt;Runtime type actions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These actions run the pipeline in the GitHub Actions runners host machines directly.&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;jfr-setup-action&lt;/code&gt; - It’s used to set up the Jenkins environment, including but not limited to Jenkins core, plugin installation manager and Jenkinsfile Runner.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jfr-plugin-installation-action&lt;/code&gt; - Users can use it to install extra plugins. &lt;code&gt;jfr-setup-setup&lt;/code&gt; needs to be run before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jfr-runtime-action&lt;/code&gt; - It runs the Jenkins pipeline in the host machine. &lt;code&gt;jfr-setup-setup&lt;/code&gt; needs to be run before.&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;container-type-actions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#container-type-actions&quot; /&gt;Container type actions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These actions run the pipeline in the customized container.&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;jfr-container-action&lt;/code&gt; - It runs the Jenkins pipeline in the declared container.
As the prebuilt container is declared in advance, it can integrate with other GitHub Actions theoretically.
It’s based on the idea of &lt;a href=&quot;https://docs.github.com/en/actions/using-jobs/running-jobs-in-a-container&quot;&gt;Running jobs in a container&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jfr-static-image-action&lt;/code&gt; - It runs the Jenkins pipeline in the runtime built container.
It doesn’t need to declare the container in advance so users cannot use other GitHub Actions except using &lt;code&gt;actions/checkout&lt;/code&gt; to set up the workspace.
But the users can override the base image by providing the docker image URL.
For instance, if users want to combine the Jenkins environment with nodejs environment, they can use &lt;code&gt;node:18.3.0&lt;/code&gt; as input.
It’s based on the idea of &lt;a href=&quot;https://docs.github.com/en/actions/creating-actions/creating-a-docker-container-action#introduction/&quot;&gt;GitHub Docker container action&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 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;When I started to write code based on my previous proposal, I found my implementation is different from the expectation of the maintainer and the mentors.
What I wanted to do is make Jenkinsfile runner capable of generating necessary configurations for users.
So they can use these configuration files to complete their Jenkinsfile runner actions.
However, this method will couple the configuration generation step with Jenkinsfile runner which is a command line tool for Jenkins pipeline execution engine.
The maintainer and the mentors proposed to make several useful GitHub Actions instead of coupling this unnecessary logic into Jenkinsfile runner.
Therefore, I changed my project plan based on their advice and worked on developing the GitHub Actions for Jenkinsfile runner.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this stage, I developed &lt;code&gt;jfr-container-action&lt;/code&gt; and &lt;code&gt;jfr-static-image-action&lt;/code&gt;, which run in the customized containers.
Its main advantage is that most dependencies are prepared in advance in the container.
I also made several useful options in Jenkinsfile runner available in our GitHub actions such as the initial hook option.
To make users get started in our actions quickly, I refactored the documentation several times,
and created several useful examples.
It is worth noting that my examples aim at applying Jenkins pipeline in GitHub Actions runner which is a FaaS context.&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 phase, I found current actions can only be supported by GitHub Actions Linux runner.
Then I decided to develop the runtime type actions so they can run in all kinds of GitHub Actions runners.
Its advantages are obvious.
The runtime type actions are &lt;code&gt;jfr-setup-action&lt;/code&gt;, &lt;code&gt;jfr-plugin-installation-action&lt;/code&gt; and &lt;code&gt;jfr-runtime-action&lt;/code&gt;.
These actions will download all the dependencies at the runtime compared to container type actions&#39; behavior.
Its main disadvantage is the possibility of suffering from a download center outage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What’s more, I kept developing examples for the actions and updated the documentation.
As the project and documentation grow infinitely, I decided to split my project into several subprojects,
and host the documentation including the user guide and developer guide on the GitHub Pages.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;deliverables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliverables&quot; /&gt;Deliverables&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I write a &lt;a href=&quot;https://jenkinsci.github.io/jfr-action-doc&quot;&gt;central documentation page&lt;/a&gt; above the interface, basic usage, advanced usage, demos and developer guide for these Jenkinsfile-runner GitHub actions.
If you feel confused about the definitions or examples, you can check the documentation page mentioned above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-use-jfr-container-action&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-use-jfr-container-action&quot; /&gt;How to use jfr-container-action&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The user needs to declare the image usage of &lt;code&gt;ghcr.io/jenkinsci/jenkinsfile-runner:master&lt;/code&gt; at the start of the job.
Then the user can call this action by using &lt;code&gt;jenkinsci/jfr-container-action@master&lt;/code&gt;.
Because the runner declares the container environment at the start,
other GitHub Actions can also run with &lt;code&gt;jfr-container-action&lt;/code&gt; theoretically.&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;CI&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;on&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;nv&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;jfr-container-action-pipeline&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ghcr.io/jenkinsci/jenkinsfile-runner:master&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;steps&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;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Jenkins pipeline in the container&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;s&quot;&gt;jenkinsci/jfr-container-action@master&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;run&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;jenkinsfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Jenkinsfile&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;pluginstxt&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;plugins.txt&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;jcasc&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jcasc.yml&lt;/span&gt;&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;how-to-use-jfr-static-image-action&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-use-jfr-static-image-action&quot; /&gt;How to use jfr-static-image-action&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jfr-static-image-action&lt;/code&gt; can also run the pipeline in the container.
But the users don’t need to declare the container by themselves like &lt;code&gt;jfr-container-action&lt;/code&gt;.
Instead, &lt;code&gt;jfr-static-image-action&lt;/code&gt; wraps the preparation and invocation of a customized container.
Therefore, the users cannot use other GitHub Actions except using &lt;code&gt;actions/checkout&lt;/code&gt; to set up the workspace.
The users can call this action by using &lt;code&gt;jenkinsci/jfr-static-image-action@master&lt;/code&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;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;CI&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;on&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;nv&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;jfr-static-image-action-pipeline&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;steps&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;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Jenkins pipeline in the container&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;s&quot;&gt;jenkinsci/jfr-static-image-action@master&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;run&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;jenkinsfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Jenkinsfile&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;pluginstxt&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;plugins.txt&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;jcasc&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jcasc.yml&lt;/span&gt;&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;how-to-use-jfr-runtime-action-with-other-supporting-runtime-type-actions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-use-jfr-runtime-action-with-other-supporting-runtime-type-actions&quot; /&gt;How to use jfr-runtime-action with other supporting runtime type actions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jfr-runtime-action&lt;/code&gt; will run the pipeline in the host machine directly.
The users need to use &lt;code&gt;jfr-setup-action&lt;/code&gt; in advance.
If the users want to install extra plugins, they can use &lt;code&gt;jfr-plugin-installation-action&lt;/code&gt;.
The advantage of &lt;code&gt;jfr-runtime-action&lt;/code&gt; is that it can run in all kinds of runners provided by GitHub Actions.&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;CI&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;on&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;nv&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;jfr-runtime-action-pipeline&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;strategy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;matrix&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;os&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;nv&quot;&gt;ubuntu-latest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;macOS-latest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;windows-latest&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${{matrix.os}}&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jfr-runtime-action-pipeline&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;steps&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;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Setup Jenkins&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;s&quot;&gt;jenkinsci/jfr-runtime-action@master&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Jenkins plugins download&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;s&quot;&gt;jenkinsci/jfr-plugin-installation-action@master&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;pluginstxt&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;plugins.txt&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Run Jenkins pipeline&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;s&quot;&gt;jenkinsci/jfr-runtime-action@master&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;run&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;jenkinsfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Jenkinsfile&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;reflection&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reflection&quot; /&gt;Reflection&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The most valuable lesson I learned in GSoC is not about how to write code.
It’s about the method of communicating with other people in the Jenkins community.
When I was new in the Jenkins community, I kept making assumptions when I communicate with my mentors and project maintainers.
Therefore, it’s easy for them to misunderstand my idea.
The best way of communication in Jenkins open source community is over-explanation.
Sometimes, people who lack background information cannot understand your ideas about a specific topic.
Therefore, providing some extra explanations or descriptions is necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second lesson I learned is still about communication.
When you feel confused about the words under a specific context, it’s better to ask the contributors or your mentors directly instead of spending plenty of time by yourself.
The people in Jenkins open source community are always willing to give you the answers.
Furthermore, if you have obstacles or milestones when developing the tools or plugins, it’s still necessary to ask the community developers first instead of making the decisions arbitrarily.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-links&quot; /&gt;Project 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://jenkinsci.github.io/jfr-action-doc&quot;&gt;Central documentation page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jfr-setup-action&quot;&gt;jfr-setup-action repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jfr-plugin-installation-action&quot;&gt;jfr-plugin-installation-action repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jfr-runtime-action&quot;&gt;jfr-runtime-action repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jfr-container-action&quot;&gt;jfr-container-action repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jfr-static-image-action&quot;&gt;jfr-static-image-action repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/08/31/DW_java11_performance/</id>
<title>Moving Jenkins to a New Frontier of Performance with Java 11 - DevOps World 2022</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/08/31/DW_java11_performance/" />
<category term='events'></category>
<category term='contribute'></category>
<category term='performance'></category>
<category term='java11'></category>
<category term='devopsworld'></category>
<category term='devopsworld2022'></category>
<summary>
It&#8217;s 2022, and the Jenkins project is approaching 18 years old, boasts over 1,800 plugins and over 1 million users around the world, and is widely considered the most popular automation server in use today.
The latest hurdle we&#8217;ve cleared was delivering Java 11 support, partially motivated by Oracle&#8217;s ending of public support for Java 8 back in March of 2022.


Starting as a hack-a-thon project in 2018, the Jenkins community announced full support
for Java 11 in March of 2019, and new versions of Jenkins since the June 2022 release now require Java 11.


So what does this mean exactly?
Well, for starters, Java...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s 2022, and the Jenkins project is approaching 18 years old, boasts over 1,800 plugins and over 1 million users around the world, and is widely considered the most popular automation server in use today.
The latest hurdle we’ve cleared was delivering Java 11 support, partially motivated by Oracle’s ending of public support for Java 8 back in March of 2022.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting as a &lt;a href=&quot;https://www.jenkins.io/blog/2018/06/08/jenkins-java10-hackathon/&quot;&gt;hack-a-thon&lt;/a&gt; project in 2018, the Jenkins community &lt;a href=&quot;https://www.jenkins.io/blog/2019/03/11/let-s-celebrate-java-11-support/&quot;&gt;announced full support&lt;/a&gt;
for Java 11 in March of 2019, and new versions of Jenkins since the &lt;a href=&quot;https://www.jenkins.io/blog/2022/06/28/require-java-11/&quot;&gt;June 2022 release now require Java 11&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So what does this mean exactly?
Well, for starters, Java 8 was released in 2014 and had become outdated in terms of new features and security enhancements that were happening in many key third-party libraries consumed by the Jenkins project.
The requirements to move to Java 9, Java 10, or Java 11 were becoming more and more painful from a development standpoint.
This led to an &lt;a href=&quot;https://www.oracle.com/java/technologies/java-se-support-roadmap.html&quot;&gt;unprecedented response from Oracle&lt;/a&gt;, stating they would extend fee-based support for JDK8 into 2030.
However, the benefits of moving to newer versions of Java were clear, most notably surrounding performance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;java-memory-management&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-memory-management&quot; /&gt;Java memory management&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s one of the core tenets of the programming language, removing the complexity of memory management from the developer’s responsibilities.
At the core of the JVM (Java Virtual Machine) is the garbage collector.
The garbage collector frees up memory when objects are no longer needed, allowing space for new objects to be created.
While the G1GC garbage collector is our recommended GC for Jenkins, it was not the default for Java 8.
Only in Java 9 and later did G1GC become default.
Now with Java 11 there are many improvements to the G1GC collector which deliver significant gains in performance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join us at DevOps World in-person this year in Orlando, Florida, where Dylan Dewhurst and I will be presenting our learnings about the benefits of moving Jenkins from Java 8 to Java 11.
We will provide data showing the performance improvements this shift has brought.
We will showcase some experimental garbage collectors that we hope to see utilized in the next generation of JVM’s, and we will show you how to move your Jenkins instance from Java 8 to Java 11 successfully.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/DW_2022.png&quot; alt=&quot;DW 2022&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/08/26/jenkins-design/</id>
<title>See what&#39;s next for the Jenkins user interface - DevOps World 2022</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-08-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/08/26/jenkins-design/" />
<category term='events'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='user-experience'></category>
<category term='devopsworld'></category>
<category term='devopsworld2022'></category>
<summary>
This is a speaker blogpost for a DevOps World 2022 talk in Orlando, Florida










... at the 'Transformation of the Jenkins User Interface and Where it’s Going Next' talk at DevOps World 2022, Thursday, September 29 10:45 AM - 11:30 AM EDT.


We&#8217;ll be giving a talk on the history of the Jenkins user interface, where we stand today, and a look into the future of where we plan to take Jenkins.


Expect to hear about the lessons we&#8217;ve learned and the challenges we&#8217;re tackling as we update Jenkins for the modern web.


Topics include:




A brief history of the Jenkins UI


What&#8217;s wrong with the...
</summary>
<content type='html'>
&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;
This is a speaker blogpost for a DevOps World 2022 talk in Orlando, Florida
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/jenkins-redesign-preview.png&quot; alt=&quot;jenkins redesign preview&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;... at the &lt;em&gt;&#39;Transformation of the Jenkins User Interface and Where it’s Going Next&#39;&lt;/em&gt; talk at &lt;a href=&quot;https://events.devopsworld.com/widget/cloudbees/devopsworld22/conferenceSessionDetails?tab.day=20220929&amp;amp;search.tracks=1621547690784001M6Z8&quot;&gt;DevOps World 2022&lt;/a&gt;, Thursday, September 29 10:45 AM - 11:30 AM EDT.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll be giving a talk on the history of the Jenkins user interface, where we stand today, and a look into the future of where we plan to take Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Expect to hear about the lessons we’ve learned and the challenges we’re tackling as we update Jenkins for the modern web.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Topics include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A brief history of the Jenkins UI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What’s wrong with the current UI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The work we’re doing currently&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Live demo showcasing a futuristic Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/UX discussions of Jenkins please 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;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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/08/19/dw-community-presentations/</id>
<title>6 Can’t Miss Jenkins Sessions from DevOps World 2022</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-08-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/08/19/dw-community-presentations/" />
<category term='events'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='devopsworld2022'></category>
<summary>
For the first time in three years, the Jenkins community and Jenkins users will be united at DevOps World 2022 on September 27-29, 2022 in beautiful Orlando, Florida. (It really is a magical place.)







Following Jenkins' recent move to Java 11 and significant security advisories for plugin users, the Jenkins community has the opportunity to come together to discuss Jenkins success stories, what&#8217;s to come for Jenkins, and novel uses of the leading open source automation server.


With 30 sessions for Jenkins users and 100+ sessions total on software delivery best practices, DevOps World has a lot to offer DevOps engineers, managers...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the first time in three years, the Jenkins community and Jenkins users will be united at &lt;a href=&quot;https://events.devopsworld.com/widget/cloudbees/devopsworld22/conferenceSessionDetails?tab.day=20220927&amp;amp;search=jenkins&quot;&gt;DevOps World 2022&lt;/a&gt; on September 27-29, 2022 in beautiful Orlando, Florida. (It really is a magical place.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/DW_2022.png&quot; alt=&quot;DW 2022&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following Jenkins&#39; recent move to Java 11 and significant security advisories for plugin users, the Jenkins community has the opportunity to come together to discuss Jenkins success stories, what’s to come for Jenkins, and novel uses of the leading open source automation server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With &lt;strong&gt;30 sessions for Jenkins users and 100+ sessions total on software delivery best practices&lt;/strong&gt;, DevOps World has a lot to offer DevOps engineers, managers in shared services, and leaders alike.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a quick look at six sessions our Jenkins teams are interested in:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ask Me Anything About the Jenkins Infrastructure&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thursday, September 29 | 1:45 PM - 2:15 PM EDT&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Members of the Jenkins Infrastructure team will answer any question you have about the infrastructure, its model, tools, or processes.
Learn how this team handles daily updates of multiple Jenkins controllers and their plugins and more than 50 dependency updates per week.
If you have any questions around security processes, infrastructure as code, onboarding, or tooling, the team will answer them.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;How did we reduce 35% Jenkins failures at Broadcom&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Wednesday, September 28 | 4:15 PM - 4:30 PM EDT&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Learn how Broadcom’s Centralized Tools team, supporting 600+ engineers with thousands of Jenkins jobs daily, used a data-led approach to accelerate CI/CD efforts and reduced CI/CD failure by 35 percent while reducing resources needed.
Leave the session understanding the five-step process and tooling and types of analytics you need to replicate their success.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Moving Jenkins to a New Frontier of Performance with Java 11&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thursday, September 29 | 2:45 PM - 3:30 PM EDT&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this session, you will learn about Jenkins&#39; transition from Java 8 to Java 11, the performance benefits that come with and discuss performance tuning Jenkins for Java 11.
We will also take a deep dive into how garbage collection works in Java 11 and share the results of our performance experiments based on the new ZGC and Shenandoah garbage collectors.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Naively Building Android Apps with Jenkins. Not Natively, Naively.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Wednesday, September 28 | 4:15 PM - 5:00 PM EDT&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the end of this session, you should be able to start CI/CD for Android app development at home with an unconventional method.
Embark with Bruno on an adventure full of joys, frustrations, discoveries, but above all learning.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Jenkins Plugin Health Scoring System&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thursday, September 29 | 1:45 PM - 2:30 PM EDT&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a Jenkins administrator, or an engineer working in a shared service team, choosing which plugins of the 1800+ plugins to use in your controller is pretty difficult.
Learn how the Plugin Health score - which reviews all plugins on different data points like security, stability, administrative metrics, code, and testing quality - can help you evaluate new plugins before installing them.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Transformation of the Jenkins User Interface and Where it’s Going Next&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thursday, September 29 | 10:45 AM - 11:30 AM EDT&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join this session for an overview of the Jenkins user interface covering its past, what it looks like currently, and where it is headed.
Review the lessons learned as the Jenkins UI evolved and get a preview of the future state, including how plugin developers can integrate these changes using the new Jenkins Design Library.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And last but not least, one of my contributions to DevOps World…&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Contributing to Open Source Workshops&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Wednesday, September 28 | 10:45 AM - 12:15 PM EDT&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join this 90-minute pre-conference workshop for insight into how to create useful and positive contributions to an open source project and learn more about Jenkins plugins, Java, and GitHub. Participants will &quot;learn by doing&quot; as they confirm that their changes are useful, correct, and complete.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;For more details on the Jenkins-focused sessions, or the 100+ other sessions on modern software delivery, XOps, digital transformation, supply chain security, or cloud, check out the &lt;a href=&quot;https://events.devopsworld.com/widget/cloudbees/devopsworld22/conferenceSessionDetails?tab.day=20220926&quot;&gt;DevOps World 2022 Agenda&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/08/11/plugin-health-scoring/</id>
<title>Plugin Health Scoring at DevOps World 2022</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-08-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/08/11/plugin-health-scoring/" />
<category term='events'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='devopsworld2022'></category>
<summary>
About


In the Jenkins ecosystem, there are over 1800 plugins.
The plugins are not equal in terms of their quality, maintenance or support.
As an instance administrator or an engineer working in a shared service team, determining which plugins are of good quality can be complicated.
When someone asks you to install a plugin, what should you check before installing it?
If you are a maintainer, what should you prioritize and focus on first when improving your plugin?


It’s really easy to get lost, confused and just install any plugin requested.
This leads to instances running plugins that are not supported by anyone, having instances with hundreds...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/Jenkins-DevOps.png&quot; alt=&quot;Jenkins DevOps&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about&quot; /&gt;About&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Jenkins ecosystem, there are over 1800 plugins.
The plugins are not equal in terms of their quality, maintenance or support.
As an instance administrator or an engineer working in a shared service team, determining which plugins are of good quality can be complicated.
When someone asks you to install a plugin, what should you check before installing it?
If you are a maintainer, what should you prioritize and focus on first when improving your plugin?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s really easy to get lost, confused and just install any plugin requested.
This leads to instances running plugins that are not supported by anyone, having instances with hundreds of plugins, while most of them are not really used.
All this makes the upgrade process more complicated, creates regressions, and leads to general displeasure.
Is there a better way to indicate the quality and activity of a plugin?
We think so.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;google-summer-of-code-2022&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-summer-of-code-2022&quot; /&gt;Google Summer of Code 2022&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this year’s Google Summer of Code event, &lt;a href=&quot;https://www.jenkins.io/blog/authors/alecharp/&quot;&gt;Adrien Lecharpentier&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/adi10hero/&quot;&gt;Aditya Srivastava&lt;/a&gt;, and myself have been working with contributor &lt;a href=&quot;https://www.jenkins.io/blog/authors/dheerajodha/&quot;&gt;Dheeraj Singh Jodha&lt;/a&gt; on building the foundation for a &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/projects/plugin-health-scoring-system/&quot;&gt;Plugin Health Scoring System&lt;/a&gt; for Jenkins plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The idea of this system is to come up with a composite score for each plugin.
This final score will be calculated from multiple probes that cover every area of what makes a great plugin; such as maintainer activity, security, open bugs, automation, code coverage and other best practices.
Each of these probes will have different weights, commonly agreed upon by the Jenkins community, associated with them as some probes are more important than others at any given time.
One key aspect we are keeping in mind while building the foundation is the flexibility and adaptability of changing these probes.
This is extremely important for this project, for as time goes on, probes will be removed or added, weights of the probes will change as best practices get more widely adopted across the plugin ecosystem and new ways of doing things inevitably become mainstream.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whether you are the end user getting a more secure, stable, and quality plugin, administrator being more informed on the plugins, or open source maintainers getting more guidance on how to make an awesome plugin, we think that the plugin health scoring system will be a net benefit to the Jenkins project and provide value to various roles and people.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;date-location&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#date-location&quot; /&gt;Date | Location&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;Thursday, September 29, 2022 @ 1:45PM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://reg.devopsworld.com/flow/cloudbees/devopsworld22/Landing/page/welcome&quot;&gt;DevOps World 2022 | Orlando, Florida&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;&lt;a href=&quot;https://github.com/ryecb&quot;&gt;Runxia Ye&lt;/a&gt; and myself will be presenting this topic at this year’s DevOps World 2022.
Join us on Thursday, September 29th at 1:45 pm for this presentation where we will discuss in detail the ins and outs of this project and the benefits it will bring to the Jenkins community.
We also welcome you to provide feedback on our project’s &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_GSoC-Plugin_Health_Score:gitter.im&quot;&gt;Gitter channel&lt;/a&gt; and follow the project on &lt;a href=&quot;https://github.com/jenkins-infra/plugin-health-scoring&quot;&gt;GitHub&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/2022/08/05/manage-jenkins-agents-with-podtemplate/</id>
<title>Manage Jenkins agents with Kubernetes native PodTemplate</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-08-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/08/05/manage-jenkins-agents-with-podtemplate/" />
<author>
<name>linuxsuren</name>
</author>
<category term='casc'></category>
<summary>
Jenkins has great integration with Kubernetes. No matter the controller or agents, they all work well in Kubernetes Pods.
Configuration as Code is an awesome idea.
People don’t need to open the UI page of Jenkins again and again.
We can put all the
system configuration into a git repository. You might already feel tired to edit a super huge Kubernetes YAML file if there are
many many Jenkins agents that need to be maintained. It’s pretty likely to make a mistake in a big YAML file.


I’m going to provide a solution to make our life easier maintaining Jenkins .
You only need to update a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has great integration with Kubernetes. No matter the controller or agents, they all work well in Kubernetes Pods.
&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Configuration as Code&lt;/a&gt; is an awesome idea.
People don’t need to open the UI page of Jenkins again and again.
We can put all the
system configuration into a git repository. You might already feel tired to edit a super huge Kubernetes YAML file if there are
many many Jenkins agents that need to be maintained. It’s pretty likely to make a mistake in a big YAML file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m going to provide a solution to make our life easier maintaining Jenkins .
You only need to update a ConfigMap if you want to make
any changes to the Jenkins system configuration. And you only need to create a Kubernetes native PodTemplate resource if you want
to add a new Jenkins agent. To achieve this goal, you only need to install an extra Kubernetes deployment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please allow me to show you how to do it. Before going forward, let’s assume you already have a Kubernetes cluster, and you have
enough permission to access the relevant resources.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Firstly, put all the Jenkins system config into a ConfigMap, such as:&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;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;jenkins_user.yaml&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;s&quot;&gt;jenkins:&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;mode: EXCLUSIVE&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;numExecutors: 0&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;scmCheckoutRetryCount: 2&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;disableRememberMe: true&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;clouds:&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;- kubernetes:&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;name: &quot;kubernetes&quot;&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;serverUrl: &quot;https://kubernetes.default&quot;&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;skipTlsVerify: true&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ConfigMap&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkins-casc-config&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kubesphere-devops-system&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;Secondly, let your Jenkins load its configuration from a ConfigMap. Please see also the following important parts:&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;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;containers&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;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ghcr.io/linuxsuren/jenkins:lts&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;env&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;CASC_JENKINS_CONFIG&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;value&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;/var/jenkins_home/casc_configs/&quot;&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# loading config file from a directory that was mount from a ConfigMap&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;volumeMounts&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;mountPath&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/var/jenkins_home/casc_configs&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;casc-config&lt;/span&gt;                                 &lt;span class=&quot;c1&quot;&gt;# mount from a volume&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;volumes&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;configMap&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;defaultMode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;420&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkins-casc-config&lt;/span&gt;                         &lt;span class=&quot;c1&quot;&gt;# clamin a ConfigMap volume, all the CasC YAML content will be here&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;casc-config&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;then, the core part is the Kubernetes controller. Please see the following code snippet:&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;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;apps/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Deployment&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkins-agent&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kubesphere-devops-system&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;containers&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;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kubespheredev/devops-controller:dev-v3.2.1-rc.3-6726130&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;controller&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;s&quot;&gt;--enabled-controllers&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;all=false,jenkinsagent=true,jenkinsconfig=true&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# only enable the necessary features of this controller&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 controller will watch all the PodTemplates (containing the label &lt;code&gt;jenkins.agent.pod&lt;/code&gt;), then convert it to Jenkins-style PodTemplate, merge it into
the CasC YAML file finally.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When everything is setup, you can try to add a Kubernetes native PodTemplate. A few seconds later, you can use it in your Pipeline.
Considering there are many potential technical details, I already put all the necessary files to &lt;a href=&quot;https://github.com/devops-ws/learn-kustomization/tree/main/jenkins&quot;&gt;this git repository&lt;/a&gt;.
Please feel free to maintain &lt;a href=&quot;https://github.com/kubesphere/ks-devops/tree/master/controllers/jenkins/config&quot;&gt;this project&lt;/a&gt; if it
is helpful in your work.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/08/04/expanding-open-source-in-Africa/</id>
<title>Expanding Open Source in Africa</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-08-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/08/04/expanding-open-source-in-Africa/" />
<author>
<name>markewaite</name>
</author>
<category term='devopsworld'></category>
<category term='devopsworld2022'></category>
<category term='events'></category>
<category term='community'></category>
<category term='documentation'></category>
<category term='outreach-programs'></category>
<category term='contributing'></category>
<summary>
Open source software has changed software development.
Companies readily use open source as a key part of their software development and delivery.
Open source operating systems dominate cloud computing operating systems.
Open source JavaScript libraries and frameworks like Angular, Vue.js, and React are key components in web applications.
Open source Java libraries and frameworks like Spring Framework, Spring Boot, Hibernate, and Grails provide effective and powerful foundations for development.
Open source Java development tools like Apache Maven, Jenkins, and Visual Studio Code improve developer productivity.


Open source software relies on open source contributors to maintain and improve it.
Unfortunately, open source contributions are not evenly distributed throughout...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open source software has changed software development.
Companies readily use open source as a key part of their software development and delivery.
Open source operating systems dominate cloud computing operating systems.
Open source JavaScript libraries and frameworks like Angular, Vue.js, and React are key components in web applications.
Open source Java libraries and frameworks like Spring Framework, Spring Boot, Hibernate, and Grails provide effective and powerful foundations for development.
Open source Java development tools like Apache Maven, Jenkins, and Visual Studio Code improve developer productivity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Open source software relies on open source contributors to maintain and improve it.
Unfortunately, open source contributions are not evenly distributed throughout the world.
Areas with more developed software organizations also tend to contribute more to open source software.
We’re working to increase open source contributions from Africa, one project at a time.&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/authors/zaycodes/&quot;&gt;Zainab Daodu&lt;/a&gt;, Omotola Omotayo, and &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Mark Waite&lt;/a&gt; will present &quot;Expanding open source in Africa&quot; at &lt;a href=&quot;https://reg.devopsworld.com/flow/cloudbees/devopsworld22/landing/page/welcome&quot;&gt;DevOps World 2022&lt;/a&gt;.
Join us on Thursday, September 29, 2022 in Orlando as we share our experiences and help you find ways that you can help expand open source in Africa.
The presentation will share what we’ve learned while running outreach efforts to help more African contributors work in open source.
We’ll include highlights from the Jenkins project involvement in She Code Africa Contributhon 2022.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;she-code-africa-contributhon-2022&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#she-code-africa-contributhon-2022&quot; /&gt;She Code Africa Contributhon 2022&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://sites.google.com/shecodeafrica.org/contributhon&quot;&gt;She Code Africa Contributhon&lt;/a&gt; is a boot camp where African women are paid to work with open source organizations on selected projects with dedicated mentors.
This program aims to create a more diverse, inclusive, and innovative culture within the African open source ecosystem by matching African women in technology with sponsor and mentor open source organizations.
The 6 mentees joining the Jenkins project come from Nigeria, Kenya, and Ghana.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2022 &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/outreach-programs/#she-code-africa-contributhon&quot;&gt;Contributhon&lt;/a&gt; brought 3 different projects to the Jenkins community:&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;#inclusive-naming&quot;&gt;Inclusive naming&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#screenshot-updates&quot;&gt;Screenshot updates&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#pipeline-help&quot;&gt;Pipeline help&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;New contributors developed their skills by submitting GitHub pull requests and working with mentors to improve those pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;She Code Africa also provided a &lt;a href=&quot;#project-manager&quot;&gt;project manager&lt;/a&gt; to oversee all the projects.
This was our first experience with a project manager for a She Code Africa project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;inclusive-naming&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#inclusive-naming&quot; /&gt;Inclusive naming&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2016 the Jenkins project switched to use the term &quot;agent&quot; to describe worker nodes.
Inclusive naming changes were approved in 2020 to use the term &quot;controller&quot; for the central Jenkins process that orchestrates work on agents.
Additional naming changes include the use of &quot;allowlist&quot; and &quot;denylist&quot; rather than their less inclusive alternatives.
Those inclusive naming changes have been moving through the Jenkins plugin code base, but there is plenty of work yet to do.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Catherine Kiiru and Peace Okafor worked with the Jenkins project to identify source code locations where inclusive naming could be applied safely.
The &lt;a href=&quot;https://docs.google.com/spreadsheets/d/11Iv2wW3GQinrZ408YZ_MwGEokWqZqv0p3Iycv6rmwhI/edit?usp=sharing&quot;&gt;inclusive naming planning sheet&lt;/a&gt; guided their efforts and provides a reference for further inclusive naming improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Catherine Kiiru&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/catherine-kiiru.jpg&quot; alt=&quot;Catherine Kiiru&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Peace Okafor&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/peace-okafor.jpg&quot; alt=&quot;Peace Okafor&quot; width=&quot;250px&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;screenshot-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#screenshot-updates&quot; /&gt;Screenshot updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins user interface has been significantly improved over the course of the past 18 months of development.
However, the documentation screenshots had not been updated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Somaa Chukwu worked with the Jenkins project to review the documentation screenshots and identified the outdated screenshots.
She used the &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1hudD8cK_ySs0r6wnZHf-GFqOaDFIHL3stvvXUbacXjY/edit#gid=0&quot;&gt;outdated screenshots&lt;/a&gt; worksheet to submit pull requests.
Somaa’s &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pulls?q=is%3Apr+is%3Aclosed+author%3Asomaathetechster&quot;&gt;screenshot updates&lt;/a&gt; helped the Jenkins project while she was learning more about Jenkins, git, and GitHub pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Somaa Chukwu&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/somaa-chukwu.jpg&quot; alt=&quot;Somaa Chukwu&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The screenshot updates project was continued by &lt;a href=&quot;https://www.jenkins.io/blog/authors/kmartens27/&quot;&gt;Kevin Martens&lt;/a&gt;.
Documentation screenshots are now current with the Jenkins 2.346.x LTS line.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;pipeline-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-help&quot; /&gt;Pipeline help&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/&quot;&gt;Pipeline Steps Reference&lt;/a&gt; and Pipeline online help often receive &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1nA8xVOkyKmZ8oTYSLdwjborT0w-BpBNNZT0nxR9deZ8/edit#gid=1087292709&quot;&gt;feedback&lt;/a&gt; that more examples are needed, that step return values need to be described, and that arguments need more description of their purpose, allowed values, and expected results.
Most plugin maintainers do not provide detailed documentation of the pipeline steps, or the arguments to those pipeline steps.
The Pipeline help project improves the documentation of pipeline steps and their arguments while introducing Jenkins Pipeline, Jenkins plugin development, Jenkins documentation as code, and the concepts of GitHub forks and pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We used the &lt;a href=&quot;https://docs.google.com/document/d/1AG437RU_ZLuhfbJJNj3ZSXllrFg_bYbru5x0rPq_u2c/edit?usp=sharing&quot;&gt;project plan&lt;/a&gt; to guide the improvements to several plugins, including the git plugin, the http request plugin, the Pipeline build step plugin, and the input step plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Afi Gbadago&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/afi-gbadago.jpg&quot; alt=&quot;Afi Gbadago&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Sophia Okito&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/sophia-okito.jpg&quot; alt=&quot;Sophia Okito&quot; width=&quot;250px&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;project-manager&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-manager&quot; /&gt;Project manager&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nafeesat was our project manager.
She coordinated the work from each of the three projects.
She assured that we met regularly and that we had good plans for the projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Nafeesat Jimoh&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/nafeesat-jimoh.jpg&quot; alt=&quot;Nafeesat Jimoh&quot; width=&quot;250px&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;mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mentors&quot; /&gt;Mentors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re very grateful to the mentors from the Jenkins project that are hosting mentoring sessions, reviewing pull requests, and encouraging the mentees.
Thanks to:&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/ajard/&quot;&gt;Angélique Jard&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kmartens27&quot;&gt;Kevin Martens&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/kwhetstone/&quot;&gt;Kristin Whetstone&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/markewaite/&quot;&gt;Mark Waite&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;We also thank &lt;a href=&quot;https://www.jenkins.io/blog/authors/zaycodes/&quot;&gt;Zainab Daodu&lt;/a&gt; of She Code Africa for her efforts to facilitate the Contributhon and encourage participation.&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/2022/08/01/building-naively-android/</id>
<title>Naively Building Android Apps with Jenkins. Not Natively, Naively. - DevOps World 2022</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-08-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/08/01/building-naively-android/" />
<category term='devopsworld'></category>
<category term='devopsworld2022'></category>
<category term='android'></category>
<category term='mobile'></category>
<summary>
This is a speaker blogpost for a DevOps World 2022 talk in Orlando, Florida





Come join me at DevOps World 2022 for "Naively Building Android Apps with Jenkins. Not Natively, Naively.", a talk about my journey with Jenkins while trying to build and publish Android applications without prior Jenkins knowledge.


I&#8217;ve been tinkering with various CI/CD tools for years (Gitlab CI, Circle CI, Travis CI, Shippable, Github Actions, &#8230;&#8203;) but not with Jenkins for whatever reason.


I&#8217;ve been supporting since 2014 mobile application developers through the use of gitlab-ci.


For DevOpsWorld 2022, I&#8217;ve been given a challenge: what if I tried to replicate that...
</summary>
<content type='html'>
&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;
This is a speaker blogpost for a DevOps World 2022 talk in Orlando, Florida
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come join me at &lt;a href=&quot;https://events.devopsworld.com/widget/cloudbees/devopsworld22/conferenceSessionDetails?tab.day=20220928&quot;&gt;DevOps World 2022&lt;/a&gt; for &lt;em&gt;&quot;Naively Building Android Apps with Jenkins. Not Natively, Naively.&quot;&lt;/em&gt;, a talk about my journey with Jenkins while trying to build and publish Android applications without prior Jenkins knowledge.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been tinkering with various CI/CD tools for years (Gitlab CI, Circle CI, Travis CI, Shippable, Github Actions, …​) but not with Jenkins for whatever reason.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been supporting since 2014 mobile application developers through the use of gitlab-ci.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For DevOpsWorld 2022, I’ve been given a challenge: what if I tried to replicate that well oiled gitlab-centric machinery that I had built for years this time with Jenkins?
At least…​ Could I mimic a subset of the functionality of my previous work without knowing anything about Jenkins?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To spice things up a bit, I might as well refrain from looking at what has already been done elsewhere; thus, I may end up with a shaky solution, or even a functional system that can be replicated at will.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Topics will include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;What does one need to build an Android application?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When your only tool is a hammer, everything looks like a nail (an ode to containerization)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Credentials and authentication&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From Docker to the Cloud?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quality Assurance, Tests, and Deployment&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/2022-08-01-naively-building-android/BuildingAndroidAppsNaively.png&quot; alt=&quot;BuildingAndroidAppsNaively&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
This is not a definitive guide to build an Android application with Jenkins, more like a roadmap to my journey with Jenkins…​ with takeaways from my experience.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come join me for the presentation in Orlando!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/07/27/jenkins-contributor-summit-at-devops-world-2022-call-for-participation/</id>
<title>Jenkins Contributor Summit at DevOps World 2022  - Call for Participation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-07-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/07/27/jenkins-contributor-summit-at-devops-world-2022-call-for-participation/" />
<category term='events'></category>
<category term='community'></category>
<category term='contribute'></category>
<category term='devopsworld2022'></category>
<summary>
About


The Jenkins Contributor Summit brings together current and future contributors to the Jenkins project. It is a community driven event, with its agenda created with input and suggestions from Jenkins community members.




Date | Location




Tuesday, September 27, 2022 @ 9AM - 5PM


DevOps World 2022 | Orlando, Florida


This Contributor Summit will be in-person.
It is Free to attend. Sign up is required. Seats are limited. Conference registration is not required to attend the Contributor Summit. However there is a fee to attend the DevOps World conference.









Call for Participation


We invite anyone interested to join us in the planning, organization and/or speak at the contributor...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/Jenkins-DevOps.png&quot; alt=&quot;Jenkins DevOps&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about&quot; /&gt;About&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor Summit brings together current and future contributors to the Jenkins project. It is a community driven event, with its agenda created with input and suggestions from Jenkins community members.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;date-location&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#date-location&quot; /&gt;Date | Location&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;Tuesday, September 27, 2022 @ 9AM - 5PM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://reg.devopsworld.com/flow/cloudbees/devopsworld22/Landing/page/welcome&quot;&gt;DevOps World 2022 | Orlando, Florida&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This Contributor Summit will be in-person.
It is Free to attend. Sign up is required. Seats are limited. Conference registration is not required to attend the Contributor Summit. However there is a fee to attend the DevOps World conference.&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;a class=&quot;image&quot; href=&quot;https://docs.google.com/forms/d/e/1FAIpQLSfg0t1iAlfyBU5GS9ihJy67gWTSIlr261NnqOGcc40nkrjb3w/viewform&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/register-button.png&quot; alt=&quot;register button&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&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;We invite anyone interested to join us in the planning, organization and/or speak at the contributor summit. Please reach out to us via &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_advocacy-and-outreach-sig:gitter.im&quot;&gt;Gitter -Advocacy-and-Outreach SIG&lt;/a&gt; and or join the discussion at &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt;. Please use the contributor-summit label. You can find all the related topics using the search query. &lt;a href=&quot;https://community.jenkins.io/t/jenkins-contributor-summit-in-orlando-fl-on-september-27-2022-agenda-is-available/3104&quot;&gt;Main Discussion Thread&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;proposed-agenda&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#proposed-agenda&quot; /&gt;Proposed Agenda&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is an initial draft of the agenda, additional input and participation is welcomed and appreciated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We plan to talk about the current state of the project and its future evolution. Project updates will be provided by the Governance Board, working and special interest groups. We will also organize breakout sessions to discuss key initiatives in the project and its roadmap. Topics include but are not limited to: architecture changes, Jenkins Security, Cloud Native Jenkins, interoperability, documentation, and user experience. We will also have lightning talks and demos of the new and upcoming Jenkins features. We can also organize a track for newcomer contributors who want to participate in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Intro words, summit overview - Bruno Verachten&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;State of Jenkins - Mark Waite&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Major news&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Project/SIG Updates - SIG leaders, Officers&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Release officer - Tim Jacomb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security - Wadeck Follonier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Infra - Damien Duportal&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Platform - Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events - Alyssa Tong&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Outreach SIG - Mark Waite &amp;amp; Jean-Marc Meessen&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GSoC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;She Code Africa&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation - Mark Waite &amp;amp; Kevin Martens&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I18n, L10n&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User Experience - Tim Jacomb &amp;amp; Jan Faracik&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What’s next for Java - Mark Waite&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 11&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Active support ends 30 Sep 2023&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security support ends 30 Sep 2026&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 17&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Active support ends 30 Sep 2026&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security support ends 30 Sep 2031&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin health scoring project - Jake Leon &amp;amp; Adrien Lecharpentier&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Inspiring plugin health improvements by scoring the current status&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ignite Talks / Demos - PARTICIPANTS NEEDED&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;End user presentations/demos&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pipeline experiences&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mobile development&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Administering large Jenkins instances - Damien Duportal&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pre-built Jenkins test configurations with Docker - Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choosing your tests wisely&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security - Wadeck Follonier&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hacktoberfest and onboarding new contributors - Jean-Marc Meessen &amp;amp; Bruno Verachten&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Future of Jenkins&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;UI - Jan Faracik &amp;amp; Tim Jacomb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Testing improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Internationalization and localization&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;First time contributor tasks&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Making Jenkins cloudier&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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/2022/06/28/require-java-11/</id>
<title>Jenkins requires Java 11 or newer</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-06-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/06/28/require-java-11/" />
<author>
<name>basil</name>
</author>
<category term='announcement'></category>
<category term='core'></category>
<category term='developer'></category>
<category term='jenkins'></category>
<category term='platform-sig'></category>
<summary>
Introduction





The Jenkins project is committed to delivering a world-class platform experience for end users and developers alike.
At the core of this experience is Java, an object-oriented programming language with a cross-platform runtime in the form of the Java virtual machine (JVM).
Since its inception, the Jenkins project has been a major consumer of Java, distributing over 1,800 plugins to an installed base of over 300,000 controllers,
and Jenkins regularly appears on lists of the top Java applications of all time.


Beginning with Jenkins 2.357 (released on June 28, 2022) and the forthcoming 2.361.1 LTS release, Jenkins requires Java 11 or newer.
Additionally, beginning with...
</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;&lt;span class=&quot;image right center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-06-require-java-11/jenkins-requires-java-11.png&quot; alt=&quot;Jenkins requires Java 11&quot; width=&quot;400px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project is committed to delivering a world-class platform experience for end users and developers alike.
At the core of this experience is &lt;a href=&quot;https://www.java.com/&quot;&gt;Java&lt;/a&gt;, an &lt;a href=&quot;https://dl.acm.org/doi/10.1145/154766.155364&quot;&gt;object-oriented&lt;/a&gt; programming language with a cross-platform runtime in the form of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Java_virtual_machine&quot;&gt;Java virtual machine (JVM)&lt;/a&gt;.
Since its inception, the Jenkins project has been a major consumer of Java, distributing over 1,800 plugins to an installed base of over 300,000 controllers,
and Jenkins regularly appears on &lt;a href=&quot;https://blogs.oracle.com/javamagazine/post/the-top-25-greatest-java-apps-ever-written&quot;&gt;lists of the top Java applications of all time&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Beginning with Jenkins 2.357 (released on June 28, 2022) and the forthcoming 2.361.1 LTS release, Jenkins requires Java 11 or newer.&lt;/strong&gt;
Additionally, beginning with Jenkins 2.355 (released on June 14, 2022) and Jenkins 2.346.1 LTS (released on June 22, 2022), Jenkins supports Java 17.
Plugins have already been prepared in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/68446&quot;&gt;JENKINS-68446&lt;/a&gt;.
&lt;strong&gt;Use the Plugin Manager to upgrade all plugins before &lt;em&gt;and&lt;/em&gt; after upgrading to Jenkins 2.357.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Long-time Jenkins users and Java developers may recall previous migrations to Java 7 and Java 8.
While these migrations were not trivial, they pale in comparison to the magnitude of the migration to Java 9 and beyond.
Java 9 represents a &lt;a href=&quot;https://en.wikipedia.org/wiki/Sea_change_(idiom)&quot;&gt;sea change&lt;/a&gt; in the Java ecosystem across many dimensions.
Not only are there changes to licensing policies, versioning schemes, release cadences, and long-term support (LTS) cycles,
but also there are a number of significant technical changes to the language and runtime (e.g., &lt;a href=&quot;https://openjdk.org/projects/jigsaw/&quot;&gt;Project Jigsaw&lt;/a&gt;),
not all of them retaining the high levels of compatibility that characterized previous releases.
Although these evolutionary changes are likely to be in the best interests of the Java community in the long term,
it is nevertheless incumbent on the community to be aware of the impact and to plan accordingly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post, we will discuss the Jenkins project’s migration to Java 11 and Java 17,
reflecting on it in the context of previous Java migrations within the Jenkins project and the Java community more broadly.
We will summarize the benefits and risks and describe the upgrade process.
Finally, we will share a glimpse at what is coming in future releases.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;history&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#history&quot; /&gt;History&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since its inception in 2005, the Jenkins (then Hudson) project has gone through a number of Java migrations.
To a large degree, the present migration is consistent with historical precedent within the Jenkins project.
For years the Jenkins project has published &lt;a href=&quot;http://stats.jenkins.io&quot;&gt;anonymous usage statistics&lt;/a&gt;,
as described in &lt;a href=&quot;https://brokenco.de/2019/05/23/jenkins-usage-stats.html&quot;&gt;a piece by R. Tyler Croy&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkins-infra/jenkins-usage-stats&quot;&gt;recently revised by Andrew Bayer&lt;/a&gt;,
which enable us to quantify past and present trends.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;data&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#data&quot; /&gt;Data&lt;/h3&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/2022-06-require-java-11/jvms.png&quot; alt=&quot;JVMS by Date&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;analysis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#analysis&quot; /&gt;Analysis&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The above data reveals that the lifecycle of each major Java version is clearly a Gaussian function.
Each major version of Java is released by the vendor,
begins a phase of rapidly growing adoption,
reaches a usage peak,
loses support from the Jenkins project,
begins a decline in usage,
declines in usage to a terminal state,
and finally reaches vendor end-of-life (EOL),
in roughly that order.&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: 20%;&quot;&gt;
&lt;col style=&quot;width: 20%;&quot;&gt;
&lt;col style=&quot;width: 20%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Java 6&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Java 7&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Java 8&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Java 11&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Vendor release date&lt;/p&gt;&lt;/th&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;December 11, 2006&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;July 7, 2011&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;March 18, 2014&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;September 25, 2018&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Rapid adoption&lt;/p&gt;&lt;/th&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;October 2009&lt;br&gt;
(11,193 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;February 2013&lt;br&gt;
(10,997 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;February 2015&lt;br&gt;
(12,210 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;November 2019&lt;br&gt;
(10,094 installations)&lt;/br&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Peak usage&lt;/p&gt;&lt;/th&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;March 2013&lt;br&gt;
(47,244 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;June 2015&lt;br&gt;
(68,681 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;February 2021&lt;br&gt;
(261,468 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;N/A&lt;/p&gt;&lt;/td&gt;
&lt;/td&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Jenkins weeklies require next major version&lt;/p&gt;&lt;/th&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;May 2015&lt;br&gt;
(21,798 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;April 2017&lt;br&gt;
(40,569 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;June 2022&lt;br&gt;
(185,286 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;N/A&lt;/p&gt;&lt;/td&gt;
&lt;/td&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Terminal decline in usage&lt;/p&gt;&lt;/th&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;May 2016&lt;br&gt;
(10,283 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;March 2019&lt;br&gt;
(10,123 installations)&lt;/br&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;N/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;N/A&lt;/p&gt;&lt;/td&gt;
&lt;/td&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Vendor End of Life (EOL)&lt;/p&gt;&lt;/th&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;December 31, 2015&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;July 31, 2019&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;a href=&quot;https://adoptium.net/support/&quot;&gt;At least November 2026&lt;/a&gt;&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;a href=&quot;https://adoptium.net/support/&quot;&gt;At least October 2024&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Extrapolating further, one can observe the following trends:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It takes at least a year for Jenkins users to begin to adopt a new release of Java.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once Jenkins users begin to adopt a new version of Java, usage of the preceding Java version eventually reaches a peak and begins to decline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Jenkins project has historically started requiring a new Java version roughly halfway through the period of decline of the preceding Java version.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once Jenkins requires a given Java version, usage of the preceding Java version continues to decline until it reaches a terminal stage of decline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The abovementioned terminal stage of decline typically correlates with the end of active support from the Java vendor.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;Conclusion&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Critically, the Jenkins project has never required a given version of Java until the preceding version is clearly declining in usage.
This reduces risk by ensuring that the majority of users are successfully running the new version in production.
Conversely, the requirement of a new Java version for Jenkins users incentivizes the remaining users to upgrade
and prevents users who are reluctant to upgrade from putting the project at risk by continuing to rely on a version that is reaching vendor end-of-life (EOL).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The requirement for Java 11 is consistent with historical precedent.
Usage of Java 8 peaked in February 2021 and has been declining since then.
Meanwhile, adoption of Java 11 has been increasing rapidly since November 2019 but has not yet reached a peak.
The time is right to require Java 11.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-new-era-for-java&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-new-era-for-java&quot; /&gt;A new era for Java&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The release of Java 9 heralded a new era in the evolution of the Java Platform.
In addition to new features (e.g., &lt;a href=&quot;https://openjdk.org/projects/jigsaw/&quot;&gt;Project Jigsaw&lt;/a&gt;), it introduced a new versioning scheme and release cadence.
Originally, there was a new major version released every few years.
After Java 9, the release schedule changed to a new major version every six (6) months, with a Long Term Support (LTS) release of Java selected every few major versions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java-8-forever-always&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-8-forever-always&quot; /&gt;Java 8, Forever &amp;amp; Always?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Members of the Jenkins community, spearheaded by Oleg Nenashev, &lt;a href=&quot;https://www.jenkins.io/blog/2018/06/08/jenkins-java10-hackathon/&quot;&gt;began working on Java 11 support in 2018&lt;/a&gt;.
At the time, Java 9, 10, and 11 had not yet achieved significant levels of adoption.
In &lt;a href=&quot;https://engineering.linkedin.com/blog/2022/linkedin-s-journey-to-java-11&quot;&gt;a piece on LinkedIn’s journey to Java 11&lt;/a&gt;, Jesse Jie provides the following anecdote:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
As an anecdote, some sessions at the Oracle Code One conference in late 2019 asked attendees if their products were using Java 9 or higher
to which only about 20% of the room said that they were; few major companies had adopted Java 11 either.
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Jesse Jie
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These observations match our own experience in the Jenkins project.
Many users are choosing to stay on Java 8, and Java vendors are responding in turn by extending support for Java 8:
to May 2026 (in the case of &lt;a href=&quot;https://adoptium.net/support/&quot;&gt;Adoptium&lt;/a&gt;, &lt;a href=&quot;https://aws.amazon.com/corretto/faqs/&quot;&gt;Amazon Corretto&lt;/a&gt;, and &lt;a href=&quot;https://www.ibm.com/support/pages/semeru-runtimes-support&quot;&gt;IBM Semeru&lt;/a&gt;) and to December 2030 (in the case of &lt;a href=&quot;https://www.azul.com/products/azul-support-roadmap/&quot;&gt;Azul&lt;/a&gt; and &lt;a href=&quot;https://www.oracle.com/java/technologies/java-se-support-roadmap.html&quot;&gt;Oracle&lt;/a&gt;).
This is an unprecedented level of support for a version of Java originally released in 2014.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the Jenkins project could remain on Java 8 for the foreseeable future, this would be imprudent for several reasons.
First, many key third-party libraries consumed by the Jenkins project (e.g., &lt;a href=&quot;https://www.eclipse.org/jetty/&quot;&gt;Jetty&lt;/a&gt;, &lt;a href=&quot;https://www.eclipse.org/jgit/&quot;&gt;JGit&lt;/a&gt;, &lt;a href=&quot;https://spring.io/blog/2021/09/02/a-java-17-and-jakarta-ee-9-baseline-for-spring-framework-6&quot;&gt;Spring Framework&lt;/a&gt;, and &lt;a href=&quot;https://spring.io/projects/spring-security&quot;&gt;Spring Security&lt;/a&gt;) are beginning to require newer versions of Java,
and staying on Java 8 puts the Jenkins project at risk of eventually not being able to receive security updates from upstream projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Furthermore, significant runtime improvements have been made to the Java Platform in recent years.
For example, LinkedIn saw &lt;a href=&quot;https://engineering.linkedin.com/blog/2022/linkedin-s-journey-to-java-11&quot;&gt;drastic performance improvements&lt;/a&gt; when migrating to Java 11,
and Adoptium saw &lt;a href=&quot;https://twitter.com/sxaTech/status/1537764804416380929&quot;&gt;significant memory usage improvements&lt;/a&gt; when migrating to Java 11 (on Jenkins, no less!).
Recent Java runtimes provide a number of improvements to &lt;a href=&quot;https://www.cs.cmu.edu/~fp/courses/15411-f07/misc/gc-survey.pdf&quot;&gt;garbage collection&lt;/a&gt;, among other areas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, Jenkins takes pride in its strong development community, and staying on a current version of Java helps attract and retain developers.
As one developer put it in &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/sw_WepGw0Pk/m/L_UN2jWUXW4J&quot;&gt;a 2015 mailing list post&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
In the context of recruiting (OSS) developers, I think Java moves slowly enough (especially cf. C#) to damage its mindshare
without additionally making it all less fun by making everyone act like a corporate IT developer stuck on an obsolete platform.
That just drives people to work on CI systems that don’t have that constraint.
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Nigel Magnay
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;trouble-with-jaxb&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#trouble-with-jaxb&quot; /&gt;Trouble with JAXB&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Prior to Java 11, &lt;a href=&quot;https://github.com/eclipse-ee4j/jaxb-ri&quot;&gt;Java Architecture for XML Binding (JAXB)&lt;/a&gt; was part of the Java Platform, and one could use it without adding a third-party dependency.
Beginning with Java 11, JAXB is no longer a part of the Java Platform and requires adding a third-party dependency.
Thanks to work done several years ago by Baptiste Mathus and others, &lt;a href=&quot;https://plugins.jenkins.io/jaxb/&quot;&gt;a JAXB Jenkins plugin is available&lt;/a&gt;,
which provides the JAXB library to Jenkins plugins in the form of a plugin-to-plugin dependency.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The vast majority of plugins have already been prepared to support Java 11 via the JAXB plugin in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/68446&quot;&gt;JENKINS-68446&lt;/a&gt;.
Jenkins users need only upgrade plugins to compatible versions as documented in the &lt;strong&gt;Released As&lt;/strong&gt; field in Jira.
&lt;strong&gt;It is critical to use the Plugin Manager to upgrade all plugins before &lt;em&gt;and&lt;/em&gt; after upgrading to Jenkins 2.357.&lt;/strong&gt;
Failure to upgrade plugins to compatible versions may result in &lt;code&gt;ClassNotFoundException&lt;/code&gt;, &lt;code&gt;NoClassDefFoundError&lt;/code&gt;, or other low-level Java errors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dr-openjdk-or-how-i-learned-to-stop-worrying-and-love-java-9-and-beyond&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dr-openjdk-or-how-i-learned-to-stop-worrying-and-love-java-9-and-beyond&quot; /&gt;Dr. OpenJDK or: How I Learned to Stop Worrying and Love Java 9 and Beyond&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The world of Java development was shaken in 2019 when Oracle changed the licensing policy for Java 8.
Recent years have seen the proliferation of a number of different Java vendors:&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://adoptium.net/&quot;&gt;Adoptium&lt;/a&gt; (then &lt;a href=&quot;https://adoptopenjdk.net/&quot;&gt;AdoptOpenJDK&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://aws.amazon.com/corretto/&quot;&gt;Amazon Corretto&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.azul.com/products/core/&quot;&gt;Azul Platform Core&lt;/a&gt; (then Zulu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://bell-sw.com/pages/downloads/&quot;&gt;BellSoft Liberica JDK&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.ibm.com/languages/java/semeru-runtimes/&quot;&gt;IBM Semeru&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.microsoft.com/openjdk&quot;&gt;Microsoft OpenJDK&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.oracle.com/java/&quot;&gt;Oracle Java&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.redhat.com/products/openjdk/download&quot;&gt;Red Hat OpenJDK&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;Yes, even Microsoft now has a build of OpenJDK.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The presence of so many options can be initially daunting.
In recent years, the Jenkins project has been using and recommending Adoptium/Eclipse Temurin,
which is the Java vendor used in &lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins/&quot;&gt;the official Jenkins Docker images&lt;/a&gt; and the Java vendor used to power the &lt;a href=&quot;https://www.jenkins.io/projects/infrastructure/&quot;&gt;Jenkins project’s infrastructure&lt;/a&gt;.
Reciprocally, we are also pleased to note that Adoptium builds are done with Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java-11-vs-java-17&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-11-vs-java-17&quot; /&gt;Java 11 vs. Java 17&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the center of the vast majority of the abovementioned Java distributions is the &lt;a href=&quot;https://openjdk.org/&quot;&gt;OpenJDK&lt;/a&gt; project, which brings us to our final point.
Throughout the development of this project, we repeatedly encountered issues that were resolved in Java 17 but not yet backported to Java 11.
As good citizens of the open source community, we &lt;a href=&quot;https://github.com/openjdk/jdk11u-dev/pulls?q=author%3Abasil&quot;&gt;contributed backports where applicable for the benefit of Jenkins users and the broader Java community&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 17 support in Jenkins is brand new, and it has not yet reached a stage of rapid adoption within the Jenkins community.
Nevertheless, our experience has been that Java 17 is usually a more reliable choice than Java 11.
We enthusiastically invite the Jenkins community to begin adopting Java 17,
and we can say with confidence that the migration from Java 11 to Java 17 will not be nearly as painful as the migration from Java 8 to Java 11.&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;upgrading-to-java-11-or-17&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrading-to-java-11-or-17&quot; /&gt;Upgrading to Java 11 or 17&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;order-of-operations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#order-of-operations&quot; /&gt;Order of operations&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning with Jenkins 2.357 (released on June 28, 2022) and the forthcoming 2.361.1 LTS release,
Jenkins requires Java 11 or newer on both the controller JVM (i.e., the JVM running &lt;code&gt;jenkins.war&lt;/code&gt;) and agent JVMs (i.e., JVMs running &lt;code&gt;remoting.jar&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This does not imply that you need to build your application with the same version of Java.
You can continue to use any desired JDK to build your application,
so long as the JVM used for running Jenkins itself is version 11 or newer.
For example, the Global Tool Configuration page can still be used to provide a JDK 8 installation for building your application.
Similarly, you can set up ephemeral or static agents with two installations of Java:
Java 11 or newer to run &lt;code&gt;remoting.jar&lt;/code&gt; for Jenkins and Java 8 to build your application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since Jenkins 2.296, we have been recommending that users run the controller on Java 11.
Prior to Jenkins 2.357 and Jenkins 2.361.1, running the controller on Java 11 and agents on Java 8, though not recommended, did not result in errors.
Beginning with Jenkins 2.357 and Jenkins 2.361.1, running the controller on Java 11 and agents on Java 8 will result in the following error:&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;Error: A JNI error has occurred, please check your installation and try again
Exception in thread &quot;main&quot; java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Therefore, it is critical to upgrade both the controller &lt;em&gt;and&lt;/em&gt; agents to Java 11 or newer prior to upgrading Jenkins to 2.357 or 2.361.1.
Use the &lt;a href=&quot;https://plugins.jenkins.io/versioncolumn/&quot;&gt;Versions Node Monitors&lt;/a&gt; plugin to verify that agents are running a compatible version of Java.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;docker-images&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-images&quot; /&gt;Docker images&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The official Jenkins Docker images for &lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins/&quot;&gt;the controller&lt;/a&gt; and &lt;a href=&quot;https://hub.docker.com/r/jenkins/inbound-agent/&quot;&gt;agents&lt;/a&gt; have been based on Java 11 for many months,
with Java 8 available as a fallback and Java 17 available in preview mode.
Beginning with Jenkins 2.357, the Java 8 images will be retired and the Java 17 images will transition from preview to general availability (GA).
Users of the official Jenkins Docker images need not install or configure Java on their own, as it comes preinstalled in the image.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are using a Docker image to run both the agent Java process (i.e., &lt;code&gt;remoting.jar&lt;/code&gt;) and your own application build and your application build still requires Java 8,
you will need to provide a Java 11 or newer runtime for the Jenkins agent process and a Java 8 environment for your application build.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;os-packages&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#os-packages&quot; /&gt;OS packages&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users of the &lt;a href=&quot;https://www.jenkins.io/download/&quot;&gt;official Jenkins OS packages for Debian, Red Hat, and SUSE Linux distributions&lt;/a&gt; should note that these packages are agnostic to the Java vendor.
In other words, you must bring your own Java package.
One straightforward way to do this is to install Java 11 from your Linux distribution, as described on the package download site:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/debian/&quot;&gt;Debian&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;apt-get install fontconfig openjdk-11-jre&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/redhat/&quot;&gt;Red Hat&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;yum install fontconfig java-11-openjdk&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/opensuse/&quot;&gt;openSUSE&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;zypper install dejavu-fonts fontconfig java-11-openjdk&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By virtue of not requiring any custom repositories, this is certainly the simplest method (and the one used by the Jenkins project’s &lt;a href=&quot;https://github.com/jenkinsci/packaging/tree/f7c48c9bdc39bce6a8259403d97b0ce337084a37/molecule/default&quot;&gt;packaging tests&lt;/a&gt;),
but it does not give the user a high degree of control over the Java runtime environment.
As mentioned previously, the official Jenkins Docker images use Adoptium/Eclipse Temurin (as does the Jenkins infrastructure project).
Enthusiastic users may wish to install Java from Adoptium or another vendor.
Adoptium recently began providing Linux installation packages, as described in &lt;a href=&quot;https://blog.adoptium.net/2021/12/eclipse-temurin-linux-installers-available/&quot;&gt;a piece by George Adams&lt;/a&gt;.
Ultimately, the choice of which Java vendor to use is your own, as long as that vendor provides Java 11 or Java 17.
Refer to your chosen Java vendor for installation instructions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you have installed a suitable version of Java, configure Jenkins to use that Java runtime.
The most straightforward way is to configure that version of Java as the default version of Java at the operating system (OS) level:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/debian/&quot;&gt;Debian&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;update-alternatives --config java&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/redhat/&quot;&gt;Red Hat&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;alternatives --config java&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://pkg.jenkins.io/opensuse/&quot;&gt;openSUSE&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;update-alternatives --config java&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alternatively, users who do not wish to change the default version of Java can customize the &lt;code&gt;JAVA_HOME&lt;/code&gt; or &lt;code&gt;JENKINS_JAVA_CMD&lt;/code&gt; environment variable as part of the Jenkins &lt;code&gt;systemd(1)&lt;/code&gt; service unit.
Refer to the &lt;a href=&quot;https://www.jenkins.io/doc/book/system-administration/systemd-services/&quot;&gt;Managing systemd services&lt;/a&gt; section of the Jenkins documentation for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;garbage-collection-options&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#garbage-collection-options&quot; /&gt;Garbage collection options&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users who have customized Java garbage collection options should note that these options have changed in recent versions of Java.
Refer to the following &lt;a href=&quot;https://support.cloudbees.com/hc/en-us/articles/222446987-Prepare-Jenkins-for-Support&quot;&gt;CloudBees Support article&lt;/a&gt; for the recommended garbage collection options for Java 11:&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;-XX:+AlwaysPreTouch
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${PATH}
-XX:+UseG1GC
-XX:+UseStringDeduplication
-XX:+ParallelRefProcEnabled
-XX:+DisableExplicitGC
-XX:+UnlockDiagnosticVMOptions
-XX:+UnlockExperimentalVMOptions
-Xlog:gc*=info,gc+heap=debug,gc+ref*=debug,gc+ergo*=trace,gc+age*=trace:file=${PATH}/gc.log:utctime,pid,level,tags:filecount=2,filesize=100M
-XX:ErrorFile=${PATH}/hs_err_%p.log
-XX:+LogVMOutput
-XX:LogFile=${PATH}/jvm.log&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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;
These options are explained in-depth in the &lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE&quot;&gt;Oracle Java documentation&lt;/a&gt; as well as the &lt;a href=&quot;https://docs.cloudbees.com/docs/admin-resources/latest/jvm-troubleshooting/&quot;&gt;CloudBees Jenkins JVM guide&lt;/a&gt;.
&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;reporting-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporting-issues&quot; /&gt;Reporting issues&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you find a regression in a plugin, please file a bug report in Jira:&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://issue-redirect.jenkins.io/issue/67688&quot;&gt;JENKINS-67688: Java 11 Phase 5: Require Java 11 or newer&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;When reporting an issue, include the following information:&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;Use the &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/67688&quot;&gt;JENKINS-67688&lt;/a&gt; epic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the output of &lt;code&gt;java -version&lt;/code&gt; (e.g., OpenJDK 64-Bit Server VM build 11.0.15+10-Ubuntu-0ubuntu0.22.04.1)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the name, version, and architecture of the operating system you are using (e.g., Ubuntu 20.04.4 LTS x86_64).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the &lt;em&gt;complete&lt;/em&gt; list of installed plugins as suggested in the &lt;a href=&quot;https://www.jenkins.io/doc/book/system-administration/diagnosing-errors/#how-to-report-a-bug&quot;&gt;bug reporting guidelines&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the &lt;em&gt;complete&lt;/em&gt; stack trace, if relevant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide steps to reproduce the issue &lt;em&gt;from scratch&lt;/em&gt; on a minimal Jenkins installation; the scenario should fail on Jenkins 2.356 or earlier when the steps are followed on Java 11 or Java 17 and pass when the steps are followed on Java 8.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-work&quot; /&gt;Future work&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We expect to see usage of Java 11 continue to grow until it reaches a peak.
We expect to see usage of Java 8 continue to decline until it reaches a terminal state, as was the case for Java 7 and Java 6.
We expect to see usage of Java 17 transition from minimal levels to significant levels.
To reach our goal of Java 17 as the recommended Java version, we need cooperation from both Jenkins users and contributors alike.
The development work for Java 17 support is tracked in the following Jira epics:&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://issue-redirect.jenkins.io/issue/67908&quot;&gt;JENKINS-67908: Java 17 Phase 1: Support Java 17&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/67909&quot;&gt;JENKINS-67909: Java 17 Phase 2: Deprecate support for Java 11&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/67907&quot;&gt;JENKINS-67907: Java 17 Phase 3: Require Java 17 or newer&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;If you have made it this far through this post, you are clearly enthusiastic about the Jenkins platform experience.
If you have never contributed, why not?
We would love to work with you.
Join one of our &lt;a href=&quot;https://www.jenkins.io/sigs/platform/&quot;&gt;Platform Special Interest Group (SIG)&lt;/a&gt; meetings to learn more.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion-2&quot; /&gt;Conclusion&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We expect to see a bit of disruption from these changes but hope that in the long term they will be in the best interests of the Jenkins community.
Please reach out on the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;developers&#39; list&lt;/a&gt; with any questions or suggestions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As noted above, members of the Jenkins community began working on Java 11 support in 2018, well before the present author’s involvement in the project
and well beyond the present author’s ability to identify and name everyone who was involved in the effort.
In addition to the many plugin maintainers who merged and released JAXB fixes in a timely fashion,
we would like to thank the following regular contributors for their recent efforts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Adrien Lecharpentier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alexander Brandes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alex Earl&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Andrew Bayer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Baptiste Mathus&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Carroll Chiou&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Damien Duportal&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Daniel Beck&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Devin Nusbaum&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dr. Ullrich Hafner&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jesse Glick&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kevin Martens&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oleg Nenashev&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Olivier Lamy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tim Jacomb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vincent Latombe&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you! It would not have been possible without you.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/col&gt;&lt;/col&gt;&lt;/col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;/table&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/2022/06/20/svg-icon-migration/</id>
<title>SVG icon migration (breaking changes!)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-06-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/06/20/svg-icon-migration/" />
<author>
<name>kmartens27</name>
</author>
<category term='svg-migration'></category>
<category term='community'></category>
<category term='ux'></category>
<summary>
Summary


Beginning with Jenkins weekly v2.333 (released on January 31, 2022) and Jenkins LTS v2.346.1, Jenkins core has upgraded from GIF and PNG icons to SVG icons.
Plugins that will be affected by this change are tracked in a spreadsheet found in JENKINS-68251.
Plugins that do not interact with icons are unaffected by this change.




Background


Scalable vector graphics (SVG) icons provide a more attractive user interface.
They are able to adapt to themes like the dark theme and the solarized theme.
The SVG icons provide a more consistent experience for users.
SVG images also preserve image quality, ensuring that icons are displayed properly regardless of scale.


Many plugins...
</summary>
<content type='html'>
&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;Beginning with Jenkins weekly v2.333 (released on January 31, 2022) and Jenkins LTS v2.346.1, Jenkins core has upgraded from &lt;code&gt;GIF&lt;/code&gt; and &lt;code&gt;PNG&lt;/code&gt; icons to &lt;code&gt;SVG&lt;/code&gt; icons.
Plugins that will be affected by this change are tracked in a &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1PxlgT11_uDyTzPch8zWn3PDxLUIAab21ILmJ17zCzBk/edit#gid=1308179162&quot;&gt;spreadsheet&lt;/a&gt; found in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/68251&quot;&gt;JENKINS-68251&lt;/a&gt;.
Plugins that do not interact with icons are unaffected by this change.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Scalable vector graphics (SVG) icons provide a more attractive user interface.
They are able to adapt to themes like the &lt;a href=&quot;https://plugins.jenkins.io/dark-theme/&quot;&gt;dark theme&lt;/a&gt; and the &lt;a href=&quot;https://plugins.jenkins.io/solarized-theme/&quot;&gt;solarized theme&lt;/a&gt;.
The SVG icons provide a more consistent experience for users.
SVG images also preserve image quality, ensuring that icons are displayed properly regardless of scale.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many plugins have been updated to use the new icons.
A &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1PxlgT11_uDyTzPch8zWn3PDxLUIAab21ILmJ17zCzBk/edit#gid=1308179162&quot;&gt;tracking spreadsheet&lt;/a&gt; lists plugins that have been reviewed for possible issues.
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/68251)&quot;&gt;JENKINS-68251&lt;/a&gt; is the Jenkins issue that tracks the change.
It contains a link to the &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1PxlgT11_uDyTzPch8zWn3PDxLUIAab21ILmJ17zCzBk/edit#gid=1308179162&quot;&gt;tracking spreadsheet&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Make sure that you update all plugins before and after updating to Jenkins 2.333 or later.&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;reporting-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporting-issues&quot; /&gt;Reporting issues&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the spreadsheet, there is a table labeled “Abandoned plugin, to be discussed”.&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/2022-06-svg-migration/abandoned-plugin.png&quot; alt=&quot;Abandoned plugin table label from spreadsheet.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The table contains plugins that have had no SCM activity for at least 5 years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When reviewing this table, if the list includes plugins that you are using, please contact the plugin maintainer to request an update to the plugin.
Many plugins already have a pull request submitted.
The pull request needs to be tested, merged, and released.
You can help the maintainer by testing the pull request and reporting the results of your testing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the maintainer has abandoned the plugin, please consider &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-governance/adopt-a-plugin/&quot;&gt;adopting the plugin&lt;/a&gt; yourself.
After adoption, use the &lt;a href=&quot;https://www.jenkins.io/doc/developer/views/icon-path-to-icon-class-migration/&quot;&gt;icon path to icon class migration instructions&lt;/a&gt; to update the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When &lt;a href=&quot;https://www.jenkins.io/participate/report-issue/redirect/&quot;&gt;reporting SVG icon migration issues&lt;/a&gt;, please provide the following information:&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;Use the ‘svg-migration’ label&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide configuration details as described in &lt;a href=&quot;https://www.jenkins.io/participate/report-issue/#Howtoreportanissue-Creatingtheissue&quot;&gt;&quot;How to report an issue&quot;&lt;/a&gt;, including Jenkins core version and the name and version of all installed plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Include a screenshot of the issue&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;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;While many of the commonly used plugins have already been updated for SVG icon usage, there are unmaintained plugins that could cause errors or breakages.
If you are in a situation where a plugin has been abandoned, adoption is the only way to ensure that there are no disruptions during usage.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/06/13/Let-the-coding-start/</id>
<title>Let the (GSoC) coding start !</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-06-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/06/13/Let-the-coding-start/" />
<category term='gsoc'></category>
<category term='gsoc2022'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
The GSoC community bonding period just finished.


The four Jenkins GSoC projects are now ready.
Contact between contributors and mentors is established.
Regular communication channels are setup (weekly project meetings and dedicated chat).
Links to the project plans and plannings drafts are published on the project pages.


Next step, the actual coding!


Together with their mentors, Dheeraj, Ymming, Hrushikesh, and Vihaan will work the whole summer on their respective projects.


End July, we will perform a public progress review.
During an online meetup, the GSoC contributors will present their project.
They will be invited to share what has been done to date.
And why not, make a first preliminary demo.
This...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The GSoC community bonding period just finished.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;four Jenkins GSoC projects&lt;/a&gt; are now ready.
Contact between contributors and mentors is established.
Regular communication channels are setup (weekly project meetings and dedicated chat).
Links to the project plans and plannings drafts are published on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;project pages&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next step, the actual coding!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Together with their mentors, Dheeraj, Ymming, Hrushikesh, and Vihaan will work the whole summer on their respective projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;End July, we will perform a public progress review.
During an online meetup, the GSoC contributors will present their project.
They will be invited to share what has been done to date.
And why not, make a first preliminary demo.
This is an opportunity for the community to comment, advise and become more involved with the project.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/05/27/docker-image-new-lifecycle/</id>
<title>Docker Image: new Exit and Restart Behavior for Controllers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-05-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/05/27/docker-image-new-lifecycle/" />
<category term='platform'></category>
<category term='docker'></category>
<summary>
The Jenkins project provides Docker images for controllers (and more).
Beginning with Jenkins 2.344 released April 18, 2022 and Jenkins 2.332.3 released May 04, 2022, the behavior of the "Exit" and "Restart" lifecycle of the controller image jenkins/jenkins changed.









TL;DR; Ensure that you have a Container Restart Policy


For quick readers: check the How to Add a Container Restart Policy section for immediate actions to be taken.






Application Lifecycle in a Container World


Jenkins previously restarted itself after upgrading plugins or via the /restart or /safeRestart endpoints by calling exec(2).
This was fragile and exposed users to a variety of bugs.


The ExitLifecycle implementation allows the main...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project provides Docker images for controllers (and more).
Beginning with &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.344&quot;&gt;Jenkins 2.344&lt;/a&gt; released April 18, 2022 and &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.332.3&quot;&gt;Jenkins 2.332.3&lt;/a&gt; released May 04, 2022, the behavior of the &quot;Exit&quot; and &quot;Restart&quot; lifecycle of the controller image &lt;code&gt;jenkins/jenkins&lt;/code&gt; changed.&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;TL;DR; Ensure that you have a Container Restart Policy&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For quick readers: check the &lt;a href=&quot;#how-to-add-a-container-restart-policy&quot;&gt;How to Add a Container Restart Policy&lt;/a&gt; section for immediate actions to be taken.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;application-lifecycle-in-a-container-world&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#application-lifecycle-in-a-container-world&quot; /&gt;Application Lifecycle in a Container World&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins previously restarted itself after upgrading plugins or via the &lt;code&gt;/restart&lt;/code&gt; or &lt;code&gt;/safeRestart&lt;/code&gt; endpoints by calling &lt;code&gt;exec(2)&lt;/code&gt;.
This was fragile and exposed users to a variety of bugs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;ExitLifecycle&lt;/code&gt; implementation allows the main process to exit normally before starting it again from scratch,
relying on the exit code to signal to the container orchestrator that the container ought to be restarted rather than to remain shut down.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avoiding &lt;code&gt;exec(2)&lt;/code&gt; from Java code, with all the associated complexity of closing file handles and making low-level system calls via JNA, eliminates exposure to a category of bugs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can read more about this on the following issues: &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5899&quot;&gt;jenkinsci/jenkins#5899&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/1268&quot;&gt;jenkinsci/docker#1268&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;delegate-restarts-to-the-container-engine&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#delegate-restarts-to-the-container-engine&quot; /&gt;Delegate Restarts to the Container Engine&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.344&quot;&gt;Jenkins Weekly 2.344&lt;/a&gt; and the &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.332.3&quot;&gt;Jenkins LTS 2.332.3&lt;/a&gt;, the Docker image for Jenkins controller uses the new lifecycle &lt;code&gt;ExitLifecycle&lt;/code&gt; by default.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It means that when the Jenkins controller triggers any &quot;restart&quot; or &quot;exit&quot; event, then its container exits.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are running Jenkins in a controller as a container, you should add a &lt;a href=&quot;https://docs.docker.com/config/containers/start-containers-automatically/&quot;&gt;&quot;container restart policy&quot;&lt;/a&gt; different than &lt;code&gt;none&lt;/code&gt; to ensure that the container is restarted automatically.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are running Jenkins in production in a container, chances are great that you already have a restart policy set and the change will be transparent.
But we updated the &lt;a href=&quot;https://github.com/jenkinsci/docker&quot;&gt;jenkinsci/docker documentation&lt;/a&gt; to mention that the flag &lt;code&gt;--restart=on-failure&lt;/code&gt; is set when starting a Jenkins controller container.&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-add-a-container-restart-policy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-add-a-container-restart-policy&quot; /&gt;How to Add a Container Restart Policy&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you do not have a &lt;a href=&quot;https://docs.docker.com/config/containers/start-containers-automatically/&quot;&gt;container restart policy&lt;/a&gt; defined, please find the different following methods depending on your container orchestrator:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker Engine, Docker Swarm: add the &lt;a href=&quot;https://docs.docker.com/engine/reference/run/#restart-policies---restart&quot;&gt;flag &lt;code&gt;--restart=on-failure&lt;/code&gt;&lt;/a&gt; to the &lt;code&gt;docker run &amp;lt;…​&amp;gt; jenkins/jenkins&lt;/code&gt; command.&lt;/p&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
No need to create a new container: you can use the command &lt;code&gt;docker update&lt;/code&gt; to &lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/update/#update-a-containers-restart-policy&quot;&gt;update the restart policy of an existing container&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker Compose: update your &lt;code&gt;docker-compose.yml&lt;/code&gt; file to specify the &lt;a href=&quot;https://docs.docker.com/compose/compose-file/#restart&quot;&gt;&lt;code&gt;restart: on-failure&lt;/code&gt; keyword&lt;/a&gt; (or the &lt;a href=&quot;https://docs.docker.com/compose/compose-file/deploy/#restart_policy&quot;&gt;&lt;code&gt;deploy.restart_policy&lt;/code&gt;&lt;/a&gt; if using &lt;code&gt;docker compose deploy&lt;/code&gt; to a Docker Swarm cluster)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you are using the official Jenkins helm-chart, make sure that you are using at least the version &lt;a href=&quot;https://github.com/jenkinsci/helm-charts/releases/tag/jenkins-3.10.3&quot;&gt;&lt;code&gt;3.10.3&lt;/code&gt;&lt;/a&gt; of the Helm chart and you’re good to go, as per &lt;a href=&quot;https://github.com/jenkinsci/helm-charts/issues/529&quot;&gt;jenkinsci/helm-charts#529&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otherwise, ensure that you configure the Deployment for Jenkins to specify the &lt;a href=&quot;https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy&quot;&gt;&lt;code&gt;OnFailure&lt;/code&gt; restart policy for the pods&lt;/a&gt;. Please note that it’s the default policy if unspecified.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hashicorp’s Nomad: Ensure that you specify a non-empty &lt;a href=&quot;https://www.nomadproject.io/docs/job-specification/restart&quot;&gt;&lt;code&gt;restart&lt;/code&gt; stanza&lt;/a&gt;. Please note that the &lt;a href=&quot;https://www.nomadproject.io/docs/job-specification/restart#restart-parameter-defaults&quot;&gt;default stanza behavior&lt;/a&gt; behaves as expected: Jenkins is restarted.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/05/20/gsoc2022-projects-announcement/</id>
<title>Welcome Google Summer of Code 2022 Contributors!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-05-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/05/20/gsoc2022-projects-announcement/" />
<category term='gsoc'></category>
<category term='gsoc2022'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
On behalf of the Jenkins GSoC team and mentors,
We would like to welcome
Dheeraj Singh Jodha,
Yiming Gong,
Hrushikesh Rao, and
Vihaan Thora.
They will be working on Google Summer of Code projects in the Jenkins organization,
and they have already done some contributions.


This year we have the following projects:




Plugin Health Scoring System -
Provide a 'plugin health indicator' for plugin maintainers and Jenkins administrators.



Contributor: Dheeraj Singh Jodha from India


Mentors: Jake Leon, Adrien Lecharpentier, and Aditya Srivastava





Jenkinsfile Runner Action for GitHub Actions -
Implement a (near) feature-complete version of Jenkinsfile Runner Action for GitHub Actions.



Contributor: Yiming Gong from Carnegie Mellon University, USA


Mentors: Kris Stern, Abhyudaya Sharma, and Shubham...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the Jenkins GSoC team and mentors,
We would like to welcome
&lt;a href=&quot;https://github.com/dheerajodha&quot;&gt;Dheeraj Singh Jodha&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Cr1t-GYM&quot;&gt;Yiming Gong&lt;/a&gt;,
&lt;a href=&quot;https://github.com/hrushi20&quot;&gt;Hrushikesh Rao&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/vihaanthora&quot;&gt;Vihaan Thora&lt;/a&gt;.
They will be working on Google Summer of Code projects in the Jenkins organization,
and they have already done some contributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we have the following projects:&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 Health Scoring System&lt;/strong&gt; -
Provide a &#39;plugin health indicator&#39; for plugin maintainers and Jenkins administrators.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Contributor: &lt;a href=&quot;https://github.com/dheerajodha&quot;&gt;Dheeraj Singh Jodha&lt;/a&gt; from India&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors: &lt;a href=&quot;https://www.jenkins.io/blog/authors/jleon&quot;&gt;Jake Leon&lt;/a&gt;, &lt;a href=&quot;https://github.com/alecharp&quot;&gt;Adrien Lecharpentier&lt;/a&gt;, and &lt;a href=&quot;https://github.com/ADI10HERO&quot;&gt;Aditya Srivastava&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkinsfile Runner Action for GitHub Actions&lt;/strong&gt; -
Implement a (near) feature-complete version of Jenkinsfile Runner Action for GitHub Actions.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Contributor: &lt;a href=&quot;https://github.com/Cr1t-GYM&quot;&gt;Yiming Gong&lt;/a&gt; from Carnegie Mellon University, USA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors: &lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Kris Stern&lt;/a&gt;, &lt;a href=&quot;https://github.com/AbhyudayaSharma&quot;&gt;Abhyudaya Sharma&lt;/a&gt;, and &lt;a href=&quot;https://github.com/imskr&quot;&gt;Shubham Kumar&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatic git cache maintenance on the controller&lt;/strong&gt; -
Automate the maintenance of cached git repositories on the Jenkins controller.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Contributor: &lt;a href=&quot;https://github.com/hrushi20&quot;&gt;Hrushikesh Rao&lt;/a&gt; from Jawaharlal Nehru Technological University, India&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors: &lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt; and &lt;a href=&quot;https://github.com/rishabhBudhouliya&quot;&gt;Rishabh Budhouliya&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pipeline Step Documentation Generator Improvements&lt;/strong&gt; -
&quot;Enhance the Jenkins Pipeline documentation generator to produce better documentation for thousands of Pipeline developers&quot;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Contributor: &lt;a href=&quot;https://github.com/vihaanthora&quot;&gt;Vihaan Thora&lt;/a&gt; from Indian Institute of Technology, Indore, India&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors: &lt;a href=&quot;https://github.com/kwhetstone&quot;&gt;Kristin Whetstone&lt;/a&gt;, &lt;a href=&quot;https://github.com/arpoch&quot;&gt;Harshit Chopra&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/koushartasneem&quot;&gt;Tasneem Koushar&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the next weeks project teams will be reaching out to potential stakeholders in order to establish connections and
to get comments regarding their project designs.
If you are interested in the projects, please join discussions in the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Developer mailing lists&lt;/a&gt; and project meetings once they get scheduled.
Please also expect expect more detailed blogposts about the projects soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested to know more about GSoC in Jenkins, you can find information, timeline and communication channels
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/05/13/mirrors/</id>
<title>Enforced HTTPS for &#39;mirrors.jenkins.io&#39; and consolidation of the Jenkins Mirrors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-05-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/05/13/mirrors/" />
<category term='infrastructure'></category>
<category term='mirrors'></category>
<category term='jenkins'></category>
<summary>
The Jenkins project provides a download mirror infrastructure allowing to download Jenkins packages and plugins from a download server close to your location.


How Does it Work?


When a download request is emitted to either mirrors.jenkins.io or get.jenkins.io, an HTTP redirect response to a mirror download server is answered.


The Jenkins infrastructure uses a database of existing mirror servers provided by volunteers and donators to select the closest mirror to your location:
this is currently the role of the distinct mirrors.jenkins.io and get.jenkins.io services.




Consolidation


The system behind mirrors.jenkins.io is using a software named "mirrorbrain" and was originally used by the Jenkins infrastructure to provide download...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project provides a download mirror infrastructure allowing to download Jenkins packages and plugins from a download server close to your location.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-does-it-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-does-it-work&quot; /&gt;How Does it Work?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When a download request is emitted to either &lt;code&gt;mirrors.jenkins.io&lt;/code&gt; or &lt;code&gt;get.jenkins.io&lt;/code&gt;, an HTTP redirect response to a mirror download server is answered.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins infrastructure uses a database of existing mirror servers provided by volunteers and donators to select the closest mirror to your location:
this is currently the role of the distinct &lt;code&gt;mirrors.jenkins.io&lt;/code&gt; and &lt;code&gt;get.jenkins.io&lt;/code&gt; services.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;consolidation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#consolidation&quot; /&gt;Consolidation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The system behind &lt;code&gt;mirrors.jenkins.io&lt;/code&gt; is using a software named &lt;a href=&quot;https://mirrorbrain.org/&quot;&gt;&quot;mirrorbrain&quot;&lt;/a&gt; and was originally used by the Jenkins infrastructure to provide download redirections to mirrors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A new system was introduced in 2020: &lt;code&gt;get.jenkins.io&lt;/code&gt;, using &lt;a href=&quot;https://github.com/etix/mirrorbits&quot;&gt;&quot;mirrorbits&quot;&lt;/a&gt; which is a great fit for a Kubernetes environment (lightweight, horizontally scalable) and provides a set of nice WebUI features to see the mirror list and grading.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;INFO: Try it by yourself, check the mirrors providing the latest Jenkins LTS distribution: &lt;a href=&quot;https://get.jenkins.io/war-stable/2.332.3/jenkins.war?mirrorlist&quot; class=&quot;bare&quot;&gt;https://get.jenkins.io/war-stable/2.332.3/jenkins.war?mirrorlist&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been 2 years and the new system is clearly the most reliable: that’s why we, the Jenkins Infrastructure team, want to retire the &quot;mirrorbrain&quot; system.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In consequence, the 19th of May 2022, the domain name &lt;code&gt;mirrors.jenkins.io&lt;/code&gt; will be changed to point to the actual &quot;mirrorbits&quot; system already available at &lt;code&gt;get.jenkins.io&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This consolidation ensures all users downloading a Jenkins package or a plugin will use the closest download mirror to their location, without having to maintain 2 distinct systems.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;enforced-https&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enforced-https&quot; /&gt;Enforced HTTPS&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main consequence is that the HTTPS protocol will be enforced for the request to the domain &lt;code&gt;mirrors.jenkins.io&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &quot;mirrorbrain&quot; system currently serving requests behind the domain &lt;code&gt;mirrors.jenkins.io&lt;/code&gt; is not available through HTTPS, which is a safety issue for users downloading files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 19th of May 2022, that won’t be the case anymore: like &lt;code&gt;get.jenkins.io&lt;/code&gt;, HTTPS will be available and enforced for the requests going through the domain &lt;code&gt;mirrors.jenkins.io&lt;/code&gt;.&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-it-change-for-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-does-it-change-for-me&quot; /&gt;What Does It Change for Me?&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;Short answer: nothing. You should already be using the domain &lt;code&gt;get.jenkins.io&lt;/code&gt; as it’s been the default since almost 2 years, and the content served by both system is the same.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Long answer: if you are still using the former &lt;code&gt;mirrors.jenkins.io&lt;/code&gt; and are not able to switch to &lt;code&gt;get.jenkins.io&lt;/code&gt;, you’ll see the following changes:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🌍 The mirror usually selected might change as the grading system on mirrorbits is different (and covers way more mirrors): faster downloads for you!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🔐 Your HTTP requests will be redirected to their corresponding URL using the HTTPS protocol with a valid TLS certificate signed by the Let’s Encrypt authority: improved safety!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⚠️ The IP pointed by the DNS record &lt;code&gt;mirrors.jenkins.io&lt;/code&gt; will change from &lt;code&gt;52.202.51.185&lt;/code&gt; to &lt;code&gt;52.167.253.43&lt;/code&gt;: upgrade your proxies!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/05/04/DigitalOcean/</id>
<title>DigitalOcean sponsors the Jenkins project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-05-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/05/04/DigitalOcean/" />
<category term='community'></category>
<category term='documentation'></category>
<category term='contributing'></category>
<summary>
The Jenkins infrastructure team has extended the reach of the ci.jenkins.io agents.
We&#8217;re grateful that DigitalOcean has donated $2760 to the Jenkins project.
The donation has allowed us to run jobs from ci.jenkins.io on an additional cluster hosted by DigitalOcean.


Easy setup


We defined a new Kubernetes cluster on DigitalOcean with the DigitalOcean Terraform provider.
The infrastructure is defined as code in our DigitalOcean infrastructure repository.




Resource management


The DigitalOcean user interface makes it easy to see our progress applying the DigitalOcean donation to continuous integration jobs for the Jenkins project.


We track our budget and our droplets from easy to use web pages that are part of...
</summary>
<content type='html'>
&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/2022-05-DigitalOcean-sponsors-Jenkins.png&quot; alt=&quot;DigitalOcean sponsors the Jenkins project&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins infrastructure team has extended the reach of the ci.jenkins.io agents.
We’re grateful that DigitalOcean has donated $2760 to the Jenkins project.
The donation has allowed us to run jobs from &lt;a href=&quot;https://ci.jenkins.io&quot;&gt;ci.jenkins.io&lt;/a&gt; on an additional cluster hosted by DigitalOcean.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;easy-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#easy-setup&quot; /&gt;Easy setup&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We defined a new Kubernetes cluster on DigitalOcean with the &lt;a href=&quot;https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs&quot;&gt;DigitalOcean Terraform provider&lt;/a&gt;.
The infrastructure is defined as code in our &lt;a href=&quot;https://github.com/jenkins-infra/digitalocean&quot;&gt;DigitalOcean infrastructure repository&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;resource-management&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resource-management&quot; /&gt;Resource management&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The DigitalOcean user interface makes it easy to see our progress applying the DigitalOcean donation to continuous integration jobs for the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We track our budget and our droplets from easy to use web pages that are part of the DigitalOcean platform.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;automated-cluster-upgrades&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automated-cluster-upgrades&quot; /&gt;Automated cluster upgrades&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The DigitalOcean managed Kubernetes cluster provides automated upgrades.
Upgrades happen weekly and keep the infrastructure current with the latest capabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;smooth-autoscaling&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#smooth-autoscaling&quot; /&gt;Smooth autoscaling&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve seen smooth and effective resource allocation and deallocation on DigitalOcean as the load increases and decreases.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;digitalocean-tutorials-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#digitalocean-tutorials-for-jenkins&quot; /&gt;DigitalOcean tutorials for Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Step by step DigitalOcean installation instructions are available from the  &lt;a href=&quot;https://www.digitalocean.com/community/tutorial_collections/how-to-install-jenkins&quot;&gt;&quot;How to install Jenkins&quot;&lt;/a&gt; tutorials on the DigitalOcean community site.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/05/02/cicd-with-postman-and-jenkins/</id>
<title>CI/CD with Postman and Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-05-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/05/02/cicd-with-postman-and-jenkins/" />
<category term='jenkins'></category>
<category term='postman'></category>
<category term='api'></category>
<category term='cicd'></category>
<summary>
The Postman API Platform is redefining how APIs are built, managed, and consumed.
An important aspect of API management is continuous building, testing, and deployment with CI/CD tools.
With the latest release of Postman, we bring the API builds closer to your API by integrating with Jenkins.


Observe your Jenkins builds


While you iterate over your APIs, the Jenkins builds are triggered multiple times.
While some of you may be looking at builds closely in Jenkins, not everyone in your team has access to the Jenkins instance.
Team members often depend upon other means such as emails and slack messages to get informed of the recent...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.postman.com/downloads/&quot;&gt;Postman API Platform&lt;/a&gt; is redefining how APIs are built, managed, and consumed.
An important aspect of API management is continuous building, testing, and deployment with CI/CD tools.
With the latest release of Postman, we bring the API builds closer to your API by integrating with &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;Jenkins&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;observe-your-jenkins-builds&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#observe-your-jenkins-builds&quot; /&gt;Observe your Jenkins builds&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While you iterate over your APIs, the Jenkins builds are triggered multiple times.
While some of you may be looking at builds closely in Jenkins, not everyone in your team has access to the Jenkins instance.
Team members often depend upon other means such as emails and slack messages to get informed of the recent builds and their status.
With the Jenkins Integration, the build information can now be seen within Postman under the Test tab of the API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This allows you to actively monitor your API builds along with the other components of the API.
You can also trigger a build from Postman itself, allowing you to quickly test any changes in the API.&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/2022-05-02-cicd-with-postman-and-jenkins/jenkinsbuilds.png&quot; alt=&quot;pluginView&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;get-automation-test-reports-from-anywhere-in-postman&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-automation-test-reports-from-anywhere-in-postman&quot; /&gt;Get automation test reports from anywhere in Postman&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://learning.postman.com/docs/running-collections/using-newman-cli/command-line-integration-with-newman/&quot;&gt;Newman&lt;/a&gt; is a CLI tool that is used to run the collections outside Postman.
Teams use it to run their tests in CI/ CD pipelines, test environments, etc.
While you could pull tests from Postman using APIs to run via Newman, the test reports had to be consumed outside Postman.
This creates multiple sources for you to refer to while checking the automation test status of your APIs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the latest release, you now get the reports of automation tests running anywhere in Postman.
The &lt;a href=&quot;https://www.npmjs.com/package/newman-reporter-postman-cloud&quot;&gt;Newman reporter&lt;/a&gt; posts the results as a &lt;a href=&quot;https://learning.postman.com/docs/running-collections/intro-to-collection-runs/&quot;&gt;collection run&lt;/a&gt; in the &lt;a href=&quot;https://learning.postman.com/docs/getting-started/navigating-postman/#history&quot;&gt;History&lt;/a&gt;.
The results can also be seen combined with your build reports from the CI/CD, giving you a single place to analyze your builds and associated tests.&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/2022-05-02-cicd-with-postman-and-jenkins/newmanruns.gif&quot; alt=&quot;pluginView&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A version of this post appeared on the &lt;a href=&quot;https://blog.postman.com/stay-on-top-of-your-api-builds-witih-postmans-jenkins-integration/&quot;&gt;Postman Blog&lt;/a&gt;.&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/2022/04/11/She-Code-Africa-contributhon/</id>
<title>She Code Africa Contributhon 2022!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-04-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/04/11/She-Code-Africa-contributhon/" />
<author>
<name>markewaite</name>
</author>
<category term='events'></category>
<category term='community'></category>
<category term='documentation'></category>
<category term='outreach-programs'></category>
<category term='contributing'></category>
<summary>
The She Code Africa Contributhon started April 5, 2022.
The She Code Africa Contributhon is a boot camp where African women are paid to work with open source organizations on selected projects with dedicated mentors.
This program aims to create a more diverse, inclusive, and innovative culture within the African open source ecosystem by matching African women in technology with sponsor and mentor open source organizations.
The 7 mentees joining the Jenkins project come from Nigeria, Kenya, and Ghana.


The Jenkins project has been accepted as a Contributhon mentoring organization.
We&#8217;re spreading the project work between three different project ideas and are being helped by...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon&quot;&gt;She Code Africa Contributhon&lt;/a&gt; started April 5, 2022.
The &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon&quot;&gt;She Code Africa Contributhon&lt;/a&gt; is a boot camp where African women are paid to work with open source organizations on selected projects with dedicated mentors.
This program aims to create a more diverse, inclusive, and innovative culture within the African open source ecosystem by matching African women in technology with sponsor and mentor open source organizations.
The 7 mentees joining the Jenkins project come from Nigeria, Kenya, and Ghana.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has been accepted as a &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon/mentor-orgs/current-mentoring-organizations&quot;&gt;Contributhon mentoring organization&lt;/a&gt;.
We’re spreading the project work between three different project ideas and are being helped by a She Code Africa project manager.
The projects include:&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://docs.google.com/document/d/1b7UpZe314bkamUKJQuewiXtfCxRbX8BLBswX59G6Ykc/edit?usp=sharing&quot;&gt;Inclusive naming improvements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1AG437RU_ZLuhfbJJNj3ZSXllrFg_bYbru5x0rPq_u2c/edit?usp=sharing&quot;&gt;Pipeline help improvements&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1AvONLtoFv_RIk-WTMzF8QodL9kbrOg0bI-5cb-pOGus/edit?usp=sharing&quot;&gt;Screenshot updates&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;We’re in the community bonding phase, using the &lt;a href=&quot;https://docs.google.com/presentation/d/1cd4Dlt1pvhyfJa0xrB0mBfg5dMzHBUbC/edit?usp=sharing&amp;amp;ouid=116306159720926274068&amp;amp;rtpof=true&amp;amp;sd=true&quot;&gt;Contributhon Onboarding Guide&lt;/a&gt; to prepare for the projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’d like to introduce our mentees so that you recognize them and can welcome them during code review and online chat.&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/2022-04-contributhon-participants/shecodeafrica-participants.png&quot; alt=&quot;Contributhon participants&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;nafeesat-jimoh&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nafeesat-jimoh&quot; /&gt;Nafeesat Jimoh&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/nafeesat-jimoh.jpg&quot; alt=&quot;Nafeesat Jimoh&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nafeesat is a Python programmer and a project manager based in Nigeria.
She loves to collaborate and learn from others as well as share knowledge.
She is the project manager for the Jenkins project in the She Code Africa Contributhon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/j-enny&quot;&gt;j-enny&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;catherine-kiiru&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#catherine-kiiru&quot; /&gt;Catherine Kiiru&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/catherine-kiiru.jpg&quot; alt=&quot;Catherine Kiiru&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Catherine is based in Nairobi, Kenya.
She is a front-end developer,  technical content specialist, and open source enthusiast.
Having transitioned from marketing to tech, Catherine is passionate about building exciting software solutions and using technical content to communicate their value to end users.
She has been assigned to the &lt;a href=&quot;https://docs.google.com/document/d/1b7UpZe314bkamUKJQuewiXtfCxRbX8BLBswX59G6Ykc/edit?usp=sharing&quot;&gt;inclusive naming&lt;/a&gt; project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/CatherineKiiru&quot;&gt;CatherineKiiru&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;peace-okafor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#peace-okafor&quot; /&gt;Peace Okafor&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/peace-okafor.jpg&quot; alt=&quot;Peace Okafor&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Peace is based in Nigeria.
She is a technical writer with knowledge of writing code.
She has worked as a freelancer for 4 years and counting.
She has been assigned to the &lt;a href=&quot;https://docs.google.com/document/d/1b7UpZe314bkamUKJQuewiXtfCxRbX8BLBswX59G6Ykc/edit?usp=sharing&quot;&gt;inclusive naming&lt;/a&gt; project.
She is happy to be a part of the She Code Africa Contributhon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/Ladyprowess&quot;&gt;Ladyprowess&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;afi-gbadago&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#afi-gbadago&quot; /&gt;Afi Gbadago&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/afi-gbadago.jpg&quot; alt=&quot;Afi Gbadago&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Afi is based in Ghana.
She has been assigned to the &lt;a href=&quot;https://docs.google.com/document/d/1AG437RU_ZLuhfbJJNj3ZSXllrFg_bYbru5x0rPq_u2c/edit?usp=sharing&quot;&gt;Pipeline help&lt;/a&gt; project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/AfiMaameDufie&quot;&gt;AfiMaameDufie&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;sophia-okito&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sophia-okito&quot; /&gt;Sophia Okito&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/sophia-okito.jpg&quot; alt=&quot;Sophia Okito&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sophia Okito is based in Nigeria.
She is a Java Backend Developer at &lt;a href=&quot;https://quabbly.com/&quot;&gt;Quabbly&lt;/a&gt;.
She has been assigned to the &lt;a href=&quot;https://docs.google.com/document/d/1AG437RU_ZLuhfbJJNj3ZSXllrFg_bYbru5x0rPq_u2c/edit?usp=sharing&quot;&gt;Pipeline help&lt;/a&gt; project.
She loves to try new things and is glad to be working on her first open source project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/Sophia-Okito&quot;&gt;Sophia-Okito&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;somaa-chukwu&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#somaa-chukwu&quot; /&gt;Somaa Chukwu&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/somaa-chukwu.jpg&quot; alt=&quot;Somaa Chukwu&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Somaa Chukwu is based in Nigeria.
She is a full stack developer.
She loves working with teams and is super excited for the opportunity to participate in the Jenkins project.
She has been assigned to the &lt;a href=&quot;https://docs.google.com/document/d/1AvONLtoFv_RIk-WTMzF8QodL9kbrOg0bI-5cb-pOGus/edit?usp=sharing&quot;&gt;screenshot updates&lt;/a&gt; project.
Looking forward to an amazing experience and working with everyone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/somaathetechster&quot;&gt;somaathetechster&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;miracle-ugorji&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#miracle-ugorji&quot; /&gt;Miracle Ugorji&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-04-contributhon-participants/miracle-ugorji.jpg&quot; alt=&quot;Miracle Ugorji&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Miracle Ugorji is based in Nigeria.
She is a frontend developer and technical writer.
She is an open-source enthusiast.
She’s glad for this opportunity to kick start her open-source journey.
She has been assigned to the &lt;a href=&quot;https://docs.google.com/document/d/1AvONLtoFv_RIk-WTMzF8QodL9kbrOg0bI-5cb-pOGus/edit?usp=sharing&quot;&gt;screenshot updates&lt;/a&gt; project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/amarealcoder&quot;&gt;amarealcoder&lt;/a&gt; on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-the-projects&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-projects&quot; /&gt;About the projects&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The projects this year 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://docs.google.com/document/d/1b7UpZe314bkamUKJQuewiXtfCxRbX8BLBswX59G6Ykc/edit?usp=sharing&quot;&gt;Inclusive naming&lt;/a&gt; - use correct terms like &quot;controller&quot; and &quot;agent&quot; in online help, documentation, and messages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1AG437RU_ZLuhfbJJNj3ZSXllrFg_bYbru5x0rPq_u2c/edit?usp=sharing&quot;&gt;Pipeline help&lt;/a&gt; - improve online help and documentation of Jenkins Pipeline steps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1AvONLtoFv_RIk-WTMzF8QodL9kbrOg0bI-5cb-pOGus/edit?usp=sharing&quot;&gt;Screenshot updates&lt;/a&gt; - identify and update version specific screenshots in Jenkins documentation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More information about She Code Africa and the Contributhon is available from the  &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon&quot;&gt;Contributhon description&lt;/a&gt; and the &lt;a href=&quot;https://www.shecodeafrica.org/&quot;&gt;She Code Africa site&lt;/a&gt; .&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Conversations related to the Contributhon are happening in a &lt;a href=&quot;https://cdeliveryfdn.slack.com/archives/C01TDDNSC90&quot;&gt;Continuous Delivery Foundation slack channel&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;mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mentors&quot; /&gt;Mentors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re very grateful to the mentors from the Jenkins project that are hosting mentoring sessions, reviewing pull requests, and encouraging the mentees.
Thanks to:&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/ajard/&quot;&gt;Angélique Jard&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kmartens27&quot;&gt;Kevin Martens&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/kwhetstone/&quot;&gt;Kristin Whetstone&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/markewaite/&quot;&gt;Mark Waite&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;We also thank &lt;a href=&quot;https://www.jenkins.io/blog/authors/zaycodes/&quot;&gt;Zainab Abubakar&lt;/a&gt; of She Code Africa for her efforts to facilitate the Contributhon and encourage participation.&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/03/31/spring-rce-CVE-2022-22965/</id>
<title>Spring Framework RCE, CVE-2022-22965</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-03-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/03/31/spring-rce-CVE-2022-22965/" />
<category term='infrastructure'></category>
<category term='security'></category>
<category term='jenkins'></category>
<summary>
A remote code execution vulnerability has been identified in the Spring Framework.


This vulnerability is identified as CVE-2022-22965.


Spring officially reacted early in an early announcement.


SpringShell in Jenkins Core and Plugins


The Jenkins security team has confirmed that the Spring vulnerability is not affecting Jenkins Core.
There is no impact because we are using Stapler as a servlet, and neither Spring MVC nor Spring WebFlux.


An analysis was done on the plugins to determine whether some were using Spring in a dangerous way. No impact was found.









The dangerous library is included as a dependency of spring-security-web, which is not yet updated to include the fixed...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A remote code execution vulnerability has been identified in the Spring Framework.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This vulnerability is identified as &lt;a href=&quot;https://tanzu.vmware.com/security/cve-2022-22965&quot;&gt;CVE-2022-22965&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Spring officially reacted early in &lt;a href=&quot;https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement&quot;&gt;an early announcement&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;springshell-in-jenkins-core-and-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#springshell-in-jenkins-core-and-plugins&quot; /&gt;SpringShell in Jenkins Core and Plugins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins security team has confirmed that the Spring vulnerability is not affecting Jenkins Core.
There is no impact because we are using &lt;a href=&quot;https://github.com/jenkinsci/stapler&quot;&gt;Stapler&lt;/a&gt; as a servlet, and neither Spring MVC nor Spring WebFlux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An analysis was done on the plugins to determine whether some were using Spring in a dangerous way. No impact was found.&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;The dangerous library is included as a dependency of &lt;a href=&quot;https://mvnrepository.com/artifact/org.springframework.security/spring-security-web&quot;&gt;spring-security-web&lt;/a&gt;, which is not yet updated to include the fixed version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The presence of Spring Framework is not enough to make the application vulnerable.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;springshell-in-the-jenkins-infrastructure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#springshell-in-the-jenkins-infrastructure&quot; /&gt;SpringShell in the Jenkins Infrastructure&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins infrastructure and security teams have confirmed that the Spring vulnerability is not affecting any part of the Jenkins infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following applications are Java applications that mention Spring as a dependency:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The web service &lt;a href=&quot;https://customize.jenkins.io/&quot;&gt;customize.jenkins.io&lt;/a&gt; was stopped out of an abundance of caution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The API of the web service &lt;a href=&quot;https://plugins.jenkins.io&quot;&gt;plugins.jenkins.io&lt;/a&gt; is not affected,
as it runs with JDK 8 and only GlassFish servlets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The web service &lt;a href=&quot;https://accounts.jenkins.io&quot;&gt;accounts.jenkins.io&lt;/a&gt; is not affected,
as it also runs with the JDK 8 and uses &lt;a href=&quot;https://github.com/jenkinsci/stapler&quot;&gt;Stapler&lt;/a&gt; as a servlet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;We may decide to disable some services if we discover other vulnerabilities.
You can see the status of services on &lt;a href=&quot;https://status.jenkins.io/&quot;&gt;the status page at status.jenkins.io&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;further-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#further-updates&quot; /&gt;Further Updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We may update this blog post, if there are any corrections to be made, and in that case we’ll clearly call those out at the top.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/03/29/jenkins-contributor-awards/</id>
<title>Jenkins Contributor Awards - Nominations Extended</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-03-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/03/29/jenkins-contributor-awards/" />
<author>
<name>cdfoundation</name>
</author>
<category term='awards'></category>
<category term='jenkins'></category>
<category term='cdcon'></category>
<category term='community'></category>
<summary>
Jenkins Contributor Awards for 2022 are being run by the Continuous Delivery Foundation (CDF) along with many other CDF Community Awards.


The nominations are open and are being accepted using GitHub issues to make the process transparent.
Any contributor is eligible!
The deadline to nominate someone has been extended to April 11, 2022.
Voting will open later in April.


Nominate contributors or vote with reactions/comments for all three Jenkins awards:




Most Valuable Jenkins Contributor


Most Valuable Jenkins Advocate


Jenkins Security MVP




The winners will be announced at cdCon 2022 on June 7.


You can also nominate Jenkins community members for global awards like "Top CDF Ambassador", "Top CDF Contributor", or...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Contributor Awards for 2022 are being run by the Continuous Delivery Foundation (CDF) along with many other &lt;a href=&quot;https://cd.foundation/cdf-community-awards/&quot;&gt;CDF Community Awards&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nominations are open and are being accepted using GitHub issues to make the process transparent.
Any contributor is eligible!
The deadline to nominate someone has been extended to April 11, 2022.
Voting will open later in April.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominate contributors or vote with reactions/comments for all three Jenkins awards:&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/cdfoundation/foundation/issues/366&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/cdfoundation/foundation/issues/368&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/cdfoundation/foundation/issues/367&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;The winners will be announced at cdCon 2022 on June 7.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also nominate Jenkins community members for global awards like &quot;Top CDF Ambassador&quot;, &quot;Top CDF Contributor&quot;, or &quot;Top CDF End User&quot;!
For all CDF Community Awards and more details, visit the &lt;a href=&quot;https://cd.foundation/cdf-community-awards/&quot;&gt;CDF Award Page&lt;/a&gt;.&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/2022/jenkins-awards-2022.png&quot; alt=&quot;https://cd.foundation/cdf-community-awards/&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/03/25/systemd-migration/</id>
<title>Linux installation packages migrated from System V init to systemd</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-03-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/03/25/systemd-migration/" />
<author>
<name>basil</name>
</author>
<category term='announcement'></category>
<category term='community'></category>
<category term='core'></category>
<category term='platform-sig'></category>
<summary>
Beginning with Jenkins 2.335 and Jenkins 2.332.1, the Jenkins project is migrating from System V init(8) to systemd(1) in its official Debian, Red Hat, and openSUSE packages.
The official Docker image and Helm chart remain unchanged.
For up-to-date information, refer to the Managing systemd services page in the documentation.


Background

Beginning in 2008, the Jenkins (then Hudson) project has delivered Linux OS installation packages for Debian (and derivatives), Red Hat (and derivatives), and openSUSE.
These packages were all based on the System V init(8) system in common use at that time.
A remnant of the venerable Unix System V from 1983, init(8) had remained unchanged for...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning with Jenkins 2.335 and Jenkins 2.332.1, the Jenkins project is migrating from &lt;a href=&quot;https://en.wikipedia.org/wiki/Init&quot;&gt;System V &lt;code&gt;init(8)&lt;/code&gt;&lt;/a&gt; to &lt;a href=&quot;https://www.freedesktop.org/wiki/Software/systemd/&quot;&gt;&lt;code&gt;systemd(1)&lt;/code&gt;&lt;/a&gt; in its official Debian, Red Hat, and openSUSE packages.
The &lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins&quot;&gt;official Docker image&lt;/a&gt; and &lt;a href=&quot;https://charts.jenkins.io/&quot;&gt;Helm chart&lt;/a&gt; remain unchanged.
For up-to-date information, refer to the &lt;a href=&quot;https://www.jenkins.io/doc/book/system-administration/systemd-services/&quot;&gt;Managing &lt;code&gt;systemd&lt;/code&gt; services&lt;/a&gt; page in the documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning in 2008, the Jenkins (then Hudson) project has delivered Linux OS installation packages for Debian (and derivatives), Red Hat (and derivatives), and openSUSE.
These packages were all based on the &lt;a href=&quot;https://en.wikipedia.org/wiki/Init&quot;&gt;System V &lt;code&gt;init(8)&lt;/code&gt;&lt;/a&gt; system in common use at that time.
A remnant of the venerable &lt;a href=&quot;https://en.wikipedia.org/wiki/UNIX_System_V&quot;&gt;Unix System V&lt;/a&gt; from 1983, &lt;code&gt;init(8)&lt;/code&gt; had remained unchanged for decades.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The mid-2000s saw the emergence of a new generation of service management frameworks, starting with the release of &lt;a href=&quot;https://en.wikipedia.org/wiki/Service_Management_Facility&quot;&gt;Service Management Facility (SMF)&lt;/a&gt; in &lt;a href=&quot;https://en.wikipedia.org/wiki/Oracle_Solaris#Version_history&quot;&gt;Solaris 10&lt;/a&gt;, the release of &lt;a href=&quot;https://en.wikipedia.org/wiki/Launchd&quot;&gt;&lt;code&gt;launchd&lt;/code&gt;&lt;/a&gt; in &lt;a href=&quot;https://en.wikipedia.org/wiki/Mac_OS_X_Tiger&quot;&gt;Mac OS X Tiger&lt;/a&gt;, and the release of &lt;a href=&quot;https://upstart.ubuntu.com/&quot;&gt;Upstart&lt;/a&gt; in &lt;a href=&quot;https://en.wikipedia.org/wiki/Ubuntu_version_history&quot;&gt;Ubuntu 6.10 (Edgy Eft)&lt;/a&gt;.
In contrast to the serial service startup of &lt;code&gt;init(8)&lt;/code&gt;, these frameworks modeled services as a dependency graph and started services in parallel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The mid-2010s saw the rise of &lt;code&gt;systemd(1)&lt;/code&gt; as the dominant service management framework on Linux,
and it became the default service management framework in &lt;a href=&quot;https://en.wikipedia.org/wiki/Red_Hat_Enterprise_Linux#RHEL_7&quot;&gt;Red Hat Enterprise Linux (RHEL) 7&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/OpenSUSE#Version_history&quot;&gt;openSUSE 12.2 (Mantis)&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Debian_version_history#Debian_8_(Jessie)&quot;&gt;Debian 8 (Jessie)&lt;/a&gt;, and &lt;a href=&quot;https://en.wikipedia.org/wiki/Ubuntu_version_history#Ubuntu_15.04_(Vivid_Vervet)&quot;&gt;Ubuntu 15.04 (Vivid Vervet)&lt;/a&gt;.
A decade after the release of Solaris 10, the ideas behind its service management framework had spread to the majority of Unix-like systems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;systemd(1)&lt;/code&gt; provides compatibility with the behavior exposed by System V &lt;code&gt;init(8)&lt;/code&gt;,
and the System V &lt;code&gt;init(8)&lt;/code&gt; scripts delivered in the Jenkins project’s official Linux OS packages continued to work in this compatibility mode.
Beginning with Jenkins 2.335 and Jenkins 2.332.1, the Jenkins project’s official Linux OS packages deliver a native &lt;code&gt;systemd(1)&lt;/code&gt; &lt;a href=&quot;https://www.freedesktop.org/software/systemd/man/systemd.service.html&quot;&gt;service unit&lt;/a&gt;,
which supersedes the older System V &lt;code&gt;init(8)&lt;/code&gt; scripts.
Seven years after &lt;code&gt;systemd(1)&lt;/code&gt; became the default service management framework in the majority of Linux distributions, the Jenkins project provides full support for &lt;code&gt;systemd(1)&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;motivation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#motivation&quot; /&gt;Motivation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As defined in W. Richard Stevens&#39; book &lt;a href=&quot;http://www.kohala.com/start/unp.html&quot;&gt;&lt;em&gt;UNIX Network Programming&lt;/em&gt;&lt;/a&gt; (Addison-Wesley, 1990),
a daemon is &quot;a process that executes &#39;in the background&#39; (i.e., without an associated terminal or login shell) either waiting for some event to occur, or waiting to perform some specified task on a periodic basis.&quot;
Upon startup, a typical daemon program will:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Close all open &lt;a href=&quot;https://en.wikipedia.org/wiki/File_descriptor&quot;&gt;file descriptors&lt;/a&gt;, including standard input, standard output, and standard error&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Change its &lt;a href=&quot;https://en.wikipedia.org/wiki/Working_directory&quot;&gt;working directory&lt;/a&gt; to the root filesystem, to ensure that it does not tie up another filesystem and prevent it from being unmounted&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reset its file mode creation mask (i.e., &lt;a href=&quot;https://en.wikipedia.org/wiki/Umask&quot;&gt;&lt;code&gt;umask(2)&lt;/code&gt;&lt;/a&gt;) value&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run in the background (i.e., call &lt;a href=&quot;https://illumos.org/man/2/fork&quot;&gt;&lt;code&gt;fork(2)&lt;/code&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disassociate from its &lt;a href=&quot;https://en.wikipedia.org/wiki/Process_group&quot;&gt;process group&lt;/a&gt; (usually a shell), to insulate itself from signals (such as &lt;code&gt;SIGHUP&lt;/code&gt;) sent to the process group&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ignore all terminal I/O signals&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disassociate from the &lt;a href=&quot;https://en.wikipedia.org/wiki/Controlling_terminal&quot;&gt;controlling terminal&lt;/a&gt; (and take steps not to reacquire one)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handle any &lt;code&gt;SIGCLD&lt;/code&gt; signals&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most programs that are designed to be run as daemons do this work for themselves at startup,
and Jenkins has traditionally done this using the &lt;a href=&quot;https://akuma.kohsuke.org/&quot;&gt;Akuma&lt;/a&gt; daemonization library and &lt;a href=&quot;https://github.com/java-native-access/jna&quot;&gt;Java Native Access (JNA)&lt;/a&gt;.
The Akuma library is no longer actively maintained,
and recent versions of Java have placed increasingly greater restrictions on the ability of Java programs to access internal system state via reflection and other mechanisms.
Furthermore, third-party daemonization software like &lt;a href=&quot;https://software.clapper.org/daemonize/&quot;&gt;&lt;code&gt;daemonize(1)&lt;/code&gt;&lt;/a&gt; is not consistently packaged for all Linux distributions,
and the packages that exist are frequently unmaintained or have bugs that cause regressions for Jenkins users.
In other words, the status quo was increasingly unsustainable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users have also been requesting &lt;code&gt;systemd(1)&lt;/code&gt; support in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41218&quot;&gt;JENKINS-41218&lt;/a&gt; since January 2017.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The migration to &lt;code&gt;systemd(1)&lt;/code&gt; eliminates this long-standing pain point
by relying on &lt;code&gt;systemd(1)&lt;/code&gt; to daemonize the Jenkins Java process.
This avoids the need for JNA-based tricks in Java,
and it also unifies our implementation of service management across all Linux distributions.
Furthermore, it allows for tighter integration between Jenkins core and the service management framework with regard to service startup notification.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;changes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#changes&quot; /&gt;Changes&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although &lt;code&gt;systemd(1)&lt;/code&gt; has been the default service management framework in the majority of Linux distributions for seven years, some members of our community may not be familiar with its use in the context of managing Jenkins.
The following section describes some of the changes in more detail and explains how to perform common system administration tasks.
For up-to-date information, refer to the &lt;a href=&quot;https://www.jenkins.io/doc/book/system-administration/systemd-services/&quot;&gt;Managing &lt;code&gt;systemd&lt;/code&gt; services&lt;/a&gt; page in the documentation.
See also the &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units&quot;&gt;DigitalOcean community &lt;code&gt;systemd(1)&lt;/code&gt; tutorial&lt;/a&gt; to better understand the benefits of &lt;code&gt;systemd(1)&lt;/code&gt; and the &lt;code&gt;systemctl(1)&lt;/code&gt; command.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;package-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#package-configuration&quot; /&gt;Package configuration&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users who run Jenkins 2.335 or later and 2.332.1 LTS or later through the official Debian, Red Hat, or openSUSE packages are affected by this migration.&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;
The &lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins&quot;&gt;official Docker image&lt;/a&gt; and &lt;a href=&quot;https://charts.jenkins.io/&quot;&gt;Helm chart&lt;/a&gt; remain unchanged.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The System V &lt;code&gt;init(8)&lt;/code&gt; packages delivered the following configuration files:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Debian&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;/etc/default/jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Red Hat&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;/etc/sysconfig/jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;openSUSE&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;/etc/sysconfig/jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each configuration file used a unique format, with the Debian version being radically different from the Red Hat and openSUSE versions.
Furthermore, manual edits to these files would frequently conflict with updated upstream versions, triggering the package manager to flag the conflict and requiring manual intervention on upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;New versions of Jenkins still ship these files and support Linux distributions that do not use &lt;code&gt;systemd(1)&lt;/code&gt;.
At the time, no actively-supported distributions based on Red Hat or openSUSE are known to use System V &lt;code&gt;init(8)&lt;/code&gt;.
On such systems, the &lt;code&gt;/etc/sysconfig/jenkins&lt;/code&gt; file is left in place but unused at runtime.
However, the Debian package can still be installed on distributions such as &lt;a href=&quot;https://www.devuan.org/&quot;&gt;Devuan GNU+Linux&lt;/a&gt;, which is a fork of Debian without &lt;code&gt;systemd(1)&lt;/code&gt;.
On such systems, the &lt;code&gt;/etc/default/jenkins&lt;/code&gt; file will still be used at runtime.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When installed on a modern Linux distribution running &lt;code&gt;systemd(1)&lt;/code&gt;, the &lt;code&gt;systemd(1)&lt;/code&gt; &lt;a href=&quot;https://www.freedesktop.org/software/systemd/man/systemd.service.html&quot;&gt;service unit&lt;/a&gt; is delivered to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Debian&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;/lib/systemd/system/jenkins.service&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Red Hat&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;/usr/lib/systemd/system/jenkins.service&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;openSUSE&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;code&gt;/usr/lib/systemd/system/jenkins.service&lt;/code&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main service unit is read-only and not intended to be edited manually.
It contains a large notice at the top of the file stating as much.
The canonical way to customize the &lt;code&gt;systemd(1)&lt;/code&gt; service is to run &lt;code&gt;systemctl edit jenkins&lt;/code&gt;,
which creates a &lt;em&gt;new&lt;/em&gt; drop-in unit at &lt;code&gt;/etc/systemd/system/jenkins.service.d/override.conf&lt;/code&gt;.
On a clean install, this drop-in unit does not exist.
When a user first customizes a clean install with &lt;code&gt;systemctl edit jenkins&lt;/code&gt;, &lt;code&gt;systemd(1)&lt;/code&gt; creates the drop-in unit and allows the user to customize it.
Note that such customizations must be done in a &lt;code&gt;[Service]&lt;/code&gt; section in order to take effect.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;code&gt;systemctl edit jenkins&lt;/code&gt; creates the drop-in unit as &lt;code&gt;root&lt;/code&gt; with 0644 (&lt;code&gt;-rw-r—​r--&lt;/code&gt;) permissions.
The migration logic, on the other hand, creates the drop-in unit as &lt;code&gt;root&lt;/code&gt; with 0600 (&lt;code&gt;-rw-------&lt;/code&gt;) permissions.
This might be of consequence if you store an HTTPS keystore location and/or password in the drop-in unit
and also run jobs directly on the controller,
a practice which the Jenkins project &lt;a href=&quot;https://www.jenkins.io/doc/book/security/controller-isolation/&quot;&gt;explicitly discourages&lt;/a&gt;.
When in doubt, secure the drop-in unit by setting its permissions to 0600 with &lt;code&gt;chmod(1)&lt;/code&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One benefit of the drop-in unit is that it unifies configuration across all three distributions: Debian, Red Hat, and openSUSE.
Gone are the days of maintaining distribution-specific configuration logic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also note that the drop-in unit is not overwritten on upgrades.
Gone are the days of getting conflicts in &lt;code&gt;/etc/{default,sysconfig}/jenkins&lt;/code&gt; on upgrades,
at least &lt;em&gt;after&lt;/em&gt; the upgrade to a &lt;code&gt;systemd(1)&lt;/code&gt;-based package is completed.&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;
Unlike the System V &lt;code&gt;init(8)&lt;/code&gt; configuration, the &lt;code&gt;override.conf&lt;/code&gt; file only contains customizations, not the original defaults.
Users who are accustomed to editing an existing set of defaults must refer to the (read-only) service unit side-by-side when editing the drop-in unit
or use a command like &lt;code&gt;systemctl edit jenkins --full&lt;/code&gt;, which copies the original service unit instead of creating a drop-in unit.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Editing the drop-in unit with &lt;code&gt;systemctl edit jenkins&lt;/code&gt; will automatically reload the &lt;code&gt;systemd(1)&lt;/code&gt; configuration.
The settings will take effect the next time Jenkins is restarted.
If you edit the drop-in unit without &lt;code&gt;systemctl(1)&lt;/code&gt;, you need to run &lt;code&gt;systemctl daemon-reload&lt;/code&gt; for the changes to take effect.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A final point to mention about the service unit is its use of specifiers,
which may be unfamiliar to some users.
The drop-in unit does not perform shell expansion.
Specifiers can insert contextual information (like system hostname, unit name, and operating system kernel release) into the drop-in unit.
The &lt;code&gt;systemd(1)&lt;/code&gt; documentation contains &lt;a href=&quot;https://www.freedesktop.org/software/systemd/man/systemd.unit.html#id-1.13.3&quot;&gt;a table of specifiers available in unit files&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;migration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#migration&quot; /&gt;Migration&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project ships logic to automatically migrate the System V &lt;code&gt;init(8)&lt;/code&gt; configuration file to the new &lt;code&gt;systemd(1)&lt;/code&gt; &lt;code&gt;override.conf&lt;/code&gt; format.
This migration logic does nothing if an &lt;code&gt;override.conf&lt;/code&gt; file already exists,
which would be an indication that the migration script already ran
or that the user has made their own customizations that should be preserved.
If &lt;code&gt;override.conf&lt;/code&gt; does not exist, package installation migrates the old System V &lt;code&gt;init(8)&lt;/code&gt; configuration file to &lt;code&gt;override.conf&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;logging&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#logging&quot; /&gt;Logging&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;systemd(1)&lt;/code&gt; package also uses &lt;code&gt;systemd-journald(8)&lt;/code&gt; for logging by default.
Rather than creating a log file in &lt;code&gt;/var/log/jenkins/jenkins.log&lt;/code&gt;,
Jenkins now logs to the system’s journal.
Log entries may be viewed with &lt;code&gt;journalctl -u jenkins&lt;/code&gt;.
This is perhaps the most noticeable user-visible change in this migration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-journalctl-to-view-and-manipulate-systemd-logs&quot;&gt;DigitalOcean log management tutorial&lt;/a&gt; for more detailed information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;startup-notifications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#startup-notifications&quot; /&gt;Startup notifications&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The System V &lt;code&gt;init(8)&lt;/code&gt; logic was asynchronous; i.e., running &lt;code&gt;/etc/init.d/jenkins start&lt;/code&gt; would return prior to the completion of Jenkins startup.
The &lt;code&gt;systemd(1)&lt;/code&gt; logic is synchronous; i.e., running &lt;code&gt;systemctl start jenkins&lt;/code&gt; will block until Jenkins signals successful startup.
This allows system administrators to write automation to programmatically deploy Jenkins using modern tools like Ansible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins previously restarted itself after upgrading plugins or via the &lt;code&gt;/restart&lt;/code&gt; or &lt;code&gt;/safeRestart&lt;/code&gt; endpoints by calling &lt;code&gt;exec(2)&lt;/code&gt;.
This was fragile and exposed users to a variety of bugs.
The &lt;code&gt;systemd(1)&lt;/code&gt; implementation allows the main process to exit normally before starting it again from scratch.
In addition to eliminating a category of bugs, this also provides more visibility into service startup progress.
Some examples are shown below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From &lt;code&gt;systemctl status jenkins&lt;/code&gt; after upgrading plugins:&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;systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;/lib/systemd/system/jenkins.service&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; enabled&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    Drop-In: /etc/systemd/system/jenkins.service.d
             └─override.conf
     Active: active &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;running&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…]
   Main PID: &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…] &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;java&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
     Status: &lt;span class=&quot;s2&quot;&gt;&quot;Restart in 10 seconds&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;As Jenkins is being brought down:&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;systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;/lib/systemd/system/jenkins.service&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; enabled&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    Drop-In: /etc/systemd/system/jenkins.service.d
             └─override.conf
     Active: deactivating &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;stop-sigterm&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; since &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…]
   Main PID: &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…] &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;java&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
     Status: &lt;span class=&quot;s2&quot;&gt;&quot;Stopping Jenkins&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;As Jenkins is starting up:&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;systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;/lib/systemd/system/jenkins.service&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; enabled&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    Drop-In: /etc/systemd/system/jenkins.service.d
             └─override.conf
     Active: activating &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;start&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; since &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…]
   Main PID: &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…] &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;java&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;After successful startup:&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;systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;/lib/systemd/system/jenkins.service&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; enabled&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    Drop-In: /etc/systemd/system/jenkins.service.d
             └─override.conf
     Active: active &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;running&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; since &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…]
   Main PID: &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;…] &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;java&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;If Jenkins does not signal startup completion within a configured time,
the service will be considered failed and will be shut down again.
As each initialization milestone (i.e., &quot;Started initialization&quot;, &quot;Listed all plugins&quot;,
&quot;Prepared all plugins&quot;, &quot;Started all plugins&quot;, &quot;Augmented all extensions&quot;,
&quot;System config loaded&quot;, &quot;System config adapted&quot;, &quot;Loaded all jobs&quot;,
&quot;Configuration for all jobs updated&quot;, and &quot;Completed initialization&quot;) is attained,
the timeout is extended by the value of the &lt;code&gt;jenkins.model.Jenkins.extendTimeoutSeconds&lt;/code&gt; system property (by default, 15 seconds).
The timeout can be configured with the &lt;code&gt;TimeoutStartSec&lt;/code&gt; directive in the service unit.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reporting-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporting-issues&quot; /&gt;Reporting issues&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you find a regression, please file a bug report in &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;Jira&lt;/a&gt;.
When reporting an issue, include the following information:&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;Use the &lt;code&gt;core&lt;/code&gt; component.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the name, version, and architecture of the Linux distribution you are using (e.g., Ubuntu 20.04.4 LTS x86_64).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the contents of the old System V &lt;code&gt;init(8)&lt;/code&gt; configuration in &lt;code&gt;/etc/{default,sysconfig}/jenkins&lt;/code&gt;, sanitized as necessary.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the contents of the &lt;code&gt;systemd(1)&lt;/code&gt; drop-in unit in &lt;code&gt;/etc/systemd/system/jenkins.service.d/override.conf&lt;/code&gt;, sanitized as necessary.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide steps to reproduce the issue &lt;em&gt;from scratch&lt;/em&gt; on a minimal Jenkins installation; the scenario should fail when the steps are followed on Jenkins 2.335 or later and pass when the steps are followed on Jenkins 2.334 or earlier.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;Conclusion&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We expect to see a bit of disruption from these changes but hope that in the long run they will save time for core and plugin developers and lead to a more secure and stable tool.
Please reach out on the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;developers&#39; mailing list&lt;/a&gt; with any questions or suggestions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/03/22/jenkins-contributor-awards/</id>
<title>Jenkins Contributor Awards - Nominations Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-03-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/03/22/jenkins-contributor-awards/" />
<author>
<name>cdfoundation</name>
</author>
<category term='awards'></category>
<category term='jenkins'></category>
<category term='cdcon'></category>
<category term='community'></category>
<summary>
Jenkins Contributor Awards for 2022 will be run by the Continuous Delivery Foundation (CDF) along with many other CDF Community Awards.


The nominations are currently open and are being accepted using GitHub issues to make the process more transparent.
Any contributor is eligible!
The deadline to nominate someone is March 29, 2022.
Voting will open in April.


Nominate contributors or vote with reactions/comments for all three Jenkins awards:




Most Valuable Jenkins Contributor


Most Valuable Jenkins Advocate


Jenkins Security MVP




The winners will be announced at cdCon 2022 on June 7.


You can also nominate Jenkins community members for global awards like "Top CDF Ambassador", "Top CDF Contributor", or "Top CDF...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Contributor Awards for 2022 will be run by the Continuous Delivery Foundation (CDF) along with many other &lt;a href=&quot;https://cd.foundation/cdf-community-awards/&quot;&gt;CDF Community Awards&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nominations are currently open and are being accepted using GitHub issues to make the process more transparent.
Any contributor is eligible!
The deadline to nominate someone is March 29, 2022.
Voting will open in April.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominate contributors or vote with reactions/comments for all three Jenkins awards:&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/cdfoundation/foundation/issues/366&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/cdfoundation/foundation/issues/368&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/cdfoundation/foundation/issues/367&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;The winners will be announced at cdCon 2022 on June 7.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also nominate Jenkins community members for global awards like &quot;Top CDF Ambassador&quot;, &quot;Top CDF Contributor&quot;, or &quot;Top CDF End User&quot;!
For all CDF Community Awards and more details, visit the &lt;a href=&quot;https://cd.foundation/cdf-community-awards/&quot;&gt;CDF Award Page&lt;/a&gt;.&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/2022/jenkins-awards-2022.png&quot; alt=&quot;https://cd.foundation/cdf-community-awards/&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/03/21/java17-preview-availability/</id>
<title>Java 17 Preview is available in Jenkins 2.339+</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-03-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/03/21/java17-preview-availability/" />
<author>
<name>basil</name>
</author>
<category term='announcement'></category>
<category term='community'></category>
<category term='core'></category>
<category term='java17'></category>
<category term='platform-sig'></category>
<summary>
Please refer to the Java requirements documentation for up-to-date details on how to run Jenkins on Java 17.









Jenkins, one of the leading open-source automation servers, does not yet officially support Java 17.
On September 14, 2021, OpenJDK 17 was released.
This is a Long-Term-Support (LTS) release, and it will stay around for years.
The Jenkins project is eager to offer full support of this version.
Over the last year, many contributors have been working toward enabling support for Java 17 in the project.
It was a thorny path, but now, on behalf of the Jenkins Platform SIG,
we are happy to announce preview availability of Java...
</summary>
<content type='html'>
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to the &lt;a href=&quot;https://www.jenkins.io/doc/book/platform-information/support-policy-java&quot;&gt;Java requirements&lt;/a&gt; documentation for up-to-date details on how to run Jenkins on Java 17.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/logos/formal/256.png&quot; alt=&quot;Jenkins Java&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins, one of the leading open-source automation servers, does not yet officially support Java 17.
On September 14, 2021, OpenJDK 17 was released.
This is a Long-Term-Support (LTS) release, and it will stay around for years.
The Jenkins project is eager to offer full support of this version.
Over the last year, many contributors have been working toward enabling support for Java 17 in the project.
It was a thorny path, but now, on behalf of the &lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Jenkins Platform SIG&lt;/a&gt;,
we are happy to announce preview availability of Java 17 support in Jenkins weekly releases!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why do we need preview availability for Java 17?
It offers Jenkins contributors and early adopters
a way to try out the changes before the general availability release happens later this year.
It should help us to get more exploratory testing and, hopefully,
resolve most of the issues before Java 17 is officially supported in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post we will describe how to run with Java 17
and how to investigate and report compatibility issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A group of contributors has been working on Java 17 support,
focusing on enabling Java 17 support in development tools, testing, and addressing known compatibility issues.
See the &lt;a href=&quot;https://www.jenkins.io/sigs/platform/#meetings&quot;&gt;Platform SIG meeting notes&lt;/a&gt; for detailed status updates.
Starting with Jenkins 2.339, Jenkins successfully runs with latest OpenJDK 17 releases on various Linux and Windows platforms.
We performed a &lt;em&gt;lot&lt;/em&gt; of automated and exploratory tests.
Jenkins plugins appear to work well.
There is ongoing test automation effort toward the GA release,
but we were able to successfully run Jenkins core tests and &lt;a href=&quot;https://github.com/jenkinsci/plugin-compat-tester&quot;&gt;Plugin Compatibility Tester&lt;/a&gt; for recommended plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;running-jenkins-and-java-17-in-docker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-jenkins-and-java-17-in-docker&quot; /&gt;Running Jenkins and Java 17 in Docker&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For several months, we have provided Docker images for the Jenkins controller and agent.
All these images are based on the official &lt;a href=&quot;https://hub.docker.com/_/debian&quot;&gt;Debian stable&lt;/a&gt; and &lt;a href=&quot;https://hub.docker.com/_/eclipse-temurin&quot;&gt;Eclipse Temurin&lt;/a&gt; images maintained by the Docker community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-controller-image&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-controller-image&quot; /&gt;Jenkins controller image&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 17 support is now provided as a part of the official
&lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins&quot;&gt;jenkins/jenkins&lt;/a&gt; image.
You can run Jenkins with Java 17 simply as:&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;docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:jdk17-preview&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following tags are available:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;jdk17-preview&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Latest weekly release with Java 17 support&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;2.339-jdk17-preview&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Weekly releases packaged with Java 17&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The image is fully compatible with
&lt;a href=&quot;https://github.com/jenkinsci/docker/blob/master/README.md&quot;&gt;the official Jenkins Docker image documentation&lt;/a&gt;,
e.g., you can use &lt;code&gt;plugins.txt&lt;/code&gt; to install plugins, mount volumes, and pass extra options via environment variables.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;agent-images&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#agent-images&quot; /&gt;Agent images&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you use containerized agents via the Docker or Kubernetes plugins,
we have also released official Docker images for Jenkins agents:&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://hub.docker.com/r/jenkins/agent&quot;&gt;jenkins/agent&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkins/inbound-agent/&quot;&gt;jenkins/inbound-agent&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;All images use the &lt;code&gt;jdk17-preview&lt;/code&gt; tag.&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;running-jenkins-with-java&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-jenkins-with-java&quot; /&gt;Running Jenkins with Java&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As with Java 11, you can start Jenkins using the &lt;code&gt;java&lt;/code&gt; 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;java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; jenkins.war &lt;span class=&quot;nt&quot;&gt;--enable-future-java&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;compatibility-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#compatibility-issues&quot; /&gt;Compatibility issues&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In March 2022, the community performed many exploratory tests to discover as many Java 17 issues as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a result, the community solved a lot of problems before announcing Java 17 support in Jenkins. However, it is still possible that some plugins have not been updated to support Java 17.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you find a regression in a plugin, please file a bug report in Jira:&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://issue-redirect.jenkins.io/issue/67908&quot;&gt;Open Java 17 issues&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;For security issues, please use the standard &lt;a href=&quot;https://www.jenkins.io/security/#reporting-vulnerabilities&quot;&gt;vulnerability reporting process&lt;/a&gt;.
Although we will be fixing Java 17 specific issues in public while Java 17 support is in preview,
following the security process will help us to investigate the impact on Java 8 and 11 users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing&quot; /&gt;Contributing&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We appreciate any and all contributions in the Java 17 effort,
including trying out Jenkins with Java 17 and reporting or fixing compatibility issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you want to do exploratory testing,
we recommend trying out Java 17 support on one of your test controllers.
Such testing is highly appreciated,
especially if you use some service integration plugins or exotic platforms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are a plugin developer/maintainer,
we would appreciate if you could test your plugin with Java 17.
Java 17 developer guidelines are forthcoming.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whatever you do, please let us know about your experience by sending a message to
the &lt;a href=&quot;https://community.jenkins.io/&quot;&gt;forums&lt;/a&gt;.
This information will help us track changes and contributions.
Any other feedback about the migration will be appreciated!&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;We will soon be updating the toolchain to support Java 17.
At that point, we will publish documentation for plugin developers explaining how to test plugins with Java 17.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the coming weeks we will focus on addressing feedback from early adopters and
fixing any discovered compatibility issues.
We will also continue working on Java 17 support patches toward general availability later this year.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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/sigs/platform/&quot;&gt;Platform Special Interest Group&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/2022/03/08/gsoc2022-announcement/</id>
<title>Google Summer of Code 2022… Here We Come!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-03-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/03/08/gsoc2022-announcement/" />
<category term='gsoc'></category>
<category term='gsoc2022'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
We are thrilled to announce that Jenkins has been accepted to
Google Summer of Code 2022!
This will be Jenkins' sixth year as a mentoring organization.


Congratulations to all 203 accepted open source participating organizations!


For the past 5 years as a mentoring organization,
Jenkins boasts mentorship of 27 GSoC students by 80+ mentors,
that&#8217;s bringing together over 107 strangers for a common idea - Jenkins.


At the heart of it, GSoC is more than just a mentoring program, bridging new contributors to the open source.
It is about giving a little of your day to make a lifetime of a difference,
not only for the GSoC contributors but...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are thrilled to announce that Jenkins has been accepted to
&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code 2022&lt;/a&gt;!
This will be Jenkins&#39; sixth year as a mentoring organization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to all &lt;a href=&quot;https://summerofcode.withgoogle.com/programs/2022/organizations&quot;&gt;203 accepted open source participating organizations&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the past 5 years as a mentoring organization,
Jenkins boasts mentorship of 27 GSoC students by 80+ mentors,
that’s bringing together over 107 strangers for a common idea - Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the heart of it, GSoC is more than just a mentoring program, bridging new contributors to the open source.
It is about giving a little of your day to make a lifetime of a difference,
not only for the GSoC contributors but also for the many Jenkins users who will benefit from the improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to welcome new GSoC contributors to the Jenkins family.
We think you will enjoy this valuable experience while developing your technical skills.
You will gain insights into how the community works.
The best part will be learning from people who are passionate about Jenkins
but more importantly they passionate about wanting to make a difference for another individual (GSoC contributors) and for the betterment of the project as a whole.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For detailed information on Jenkins GSoC 2021, see &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/&quot;&gt;completed projects&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;What’s next?&lt;/strong&gt;
GSoC is &lt;a href=&quot;https://summerofcode.withgoogle.com/programs/2022&quot;&gt;officially announced&lt;/a&gt;, and please expect more potential GSoC contributors to contact projects in our
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc#contacts&quot;&gt;Gitter channels and Discourse channels&lt;/a&gt;.
Many communications will also happen in SIG and sub-project channels.
We will be working hard in order to help potential participants to find interesting projects, to explore the area,
and to prepare their project proposals before the deadline on April 19th.
Then we will process the applications, select projects and assign mentor teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All information about the Jenkins GSoC is available on its &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;sub-project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-do-i-apply&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-apply&quot; /&gt;How do I apply?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors&quot;&gt;Information for students&lt;/a&gt; page for full application guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage interested participants to reach out to the Jenkins community early and to start exploring project ideas.
We also encourage participants to join the weekly &lt;a href=&quot;https://docs.google.com/document/d/1OpvMWpzBKtKnYBAkhtQ1dK5zQix3D7RY5g3vDJXkSnc/edit?usp=sharing&quot;&gt;Jenkins GSoC office hours&lt;/a&gt;, these meetings are set up for participants to meet org admins and mentors and to ask questions.
Also, join our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;Gitter channel&lt;/a&gt; and our
&lt;a href=&quot;https://community.jenkins.io/c/contributing/gsoc/6&quot;&gt;Discourse server&lt;/a&gt;
to receive information about such incoming events in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The application period starts on April 4th, but you should prepare now!
Use the time before the application period to discuss and improve your project proposals.
We also recommend that you become familiar with Jenkins and start exploring your proposal areas.
Project ideas include quick-start guidelines and reference newbie-friendly issues
which may help with initial study.
If you do not see anything interesting,
you can &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;propose your own project idea&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;i-want-to-be-a-mentor-is-it-too-late&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-want-to-be-a-mentor-is-it-too-late&quot; /&gt;I want to be a mentor. Is it too late?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s not!
We are looking for more project ideas and for Jenkins contributors/users
who are passionate about Jenkins and want to be a mentor.
No hardcore experience required, mentors can study the project internals together with GSoC contributors and technical advisors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can either propose a new project idea or join an existing one.
See the &lt;a href=&quot;https://www.jenkins.io/blog/2022/01/07/gsoc-2022/&quot;&gt;Call for Mentors post&lt;/a&gt;
and &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors&quot;&gt;Information for mentors&lt;/a&gt; for details.
If you want to propose a new project,
please do so as soon as possible so that potential GSoC contributors have time to explore them and to prepare their proposals.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year mentorship does &lt;strong&gt;NOT&lt;/strong&gt; require strong expertise in Jenkins development.
The objective is to guide participants and to get involved into the Jenkins community.
GSoC org admins will help to find advisers if special expertise is required.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;important-dates-for-gsoc-2022&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates-for-gsoc-2022&quot; /&gt;Important dates for GSoC 2022&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;March 7 - April 3 - Potential GSoC contributors discuss application ideas with mentoring organizations. Show &lt;a href=&quot;https://community.jenkins.io/c/contributing/gsoc/6&quot;&gt;us&lt;/a&gt; your proposal!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;April 4 - GSoC contributor application period begins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;April 19 - GSoC contributor application deadline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;May 12 - GSoC contributor slot requests due from Org Admins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;May 20 - Accepted GSoC contributor projects announced&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;May 20 - June 12 - Community Bonding Period | GSoC contributors get to know mentors, read documentation, get up to speed to begin working on their projects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;June 13 - Coding officially begins!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;July 25 - September 4 - Work Period | GSoC contributors work on their project with guidance from Mentors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;September 5 - September 12 - Final week: GSoC contributors submit their final work product&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;September 20 - Initial results of Google Summer of Code 2022&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;November 21 - Final date for all GSoC contributors to submit their final work product&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.google.com/open-source/gsoc/timeline&quot;&gt;GSoC Timeline&lt;/a&gt; for more info.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/02/16/return_of_students_as_mentors/</id>
<title>Jenkins GSoC 2022: The Return of Students as Mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-02-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/02/16/return_of_students_as_mentors/" />
<category term='gsoc'></category>
<category term='gsoc2022'></category>
<category term='community'></category>
<category term='events'></category>
<category term='developer'></category>
<summary>
Since 2005, the Google Summer of Code program has connected 18,000+ new open source contributors from 112 countries with 17,000+ mentors from 118 countries.
Google Summer of Code has produced over 40 million lines of code for 746 open source organizations.


The Jenkins project has been a mentoring organization for five years,
successfully mentored 27 GSoC students by ~80 mentors,
not to mention countless numbers of proposed and accepted project ideas.


The Need for More Project Ideas and Mentors

This year, the Jenkins project is gearing up to participate in the GSoC 2022.
Just like previous years, an integral element of this program consists of project ideas...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since 2005, the Google Summer of Code program has connected 18,000+ new open source contributors from 112 countries with 17,000+ mentors from 118 countries.
Google Summer of Code has produced over 40 million lines of code for 746 open source organizations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has been a mentoring organization for five years,
successfully mentored 27 GSoC students by ~80 mentors,
not to mention countless numbers of proposed and accepted project ideas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-need-for-more-project-ideas-and-mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-need-for-more-project-ideas-and-mentors&quot; /&gt;The Need for More Project Ideas and Mentors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, the Jenkins project is gearing up to participate in the GSoC 2022.
Just like previous years, an integral element of this program consists of project ideas and mentors.
However, &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/project-ideas/&quot;&gt;Jenkins GSoC 2022 project ideas and mentors&lt;/a&gt; are still on the dangerously light side.
We are in need of more project ideas and mentors.
Please see our &lt;a href=&quot;https://www.jenkins.io/blog/2022/01/07/gsoc-2022/&quot;&gt;previous post&lt;/a&gt; for more details on project ideas and mentoring.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;meet-our-returning-students-now-mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#meet-our-returning-students-now-mentors&quot; /&gt;Meet our Returning Students, Now Mentors&lt;/h3&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/2022-02-16-new-mentors/new-gsoc-mentors.png&quot; alt=&quot;Natasha Stopa, Abhyudaya Sharma, Kris Stern, Rishabh Budhouliya, and Harshit Chopra&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, we are especially excited to have former GSoC students join the program as mentors.
The following GSoC students turned mentors include:&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;Natasha Stopa&lt;/strong&gt; (&lt;a href=&quot;https://www.jenkins.io/blog/authors/stopalopa&quot;&gt;Blogposts&lt;/a&gt;, &lt;a href=&quot;https://github.com/stopalopa&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Abhyudaya Sharma&lt;/strong&gt; (&lt;a href=&quot;https://www.jenkins.io/blog/authors/abhyudayasharma&quot;&gt;Blogposts&lt;/a&gt;, &lt;a href=&quot;https://github.com/AbhyudayaSharma&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kris Stern&lt;/strong&gt; (&lt;a href=&quot;https://www.jenkins.io/blog/authors/krisstern&quot;&gt;Blogposts&lt;/a&gt;, &lt;a href=&quot;https://github.com/krisstern&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rishabh Budhouliya&lt;/strong&gt; (&lt;a href=&quot;https://www.jenkins.io/blog/authors/rishabhbudhouliya&quot;&gt;Blogposts&lt;/a&gt;, &lt;a href=&quot;https://github.com/rishabhBudhouliya&quot;&gt;GitHub&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Harshit Chopra&lt;/strong&gt; (&lt;a href=&quot;https://www.jenkins.io/blog/authors/arpoch&quot;&gt;Blogposts&lt;/a&gt;, &lt;a href=&quot;https://github.com/arpoch&quot;&gt;GitHub&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;We asked them to take us through how they came to decide to be GSoC mentors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-sort-of-role-has-mentoring-played-in-your-life&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-sort-of-role-has-mentoring-played-in-your-life&quot; /&gt;What sort of role has mentoring played in your life?&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;Abhyudaya Sharma&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Mentoring has helped me improve my communication skills, meet new people, and learn things in more detail.
I feel that by explaining something to someone, you are not only helping them learn, but you also improve your own understanding.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Harshit Chopra&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Mentoring helped me explain my thought process more effectively.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Kris Stern&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Mentoring has helped me in my work, especially when I need to collaborate with my colleagues.
In a way the experience hones my soft skills, so that I have become a more effective communicator.&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;what-made-you-decide-to-be-a-gsoc-mentor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-made-you-decide-to-be-a-gsoc-mentor&quot; /&gt;What made you decide to be a GSoC mentor?&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;Abhyudaya Sharma&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;GSoC is not just an opportunity for students to learn new technologies and improve their programming skills, it is much more than that.
As a GSoC student in 2019, the feedback from the community members made me realize that even a single project can lead to a substantial improvement in the quality of life of its users.
Hence, I’m back this year as a mentor to help the amazing Jenkins ecosystem become even better.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Harshit Chopra&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;I had great experience as a mentee in GSoC 2021. The mentors and community support made it possible. So I decided to give back to the community.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Kris Stern&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;I have learned a lot from my previous mentors as well as mentoring community through participation in GSoC as a contributor in 2019 and 2020,
and I would like to give back by becoming a mentor myself.&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;what-advice-would-you-share-with-future-gsoc-participants&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-advice-would-you-share-with-future-gsoc-participants&quot; /&gt;What advice would you share with future GSoC participants?&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;Abhyudaya Sharma&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;I wish I knew the importance of writing documentation when I started out as a GSoC student.
Writing documentation for your code may seem like a chore at first but with time one realizes that a project is only as good as its documentation.
I would recommend future GSoC students to make daily notes of their work and compile them so that they are useful for users and future developers.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Harshit Chopra&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;I wish I knew that there is no one solution to a problem, sometimes a solution might seem good but could have repercussions. So it’s always good to establish regular communication with the mentors and nice to have a plan B.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Kris Stern&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;I wish I knew as open-source contributors we do not always know everything, even for the more experienced ones who are in more senior roles in the open-source communities.&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;what-advice-would-you-share-with-potential-mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-advice-would-you-share-with-potential-mentors&quot; /&gt;What advice would you share with potential mentors?&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;Abhyudaya Sharma&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;If you’ve always wanted a new feature or have something fixed, this is the perfect opportunity.
Students will be working under your guidance for over three months and will have a chance to create something that would benefit not just you but the entire open-source community.
Moreover, mentoring is an excellent opportunity to hone one’s skills and meet new people from all around the world.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Harshit Chopra&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;If you have the time and want to pass on your experience and knowledge you have gained so far that might help contributors, then mentoring is the best thing for it.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Kris Stern&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;By taking part in mentoring a new cohort of GSoC contributors we are not just giving, but are learning and benefiting in the process as well.
It may seem like we do not have all the necessary skills and knowledge to offer mentorship in a particular project at first,
but this can be overcome,
especially building on the strengths of our skills and knowledge gained from past GSoC projects as contributors ourselves.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/02/10/last-plugin-version-not-installable/</id>
<title>Why can&#39;t I install the latest plugin on my Jenkins LTS?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-02-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/02/10/last-plugin-version-not-installable/" />
<category term='jenkins'></category>
<category term='plugin'></category>
<category term='upgrade'></category>
<category term='developer'></category>
<summary>
I regularly go, as all Jenkins admin do, to my system&#8217;s Plugin Management page to see what plugins can be upgraded.


Although I am running the latest LTS version, I can&#8217;t update some key plugins (for example the JUnit plugin).
This is even more intriguing as some are part of the plugins installed by default by the setup wizard.
No "install" tick box and the plugin is labeled "unavailable".
There is a note saying "This version of the plugin exists but it is not being offered for installation, so the latest bug fixes or features are not available to you. This is typically the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I regularly go, as all Jenkins admin do, to my system’s Plugin Management page to see what plugins can be upgraded.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although I am running the latest &lt;a href=&quot;https://www.jenkins.io/download/lts/&quot;&gt;LTS version&lt;/a&gt;, &lt;strong&gt;I can’t update some key plugins&lt;/strong&gt; (for example the JUnit plugin).
This is even more intriguing as some are part of the plugins installed by default by the setup wizard.
No &quot;install&quot; tick box and the plugin is labeled &quot;unavailable&quot;.
There is a note saying &quot;&lt;em&gt;This version of the plugin exists but it is not being offered for installation, so the latest bug fixes or features are not available to you. This is typically the case when plugin requirements, e.g. a recent version of Jenkins, are not satisfied. If you are using the latest version of Jenkins offered to you, newer plugin releases may not be available to your release line yet. See the plugin documentation for information about its requirements.&lt;/em&gt;&quot;.&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/2022-02-10-last-plugin-version-not-installable/plugin-not-installable.png&quot; alt=&quot;pluginView&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The message indicates to Jenkins administrators that a newer plugin version is available
but that the installed Jenkins core doesn’t provide a necessary prerequisite – typically being too old.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Why is this happening now?&lt;/strong&gt;
Did I miss something?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As part of the continuous improvement of Jenkins, some critical and high impact changes are introduced.
This is typically the case of GUI changes (icons, fonts, layout) as is currently happening.
It is also the case for new core features that can be consumed by plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Such changes are typically first introduced in the cutting edge Jenkins weekly release.
Plugins are adapted to take advantage of these changes and the minimal Jenkins version required for those new plugin releases is set to a very new release of Jenkins that includes these changes.
This causes a clear requirement disruption compared to the generally slow and low-impact plugin requirement evolution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It will require more time before these major changes will be available in an LTS Jenkins version.
In the meantime, the new plugin will have to wait before it can be installed on that release line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you &lt;em&gt;need&lt;/em&gt; to install that latest plugin version because it also fixes that annoying bug, you will have to evaluate whether it is worth &lt;a href=&quot;https://www.jenkins.io/download/lts/#switching-from-lts-to-weekly&quot;&gt;switching to the weekly release line&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that this story is a strong reminder to keep your Jenkins system as current as possible if you don’t want to miss out on new features and important bug fixes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to Daniel Beck to have given me the &quot;raw&quot; explanation of this unexpected behavior.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2022/01/14/happy-new-year/</id>
<title>Happy New Year! 2022 edition</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-01-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/01/14/happy-new-year/" />
<author>
<name>markewaite</name>
</author>
<category term='community'></category>
<category term='new-year-blogpost'></category>
<category term='governance'></category>
<summary>
Special thanks from the Jenkins project to users and contributors with the New Year!
Let&#8217;s take a look at some changes this year.





Highlights




Major events including Google Summer of Code, Hacktoberfest, She Code Africa Contributhon, and three Contributor Summits


Strong support from new and continuing Sponsors


Core features for configuration form modernization, upgrades to key dependencies, continuous delivery for plugins, and Java 11 as the preferred JVM


Security improvements for safer and more secure automation


Plugin site enhancements with integrated site search, better navigation, more information, and easier updates of existing information


Community site to encourage users to help one another and to welcome new contributors






Project updates


The...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks from the Jenkins project to users and contributors with the New Year!
Let’s take a look at some changes this year.&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/2017-12-31-new-year/card.png&quot; alt=&quot;New Year&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#highlights&quot; /&gt;Highlights&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;#major-events&quot;&gt;Major events&lt;/a&gt; including &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/&quot;&gt;Google Summer of Code&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/2021/10/31/hacktoberfest-results-2021/&quot;&gt;Hacktoberfest&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/2021/04/07/contributhon-participants/&quot;&gt;She Code Africa Contributhon&lt;/a&gt;, and three &lt;a href=&quot;https://www.jenkins.io/events/contributor-summit/&quot;&gt;Contributor Summits&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Strong support from new and continuing &lt;a href=&quot;#sponsors&quot;&gt;Sponsors&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#core-features&quot;&gt;Core features&lt;/a&gt; for configuration form modernization, upgrades to key dependencies, continuous delivery for plugins, and Java 11 as the preferred JVM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#security-improvements&quot;&gt;Security improvements&lt;/a&gt; for safer and more secure automation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#plugin-site-enhancements&quot;&gt;Plugin site enhancements&lt;/a&gt; with integrated site search, better navigation, more information, and easier updates of existing information&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#community-site&quot;&gt;Community site&lt;/a&gt; to encourage users to help one another and to welcome new contributors&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-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-updates&quot; /&gt;Project updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The highlights in this blog post do not cover all the advancements in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additional improvements are noted in the &lt;a href=&quot;https://www.jenkins.io/blog/2021/02/16/contributor-summit-online/&quot;&gt;February 2021 Contributor Summit&lt;/a&gt;, the &lt;a href=&quot;https://www.jenkins.io/events/contributor-summit/archive/2021-06&quot;&gt;June 2021 Contributor Summit&lt;/a&gt;, and the &lt;a href=&quot;https://www.jenkins.io/events/contributor-summit/archive/2021-10&quot;&gt;October 2021 Contributor Summit&lt;/a&gt;.
New and updated Jenkins features are described in the &lt;a href=&quot;https://www.jenkins.io/changelog-stable/&quot;&gt;LTS changelog&lt;/a&gt; and the &lt;a href=&quot;https://www.jenkins.io/changelog/&quot;&gt;weekly changelog&lt;/a&gt;.
The &lt;a href=&quot;https://www.youtube.com/watch?v=jvgtRXGcyOM&quot;&gt;introduction to Jenkins 2.277.1 webinar&lt;/a&gt; shares more information on configuration form modernization, the update from acegi to Spring Security, and other dependency updates.
See the &lt;a href=&quot;https://www.jenkins.io/security/advisories/&quot;&gt;security advisories archive&lt;/a&gt; for more details on security fixes and improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;major-events&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#major-events&quot; /&gt;Major events&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project participates in major open source events around the world.
These events bring new and existing contributors together to improve Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;google-summer-of-code-2021&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-summer-of-code-2021&quot; /&gt;Google Summer of Code 2021&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/blog/2021/09/24/gsoc-report/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-01-14-new-year/gsoc-2021-students.png&quot; alt=&quot;Google Summer of Code students&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project continued its deep commitment to Google Summer of Code in 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Five Jenkins projects were accepted into Google Summer of Code.
All five projects were completed successfully.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to the Google Summer of Code students:&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/shrutic-git/&quot;&gt;Shruti Chaturvedi&lt;/a&gt; for the &lt;a href=&quot;https://www.jenkins.io/blog/2021/08/02/cloudevents-plugin-phase-I/&quot;&gt;CloudEvents plugin for Jenkins&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/arpoch/&quot;&gt;Harshit Chopra&lt;/a&gt; for &lt;a href=&quot;https://www.jenkins.io/blog/2021/08/19/git-credentials-binding-work-report/&quot;&gt;git credentials binding for sh, bat, and powershell&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/sharmapulkit04/&quot;&gt;Pulkit Sharma&lt;/a&gt; for &lt;a href=&quot;https://www.jenkins.io/blog/2021/08/23/jenkins-operator-security-work-report/&quot;&gt;security validator for Jenkins operator for Kubernetes&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/aki-7/&quot;&gt;Akihiro Kiuchi&lt;/a&gt; for &lt;a href=&quot;https://www.jenkins.io/blog/2021/07/31/remoting-monitoring-phase-1/&quot;&gt;remoting monitoring with OpenTelemetry&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/adi10hero/&quot;&gt;Aditya Srivastava&lt;/a&gt; for &lt;a href=&quot;https://www.jenkins.io/blog/2021/08/28/conventional-commits-plugin-project-report/&quot;&gt;conventional commits plugin for Jenkins&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;Read more about their results and their impact on the Jenkins project in the &lt;a href=&quot;https://www.jenkins.io/blog/2021/09/24/gsoc-report/&quot;&gt;end of project report&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hacktoberfest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hacktoberfest&quot; /&gt;Hacktoberfest&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/blog/2021/10/31/hacktoberfest-results-2021/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021/2021-10-31-hacktoberfest-results-2021.png&quot; alt=&quot;Hacktoberfest 2021&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hacktoberfest 2021 contributors provided over 90 pull requests to Jenkins repositories.
The pull requests included improvements to Jenkins core, Jenkins plugins, Jenkins infrastructure, and Jenkins documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Key results included:&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/2021/10/31/hacktoberfest-results-2021/#translations-and-artwork&quot;&gt;Translations and artwork&lt;/a&gt;, including improvements in French, Spanish, and Russian language translations and two new Jenkins images&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2021/10/31/hacktoberfest-results-2021/#plugin-docs-migration-to-github&quot;&gt;Plugin documentation migration to GitHub&lt;/a&gt; for 29 different plugins, with a &lt;a href=&quot;https://www.youtube.com/watch?v=NU2g373wHNo&amp;amp;t=2331s&quot;&gt;tutorial video&lt;/a&gt; to help new contributors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2021/10/31/hacktoberfest-results-2021/#implementing-content-security-policy&quot;&gt;Security improvements in content security policy&lt;/a&gt; from six contributors moving JavaScript into dedicated files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2021/10/31/hacktoberfest-results-2021/#jenkins-architecture-diagrams&quot;&gt;Architecture diagrams&lt;/a&gt; providing both a dataflow view and a high-level overview of Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Five part video series on &lt;a href=&quot;https://youtu.be/Fev8KfFsPZE&quot;&gt;&quot;Modernizing Jenkins Plugins&quot;&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;she-code-africa-contributhon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#she-code-africa-contributhon&quot; /&gt;She Code Africa Contributhon&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/blog/2021/04/07/contributhon-participants/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-04-contributhon-participants/shecodeafrica-participants-opengraph.png&quot; alt=&quot;She Code Africa Contributhon 2021&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project was a mentoring organization in the first ever &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon&quot;&gt;She Code Africa Contributhon&lt;/a&gt;.
The She Code Africa Contributhon pays African women to work with open source organizations on selected projects with dedicated mentors.
This program aims to create a more diverse, inclusive, and innovative culture within the African open source ecosystem by matching African women in technology with sponsor and mentor open source organizations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The five women met with mentors twice weekly for a month.
They built Jenkins core and Jenkins plugins and submitted pull requests to improve Jenkins plugin online help and documentation.
The 5 mentees on the Jenkins project joined the project from Nigeria, Kenya, and Rwanda.&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://www.jenkins.io/blog/2021/04/07/contributhon-participants/&quot;&gt;She Code Africa blogpost&lt;/a&gt;.&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;sponsors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sponsors&quot; /&gt;Sponsors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project is truly fortunate to have so many sponsors contributing to its success.
We thank our sponsors sincerely and look forward to their continuing support.
The Jenkins project depends on sponsor organizations for its infrastructure, tools, and funding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many contributors are employed by sponsor companies like &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; and &lt;a href=&quot;https://www.redhat.com/&quot;&gt;Red Hat&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins distribution, build, test, and deployment infrastructure is provided by sponsors like &lt;a href=&quot;https://jfrog.com/&quot;&gt;JFrog&lt;/a&gt;, &lt;a href=&quot;https://aws.amazon.com/&quot;&gt;Amazon Web Services&lt;/a&gt;, &lt;a href=&quot;https://osuosl.org/&quot;&gt;Oregon State University Open Source Lab&lt;/a&gt;, &lt;a href=&quot;https://www.oracle.com/&quot;&gt;Oracle&lt;/a&gt;, and &lt;a href=&quot;https://www.digitalocean.com/&quot;&gt;DigitalOcean&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins development is tracked with tools provided by sponsors like &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;, &lt;a href=&quot;https://jfrog.com/&quot;&gt;JFrog&lt;/a&gt;, &lt;a href=&quot;https://www.atlassian.com/&quot;&gt;Atlassian&lt;/a&gt;, the &lt;a href=&quot;https://www.linuxfoundation.org/&quot;&gt;Linux Foundation&lt;/a&gt;, &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt;, and &lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt;.
Site search for the Jenkins primary web site and the plugins site is provided by &lt;a href=&quot;https://www.algolia.com/&quot;&gt;Algolia&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Operational funding is provided by the &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation&lt;/a&gt;, &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;, and &lt;a href=&quot;https://aws.amazon.com/&quot;&gt;Amazon Web Services&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mirrors for worldwide distribution are provided by organizations like &lt;a href=&quot;https://osuosl.org/&quot;&gt;Oregon State University Open Source Lab&lt;/a&gt;, &lt;a href=&quot;https://xmission.com/&quot;&gt;XMission&lt;/a&gt;, &lt;a href=&quot;https://www.tsinghua.edu.cn/&quot;&gt;Tsinghua University&lt;/a&gt;, &lt;a href=&quot;https://www.yamagata-u.ac.jp/&quot;&gt;Yamagata University&lt;/a&gt;, &lt;a href=&quot;https://gruenehoelle.nl/&quot;&gt;Gruenehoelle NL&lt;/a&gt;, &lt;a href=&quot;https://belnet.be/&quot;&gt;Belgian Education and Research Network&lt;/a&gt;, and &lt;a href=&quot;https://www.rwth-aachen.de/&quot;&gt;RWTH Aachen University&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;core-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#core-features&quot; /&gt;Core features&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins core delivered 53 weekly releases and 14 long term support releases in 2021.
Hundreds of plugin releases were delivered in 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The releases included user interface improvements, security improvements, security fixes, dependency replacements, dependency updates, and more.
Contributors from around the world provided the changes included in those releases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configuration-form-modernization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-form-modernization&quot; /&gt;Configuration form modernization&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the culmination of 12 months of work by many different people, Jenkins modernized its configuration forms in Jenkins 2.277.1.
The Jenkins user interface is now much better adapted to narrow screens and modern web layout techniques.
It works well on all modern web browsers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The configuration form modernization introduction included a &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.277.1&quot;&gt;changelog&lt;/a&gt;, an &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.277/#configuration-form-modernization&quot;&gt;upgrade guide&lt;/a&gt;, and an &lt;a href=&quot;https://www.youtube.com/watch?v=jvgtRXGcyOM&quot;&gt;introductory webinar&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dependency-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dependency-updates&quot; /&gt;Dependency updates&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many outdated Jenkins dependencies were updated or replaced by 2021 development work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins core security library was converted from a forked copy of Acegi Security to the most recent release of the standard Spring Security library.
The Jenkins core XML serialization library was converted from a forked copy of the XStream library to the most recent release of the standard XStream library.
The Jenkins internal class management libraries were converted from a forked copy of Apache Ant libraries to the most recent release of the standard Apache Ant libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Outdated libraries were removed from Jenkins core including ASM 5, ASM 6, Apache Commons Digester, Bytecode Compatibility Transformer, Akuma, Woodstox, JNA Posix, JTidy, and libpam4j.
Removals were accompanied by plugin updates as needed to retain compatibility and functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Key libraries were updated to use more recent releases of the libraries.
Guava was upgraded from 11.0.1 to 31.0.1.
Guice was upgraded from 4.0 to 5.0.1.
Groovy was upgraded from 2.4.12 to 2.4.21.
Many Apache Commons libraries were upgraded to their most recent releases.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;continuous-delivery-for-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#continuous-delivery-for-plugins&quot; /&gt;Continuous delivery for plugins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Continuous delivery of Jenkins components was proposed in 2020 by Jesse Glick as &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/229/README.adoc&quot;&gt;Jenkins Enhancement Proposal 229&lt;/a&gt;.
By the end of 2021, 119 plugins had adopted continuous delivery, providing new plugin releases each time a relevant commit was merged to the plugin repository.
Additional components have adopted continuous delivery as well, including the plugin bill of materials and the Jenkins test harness.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We look forward to even greater adoption of continuous delivery for plugins in 2022.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;prefer-java-11-instead-of-java-8&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#prefer-java-11-instead-of-java-8&quot; /&gt;Prefer Java 11 instead of Java 8&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 11 was adopted as the recommended JDK during 2021.
Docker images now use JDK 11 by default.
See the &lt;a href=&quot;https://www.jenkins.io/blog/2021/08/17/docker-images-use-jdk-11-by-default/&quot;&gt;blogpost&lt;/a&gt; for more information about the Docker image transition.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Docker images with Java 11 are also available for multiple platforms, including 64 bit ARM and IBM s390x.&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;more-inclusive-naming&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-inclusive-naming&quot; /&gt;More inclusive naming&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project decided in 2016 to replace the term &quot;slave&quot; with the more inclusive term &quot;agent&quot;.
In July 2020 the project adopted the &quot;controller&quot; term to replace the older term &quot;master&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins core 2.319.1 was released in December 2021 replaced the term &quot;master&quot; with more accurate terminology.
The release also includes an integrated migration tool to allow existing installations to decide when they would adopt the new terminology.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;security-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-improvements&quot; /&gt;Security improvements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins security improvements have continued throughout 2021.
The Jenkins security team provided timely responses to security issues in Jenkins core and in Jenkins plugins.
The project is sincerely grateful to &lt;a href=&quot;https://www.jenkins.io/blog/authors/daniel-beck/&quot;&gt;Daniel Beck&lt;/a&gt; for his years of service as Jenkins Security Officer.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/wadeck/&quot;&gt;Wadeck Follonier&lt;/a&gt; began his service as Jenkins Security Officer in December, 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins infrastructure team resolved infrastructure issues and safeguarded Jenkins infrastructure.
The project is deeply grateful to &lt;a href=&quot;https://www.jenkins.io/blog/authors/olblak/&quot;&gt;Olivier Vernin&lt;/a&gt; for his years of service as Jenkins Infrastructure Officer.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/dduportal/&quot;&gt;Damien Duportal&lt;/a&gt; began his service as Jenkins Infrastructure Officer in December, 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;agent-to-controller-security&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#agent-to-controller-security&quot; /&gt;Agent to controller security&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Daniel Beck proposed &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/235&quot;&gt;Jenkins Enhancement Proposal 235&lt;/a&gt; in November, 2021 to remove the ability to disable or customize the agent-to-controller security system.
Telemetry has been added to Jenkins releases beginning with 2.319.1 and Jenkins 2.326.
The telemetry reports agent use of methods to access files on the controller.
As controller file access from agents is detected by the telemetry, issues are raised to remove that access from the offending plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;log4j-2-zero-day-vulnerability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#log4j-2-zero-day-vulnerability&quot; /&gt;Log4j 2 zero day vulnerability&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;December 2021 included the announcement of multiple zero day vulnerabilities in the Apache Log4j 2 library.
The Jenkins security team assessed the impact of the vulnerabilities and confirmed that Jenkins core was not affected by the vulnerabilities.
Further research showed that Jenkins plugins might be affected by the vulnerabilities.
Instructions were &lt;a href=&quot;https://www.jenkins.io/blog/2021/12/10/log4j2-rce-CVE-2021-44228/&quot;&gt;shared in a blogpost&lt;/a&gt; so that Jenkins administrators could check their system for issues.
A &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/67353&quot;&gt;Jira epic&lt;/a&gt; tracks the progress of corrections in the plugins that were including the affected Apache Log4j 2 library versions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-confluence-instance-shutdown&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-confluence-instance-shutdown&quot; /&gt;Jenkins Confluence instance shutdown&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In September, 2021, a zero day vulnerability was disclosed in the Confluence version used in the Jenkins project.
The infrastructure team permanently disabled the service, rotated privileged credentials, and actively reduced the scope of access across the Jenkins infrastructure.
Passwords for all user accounts on jenkins.io were reset.
Users were required to perform a password recovery in order to regain access to their jenkins.io accounts.
 See the &lt;a href=&quot;https://www.jenkins.io/blog/2021/09/04/wiki-attacked/&quot;&gt;blogpost&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The page content from the Jenkins Confluence instance has been returned to service as static HTML pages.
The plugin documentation from the Jenkins Confluence instance is now integrated into the plugin site build process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;master-project-in-jenkins-security&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#master-project-in-jenkins-security&quot; /&gt;Master project in Jenkins security&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Wadeck Follonier coordinated and mentored an end-of-study security research project for four students during the last year of their Master’s Degree - Reliability and IT Security at the University of Aix-Marseille.
The students applied their university training to audit Jenkins core and many Jenkins plugins for specific types of security issues.
Their project resulted in 14 vulnerabilities reported in Jenkins security advisories.
More details of their results and their processes are available in the &lt;a href=&quot;https://www.jenkins.io/blog/2021/06/21/student-luminy-project-security/&quot;&gt;blogpost&lt;/a&gt;.&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;plugin-site-enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-site-enhancements&quot; /&gt;Plugin site enhancements&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://plugins.jenkins.io&quot;&gt;Jenkins plugins site&lt;/a&gt; has become the definitive location for information about Jenkins plugins.
It successfully presents plugin documentation, changelogs, and dependencies for over 1100 plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Site search is provided by an Algolia open source sponsorship for easy and accurate search of Jenkins plugins.
Search performance reports are used to refine and improve the site.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins plugin maintainers migrated plugin documentation for over 200 plugins into plugin repositories.
Documentation in GitHub repositories is easier to update, easier to manage, and more likely to be correct.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;community-site&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-site&quot; /&gt;Community site&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;a class=&quot;image&quot; href=&quot;https://community.jenkins.io&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-01-14-new-year/community-site.png&quot; alt=&quot;Community Site&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community has improved its communication with the addition of a new internet forum, &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt;.
Discourse sponsors the internet forum management software that runs the community site.
The site hosts question and answer forums, highlights novel and interesting use of Jenkins, and encourages users to help one another.
See the &lt;a href=&quot;https://community.jenkins.io/t/2021-the-year-in-review/1149&quot;&gt;&quot;2021: Year in Review&quot;&lt;/a&gt; page for more details on the use and evolution of the community site.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-is-the-way&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-is-the-way&quot; /&gt;Jenkins is the way&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;a class=&quot;image&quot; href=&quot;https://stories.jenkins.io/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2022-01-14-new-year/jenkins-is-the-way-map.png&quot; alt=&quot;Jenkins is the Way&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;&quot;Jenkins Is The Way&quot;&lt;/a&gt; is a global showcase of how developers and engineers are building, deploying, and automating great stuff with Jenkins.
138 new user stories were added to the site in 2021.
Jenkins use around the world was highlighted in 3 eBooks.&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 Jenkins project will be busy in 2022.
User experience improvements are arriving.
Java updates are continuing.
In the coming months there will be discussions on the &lt;a href=&quot;https://community.jenkins.io/&quot;&gt;community site&lt;/a&gt;, in the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;mailing lists&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/sigs/&quot;&gt;special interest groups&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/events/contributor-summit&quot;&gt;contributor summits&lt;/a&gt;.
We invite all teams to work on their roadmaps and to communicate them in the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also plan to continue all outreach programs.
At the moment we are looking for Google Summer of Code 2022 mentors and project ideas (&lt;a href=&quot;https://www.jenkins.io/blog/2022/01/07/gsoc-2022/&quot;&gt;announcement&lt;/a&gt;).
We also work on improving &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;contribution guidelines&lt;/a&gt; for newcomers and expert contributors.
If you are interested, please contact the &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/&quot;&gt;Advocacy and Outreach SIG&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;and-even-more&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#and-even-more&quot; /&gt;And even more&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post does not provide a full overview of what changed in the project.
The Jenkins project consists of more than 2000 plugins and components which are developed by thousands of contributors.
Thanks to them, a lot of changes happen in the project every day.
We are cordially grateful to everybody who participates in the project, regardless of contribution size.
Everything matters: new features, bug fixes, documentation, blog posts, well reported issues, Stackoverflow responses, etc.
THANKS A LOT FOR ALL YOUR CONTRIBUTIONS!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, keep updating Jenkins and exploring new features.
And stay tuned, there is much more to come in 2022!&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/2022/01/07/gsoc-2022/</id>
<title>Google Summer of Code 2022 Call for Project Ideas and Mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2022-01-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2022/01/07/gsoc-2022/" />
<category term='gsoc'></category>
<category term='gsoc2022'></category>
<category term='community'></category>
<category term='events'></category>
<category term='developer'></category>
<summary>
Google Summer of Code (GSoC) is a global, online mentoring program focused on introducing new contributors to open source software development.
GSoC contributors work on a 12+ week programming project with the guidance of mentors from their open source organization.
During GSoC, participating contributors are paired with mentors from open source organizations, gaining exposure to real-world software development techniques.
GSoC contributors will learn from experienced open source developers while writing code for real-world projects!
A small stipend is provided as an incentive.


See GSoC contributor eligibility here.


We are looking for project ideas and mentors to participate in GSoC 2022.
GSoC project ideas are coding projects that...
</summary>
<content type='html'>
&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 contributors work on a 12+ week programming project with the guidance of mentors from their open source organization.
During GSoC, participating contributors are paired with mentors from open source organizations, gaining exposure to real-world software development techniques.
GSoC contributors will learn from experienced open source developers while writing code for real-world projects!
A small stipend is provided as an incentive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See GSoC contributor eligibility &lt;a href=&quot;https://summerofcode.withgoogle.com/get-started&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are looking for project ideas and mentors to participate in GSoC 2022.
GSoC project ideas are coding projects that potential GSoC contributors can accomplish in about 12+ weeks.
The coding projects can be new features, plugins, test frameworks, infrastructure, etc.
Anyone can submit a project idea, but of course we like it even better if you mentor your project idea.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please send us your project ideas before the beginning of February so they can get a proper review by the GSoC committee and by the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 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;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Create a pull-request with your idea in a .adoc file in the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/tree/master/content/projects/gsoc/2022/project-ideas&quot;&gt;project ideas&lt;/a&gt;.
It is not necessary to submit a Google Doc, but it will still work if you want to do that.
See the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;instructions&lt;/a&gt; on submitting ideas which include an .adoc template and some examples.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-list-of-ideas&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-list-of-ideas&quot; /&gt;Current list of ideas&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below is a current list of proposed project ideas for GSoC contributors to review.
Note that this list is still evolving and is subject to change.
A final list along with project details and descriptions is coming soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkinsfile Runner Action for GitHub Actions (Mentors: Oleg Nenashev, Kris Stern)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/project-ideas/automatic-spec-generator-for-jenkins-rest-api/&quot;&gt;Automatic Specification Generator for Jenkins REST API&lt;/a&gt; (Mentors: Kristin Whetstone)*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin Health Scoring System - How Should it Work (Mentors: Mark Waite, Adrien Lecharpentier)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuration as Code Drift Detector (Mentors: Jean-Marc Meessen)*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/project-ideas/plugin-installation-manager-tool/&quot;&gt;Plugin Installation Manager Tool Improvements&lt;/a&gt; (Need new mentors)*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2022/project-ideas/pipeline-step-documentation-generator/&quot;&gt;Doc Generator&lt;/a&gt; (Mentor: Mark Waite)*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic Git Cache Maintenance on the Controller (Mentor: Mark Waite)*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improving Cloud Events plugin and aligning it with the emerging CD Events Standard (Mentor: Oleg Nenashev)*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins and OpenTelemetry (Mentor: Oleg Nenashev)*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkinsfile executor service for Keptn (powered by Jenkinsfile Runner) (Mentor: Oleg Nenashev)*&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(*) additional mentor(s) needed&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 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;/h3&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;.
Note that being a GSoC mentor does not require expert knowledge of Jenkins.
Mentors do not work alone. We make sure that every project has at least two mentors.
GSoC org admins will help to find technical advisers, so you can study together with your GSoC contributor.
Mentoring takes about 5 to 8 hours of work per week (more at the start, less at the end).
Mentors provide guidance, coaching, and sometimes a bit of cheerleading.
They review GSoC contributor proposals, pull-requests and contributor presentations at the evaluation phase.
They fill in the Google provided final evaluations at the end of the coding period.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-do-you-get-in-exchange&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-do-you-get-in-exchange&quot; /&gt;What do you get in exchange?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentor interaction is a vital part of GSoC.
In return for mentoring, a GSoC contributor works on your project full time for 12+ weeks.
Think about the projects that you’ve always wanted to do but never had the time…
Mentoring is also an opportunity to improve your management and people skills, while giving back to the community.
GSoC is a fantastic program and the Jenkins project is happy to participate in GSoC again in 2022!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For any question, 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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/12/22/deprecated-ruby-runtime/</id>
<title>Deprecating non-Java plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-12-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/12/22/deprecated-ruby-runtime/" />
<category term='ruby'></category>
<category term='plugins'></category>
<category term='announcement'></category>
<category term='deprecation'></category>
<summary>
10 years ago, the Jenkins ruby-runtime was first released. It was an experiment to let
plugins be written in ruby but still get integrated into the main
Java Virtual Machine runtime with help of JRuby.
A similar extension was made to allow plugins to be written in Python but still integrated into the Java Virtual Machine with Jython.


Over the years though, the experiments are no longer being maintained and the
plugins that use the non-Java runtimes take a lot of compatibility effort.
In addition, the Jenkins ruby runtime does not support Java 11.
Specifically, the last few years have been really hard on the Jenkins
core developers,...
</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/post-images/2021-12-deprecating-non-java-runtimes.png&quot; alt=&quot;Deprecating non-Java plugins&quot; width=&quot;400px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/ruby-runtime-plugin/commit/d368b087fadb3282c9b537f0fa6d9a150b080c73&quot;&gt;10 years ago, the Jenkins ruby-runtime was first released&lt;/a&gt;. It was an experiment to let
plugins be written in ruby but still get integrated into the main
Java Virtual Machine runtime with help of &lt;a href=&quot;https://www.jruby.org/&quot;&gt;JRuby&lt;/a&gt;.
A similar extension was made to allow plugins to be written in Python but still integrated into the Java Virtual Machine with &lt;a href=&quot;https://www.jython.org/&quot;&gt;Jython&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the years though, the experiments are no longer being maintained and the
plugins that use the non-Java runtimes take a lot of compatibility effort.
In addition, the Jenkins ruby runtime does not support Java 11.
Specifically, the last few years have been really hard on the Jenkins
core developers, as they still have to maintain all the hacks and
processes to keep the non-Java runtimes barely working.
Examples of the experienced issues include compatibility with &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/200/README.adoc&quot;&gt;JEP-200: Switch Remoting/XStream blocklist to a permitlist&lt;/a&gt; where we had to allow many Ruby Runtime classes in the Jenkins core to support serialization of data.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2018 we discussed the future of the Ruby Runtime based plugins.
There was a consensus that we want to deprecate and remove the plugins so that Jenkins users do not experience issues .
&lt;a href=&quot;https://www.jenkins.io/blog/authors/daniel-beck/&quot;&gt;Daniel Beck&lt;/a&gt; created &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/7/README.adoc&quot;&gt;JEP-7: Deprecation of ruby-runtime&lt;/a&gt; for that.
Over the years, the functionality provided by Ruby plugins has been largely replaced by other implementations,
and hence we have decided to proceed with the deprecation
(&lt;a href=&quot;https://groups.google.com/u/1/g/jenkinsci-dev/c/Ve0fqAud3Mk/m/lVejhAjNAQAJ&quot;&gt;discussion&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One month from now, January 22nd, 2022, the &lt;a href=&quot;https://updates.jenkins.io/&quot;&gt;default Jenkins update center&lt;/a&gt; will stop distributing
the &lt;a href=&quot;https://plugins.jenkins.io/ruby-runtime&quot;&gt;Ruby runtime plugin&lt;/a&gt;, the &lt;a href=&quot;https://plugins.jenkins.io/ruby-runtime/#dependencies&quot;&gt;plugins&lt;/a&gt; that use the Ruby runtime, the &lt;a href=&quot;https://plugins.jenkins.io/python-wrapper&quot;&gt;Python runtime plugin&lt;/a&gt;, and the &lt;a href=&quot;https://plugins.jenkins.io/python-wrapper/#dependencies&quot;&gt;plugin&lt;/a&gt; that uses the Python runtime.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-does-this-mean-for-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-does-this-mean-for-you&quot; /&gt;What does this mean for you?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are one of the few users who are using the following plugins, there will be no impact on your existing instances. The
only change will come for new installs. Suspended plugins will stay
installed, but can not be newly installed without manually downloading
releases or using custom update centers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins plugin management tools and distributions may be affected as well if they use the default update center to download the plugins and/or their metadata.
It includes but is not limited to the official &lt;a href=&quot;https://github.com/jenkinsci/docker&quot;&gt;Docker images&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/helm-charts&quot;&gt;Helm charts&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/jenkinsfile-runner&quot;&gt;Jenkinsfile Runner&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/custom-war-packager/&quot;&gt;Custom Jenkins WAR Packager&lt;/a&gt;,
and the &lt;a href=&quot;https://github.com/jenkinsci/plugin-installation-manager-tool&quot;&gt;Plugin Installation Manager CLI Tool&lt;/a&gt;.
Note that all these tools allow custom update sites to be configured if required.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The lists below provide additional information about the plugins based on the Ruby Runtime and the Python Runtime.
Please plan your transition away from these plugins.
They will be removed from the official Jenkins update centers on January 22, 2022.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;affected-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#affected-plugins&quot; /&gt;Affected plugins&lt;/h3&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Gitlab Hook&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;6 years ago&lt;/strong&gt;.&lt;br&gt;
Contains multiple security vulnerabilities.&lt;br&gt;
Suggestion: Use the &lt;a href=&quot;https://plugins.jenkins.io/gitlab-plugin&quot;&gt;GitLab&lt;/a&gt; plugin and the &lt;a href=&quot;https://plugins.jenkins.io/gitlab-branch-source&quot;&gt;GitLab Branch Source&lt;/a&gt; plugin.&lt;/br&gt;
&lt;/br&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Cucumber&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;9 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;code&gt;sh&lt;/code&gt; or &lt;code&gt;bat&lt;/code&gt; to run &lt;code&gt;cucumber&lt;/code&gt; from the command line.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;pyenv&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;7 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;code&gt;sh&lt;/code&gt; or &lt;code&gt;bat&lt;/code&gt; to run &lt;code&gt;pyenv&lt;/code&gt; from the command line.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Rvm&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;5 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;code&gt;sh&lt;/code&gt; or &lt;code&gt;bat&lt;/code&gt; to run &lt;code&gt;rvm&lt;/code&gt; from the command line.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Capitomcat&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;7 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Install Ruby and Capistrano and use &lt;code&gt;sh&lt;/code&gt; or &lt;code&gt;bat&lt;/code&gt; to invoke them from the command line.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Commit Message Trigger&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;7 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;bat&lt;/code&gt;, or other scripts to read git commit messages and conditionally execute Pipeline steps.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Git notes&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;10 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;bat&lt;/code&gt;, or other scripts to run &lt;code&gt;git&lt;/code&gt; to annotate commits.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;rbenv&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;6 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;code&gt;sh&lt;/code&gt; or &lt;code&gt;bat&lt;/code&gt; to run &lt;code&gt;rbenv&lt;/code&gt; from the command line.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Chef&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;6 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;code&gt;sh&lt;/code&gt; or &lt;code&gt;bat&lt;/code&gt; to run &lt;code&gt;chef&lt;/code&gt; from the command line.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;CI Skip&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;8 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use the &lt;a href=&quot;https://plugins.jenkins.io/github-scm-trait-commit-skip&quot;&gt;GitHub Commit Skip SCM Behaviour&lt;/a&gt;, &lt;a href=&quot;https://plugins.jenkins.io/bitbucket-scm-trait-commit-skip&quot;&gt;Bitbucket Commit Skip SCM Behaviour&lt;/a&gt;, or &lt;a href=&quot;https://plugins.jenkins.io/scmskip&quot;&gt;SCM Skip&lt;/a&gt; to skip builds based on the content of commit messages.
Alternately, use &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;bat&lt;/code&gt;, or other scripts to read git commit messages and conditionally execute Pipeline steps.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;InstallShield&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;8 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;bat&lt;/code&gt;, or other scripts to run InstallShield.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;MySQL Job Databases&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;7 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;a href=&quot;https://github.com/jbox-web/job-database-manager-mysql&quot;&gt;Jenkins Job Database Manager Plugin for MySQL&lt;/a&gt;.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Pathignore&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;10 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use the path ignore features of various plugins or use &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;bat&lt;/code&gt;, or other scripts to read git commit messages and conditionally execute Pipeline steps.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Perl&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;9 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use &lt;code&gt;sh&lt;/code&gt; or &lt;code&gt;bat&lt;/code&gt; to run &lt;code&gt;perl&lt;/code&gt; from the command line.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;pry&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;10 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use the Jenkins groovy console and its interface from the Jenkins command line interface.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Single Use Agent&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;7 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use cloud agents (&lt;a href=&quot;https://plugins.jenkins.io/amazon-ecs&quot;&gt;Fargate&lt;/a&gt;, &lt;a href=&quot;https://plugins.jenkins.io/azure-container-agents&quot;&gt;Azure Container Instances&lt;/a&gt;, &lt;a href=&quot;https://plugins.jenkins.io/docker-workflow/&quot;&gt;Docker&lt;/a&gt;, etc.) to allocate agents for a single use and then release them.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Travis YML&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;5 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Rewrite the travis.yml file as a Jenkinsfile, a &lt;a href=&quot;https://www.jenkins.io/blog/2019/05/09/templating-engine/&quot;&gt;Jenkins Templating Engine file&lt;/a&gt;, a &lt;a href=&quot;https://plugins.jenkins.io/pipeline-as-yaml&quot;&gt;Pipeline as YAML&lt;/a&gt;, or a &lt;a href=&quot;https://www.jenkins.io/blog/2019/01/08/mpl-modular-pipeline-library/&quot;&gt;Jenkins Modular Pipeline Library&lt;/a&gt;.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Yammer&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;8 years ago&lt;/strong&gt;.&lt;br&gt;
Suggestion: Use the &lt;a href=&quot;https://learn.microsoft.com/en-us/rest/api/yammer/rest-api-rate-limits&quot;&gt;Yammer REST API&lt;/a&gt; to post messages.&lt;/br&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;DevStack&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;9 years ago&lt;/strong&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Ikachan&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;10 years ago&lt;/strong&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Jenkinspider&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;7 years ago&lt;/strong&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Perl Smoke Test&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;7 years ago&lt;/strong&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;buddycloud&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Last released &lt;strong&gt;8 years ago&lt;/strong&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dd&gt;
&lt;/dd&gt;
&lt;/dd&gt;
&lt;/dd&gt;
&lt;/dd&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;We would like to thank all contributors and maintainers who contributed to the Ruby Runtime based plugins and the Python Runtime based plugin.
We also thank those who participated in development of new plugins replacing the functionality.
These contributors helped millions of Jenkins users while the ecosystem was supported over the past 10 years
and it is not taken for granted.
Now we need to move on so that we can keep expanding the Jenkins architecture and developers tools.
We invite all contributors to participate in this effort and to help us to migrate the plugins to supported JVM-based platforms for plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;my-instance-is-affected-what-to-do-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#my-instance-is-affected-what-to-do-next&quot; /&gt;My instance is affected, what to do next?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you do not use the affected plugins, the recommendation is to remove them.
Otherwise, it is recommended to start migration out of the plugins to alternatives providing similar functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not all plugins have alternatives.
At the moment the Jenkins core team does not plan to provide a replacement, but any contributions are welcome.
If you depend on the functionality,
we recommend reaching out to the community in the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;developer mailing list&lt;/a&gt; so that
you can coordinate the replacement with other affected users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/p&gt;&lt;/dd&gt;&lt;/dl&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/2021/12/10/log4j2-rce-CVE-2021-44228/</id>
<title>Apache Log4j 2 vulnerability CVE-2021-44228</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-12-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/12/10/log4j2-rce-CVE-2021-44228/" />
<category term='infrastructure'></category>
<category term='security'></category>
<summary>
A critical security vulnerability has been identified in the popular "Apache Log4j 2" library.
This vulnerability is identified as CVE-2021-44228.


Log4j in Jenkins


The Jenkins security team has confirmed that Log4j is not used in Jenkins core.
Jenkins plugins may be using Log4j.
You can identify whether Log4j is included with any plugin by running the following Groovy script in the Script Console:



org.apache.logging.log4j.core.lookup.JndiLookup.class.protectionDomain.codeSource



If this results in the following error, Log4j is not included in any installed and enabled plugin:



groovy.lang.MissingPropertyException: No such property: org for class: Script1



Otherwise, the script output will print one location where Log4j is found, which includes the plugin name in the path.
That...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A critical security vulnerability has been identified in the popular &quot;Apache Log4j 2&quot; library.
This vulnerability is identified as &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2021-44228&quot;&gt;CVE-2021-44228&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;log4j-in-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#log4j-in-jenkins&quot; /&gt;Log4j in Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins security team has confirmed that Log4j is not used in Jenkins core.
Jenkins plugins may be using Log4j.
You can identify whether Log4j is included with any plugin by running the following Groovy script in the &lt;a href=&quot;https://www.jenkins.io/doc/book/managing/script-console/&quot;&gt;Script Console&lt;/a&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&gt;org.apache.logging.log4j.core.lookup.JndiLookup.class.protectionDomain.codeSource&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If this results in the following error, Log4j is &lt;strong&gt;not&lt;/strong&gt; included in any installed and enabled plugin:&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;groovy.lang.MissingPropertyException: No such property: org for class: Script1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Otherwise, the script output will print one location where Log4j is found, which includes the plugin name in the path.
That plugin should be disabled or uninstalled, followed by a Jenkins restart and another script execution until the &quot;No such property&quot; error appears.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affected plugins and their mitigation status are listed in the Jenkins issue tracker.
See &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/67353&quot;&gt;this Jira Epic&lt;/a&gt; for components known to be affected.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;log4j-in-web-application-containers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#log4j-in-web-application-containers&quot; /&gt;Log4j in web application containers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are hosting your Jenkins in a separate web application container like Tomcat, Websphere, or Glassfish, check with the providers of those containers to assess if they are using a vulnerable version of Log4j.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When Jenkins runs from the Docker image, a native installer package (deb, rpm, msi), or is invoked with &lt;code&gt;java -jar jenkins.war&lt;/code&gt;, it is not running inside a separate web application container.
It is using the built-in Jetty web application container that is bundled inside Jenkins and does not include Log4j.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;log4j-in-jenkins-project-infrastructure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#log4j-in-jenkins-project-infrastructure&quot; /&gt;Log4j in Jenkins project infrastructure&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins infrastructure team is currently checking all Jenkins project infrastructure for the presence of vulnerable versions of the Log4j library.
This work is ongoing.
We may decide to disable some services temporarily out of an abundance of caution.
You can see the status of services on &lt;a href=&quot;https://status.jenkins.io/&quot;&gt;the status page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/12/08/containers-as-build-agents/</id>
<title>Use Containers as Build Agents</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-12-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/12/08/containers-as-build-agents/" />
<category term='agents'></category>
<category term='containers'></category>
<category term='docker'></category>
<summary>
A continuous integration environment is a mixed bag of machines, platforms, build toolchains and operating systems.
Ideally, you want as much flexibility as possible in managing these environments.
You want your build machines to be interchangeable and you don&#8217;t want to tie your builds to a particular machine.
Using containers as build agents is an effective way to get the flexibility you need to create applications faster and more effectively.


Most modern software organizations recognize the benefits of deploying and managing applications as containers.
And now more organizations are using containers to unify their build and test environments across machines, and to provide an efficient...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A continuous integration environment is a mixed bag of machines, platforms, build toolchains and operating systems.
Ideally, you want as much flexibility as possible in managing these environments.
You want your build machines to be interchangeable and you don’t want to tie your builds to a particular machine.
Using containers as build agents is an effective way to get the flexibility you need to create applications faster and more effectively.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most modern software organizations recognize the benefits of deploying and managing applications as containers.
And now more organizations are using containers to unify their build and test environments across machines, and to provide an efficient mechanism for deploying applications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re new to containers, think of it as the next step beyond virtualization.
It consists of a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers.
A container image contains everything it needs to run independently of the server on which it lives: It contains a copy of the operating system, along with your application.
That could include a database, code, configuration files, dependencies, and so forth.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Containerization is a great way to simplify migration of Jenkins instances to different machines, as well as simplify ongoing maintenance and upgrades.
Starting with versions 2.5 and higher, Jenkins Pipeline has built-in support for interacting with Docker from within a Jenkinsfile.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although you can install and upgrade Jenkins using OS-installable packages, the container images of Jenkins take installation and upgrades to a new level, removing a lot of the complications with maintaining the Jenkins installation.
That’s one of the main reasons you should prefer the container images of Jenkins over OS-specific installation packages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;using-containers-as-build-agents-for-greater-pipeline-flexibility&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-containers-as-build-agents-for-greater-pipeline-flexibility&quot; /&gt;Using containers as build agents for greater Pipeline flexibility&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What about using containers in your build agents? You’ll recall that Jenkins agents are the &quot;workers&quot; that perform operations requested by the Jenkins controller.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;What is a Jenkins agent?&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/4KghHJEz5no?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many of you have been writing Jenkins pipelines for awhile, but you’ve been constrained by the tooling that’s available on your agent.
But what if you no longer had to be constrained by specific versions of specific tools on specific agents? And that you had full control over the tooling that you’re using just by having Docker available on your agents?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well, that is exactly what’s possible by using containers as build agents for Jenkins.
To learn how to set up your agents with Docker, watch this step-by-step video.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;How to Setup Docker Containers As Build Agents for Jenkins&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/ymI02j-hqpU?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So why would you want to use a container as your build agent? As a pipeline author, it gives you the ability to define the tools and the specific versions of those tools that you want to use in your pipeline so that those items are not being mandated or managed by others.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Secondly, if in your environment, someone else has to install the tools for you on your agent, you can completely bypass all of that because you’re able to dynamically bring in the tools that you want or need at runtime.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, it gives you the chance to experiment with different tools without having to make a long-term commitment to those tools.
Because if you have a dependency on someone else installing tools for you, that might take a long time.
But by running it as a container, you can test it out, and if it works, great! Then you have the option to work with somebody else to get static versions of those tools installed on your agents, or you can just stay with your container-based build agents.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;thanks-to-our-sponsor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thanks-to-our-sponsor&quot; /&gt;Thanks to our Sponsor&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Darin works for CloudBees.
CloudBees helps Fortune 1000 enterprises manage and scale Jenkins.
Thanks to CloudBees for sponsoring the creation of this blog post.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/12/03/election-results/</id>
<title>2021 Jenkins Board and Officer Elections Results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-12-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/12/03/election-results/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
The Jenkins community has recently completed the 2021 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:




Mark Waite joins the re-elected Oleg Nenashev and
Kohsuke Kawaguchi, Gavin Mogan and Ewelina Wilkosz
on the Jenkins Governance Board


Tim Jacomb will continue in the role of Release Officer (uncontested)


Alyssa Tong will become the new Events Officer (uncontested)


Damien Duportal was elected as the Infrastructure Officer (uncontested)


Wadeck Follonier was elected as the Security Officer (uncontested)


Mark Waite was re-elected  in the role of Documentation Officer for another...
</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/2021/opengraph.png&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 recently completed the 2021 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://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; joins the re-elected &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; and
&lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;, &lt;a href=&quot;https://github.com/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt; and &lt;a href=&quot;https://github.com/ewelinawilkosz&quot;&gt;Ewelina Wilkosz&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://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt; will continue in the role of &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://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; will become the new &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://github.com/dduportal&quot;&gt;Damien Duportal&lt;/a&gt; was elected as the &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://github.com/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt; was elected as the &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://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; was re-elected  in the role of &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt; for another term&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 Jenkins&#39; community governance and well-being,
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.
Oleg Nenashev is employed by Dynatrace, while Mark is employed by CloudBees.&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 &lt;a href=&quot;https://community.jenkins.io/t/jenkins-election-candidates/776#board-members-2&quot;&gt;three candidates&lt;/a&gt; participating in Jenkins Governance Board elections:
Mark Waite,  Oleg Nenashev (returning), and Ullrich Hafner (returning)
All of them are awesome community leaders who actively contribute to the Jenkins project and represent its users.
It would be an honor to have them on the Jenkins board.
Regardless of the election results, we appreciate their participation and the time they invested in these elections.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we were electing 2 governance board members.
We were using the &lt;a href=&quot;https://civs.cs.cornell.edu/&quot;&gt;Condorcet Internet Voting Service&lt;/a&gt; that allows voters to rank their choices rather than just picking their one favorite choice.
You can find full voting results &lt;a href=&quot;https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_c206f1625b47c65d&quot;&gt;here&lt;/a&gt;:&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;&lt;strong&gt;Mark Waite&lt;/strong&gt; (Condorcet winner: wins contests with all other choices)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oleg Nenashev&lt;/strong&gt; loses to Mark Waite by 37–22&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ullrich Hafner loses to Mark Waite by 42–14, loses to Oleg Nenashev by 37–15&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to the returning Oleg, and the newly elected Mark, and thanks to Ullrich for his past contributions.
All new board members are elected for a 2-year term unless they decide to step down earlier.
The estimated end of the term for them is December 02, 2023.&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 Dec 02, 2022.
After the initial review of nominations and confirmations with potential candidates,
4 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;Tim Jacomb&lt;/strong&gt; - &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alyssa Tong&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;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Documentation Officer election results&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; won the biggest support as a Documentation officer (&lt;a href=&quot;https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_df9bdfde927d6f2f&quot;&gt;voting results&lt;/a&gt;).
Mark will continue as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt;.&lt;/p&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;Mark Waite&lt;/strong&gt; (Condorcet winner: wins contests with all other choices)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saeid Bostandoust loses to Mark Waite by 46–9&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&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 81 registered voters and around 59 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.
We have started a &lt;a href=&quot;https://docs.google.com/document/d/1xrPTeBkcMWPN-7nmd9N_9ewrv1C2Q6Sh9t316sMwEBQ/edit?usp=sharing&quot;&gt;Retrospective document&lt;/a&gt; for these elections.
Everyone can suggest changes in this document, and we will integrate them.&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 send an email to 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>
<entry>
<id>https://www.jenkins.io/blog/2021/11/12/interview-duchess-hacktoberfest/</id>
<title>Interview of Duchess contributors for hacktoberfest 2021 on Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-11-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/11/12/interview-duchess-hacktoberfest/" />
<author>
<name>ajard</name>
</author>
<category term='jenkins'></category>
<category term='hacktoberfest'></category>
<category term='developer'></category>
<category term='newcomer'></category>
<summary>
This year, the Duchess community embraced a new challenge:
working on women’s presence in Open Source while participating in Jenkins during the Hacktoberfest, a yearly event.


Huge congrats to all the contributors! 🥳


Note: This blog is a translation, the source blog post is located here https://www.duchess-france.org/duchess-hacktoberfest-2021/


Anne-Laure Gaillard Interview


Hello Anne-Laure, can you introduce yourself?






LinkedIn




After a PhD in Computer Science and a few years in Software Development, I specialized in software quality assurance, and particularly in the testing domain.
I’m a supporter of the doctrine: “Quality is everyone’s business”. Fond of agility, I’m part of the organization committee of the Agile Tour Bordeaux since 2020.


I...
</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/2021-11-duchess-hacktoberfest/jenkins-and-duchess.png&quot; alt=&quot;Jenkins and Duchess&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, the Duchess community embraced a new challenge:
working on women’s presence in Open Source while participating in Jenkins during the Hacktoberfest, a yearly event.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Huge congrats to all the contributors! 🥳&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Note: This blog is a translation, the source blog post is located here &lt;a href=&quot;https://www.duchess-france.org/duchess-hacktoberfest-2021/&quot; class=&quot;bare&quot;&gt;https://www.duchess-france.org/duchess-hacktoberfest-2021/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;anne-laure-gaillard-interview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#anne-laure-gaillard-interview&quot; /&gt;Anne-Laure Gaillard Interview&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hello-anne-laure-can-you-introduce-yourself&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hello-anne-laure-can-you-introduce-yourself&quot; /&gt;Hello Anne-Laure, can you introduce yourself?&lt;/h3&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/2021-11-duchess-hacktoberfest/al.jpg&quot; alt=&quot;Anne-Laure Gaillard picture&quot; height=&quot;200&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;a href=&quot;https://www.linkedin.com/in/annelauregaillard/&quot;&gt;LinkedIn&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;After a PhD in Computer Science and a few years in Software Development, I specialized in software quality assurance, and particularly in the testing domain.
I’m a supporter of the doctrine: “Quality is everyone’s business”. Fond of agility, I’m part of the organization committee of the Agile Tour Bordeaux since 2020.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I also like to engage in sporting challenges: I swam across the Garonne (a big river in the south of France) and finished 2 triathlons.
Keeping the best for the end: I’m the mother of two kids who taught me it’s possible to speak about Pokemon with one, while drawing a unicorn with the other.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-did-you-think-about-open-source-and-maybe-jenkins-before-starting-the-hackathon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-did-you-think-about-open-source-and-maybe-jenkins-before-starting-the-hackathon&quot; /&gt;What did you think about Open Source, and maybe Jenkins, before starting the hackathon?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During my studies, I met quite a lot of “nerds / geeks” contributing to Linux distributions (Gentoo &amp;amp; Debian).
Their technical skills seemed higher than mine and the Open Source universe looked inaccessible to me.
Concerning Jenkins, I am a user (now contributor) of it, but not an administrator.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-motivated-you-to-participate-in-that-hackathon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-motivated-you-to-participate-in-that-hackathon&quot; /&gt;What motivated you to participate in that hackathon?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I dared to participate thanks to the Duchess (and mainly Angélique, thanks to her).
Having the support and backing of the community was my motivation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-will-you-remember-from-this-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-will-you-remember-from-this-experience&quot; /&gt;What will you remember from this experience?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From a professional point of view, I perfected my knowledge of Git, and I had a chance to overview part of the quality processes from Open Source projects.
My first Pull Request was approved by… 9 people!
The fourth reviewer did find an issue.
Who can tell me code review isn’t useful now?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From a personal perspective, I remember two things.
The first one: Open Source communities are not elitist communities.
Every contribution matters, even small ones.
The people I met were positive and benevolent.
The second one could be illustrated by a quote from Grace Hopper: “If it’s a good idea, go ahead and do it. It’s much easier to apologize than it is to get permission.”.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;do-you-have-anything-more-to-say&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#do-you-have-anything-more-to-say&quot; /&gt;Do you have anything more to say?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After Jenkins, I also submitted Pull Requests to others Open Source projects.
The problem: with such a diversity of Open Source projects, how to organize your time?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;anne-laure-gaillard-contributions-during-hacktoberfest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#anne-laure-gaillard-contributions-during-hacktoberfest&quot; /&gt;Anne-Laure Gaillard contributions during hacktoberfest&lt;/h3&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/jenkins/pull/5779&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5779&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5785&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5785&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5804&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5804&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5806&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5806&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5807&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5807&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5808&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5808&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5822&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5822&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5823&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5823&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mattermost/quality-assurance/pull/25&quot; class=&quot;bare&quot;&gt;https://github.com/mattermost/quality-assurance/pull/25&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mattermost/quality-assurance/pull/23&quot; class=&quot;bare&quot;&gt;https://github.com/mattermost/quality-assurance/pull/23&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sarequl/Netflix-Helper/pull/6&quot; class=&quot;bare&quot;&gt;https://github.com/sarequl/Netflix-Helper/pull/6&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;bertha-torres-interview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bertha-torres-interview&quot; /&gt;Bertha Torres Interview&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-11-duchess-hacktoberfest/tb.jpg&quot; alt=&quot;Bertha Torres picture&quot; height=&quot;200&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;a href=&quot;https://twitter.com/tatoberres&quot;&gt;Twitter: @tatoberres&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/bertha-torres-62b672209/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hello-bertha-can-you-introduce-yourself&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hello-bertha-can-you-introduce-yourself&quot; /&gt;Hello Bertha, can you introduce yourself?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Coming from a literature training and as a language teacher for more than 15 years, it’s while moving to a high mountain area that a need to explore other skills set in.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thus, a self-taught training followed by a validated file for financing diploma training followed one another and confirmed to me that life is too short to waste it on what does not make sense to us.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-did-you-think-about-open-source-and-maybe-jenkins-before-starting-the-hackathon-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-did-you-think-about-open-source-and-maybe-jenkins-before-starting-the-hackathon-2&quot; /&gt;What did you think about Open Source, and maybe Jenkins, before starting the hackathon?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Participating in Open Source appeared to me in that exploratory process like a learning opportunity…
which I thought was inaccessible of course! I didn’t see myself writing code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But thanks to the Duchess France community, I learned how to contribute at my level and to understand the contribution process.
It’ll allow me as things progress to contribute in more domains.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;can-you-tell-us-how-the-woman-version-of-jenkins-was-born&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#can-you-tell-us-how-the-woman-version-of-jenkins-was-born&quot; /&gt;Can you tell us how the woman version of Jenkins was born?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well… In the presentation video for Hacktoberfest, the artwork was mentioned (&lt;a href=&quot;https://www.jenkins.io/artwork/&quot;&gt;artwork&lt;/a&gt;) and Angélique also mentioned it during the first meeting…
And one must admit that looking at it, you can see a lot of different things but women.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So I imagined a governess, very confident, efficient, very clever, scrupulously combed, nicely dressed, who might represent the personality of what Jenkins is made of.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;do-you-have-anything-to-add&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#do-you-have-anything-to-add&quot; /&gt;Do you have anything to add?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This time I was able to participate through Pull Requests related to translation and drawing. I’ll probably do it again!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;bertha-torres-contributions-during-hacktoberfest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bertha-torres-contributions-during-hacktoberfest&quot; /&gt;Bertha Torres contributions during hacktoberfest&lt;/h3&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/pull/4627&quot; class=&quot;bare&quot;&gt;https://github.com/jenkins-infra/jenkins.io/pull/4627&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5796&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5796&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5797&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5797&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-job-plugin/pull/214&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/workflow-job-plugin/pull/214&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-job-plugin/pull/215&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/workflow-job-plugin/pull/215&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/ant-plugin/pull/78&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/ant-plugin/pull/78&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/ant-plugin/pull/77&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/ant-plugin/pull/77&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;pauline-iognas-interview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pauline-iognas-interview&quot; /&gt;Pauline Iogna’s Interview&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-11-duchess-hacktoberfest/pl.jpg&quot; alt=&quot;Pauline Iogna picture&quot; height=&quot;200&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;a href=&quot;https://twitter.com/pauline_io&quot;&gt;Twitter: @pauline_io&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hello-pauline-can-you-introduce-yourself&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hello-pauline-can-you-introduce-yourself&quot; /&gt;Hello Pauline, can you introduce yourself?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m a backend developer in Java/Scala, and an active member of Duchess France.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-did-you-think-about-open-source-and-maybe-jenkins-before-starting-the-hackathon-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-did-you-think-about-open-source-and-maybe-jenkins-before-starting-the-hackathon-3&quot; /&gt;What did you think about Open Source, and maybe Jenkins, before starting the hackathon?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I didn’t really have an opinion about Jenkins before doing the hackathon.
Like many other people, I’m a Jenkins user but I didn’t know its source code.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-motivated-you-to-participate-in-this-hackathon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-motivated-you-to-participate-in-this-hackathon&quot; /&gt;What motivated you to participate in this hackathon?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Actually participating in Hacktoberfest.
Just bringing a contribution, even modest, on an open source project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-did-you-discover-through-that-hackathon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-did-you-discover-through-that-hackathon&quot; /&gt;What did you discover through that hackathon?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Technically, I discovered how to do MVC with Apache Jelly.
I also rediscovered the contribution process of Open Source projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Hacktoberfest mechanism is really well thought out for onboarding people wanting to start working on Open Source projects.
With Angélique’s help on top of that to animate sessions on the Duchess France Slack channel, we had the best conditions to contribute to that important project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-will-you-remember-from-this-experience-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-will-you-remember-from-this-experience-2&quot; /&gt;What will you remember from this experience?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s not that simple to contribute to a project you’re just discovering, it requires a bit of investment and patience.
On Jenkins, the contributors are really reactive and the Pull Requests are quickly reviewed.
The feedback is useful and benevolent.
There is one Jira project listing all the features and bugs to be worked on for the project.
Some tickets are flagged as “newbie” allowing those who are beginners to pick easily and quickly doable tickets.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;pauline-iogna-contributions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pauline-iogna-contributions&quot; /&gt;Pauline Iogna contributions&lt;/h3&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/jenkins/pull/5835&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5835&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5793&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/5793&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-few-words-about-the-organization-within-duchess-france&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-few-words-about-the-organization-within-duchess-france&quot; /&gt;A few words about the organization within Duchess France&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The framework was intentionally simple and flexible. We started with an &lt;a href=&quot;https://www.youtube.com/watch?v=Cwlv2J9U-qs&quot;&gt;online kick start meeting for describing a bit of context&lt;/a&gt;, and more precisely the Jenkins universe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Online kick start meeting for context&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/Cwlv2J9U-qs?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, we mainly exchanged through the Duchess Slack channel in an asynchronous way on a dedicated channel, as well as a 30 minutes meeting each Friday during October.&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/2021/11/09/guava-upgrade/</id>
<title>Guava library upgrade (breaking changes!)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-11-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/11/09/guava-upgrade/" />
<author>
<name>basil</name>
</author>
<category term='jenkins'></category>
<category term='core'></category>
<category term='developer'></category>
<category term='announcement'></category>
<summary>
Summary


Jenkins bundles Guava, a core Java library from Google.
Beginning with Jenkins 2.320 (released on November 10, 2021), Jenkins has upgraded the Guava library from
11.0.1 (released on January 9, 2012) to
31.0.1 (released on September 27, 2021).
Plugins have already been prepared to support the new version of Guava in JEP-233.
Use the Plugin Manager to upgrade all plugins before and after upgrading to Jenkins 2.320.




Motivation


Many security-conscious organizations using, or planning to use, Jenkins run off-the-shelf security scanners to look for known vulnerabilities.
These commonly flag the obsolete Guava library as susceptible to a serialization-related vulnerability (CVE-2018-10237) and recommend upgrading.
While Jenkins uses JEP-200 to form...
</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/2021-11-guava-upgrade/guava-upgrade.png&quot; alt=&quot;Guava Upgrade&quot; /&gt;&lt;/span&gt;
&lt;/p&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;Jenkins bundles &lt;a href=&quot;https://guava.dev/&quot;&gt;Guava&lt;/a&gt;, a core Java library from Google.
Beginning with Jenkins 2.320 (released on November 10, 2021), Jenkins has upgraded the Guava library from
&lt;a href=&quot;https://github.com/google/guava/releases/tag/v11.0.1&quot;&gt;11.0.1&lt;/a&gt; (released on January 9, 2012) to
&lt;a href=&quot;https://github.com/google/guava/releases/tag/v31.0.1&quot;&gt;31.0.1&lt;/a&gt; (released on September 27, 2021).
Plugins have already been prepared to support the new version of Guava in &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=labels%20in%20(JEP-233)&quot;&gt;JEP-233&lt;/a&gt;.
&lt;strong&gt;Use the Plugin Manager to upgrade all plugins before &lt;em&gt;and&lt;/em&gt; after upgrading to Jenkins 2.320.&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;motivation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#motivation&quot; /&gt;Motivation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many security-conscious organizations using, or planning to use, Jenkins run off-the-shelf security scanners to look for known vulnerabilities.
These commonly flag the obsolete Guava library as susceptible to a serialization-related vulnerability (&lt;a href=&quot;https://github.com/google/guava/wiki/CVE-2018-10237&quot;&gt;CVE-2018-10237&lt;/a&gt;) and recommend upgrading.
While Jenkins uses &lt;a href=&quot;https://www.jenkins.io/blog/2018/03/15/jep-200-lts/&quot;&gt;JEP-200&lt;/a&gt; to form an explicit list of allowed classes for deserialization,
and the two Guava classes affected by CVE-2018-10237 are not and will never be added to the list,
it is time-consuming for the &lt;a href=&quot;https://www.jenkins.io/security/team/&quot;&gt;security team&lt;/a&gt; to respond to purported security reports
and for users to justify exemptions from policy to use Jenkins anyway.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Furthermore, the decade-old version of Guava has long been a maintenance burden for Jenkins developers.
In a world where Dependabot offers upgrades to libraries released just hours before,
it is unpleasant to be working with dependencies that are many years old.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/233/README.adoc&quot;&gt;JEP-233&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;upgrading&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrading&quot; /&gt;Upgrading&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The vast majority of plugins have already been prepared to support the new version of Guava in &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=labels%20in%20(JEP-233)&quot;&gt;JEP-233&lt;/a&gt;.
Jenkins users need only upgrade plugins to compatible versions as documented in the &quot;Released As&quot; field in Jira.
&lt;strong&gt;It is critical to use the Plugin Manager to upgrade all plugins before &lt;em&gt;and&lt;/em&gt; after upgrading to Jenkins 2.320.&lt;/strong&gt;
Failure to upgrade plugins to compatible versions may result in &lt;code&gt;ClassNotFoundException&lt;/code&gt;, &lt;code&gt;NoClassDefFoundError&lt;/code&gt;, or other low-level Java errors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reporting-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporting-issues&quot; /&gt;Reporting issues&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you find a regression in a plugin, please file a bug report in Jira:&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://issues.jenkins.io/issues/?jql=labels%20in%20(JEP-233)%20and%20status%20not%20in%20(resolved%2C%20closed)&quot;&gt;Open JEP-233 issues&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;When reporting an issue, include the following information:&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;Use the &lt;code&gt;JEP-233&lt;/code&gt; label.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the &lt;em&gt;complete&lt;/em&gt; list of installed plugins as suggested in the &lt;a href=&quot;https://www.jenkins.io/doc/book/system-administration/diagnosing-errors/#how-to-report-a-bug&quot;&gt;bug reporting guidelines&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide the &lt;em&gt;complete&lt;/em&gt; stack trace, if relevant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide steps to reproduce the issue &lt;em&gt;from scratch&lt;/em&gt; on a minimal Jenkins installation; the scenario should fail when the steps are followed on Jenkins 2.320 or later and pass when the steps are followed on Jenkins 2.319 or earlier.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you maintain a Jenkins plugin with an open JEP-233 issue,
then please check if there is a pull request awaiting merge or release.
If you use an unmaintained Jenkins plugin with an open JEP-233 issue,
consider stepping up and &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-governance/adopt-a-plugin/&quot;&gt;adopting the plugin&lt;/a&gt; to release a compatible version.&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;We expect to see a bit of disruption from these changes
but hope that in the long run they will save time for core and plugin developers
and lead to a more secure and stable tool.
Please reach out on the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;developers&#39; list&lt;/a&gt; with any questions or suggestions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/10/31/hacktoberfest-results-2021/</id>
<title>Jenkins in Hacktoberfest 2021</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-10-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/10/31/hacktoberfest-results-2021/" />
<author>
<name>markewaite</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<category term='newcomer'></category>
<category term='outreach-programs'></category>
<summary>
Hacktoberfest 2021 made great contributions to the Jenkins project.
We thank all the Hacktoberfest contributors and the maintainers who reviewed the submitted pull requests.


We received contributions in artwork, translation, documentation, security, and general purpose improvements.
The contributions included software improvements, documentation updates, and video tutorials.


Translations and Artwork


Duchess France provided significant improvements to the French localization of Jenkins.
The changes included new translations of text, corrections of existing translations, and file encoding fixes.
The translation changes included fifteen pull requests representing the work of six different contributors.


Translation pull requests were also received for Spanish language improvements.
The translation pull requests included multiple plugins in addition to...
</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/2021/2021-10-31-hacktoberfest-results-2021.png&quot; alt=&quot;2021 10 31 hacktoberfest results 2021&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hacktoberfest 2021 made great contributions to the Jenkins project.
We thank all the Hacktoberfest contributors and the maintainers who reviewed the submitted pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We received contributions in artwork, translation, documentation, security, and general purpose improvements.
The contributions included software improvements, documentation updates, and video tutorials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;translations-and-artwork&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#translations-and-artwork&quot; /&gt;Translations and Artwork&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://www.duchess-france.org/&quot;&gt;Duchess France&lt;/a&gt; provided significant improvements to the French localization of Jenkins.
The changes included new translations of text, corrections of existing translations, and file encoding fixes.
The translation changes included &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pulls?q=is%3Apr+is%3Aclosed+created%3A%3E2021-10-01+french&quot;&gt;fifteen pull requests&lt;/a&gt; representing the work of six different contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Translation pull requests were also received for Spanish language improvements.
The translation pull requests included multiple plugins in addition to Jenkins core.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A contributor from &lt;a href=&quot;https://www.duchess-france.org/&quot;&gt;&quot;Duchess France [Women in tech]&quot;&lt;/a&gt; created the first Jenkins logo highlighting a woman.
Special thanks to &lt;a href=&quot;https://github.com/tatoberres&quot;&gt;tatoberres&lt;/a&gt; for the new artwork!&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/logos/duchess/256.png&quot; alt=&quot;256&quot; height=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/highflyer910&quot;&gt;Thea Mushambadze&lt;/a&gt; created the new Jenkins logo for Georgia logo.&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/logos/georgia/georgia.png&quot; alt=&quot;georgia&quot; height=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks very much!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;plugin-docs-migration-to-github&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-docs-migration-to-github&quot; /&gt;Plugin Docs Migration to GitHub&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project started the migration of plugin documentation to GitHub almost two years ago.
Hacktoberfest 2021 identified 40 candidate plugins to migrate their documentation to GitHub.
&lt;a href=&quot;https://github.com/Dan-Heath&quot;&gt;Dan Heath&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Mr-DG-Wick&quot;&gt;Deepak Gupta&lt;/a&gt;,
&lt;a href=&quot;https://github.com/avinashupadhya99&quot;&gt;Avinash Upadhyaya K R&lt;/a&gt;,
&lt;a href=&quot;https://github.com/rajanssingh&quot;&gt;Rajan Kumar Singh&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/dheerajodha&quot;&gt;Dheeraj Singh Jodha&lt;/a&gt; provided a total of 29 pull requests migrating plugin documentation to GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to the contributors and to the plugin maintainers that merged and released documentation migration pull requests.
Eight plugins have fully migrated their documentation to GitHub through Hacktoberfest contributions.
An additional thirteen plugins have merged the documentation change and will complete the migration with their next plugin release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin documentation migration was coordinated through a &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1xxz6v-N6h17PI9Qu9uKrWaiKdI94StfeTfzWbwIYsX8/edit?usp=sharing&quot;&gt;worksheet&lt;/a&gt;.
A &lt;a href=&quot;https://www.youtube.com/watch?v=NU2g373wHNo&amp;amp;t=2331s&quot;&gt;tutorial video&lt;/a&gt; describing the documentation migration process is also available.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;implementing-content-security-policy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementing-content-security-policy&quot; /&gt;Implementing Content Security Policy&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Wadeck Follonier provided a &lt;a href=&quot;https://www.youtube.com/watch?v=NU2g373wHNo&amp;amp;t=3369s&quot;&gt;tutorial&lt;/a&gt; to prepare Jenkins for a broader implementation of Content Security Policy.
Six contributors provided pull requests to Jenkins core to create separate JavaScript files from JavaScript that was previously implemented inside the Jenkins &#39;jelly&#39; files.
Moving JavaScript into separate files prepares Jenkins to implement Content Security Policy protections against JavaScript embedded in HTML.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-architecture-diagrams&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-architecture-diagrams&quot; /&gt;Jenkins Architecture Diagrams&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Angélique Jard provided architectural diagrams showing a &lt;a href=&quot;https://www.jenkins.io/doc/developer/architecture/&quot;&gt;dataflow view of Jenkins&lt;/a&gt; and a &lt;a href=&quot;https://www.jenkins.io/doc/developer/architecture/model/&quot;&gt;high level view of Jenkins&lt;/a&gt;.
Those diagrams help others understand the internal structure of Jenkins and how it interacts with users and with other systems.&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/developer/architecture/jenkins-dataflow.png&quot; alt=&quot;jenkins dataflow&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;modernizing-plugins-video-series&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#modernizing-plugins-video-series&quot; /&gt;Modernizing Plugins Video Series&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Darin Pope created &lt;a href=&quot;https://www.youtube.com/watch?v=Fev8KfFsPZE&quot;&gt;five videos&lt;/a&gt; illustrating some of the small steps that a new contributor can use to help modernize a plugin.
Additional plugin modernization and adoption ideas are included in the &lt;a href=&quot;https://docs.google.com/document/d/1PKYIpPlRVGsBqrz0Ob1Cv3cefOZ5j2xtGZdWs27kLuw/edit?usp=sharing&quot;&gt;&quot;Contributing to Open Source&quot; workshop&lt;/a&gt; from DevOps World 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Modernizing Jenkins Plugins&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;640&quot; height=&quot;363&quot; src=&quot;https://www.youtube.com/embed/Fev8KfFsPZE?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;thanks-to-all&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thanks-to-all&quot; /&gt;Thanks to All&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We offer our most sincere thanks to all Hacktoberfest contributors and to the many pull request reviewers.&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/2021/10/28/introducing-junit-external-storage/</id>
<title>Introducing external storage for JUnit test results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-10-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/10/28/introducing-junit-external-storage/" />
<author>
<name>timja</name>
</author>
<category term='cloud-native'></category>
<category term='pluggable-storage'></category>
<category term='junit'></category>
<summary>
In common CI/CD use-cases a lot of the space is consumed by test reports.
This data is stored within JENKINS_HOME,
and the current storage format requires huge overheads when retrieving statistics and, especially, trends.
In order to display trends, each report has to be loaded and then processed in-memory.


The main purpose of externalising Test Results is to optimize Jenkins performance and storage
by querying the desired data from external storages.


I&#8217;m please to announce that the JUnit Plugin external storage is now available for use.


Getting started


Install your database vendor specific plugin, you can use the Jenkins plugin site to search for it:


https://plugins.jenkins.io/ui/search/?labels=database


e.g. you could install...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In common CI/CD use-cases a lot of the space is consumed by test reports.
This data is stored within &lt;code&gt;JENKINS_HOME&lt;/code&gt;,
and the current storage format requires huge overheads when retrieving statistics and, especially, trends.
In order to display trends, each report has to be loaded and then processed in-memory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main purpose of externalising Test Results is to optimize Jenkins performance and storage
by querying the desired data from external storages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m please to announce that the &lt;a href=&quot;https://plugins.jenkins.io/junit&quot;&gt;JUnit Plugin&lt;/a&gt; external storage is now available for use.&lt;/p&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;Install your database vendor specific plugin, you can use the Jenkins plugin site to search for it:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/ui/search/?labels=database&quot; class=&quot;bare&quot;&gt;https://plugins.jenkins.io/ui/search/?labels=database&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;e.g. you could install the &lt;a href=&quot;https://plugins.jenkins.io/database-postgresql&quot;&gt;PostgreSQL Database&lt;/a&gt; plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We currently support &lt;a href=&quot;https://plugins.jenkins.io/database-postgresql&quot;&gt;PostgreSQL&lt;/a&gt; or &lt;a href=&quot;https://plugins.jenkins.io/database-mysql&quot;&gt;MySQL&lt;/a&gt;, but can support others, just create an issue or send a pull request.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;from-jenkins-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#from-jenkins-ui&quot; /&gt;From Jenkins UI&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Navigate to: Manage Jenkins → Configure System → Junit&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the dropdown select &#39;SQL Database&#39;&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/2021/junit-external-storage/junit-sql-config-screen.png&quot; alt=&quot;JUnit SQL plugin configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now configure your Database connection details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Search for &#39;Global Database&#39; on the same &#39;Configure System&#39; page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Select the database implementation you want to use and click &#39;Test Connection&#39; to verify Jenkins can connect&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/2021/junit-external-storage/junit-sql-config-screen.png&quot; alt=&quot;JUnit SQL plugin database configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Click &#39;Save&#39;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configuration-as-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-as-code&quot; /&gt;Configuration as code&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to configure the plugin via &lt;a href=&quot;https://plugins.jenkins.io/configuration-as-code&quot;&gt;Configuration as Code&lt;/a&gt; then see the below sample:&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;unclassified&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;globalDatabaseConfiguration&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;postgreSQL&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;database&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;jenkins&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;hostname&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;${DB_HOST_NAME}&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;password&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;${DB_PASSWORD}&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;username&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;${DB_USERNAME}&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;validationQuery&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;SELECT&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;1&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;junitTestResultStorage&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;storage&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;database&quot;&lt;/span&gt;&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;using-the-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-the-plugin&quot; /&gt;Using the plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now run some builds, here’s an example pipeline configuration to get you started if you’re just trying out the plugin:&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;writeFile&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;file:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;x.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;text:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
  &amp;lt;testsuite name=&#39;sweet&#39; time=&#39;200.0&#39;&amp;gt;
    &amp;lt;testcase classname=&#39;Klazz&#39; name=&#39;test1&#39; time=&#39;198.0&#39;&amp;gt;
      &amp;lt;error message=&#39;failure&#39;/&amp;gt;
    &amp;lt;/testcase&amp;gt;
    &amp;lt;testcase classname=&#39;Klazz&#39; name=&#39;test2&#39; time=&#39;2.0&#39;/&amp;gt;
    &amp;lt;testcase classname=&#39;other.Klazz&#39; name=&#39;test3&#39;&amp;gt;
    &amp;lt;skipped message=&#39;Not actually run.&#39;/&amp;gt;
    &amp;lt;/testcase&amp;gt;
  &amp;lt;/testsuite&amp;gt;
  &#39;&#39;&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;x.xml&#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;You will see a test result trend appear like below on the builds project page:&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/2021/junit-external-storage/junit-trend.png&quot; alt=&quot;JUnit Trend&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you check on the controller’s file system you will see no &lt;code&gt;junitResult.xml&lt;/code&gt; for new builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you connect to your database and run:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;SELECT * FROM caseresults;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will see a number of test results in the database.&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-happens-to-existing-test-results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-happens-to-existing-test-results&quot; /&gt;What happens to existing test results?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Existing test results will stay on disk but will not be loaded.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently there is no migration scripts or plugin functionality to do this, if you need it then please raise an issue.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-are-test-results-cleaned-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-are-test-results-cleaned-up&quot; /&gt;How are test results cleaned up&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When a job or build is deleted the related test results are removed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is expected to be done as part of a &#39;Build Discarder&#39;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you wish to keep your results longer than this you can disable this feature by enabling:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;Skip cleanup of test result on build deletion&lt;/code&gt; on the system configuration page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you need more complex cleanup strategies built into the plugin then please raise an issue.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;api&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#api&quot; /&gt;API&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The API is defined at:&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://javadoc.jenkins.io/plugin/junit/io/jenkins/plugins/junit/storage/JunitTestResultStorage.html&quot; title=&quot;Javadoc for io.jenkins.plugins.junit.storage.JunitTestResultStorage&quot;&gt;io.jenkins.plugins.junit.storage.JunitTestResultStorage in junit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://javadoc.jenkins.io/plugin/junit/io/jenkins/plugins/junit/storage/JunitTestResultStorageDescriptor.html&quot; title=&quot;Javadoc for io.jenkins.plugins.junit.storage.JunitTestResultStorageDescriptor&quot;&gt;io.jenkins.plugins.junit.storage.JunitTestResultStorageDescriptor in junit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://javadoc.jenkins.io/plugin/junit/io/jenkins/plugins/junit/storage/TestResultImpl.html&quot; title=&quot;Javadoc for io.jenkins.plugins.junit.storage.TestResultImpl&quot;&gt;io.jenkins.plugins.junit.storage.TestResultImpl in junit&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;&lt;code&gt;JunitTestResultStorage#load&lt;/code&gt; is passed a job name and build which can be used to construct an instance of the external storage implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This implementation will then act on that job and build except for the optimised calls that act across all builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The API contains the basic methods like &lt;code&gt;getFailCount&lt;/code&gt;, &lt;code&gt;getSkipCount&lt;/code&gt;, but also APIs that are optimised for retrieving data for the trend graphs on the job page and the test result history page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These allow single API calls to be made for what used to be a lot of work for Jenkins to look up before.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feedback&quot; /&gt;Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would love to hear your feedback &amp;amp; suggestions for this feature.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please create an issue at &lt;a href=&quot;https://github.com/jenkinsci/junit-plugin&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/junit-plugin&lt;/a&gt; or provide feedback on &lt;a href=&quot;https://community.jenkins.io&quot; class=&quot;bare&quot;&gt;https://community.jenkins.io&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/10/26/just-enough-pipeline/</id>
<title>Use Just Enough Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-10-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/10/26/just-enough-pipeline/" />
<category term='pipeline'></category>
<summary>
Jenkins Pipeline (or simply Pipeline with a capital P) is a suite of plugins that supports implementing and integrating continuous delivery pipelines into Jenkins.
This allows you to automate the process of getting software from version control through to your users and customers.


Pipeline code works beautifully for its intended role of automating build, test, deploy, and administration tasks.
But, as it is pressed into more complex roles and unexpected uses, some users have run into snags.
Using best practices – and avoiding common mistakes – can help you design a pipeline that is more robust, scalable, and high-performing.


We see a lot of users...
</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/post-images/2021/2021-10-26-just-enough-pipeline.png&quot; alt=&quot;2021 10 26 just enough pipeline&quot; height=&quot;350&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Pipeline (or simply Pipeline with a capital P) is a suite of plugins that supports implementing and integrating continuous delivery pipelines into Jenkins.
This allows you to automate the process of getting software from version control through to your users and customers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline code works beautifully for its intended role of automating build, test, deploy, and administration tasks.
But, as it is pressed into more complex roles and unexpected uses, some users have run into snags.
Using best practices – and avoiding common mistakes – can help you design a pipeline that is more robust, scalable, and high-performing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We see a lot of users making basic mistakes that can sabotage their pipeline.
(Yes, you can sabotage yourself when you’re creating a pipeline.)
In fact, it’s easy to spot someone who is going down this dangerous path – and it’s usually because they don’t understand some key technical concepts about Pipeline.
This invariably leads to scalability mistakes that you’ll pay dearly for down the line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;dont-make-this-mistake&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dont-make-this-mistake&quot; /&gt;Don’t make this mistake!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Perhaps the biggest misstep people make is deciding that they need to write their entire pipeline in a programming language.
After all, Pipeline is a domain specific language (DSL).
However, that does not mean that it is a general-purpose programming language.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you treat the DSL as a general-purpose programming language, you are making a serious architectural blunder by doing the wrong work in the wrong place.
Remember that the core of Pipeline code runs on the controller.
So, you should be mindful that everything you express in the Pipeline domain specific language (DSL) will compete with every other Jenkins job running on the controller.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, it’s easy to include a lot of conditionals, flow control logic, and requests using scripted syntax in the pipeline job.
Experience tells us this is not a good idea and can result in serious damage to pipeline performance.
We’ve actually seen organizations with poorly written Pipeline jobs bring a controller to its knees, while only running a few concurrent builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Wait a minute, you might ask, “Isn’t handling code what the controller is there for?”
Yes, the controller certainly is there to execute pipelines.
But, it’s much better to assign individual steps of the pipeline to command line calls that execute on an agent.
So, instead of running a lot of conditionals inside the pipeline DSL, it’s better to put those conditionals inside a shell script or batch file and call that script from the pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, this raises another question: “What if I don’t have any agents connected to my controller?”
If this is the case, then you’ve just made another bad mistake in scaling Jenkins pipelines.
Why? Because the first rule of building an effective pipeline is to make sure you use agents.
If you’re using a Jenkins controller and haven’t defined any agents, then your first step should be to define at least one agent and use that agent instead of executing on the controller.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the sake of maintaining scalability in your pipeline, the general rule is to avoid processing any workload on your controller.
If you’re running Jenkins jobs on the controller, you are sacrificing controller performance.
So, try to avoid using Jenkins controller capacity for things that should be passed off to an agent.
Then, as you grow and develop, all of your work should be running agents.
This is why we always recommend setting the number of executors on the master to zero.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;use-just-enough-pipeline-to-keep-your-pipeline-scalable&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-just-enough-pipeline-to-keep-your-pipeline-scalable&quot; /&gt;Use Just Enough Pipeline to Keep Your Pipeline Scalable&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All of this serves to highlight our overarching theme of “using just enough pipeline.”
Simply put, you want to use enough code to connect the pipeline steps and integrate tools – but no more than that.
Limit the amount of complex logic embedded in the Pipeline itself (similarly to a shell script), and avoid treating it as a general-purpose programming language.
This makes the pipeline easier to maintain, protects against bugs, and reduces the load on controllers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another best practice for keeping your pipeline lean, fast, and scalable is to use declarative syntax instead of scripted syntax for your Pipeline.
Declarative naturally leads you away from the kinds of mistakes we’ve just described.
It is a simpler expression of code and an easier way to define your job.
It’s computed at the startup of the pipeline instead of executing continually during the pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Therefore, when creating a pipeline, start with declarative, and keep it simple for as long as possible.
Anytime a script block shows up inside of a declarative pipeline, you should extract that block and put it in a shared library step.
That keeps the declarative pipeline clean.
By combining declarative with a shared library, that will take care of the vast majority of use cases you’ll encounter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That said, it’s not accurate to say that declarative plus a shared library will solve every problem.
There are cases where scripted is the right solution.
However, declarative is a great starting point until you discover that you absolutely must use scripted.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just remember, at the end of the day, you’ll do well to follow the adage: “Use just enough pipeline and no more.”&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;thanks-to-our-sponsor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thanks-to-our-sponsor&quot; /&gt;Thanks to our Sponsor&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mark and Darin both work for &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
CloudBees helps Fortune 1000 enterprises manage and scale Jenkins.
Thanks to CloudBees for sponsoring the creation of this blog post.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mark and Darin joined Hope Lynch and Joost van der Griendt to share additional topics in a CloudBees on-demand recording, &lt;a href=&quot;https://www.cloudbees.com/events/software-delivery-professional-series/optimizing-jenkins-enterprise&quot;&gt;&quot;Optimizing Jenkins for the Enterprise&quot;&lt;/a&gt;.
Register for the on-demand recording to receive more information on configuration as code, plugin management, and Pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/10/25/jenkins-elections/</id>
<title>Jenkins Election 2021</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-10-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/10/25/jenkins-elections/" />
<author>
<name>markewaite</name>
</author>
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
Voter registration is now open for the 2021 Jenkins project elections.
Two members of the governing board are up for election.
Five officers are up for election.


How Do I Register to Vote?





Click the "Register Here" button above or open https://community.jenkins.io/g/election-voter in your browser.


You will need to register with community.jenkins.io either using an existing account (like a GitHub account) or by creating a new account dedicated to community.jenkins.io and then "Join" the "election-voter" group.







Am I Eligible to Vote?


You&#8217;re eligible to vote if you have made at least one contribution to Jenkins before September 1, 2021.
Contributions to Jenkins are recognized in many different forms,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voter registration is now open for the 2021 Jenkins project elections.
Two members of the governing board are up for election.
Five officers are up for election.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-do-i-register-to-vote&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-register-to-vote&quot; /&gt;How Do I Register to Vote?&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;a class=&quot;image&quot; href=&quot;https://community.jenkins.io/g/election-voter&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/register-button.png&quot; alt=&quot;register button&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Click the &quot;Register Here&quot; button above or open &lt;a href=&quot;https://community.jenkins.io/g/election-voter&quot; class=&quot;bare&quot;&gt;https://community.jenkins.io/g/election-voter&lt;/a&gt; in your browser.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will need to register with &lt;a href=&quot;https://community.jenkins.io/g/election-voter&quot;&gt;community.jenkins.io&lt;/a&gt; either using an existing account (like a GitHub account) or by creating a new account dedicated to community.jenkins.io and then &quot;Join&quot; the &quot;election-voter&quot; group.&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/2021/2021-10-25-jenkins-elections.png&quot; alt=&quot;2021 10 25 jenkins elections&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;am-i-eligible-to-vote&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#am-i-eligible-to-vote&quot; /&gt;Am I Eligible to Vote?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’re eligible to vote if you have made at least &lt;strong&gt;one contribution to Jenkins before September 1, 2021&lt;/strong&gt;.
Contributions to Jenkins are recognized in many different forms, including:&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/participate/connect/&quot;&gt;Connect&lt;/a&gt; with other users through mailing lists or chat channels&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/meet/&quot;&gt;Meet&lt;/a&gt; with other users in conferences or online meetups&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/code/&quot;&gt;Code&lt;/a&gt; improvements for Jenkins core, Jenkins plugins, or Jenkins infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/help/&quot;&gt;Help&lt;/a&gt; other users through chat channels or mailing lists&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/internationalization/&quot;&gt;Translate&lt;/a&gt; Jenkins software or other materials&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/test/&quot;&gt;Test&lt;/a&gt; Jenkins software interactively or with automation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/document/&quot;&gt;Document&lt;/a&gt; Jenkins core, Jenkins plugins, or Jenkins infrastructure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/design/&quot;&gt;Design&lt;/a&gt; Jenkins user interface, Jenkins artwork, or other Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/review-changes/&quot;&gt;Review&lt;/a&gt; changes to code or documentation that are submitted by others&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;Donate&lt;/a&gt; funds to help the project&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve helped someone use Jenkins or a Jenkins derived product, you’re eligible to vote.
If you’ve tested Jenkins interactively or with automation, you’re eligible to vote.
If you’ve assisted at a Jenkins meetup or other Jenkins event, you’re eligible to vote.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;nominations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nominations&quot; /&gt;Nominations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominations for candidates are being accepted by the Jenkins election committee.
Nominations will close at the end of the day, October 31, 2021.
Nominees will be notified and will be asked to confirm that they are willing to serve if elected.
The list of candidates for each position will be announced November 7, 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;who-nominates-a-candidate&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#who-nominates-a-candidate&quot; /&gt;Who Nominates a Candidate?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anyone may propose a nomination.
Nominations are being accepted for the following positions:&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/project/board/&quot;&gt;Jenkins Governance Board Members&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&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;li&gt;
&lt;p&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;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;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&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&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/09/24/gsoc-report/</id>
<title>Congratulations to all Jenkins and CDF Google Summer of Code 2021 participants!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-09-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/09/24/gsoc-report/" />
<author>
<name>marckk</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2021'></category>
<category term='jenkins'></category>
<category term='community'></category>
<category term='events'></category>
<category term='mentor'></category>
<summary>
Congratulations to all Google Summer of Code (GSoC) 2021 students!
On behalf of the Jenkins org team, we would like to thank all participants: students, mentors, applicants, and dozens of other contributors who participated in GSoC this year.


In 2021, the Jenkins project participated in GSoC as part of the Continuous Delivery Foundation&#8217;s GSoC mentor organisation.
Within the CDF GSoC mentor organisation, we had six students working on projects: five projects focused on Jenkins
and one project focused on Spinnaker.
In GSoC, we focus on projects that solve problems important to end users and community members.
This year&#8217;s GSoC projects delivered highly anticipated new features for...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to all Google Summer of Code (GSoC) 2021 students!
On behalf of the Jenkins org team, we would like to thank all participants: students, mentors, applicants, and dozens of other contributors who participated in GSoC this year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2021, the Jenkins project participated in GSoC as part of the &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation’s&lt;/a&gt; GSoC mentor organisation.
Within the CDF GSoC mentor organisation, we had six students working on projects: five projects focused on Jenkins
and one project focused on Spinnaker.
In GSoC, we focus on projects that solve problems important to end users and community members.
This year’s GSoC projects delivered highly anticipated new features for Jenkins and Spinnaker.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Google Summer of Code has been a successful and positive experience for students due to the active participation of the Jenkins community and the wider Continuous Delivery Foundation community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;all-of-the-cdf-gsoc-students-have-successfully-completed-their-projects&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#all-of-the-cdf-gsoc-students-have-successfully-completed-their-projects&quot; /&gt;🎉 All of the CDF GSoC students have successfully completed their projects! 🎉&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the &lt;strong&gt;second year&lt;/strong&gt; in a row that all Jenkins GSoC students have reached the final evaluation and successfully passed!
This has been an extremely challenging year, and the amount of work and dedication that the students and their mentoring teams
have put into GSoC has been phenomenal.
Jenkins, Spinnaker, and the CDF are incredibly grateful to everyone who has contributed to GSoC 2021!&lt;/p&gt;
&lt;/div&gt;
&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/gsoc/2021/cdf_gsoc_org.jpeg&quot; alt=&quot;CDF GSoC&quot; height=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;️-gsoc-students-and-their-projects&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#️-gsoc-students-and-their-projects&quot; /&gt;&lt;strong&gt;☀️ GSoC Students and their Projects&lt;/strong&gt;&lt;br /&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please see the individual project pages for more details on the projects and work undertaken.
You can view student presentations during &lt;a href=&quot;https://www.youtube.com/watch?v=_D0hiA1Cgz8&quot;&gt;mid-term demos&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=bBat90NUMsg&quot;&gt;final demos&lt;/a&gt;
and students have written numerous blog posts about their work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;shruti-chaturvedi-cloudevents-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#shruti-chaturvedi-cloudevents-plugin-for-jenkins&quot; /&gt;Shruti Chaturvedi - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/cloudevents-plugin&quot;&gt;CloudEvents Plugin for Jenkins&lt;/a&gt;&lt;/h3&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/2021/gsoc-shruti-chaturvedi.jpg&quot; alt=&quot;Shruti Chaturvedi&quot; height=&quot;230&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Shruti is an undergrad student of Computer Science at Kalamazoo College.
She is developing a CloudEvents integration for Jenkins, allowing other CloudEvents-compliant CI/CD tools to communicate easily.
Shruti is also the Founding Engineer of a California-based startup, MeetKlara, where she is building serverless solutions and advocating for developing CI/CD pipelines using open-source tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: Kalamazoo College and Jenkins project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/ShrutiC-git&quot;&gt;ShrutiC-git&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LinkedIn: &lt;a href=&quot;https://www.linkedin.com/in/shruti-chaturvedi-developer/&quot;&gt;Shruti Chaturvedi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;cloudevents-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cloudevents-plugin-for-jenkins&quot; /&gt;CloudEvents Plugin for Jenkins&lt;/h4&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/2021/projects/cloudevents-plugin&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Completed project blog post: &lt;a href=&quot;https://cd.foundation/blog/2021/09/02/jenkins-interoperability-with-cloudevents/&quot;&gt;Jenkins Interoperability with CloudEvents&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mid-term blog: &lt;a href=&quot;https://www.jenkins.io/blog/2021/08/02/cloudevents-plugin-phase-I/#cloudevents-plugin-for-jenkins-interoperability-between-jenkins&quot;&gt;CloudEvents Plugin for Jenkins: Interoperability between Jenkins and other CI/CD Tools&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/bBat90NUMsg?t=2594&quot;&gt;Final demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=iQPAp4DAHnY&quot;&gt;Mid-term demo&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;sect2&quot;&gt;
&lt;h3 id=&quot;harshit-chopra-git-credentials-binding-for-sh-bat-and-powershell&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#harshit-chopra-git-credentials-binding-for-sh-bat-and-powershell&quot; /&gt;Harshit Chopra - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/git-credentials-binding&quot;&gt;Git credentials binding for sh, bat, and powershell&lt;/a&gt;&lt;/h3&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/2021/gsoc-harshit-chopra.jpg&quot; alt=&quot;Harshit Chopra&quot; height=&quot;230&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Harshit Chopra is a recent graduate and is currently working on a Jenkins project which brings the authentication support for cli git commands in a pipeline job and freestyle project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: Punjab University &amp;amp; Jenkins Project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: link: &lt;a href=&quot;https://github.com/arpoch&quot;&gt;arpoch&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LinkedIn: &lt;a href=&quot;https://www.linkedin.com/in/harshit-chopra-275269178&quot;&gt;Harshit Chopra&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://latenighttechie.wordpress.com&quot;&gt;Website&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;git-credentials-binding-for-sh-bat-and-powershell&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#git-credentials-binding-for-sh-bat-and-powershell&quot; /&gt;Git credentials binding for sh, bat, and powershell&lt;/h4&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/2021/projects/git-credentials-binding&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mid-term blog: &lt;a href=&quot;https://www.jenkins.io/blog/2021/08/19/git-credentials-binding-work-report/&quot;&gt;Git Credentials Binding for sh, bat, powershell&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/bBat90NUMsg?t=428&quot;&gt;Final demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/_D0hiA1Cgz8?t=4081&quot;&gt;Mid-term demo&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;sect2&quot;&gt;
&lt;h3 id=&quot;akihiro-kiuchi-jenkins-remoting-monitoring&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#akihiro-kiuchi-jenkins-remoting-monitoring&quot; /&gt;Akihiro Kiuchi - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/remoting-monitoring/&quot;&gt;Jenkins Remoting Monitoring&lt;/a&gt;&lt;/h3&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/2021/gsoc-akihiro-kiuchi.jpg&quot; alt=&quot;Akihiro Kiuchi&quot; height=&quot;220&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Akihiro is a student in the Department of information and communication engineering at the University of Tokyo.
He is improving the monitoring experience of Jenkins Remoting during Google Summer of Code 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: The University of Tokyo and Jenkins project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/Aki-7&quot;&gt;Aki-7&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jenkins-remoting-monitoring-with-opentelemetry&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-remoting-monitoring-with-opentelemetry&quot; /&gt;Jenkins Remoting Monitoring with OpenTelemetry&lt;/h4&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/2021/projects/remoting-monitoring/&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mid-term blog: &lt;a href=&quot;https://www.jenkins.io/blog/2021/07/31/remoting-monitoring-phase-1/&quot;&gt;Remoting Monitoring with OpenTelemetry&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/bBat90NUMsg?t=4718&quot;&gt;Final demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/_D0hiA1Cgz8?t=472&quot;&gt;Mid-term demo&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;sect2&quot;&gt;
&lt;h3 id=&quot;daniel-ko-try-spinnaker-io&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#daniel-ko-try-spinnaker-io&quot; /&gt;Daniel Ko - &lt;a href=&quot;https://spinnaker.io/docs/community/gsoc/projects/2021/try-spinnaker-io/&quot;&gt;try.spinnaker.io&lt;/a&gt;&lt;/h3&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/2021/gsoc-daniel-ko.jpg&quot; alt=&quot;Daniel Ko&quot; height=&quot;220&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Daniel is studying computer science at the University of Wisconsin - Madison.
He is developing a public Spinnaker sandbox environment for Google Summer of Code 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: University of Wisconsin - Madison and Spinnaker project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/ko28&quot;&gt;ko28&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LinkedIn: &lt;a href=&quot;https://www.linkedin.com/in/daniel-ko1/&quot;&gt;Daniel Ko&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;try-spinnaker-io-explore-spinnaker-in-a-sandbox-environment&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#try-spinnaker-io-explore-spinnaker-in-a-sandbox-environment&quot; /&gt;try.spinnaker.io:  Explore Spinnaker in a Sandbox Environment!&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://spinnaker.io/docs/community/gsoc/projects/2021/try-spinnaker-io/&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Completed project blog post: &lt;a href=&quot;https://blog.spinnaker.io/interview-with-daniel-ko-google-summer-of-code-2021-edf08d947d17&quot;&gt;Interview with Daniel Ko — Google Summer of Code 2021&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/bBat90NUMsg?t=1865&quot;&gt;Final demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/_D0hiA1Cgz8?t=2336&quot;&gt;Mid-term demo&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;sect2&quot;&gt;
&lt;h3 id=&quot;pulkit-sharma-security-validator-for-jenkins-kubernetes-operator&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pulkit-sharma-security-validator-for-jenkins-kubernetes-operator&quot; /&gt;Pulkit Sharma - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/jenkins-operator-security&quot;&gt;Security Validator for Jenkins Kubernetes Operator&lt;/a&gt;&lt;/h3&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/2021/gsoc-pulkit-sharma.jpg&quot; alt=&quot;Pulkit Sharma&quot; height=&quot;230&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pulkit is a student at Indian Institute of Technology,BHU,Varanasi.
He is working on a GSoC Project under Jenkins where he aims to add a security validator to the Jenkins Kubernetes Operator.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: Indian Institute of Technology, BHU and Jenkins Project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/sharmapulkit04&quot;&gt;sharmapulkit04&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;security-validator-for-jenkins-kubernetes-operator&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-validator-for-jenkins-kubernetes-operator&quot; /&gt;Security Validator for Jenkins Kubernetes Operator&lt;/h4&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/2021/projects/jenkins-operator-security&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Completed project blog post: &lt;a href=&quot;https://www.jenkins.io/blog/2021/08/23/jenkins-operator-security-work-report/&quot;&gt;Security Validator for Jenkins Operator for Kubernetes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/bBat90NUMsg?t=3847&quot;&gt;Final demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xO2jGmv1fLo&quot;&gt;Mid-term demo&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;sect2&quot;&gt;
&lt;h3 id=&quot;aditya-srivastava-conventional-commits-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#aditya-srivastava-conventional-commits-plugin-for-jenkins&quot; /&gt;Aditya Srivastava - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/conventional-commits-plugin&quot;&gt;Conventional Commits Plugin for Jenkins&lt;/a&gt;&lt;/h3&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/2021/gsoc-aditya-srivastava.png&quot; alt=&quot;Aditya Srivastava&quot; height=&quot;220&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aditya is a curiosity driven individual striving to find ingenious solutions to real-world problems.
He is an open-source enthusiast and a lifelong learner.
Aditya is also the Co-Founder and Maintainer of an Open Source Organization - Auto-DL, where he’s leading the development of a Deep Learning Platform as a Service application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: V.E.S.I.T &amp;amp; Jenkins project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/ADI10HERO&quot;&gt;ADI10HERO&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LinkedIn: &lt;a href=&quot;https://www.linkedin.com/in/adi10hero&quot;&gt;Aditya S.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;conventional-commits-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conventional-commits-plugin-for-jenkins&quot; /&gt;Conventional Commits Plugin for Jenkins&lt;/h4&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/2021/projects/conventional-commits-plugin&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Completed project blog post: &lt;a href=&quot;https://www.jenkins.io/blog/2021/08/28/conventional-commits-plugin-project-report/&quot;&gt;Work report for the Conventional Commits Plugin for Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mid-term blog: &lt;a href=&quot;https://www.jenkins.io/blog/2021/07/30/introducing-conventional-commits-plugin-for-jenkins/&quot;&gt;Introducing the Conventional Commits Plugin for Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/bBat90NUMsg?t=1038&quot;&gt;Final demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/_D0hiA1Cgz8?t=3207&quot;&gt;Mid-term demo&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;upcoming-events-september-28-30-devops-world&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upcoming-events-september-28-30-devops-world&quot; /&gt;Upcoming Events, September 28-30: DevOps World!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year CloudBees, one of the Jenkins corporate sponsors, has invited all students to participate in the &lt;a href=&quot;https://www.devopsworld.com/&quot;&gt;DevOps World&lt;/a&gt; virtual conference on September 28-30.
GSoC students will present lighting talks about their projects, attended other conference talks, and join the Continuous Delivery Foundation booth which represents CDF projects at the conference.
We look forward to GSoC students&#39; lightning talks during DevOps World!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;swag&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#swag&quot; /&gt;Swag&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Google Summer of Code students and mentors receive swag from Google.
In addition, this year, &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; has sponsored swag for the most active GSoC participants:
all students, mentors, and many other contributors who participated and helped the projects to succeed.
This is the forth year when the Jenkins organization sends extra GSoC swag.
In the previous years swag logistics was one of the more challenging tasks for org admins during GSoC,
and we highly appreciate that the Continuous Delivery Foundation will handle sending out the additional swag.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks you &lt;a href=&quot;https://opensource.google/&quot;&gt;Google Open Source&lt;/a&gt;, &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation (CDF)&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&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;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/09/23/jenkins-health-advisor-by-cloudbees/</id>
<title>Jenkins Health Advisor by CloudBees Tool Makes Life Easier for Jenkins Administrators</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-09-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/09/23/jenkins-health-advisor-by-cloudbees/" />
<author>
<name>aheritier</name>
</author>
<category term='jenkins'></category>
<category term='health'></category>
<category term='healthcheck'></category>
<category term='stability'></category>
<summary>
There are many ways to set up your Jenkins environment, and depending on the configuration you choose, there are different best practices and options to optimize your environment.
In this blog, I’m going to focus on Jenkins Health Advisor by CloudBees as a way to fine-tune your environment.
It’s a free tool that can help administrators understand and manage their Jenkins controller.
If you’re a CloudBees customer, the tool automatically comes with CloudBees CI.
However, it’s also available as a free open source tool to anyone who uses Jenkins.
The Jenkins Health Advisor tool can make your life easier, because it can arm you with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://plugins.jenkins.io/cloudbees-jenkins-advisor&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-health-advisor-by-cloudbees/logo.svg&quot; alt=&quot;Jenkins Health Advisor by CloudBees logo&quot; width=&quot;128&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are many ways to set up your Jenkins environment, and depending on the configuration you choose, there are different best practices and options to optimize your environment.
In this blog, I’m going to focus on &lt;a href=&quot;https://docs.cloudbees.com/docs/admin-resources/latest/plugins/cloudbees-jenkins-advisor&quot;&gt;Jenkins Health Advisor by CloudBees&lt;/a&gt; as a way to fine-tune your environment.
It’s a free tool that can help administrators understand and manage their Jenkins controller.
If you’re a CloudBees customer, the tool automatically comes with CloudBees CI.
However, it’s also available as a free open source tool to anyone who uses Jenkins.
The Jenkins Health Advisor tool can make your life easier, because it can arm you with the information you need to keep your Jenkins environment running smoothly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;A Bit of Background&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The CloudBees support team originally created the tool as a way to help customers troubleshoot Jenkins issues.
With the tool, our support engineers could gather information from a customer’s Jenkins controller about the configuration of the controller and agents, the operating system, stats from web requests, and the like.
Our tech support teams used this data to help customers pinpoint problems, such as security vulnerabilities, performance problems, and plugin version issues.
Very quickly, our support tooling team saw the bigger-picture benefits of the diagnostic tool as an opportunity for people to proactively manage their controller.
With that bit of background, let’s dive into the Jenkins Health Advisor tool so you understand how it can help you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;The Problem — Lack of Visibility into Controller Environment&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because of the open-source nature of Jenkins and the vast array of plugins that you can deploy in your Jenkins installation, downstream code changes to plugins and corresponding dependencies can inadvertently impact your environment, which slows productivity, causes confusion, and impacts the quality of your software delivery.
When problems arise, Jenkins administrators need to quickly pinpoint the root cause of an issue, and that can be quite a challenge.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;The Solution — Jenkins Health Advisor by CloudBees&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When an issue arises, you need razor sharp insight to help you quickly sift through lines upon lines of data about your Jenkins controller and your plugins to identify the problem.
And, that’s exactly what Jenkins Health Advisor does.
It gives you specific information about potential problems in your environment so you can resolve issues as quickly as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you first install the Jenkins Health Advisor tool in your environment, you’ll receive a report that lists everything it detects in your system.
You’ll then receive report emails only when something changes that could impact your environment or when the tool identifies an issue that could be problematic.
If there are no issues in your environment, you don’t receive an email.
It’s really that simple.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;The Power is in the Insight … and the CloudBees Support&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ok, so let’s explain how Jenkins Health Advisor uses data to help you optimize your environment.
The tool actually generates a support bundle every 24 hours.
We don’t want to bog down your email inbox with redundant reports emails, so we don’t send every report to you—only the reports that indicate an issue with your environment.
However, CloudBees receives every support bundle from every user.
We are constantly monitoring all of this active Jenkins controller data with external Jenkins and open source data about known issues, plugin updates, security vulnerabilities, etc.
If the Jenkins Health Advisor tool identifies an issue that could impact your system, you’ll receive an email so you can proactively address the problem.
At the same time, CloudBees engineering teams are continually working to enhance the detection capabilities of the Jenkins Health Advisor tool, so you can work as proactively as possible to manage your environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The emails you receive identify potential problems, and they also include supporting information to help you resolve issues, with links to solutions and recommended resolutions as well as articles to understand the problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Helpful Tips to Gain Value from Jenkins Health Advisor&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;span class=&quot;underline&quot;&gt;Improve Troubleshooting&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you need to troubleshoot a particular issue, you can manually generate a support bundle to give you point-in-time information on your environment.
You can filter the support bundle data on different system parameters, like the build queue, dump agent export tables, and garbage collection logs, so you get the specific information you need.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;underline&quot;&gt;Generate Anonymized System Data&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At any time, you can change the settings on your tool to anonymize the data in your support bundles.
You may want to do this if you don’t want to share sensitive project data with CloudBees.
Our support and engineering teams can still gain valuable insight from your generic system data.
This is also a helpful feature if you need to share system data with a partner or vendor, and you don’t want to share project or personnel data.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;underline&quot;&gt;Jenkins Health Advisor Tool Updates and Support&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we mentioned above, the CloudBees support tooling team is constantly working to enhance the tool.
To ensure it’s always as current as possible, we release updates to the tool every two weeks.
Usually these updates won’t impact your Jenkins environment.
However, if there are changes to the tool that might affect your system, you’ll receive a notification email so there are no surprises.
And, if you need help with the Jenkins Health Advisor tool, our support engineers are available to answer your questions.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Start Using Jenkins Health Advisor Today&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Given the vast Jenkins community, it’s impossible to know everything that may impact your environment, even if you look at your control panel every day and scour open source forums on a regular basis to stay on top of new issues and vulnerabilities.
The Jenkins Health Advisor tool is designed to streamline the work effort of your daily routine by automatically telling you when there’s an issue that may impact your Jenkins environment.
With the proactive Jenkins Health Advisor notifications, you can spend your time on more strategic tasks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/cloudbees-jenkins-advisor/&quot;&gt;Install the plugin and enroll your controller with Jenkins Health Advisor today!&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/09/22/fortune-500-real-world-results/</id>
<title>New eBook: Fortune 500 Developers and Engineers Turn to Jenkins for Real-World Results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-09-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/09/22/fortune-500-real-world-results/" />
<author>
<name>alyssat</name>
</author>
<category term='jenkins-is-the-way'></category>
<category term='case-study'></category>
<category term='ebook'></category>
<category term='community'></category>
<category term='announcement'></category>
<summary>
If you&#8217;ve been following JenkinsIsTheWay.io, you&#8217;ve read some fantastic stories from the Jenkins user community about the great stuff they are building with Jenkins.
With over 200,000 installations to date, Jenkins remains the most widely used open-source automation server.
And story after story, we hear what a critical role Jenkins plays in building robust, secure CI/CD pipelines.


So it comes as no surprise that in many of the back (and remote) offices of Fortune 500 companies, developers are turning to Jenkins to help make their lives easier with automation while also giving their engineers more time to innovate.
With this in mind, I invite...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/ebook/ebook3_front.png&quot; alt=&quot;Jenkins User Success Stories in the Fortune 500&quot; width=&quot;300&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve been following &lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;JenkinsIsTheWay.io&lt;/a&gt;, you’ve read some fantastic stories from the Jenkins user community about the great stuff they are building with Jenkins.
With over 200,000 installations to date, Jenkins remains the most widely used open-source automation server.
And story after story, we hear what a critical role Jenkins plays in building robust, secure CI/CD pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So it comes as no surprise that in many of the back (and remote) offices of Fortune 500 companies, developers are turning to Jenkins to help make their lives easier with automation while also giving their engineers more time to innovate.
With this in mind, I invite you to read the &lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/07/2021-Jenkins-Is-The-Way-in-the-Fortune-500-ebook.pdf&quot;&gt;latest ebook&lt;/a&gt; focused on the behind-the-scenes development activities underway in large-scale enterprises.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-led&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-led&quot; /&gt;Jenkins led&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Learn how companies like &lt;a href=&quot;https://stories.jenkins.io/user-story/to-faster-product-release/&quot;&gt;IBM&lt;/a&gt; continue to innovate their software prowess while confidently relying on their custom-built CI/CD pipelines.
You’ll also read how Jenkins became the ultimate collaboration tool for thousands of &lt;a href=&quot;https://stories.jenkins.io/user-story/to-produce-ultra-modern-and-sophisticated-electronic-devices/&quot;&gt;Apple&lt;/a&gt; developers.
And we don’t just shine the spotlight on tech companies.
In &lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/07/2021-Jenkins-Is-The-Way-in-the-Fortune-500-ebook.pdf&quot;&gt;this ebook&lt;/a&gt;, Jenkins users span multiple industries across the enterprise.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll read how Jenkins made it possible to standardize multidisciplinary team procedures so Roche engineers can create innovative healthcare applications with confidence.
We also dive into how Telstra’s software team was able to automate the build cycle - across 100,000 microservices - to accelerate the creation of world-class communication tools.
And how Sainsbury’s development team used Jenkins as the way to &quot;bring a retail giant into the 21st century&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;results-inspired&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results-inspired&quot; /&gt;Results inspired&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No time to dive into this Fortune 500 ebook?
I thought it’s worth highlighting the real-world results experienced by enterprise developers and engineers who have turned to awesome plugins to help build, deploy and automate their software solutions.
Here’s what they had to say in their own words!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;software-acceleration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#software-acceleration&quot; /&gt;Software acceleration&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Build times are much faster with the new node mechanism&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shared build pipelines are consistent and evolve faster&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Faster deployment times - from 5 days to several minutes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy multiple server patches 30x faster than normal processes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reduce release time from 7 to 4 days&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;simpler-smarter-processes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#simpler-smarter-processes&quot; /&gt;Simpler, smarter processes&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One-stop-shop for building, deploying, monitoring, testing and even self-managing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easy onboarding for new applications&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Credential management has gotten much simpler and stricter&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Made setting up CI/CD really easy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provides the visibility needed to track the deployment process&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;loved-and-relied-on-by-developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#loved-and-relied-on-by-developers&quot; /&gt;Loved and relied on by developers&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ultimate collaboration tool for thousands of developers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;100% confidence in a consistent and repeatable pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keeps the DevOps team in the loop&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins-as-code has freed teams up to experiment more&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Teams are more self-empowered to provision and support their own builds&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One thing to remember is that since Jenkins is a free open source solution, it also means savings across the enterprise.
This is highlighted in several of our user stories in this ebook.
You’ll discover how peers have &quot;decreased build server costs&quot; and have mentioned &quot;cost-cutting&quot; as a top Jenkins benefit.&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;share-your-story&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#share-your-story&quot; /&gt;Share your story&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whether working for a large corporation or an emerging tech startup, we relish hearing your experiences and the results you get with a Jenkins assist.
When you’re ready to tell your story, we’re prepared to help you share it.
Fill out our short questionnaire, and we’ll send you our Jenkins Is The Way T-shirt as a thank you once it’s published!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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;Download &lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/07/2021-Jenkins-Is-The-Way-in-the-Fortune-500-ebook.pdf&quot;&gt;Fortune 500 User Story eBook&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;JenkinsIsTheWay&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.surveymonkey.com/r/JenkinsIsTheWay&quot;&gt;Share your story&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/2021/09/21/jenkins-at-devops-world/</id>
<title>Join Jenkins at DevOps World 2021</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-09-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/09/21/jenkins-at-devops-world/" />
<author>
<name>alyssat</name>
</author>
<category term='events'></category>
<category term='conference'></category>
<category term='cicd'></category>
<category term='talks'></category>
<category term='workshops'></category>
<summary>
DevOps World has been the largest gathering for Jenkins for many years.
In keeping with tradition, many Jenkins presentations and sessions are planned for this year&#8217;s event.





Join us for DevOps World on September 28 - 30, 2021.
The event is virtual, free to attend and will include the following Jenkins activities:


Jenkins workshops




Contributing to Open Source


Securing Jenkins Pipeline with CyberArk Conjur Secrets Manager




See the conference workshop list for more information about workshops.




Breakout sessions




Embracing Observability in Jenkins with OpenTelemetry - Cyrille Le Clerc


Expanding Open Source in Africa with Jenkins - Experience Report - Mark Waite and Zainab Abubakar


Visualizing Git Forensics Data in a Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.devopsworld.com/&quot;&gt;DevOps World&lt;/a&gt; has been the largest gathering for Jenkins for many years.
In keeping with tradition, many Jenkins presentations and sessions are planned for this year’s event.&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;a class=&quot;image&quot; href=&quot;https://www.devopsworld.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2021.png&quot; alt=&quot;devops world 2021&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join us for DevOps World on September 28 - 30, 2021.
The event is virtual, free to attend and will include the following Jenkins activities:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-workshops&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-workshops&quot; /&gt;Jenkins workshops&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;Contributing to Open Source&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Securing Jenkins Pipeline with CyberArk Conjur Secrets Manager&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.devopsworld.com/page/1771402/sponsors&quot;&gt;conference workshop list&lt;/a&gt; for more information about workshops.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;breakout-sessions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#breakout-sessions&quot; /&gt;Breakout sessions&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;Embracing Observability in Jenkins with OpenTelemetry - &lt;a href=&quot;https://www.devopsworld.com/agenda/session/581459&quot;&gt;Cyrille Le Clerc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Expanding Open Source in Africa with Jenkins - Experience Report - &lt;a href=&quot;https://www.devopsworld.com/agenda/session/617845&quot;&gt;Mark Waite and Zainab Abubakar&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Visualizing Git Forensics Data in a Jenkins Plugin - &lt;a href=&quot;https://www.devopsworld.com/agenda/session/580631&quot;&gt;Ullrich Hafner&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speeding up Jenkins and Maven with a Build Cache - &lt;a href=&quot;https://www.devopsworld.com/agenda/session/581205&quot;&gt;Justin Reock&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auto Versioning at Scale with Jenkins and Ontrack - Taming the Hydra - &lt;a href=&quot;https://www.devopsworld.com/agenda/session/624444&quot;&gt;Damien Coraboeuf&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build up a Reliable Jenkins on KubeSphere - &lt;a href=&quot;https://www.devopsworld.com/agenda/session/581404&quot;&gt;Rick Zhao&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate Jenkins operations on Kubernetes : Jenkins Automation Operator - &lt;a href=&quot;https://www.devopsworld.com/agenda/session/581203&quot;&gt;Vibhav Bobade and Jawed Khelil&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Running JenkinsFileRunner as a Service - &lt;a href=&quot;https://www.devopsworld.com/agenda/session/580541&quot;&gt;Jose Taboada&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From Big and Slow to Small and Agile: Splitting Monolithic Jenkins Controllers for Increased Performance - &lt;a href=&quot;https://www.devopsworld.com/agenda/session/581457&quot;&gt;Dylan Dewhurst&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;See the &lt;a href=&quot;https://www.devopsworld.com/agenda&quot;&gt;full agenda&lt;/a&gt; for more Jenkins sessions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;birds-of-a-feather&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#birds-of-a-feather&quot; /&gt;Birds of a feather&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These are 30 minute networking sessions.
Topics will be on security and pipeline.
Discussions are led by &lt;a href=&quot;https://github.com/Wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;, &lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt;, &lt;a href=&quot;https://github.com/joostvdg/joostvdg.github.io&quot;&gt;Joost van der Griendt&lt;/a&gt;, and &lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&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;jenkins-contributor-summit&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-contributor-summit&quot; /&gt;Jenkins contributor summit&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A Jenkins Contributor Summit will be held October 2, 2021 at 7:00 AM UTC.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The planning discussion is taking place at &lt;a href=&quot;https://community.jenkins.io/t/jenkins-contributor-summit-oct-02-2021-apac-emea/203&quot;&gt;community.jenkins.io&lt;/a&gt;.
We welcome topic suggestions or you can volunteer to present a topic about which you are passionate.
Join in on the discussion.
New and veteran contributors are welcome!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;virtual-expo-hall&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#virtual-expo-hall&quot; /&gt;Virtual expo hall&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Be sure to stop by the Jenkins booth for project update content or to chat with one of the Jenkins maintainers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;special-thanks-to-review-committee&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#special-thanks-to-review-committee&quot; /&gt;Special thanks to review committee&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, special &lt;strong&gt;THANKS&lt;/strong&gt; to the DevOps World review committee.
We are grateful for their contributions to review, score and provide feedback for paper submissions.&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/slide&quot;&gt;Alex Earl&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/vfarcic&quot;&gt;Viktor Farcic&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/victormartinezrubio/&quot;&gt;Victor Martinez&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/csanchez?lang=en&quot;&gt;Carlos Sanchez&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 seeing you there!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/09/20/election-period-opened/</id>
<title>Jenkins Election 2021</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-09-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/09/20/election-period-opened/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
Dear all,


Time flies and the Jenkins elections period is here.


This year, two board seats and all officer positions are up for election.
Thanks, Oleg Nenashev and Ullrich Hafner who led the Jenkins project as board members for the last two years.
Thanks, Tim Jacomb, Daniel Beck, Mark Waite for your dedication as officers over the past year.


We already had two successful editions in a row. I want us to continue on that path.
This is a tremendous opportunity for community members to influence the direction of the project for the next two years.
To make this year’s election even better, we slightly modified the...
</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/logos/needs-you/Jenkins_Needs_You-transparent.png&quot; alt=&quot;Jenkins Needs You transparent&quot; height=&quot;300&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dear all,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Time flies and the Jenkins elections period is here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, two board seats and all officer positions are up for election.
Thanks, &lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev/&quot;&gt;Oleg Nenashev&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/uhafner/&quot;&gt;Ullrich Hafner&lt;/a&gt; who led the Jenkins project as board members for the last two years.
Thanks, &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;Tim Jacomb&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/daniel-beck/&quot;&gt;Daniel Beck&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Mark Waite&lt;/a&gt; for your dedication as officers over the past year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We already had two successful editions in a row. I want us to continue on that path.
This is a tremendous opportunity for community members to influence the direction of the project for the next two years.
To make this year’s election even better, we slightly modified the process by leveraging our new community platform aka &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To participate in the election, we ask every Jenkins community member to have an account on &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt;.
You can either reuse your Github account or create a new discourse account specific to &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt;.
The second requirement is to be able to showcase at least one contribution done before the first of September 2021.
As mentioned on &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;jenkins.io.io/participate&lt;/a&gt;, they are many different ways to contribute to Jenkins and for many of them, it’s very difficult to measure.
Therefore we’ll trust participants and will not require that they provide evidence of contribution as part of their voter registration. We reserve the right to ban the specific account from the election process if we identify abuse.
The election works in three stages:&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;Identify voters and nominees&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voting period&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Announce results&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;voters&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voters&quot; /&gt;Voters&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To invite participants to vote, we need a list of email’s addresses that we would share with the &lt;a href=&quot;https://civs.cs.cornell.edu&quot;&gt;Condorcet Internet Voting Service&lt;/a&gt;.
Therefore we ask every community member who matches the requirements to join the group &lt;a href=&quot;https://community.jenkins.io/g/election-voter&quot;&gt;election-voter&lt;/a&gt; on &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt; .
The group will be open for joining during the registration period after we’ll close registration during the voting period.
We’ll use emails from the “election-voter” group members.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;nominees&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nominees&quot; /&gt;Nominees&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the same period, we invite every community member to nominate candidates by sending a message to the group &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election-committee&lt;/a&gt; mentioning the position and the motivation.
On the 31 of October, the nomination period will end. We’ll notify all the nominees and get confirmation that they are interested in running as a candidate.
The list of candidates will be announced on the 7th of November.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Everybody can nominate candidates.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we are looking for nominees for the following positions:&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/project/governance/#governance-board&quot;&gt;Board members&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&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;li&gt;
&lt;p&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;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;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&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;More information about the different roles can be found on &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;jenkins.io/project/team-leads&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;election&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#election&quot; /&gt;Election&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the 7th of November, once voters and candidates are identified, we’ll invite everybody by email to vote using &lt;a href=&quot;https://civs.cs.cornell.edu&quot;&gt;civs.cs.cornell.edu&lt;/a&gt;.
At this stage of the election, nobody will be allowed to register.
Voting deadline is the 30th of November.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;result&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#result&quot; /&gt;Result&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As soon as we have the election results, we’ll publish them.
Elected members will begin their official roles on the 3rd of December 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-dates&quot; /&gt;Key Dates&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;Sep 20: Nomination and voter registration begin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oct 31: Nomination deadline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nov 07: Candidates announced, Registration deadline, voting start&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nov 30: Voting deadline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dec 03: Results announced&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-information&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-information&quot; /&gt;Key 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;Everybody can suggest candidates by sending a private message to the group &lt;a href=&quot;https://community.jenkins.io/g/election-committee&quot;&gt;election-committee&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voters register for the election by joining the public group &lt;a href=&quot;https://community.jenkins.io/g/election-voter&quot;&gt;election-voter&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Email participants will be shared with &lt;a href=&quot;https://civs.cs.cornell.edu&quot;&gt;Condorcet Voting System&lt;/a&gt; to send voting invitations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nobody can register for the election once we send invitations to &lt;a href=&quot;https://civs.cs.cornell.edu&quot;&gt;Condorcet Voting System&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the election is over, every member of the group &lt;a href=&quot;https://community.jenkins.io/g/election-voter&quot;&gt;&quot;election-voter&quot;&lt;/a&gt; will get a badge on &lt;a href=&quot;https://community.jenkins.io&quot; class=&quot;bare&quot;&gt;https://community.jenkins.io&lt;/a&gt; as a “2021 Election Participant”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the election is over, every nominee will get the badge “2021 Election Nominee”.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cheers,&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://community.jenkins.io/g/election-voter&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/register-button.png&quot; alt=&quot;register button&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/09/04/wiki-attacked/</id>
<title>Jenkins project Confluence instance attacked</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-09-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/09/04/wiki-attacked/" />
<category term='infrastructure'></category>
<category term='security'></category>
<summary>
Earlier this week the Jenkins infrastructure team identified a successful attack against our deprecated Confluence service.
We responded immediately by taking the affected server offline while we investigated the potential impact.
At this time we have no reason to believe that any Jenkins releases, plugins, or source code have been affected.


Thus far in our investigation, we have learned that the Confluence CVE-2021-26084 exploit was used to install what we believe was a Monero miner in the container running the service.
From there an attacker would not be able to access much of our other infrastructure.
Confluence did integrate with our integrated identity system which...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Earlier this week the Jenkins infrastructure team identified a successful attack against our deprecated Confluence service.
We responded immediately by taking the affected server offline while we investigated the potential impact.
At this time we have no reason to believe that any Jenkins releases, plugins, or source code have been affected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thus far in our investigation, we have learned that the &lt;a href=&quot;https://confluence.atlassian.com/doc/confluence-security-advisory-2021-08-25-1077906215.html&quot;&gt;Confluence CVE-2021-26084&lt;/a&gt; exploit was used to install what we believe was a Monero miner in the container running the service.
From there an attacker would not be able to access much of our other infrastructure.
Confluence did integrate with our integrated identity system which also powers Jira, Artifactory, and numerous other services.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The trust and security in Jenkins core and plugin releases is our highest priority.
We do not have any indication that developer credentials were exfiltrated during the attack.
At the moment we cannot assert otherwise and are therefore assuming the worst.
We are taking actions to prevent releases at this time until we re-establish a chain of trust with our developer community.
We have reset passwords for all accounts in our integrated identity system.
We are improving the password reset system as part of this effort.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this time, the Jenkins infrastructure team has permanently disabled the Confluence service, rotated privileged credentials, and taken proactive measures to further reduce the scope of access across our infrastructure.
We are working closely with our colleagues at the Linux Foundation and the Continuous Delivery Foundation to ensure that infrastructure which is not directly managed by the Jenkins project is also scrutinized.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/lNmas8aBRrI/m/eL3u7A6qBwAJ&quot;&gt;October 2019&lt;/a&gt; we made the Confluence server read-only effectively deprecating it for day-to-day use within the project.
At that time, we began migrating documentation and changelogs from the wiki to GitHub repositories.
That migration has been ongoing, with hundreds of plugins and many other documentation pages moved from the wiki to GitHub repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are grateful for those of you who followed our &lt;a href=&quot;https://www.jenkins.io/security/#reporting-vulnerabilities&quot;&gt;responsible disclosure procedure&lt;/a&gt; and reached out to us about this vulnerability affecting the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will continue to take proactive measures to improve the security of our infrastructure and encourage you to follow us on &lt;a href=&quot;https://twitter.com/jenkinsci&quot;&gt;Twitter&lt;/a&gt; for further updates.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/08/28/conventional-commits-plugin-project-report/</id>
<title>Work report for the Conventional Commits Plugin for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-08-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/08/28/conventional-commits-plugin-project-report/" />
<author>
<name>adi10hero</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2021'></category>
<category term='conventionalcommits'></category>
<category term='plugin'></category>
<summary>
This blog post is part 2 of the Introducing the Conventional Commits Plugin blog.


The goal of this blog is to showcase the work done during the Google Summer of Code 2021 coding phases.


Please refer the part 1 of the blog for a detailed description of the plugin.


Abstract


The project/plugin aims to fully automate a release process.


The plugin tries to achieve this goal by automatically determining the next semantic version based on commit messages.


There were 2 coding phases in the GSoC 2021.
I call the first phase - "Read" and the 2nd phase - "Write", let&#8217;s see why.




Phase 1: Read


In this phase, the...
</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/gsoc/2021/conventional-commits/conventionalCommitsPluginForJenkins.png&quot; alt=&quot;GSoC&quot; height=&quot;420&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post is part 2 of the &lt;a href=&quot;https://www.jenkins.io/blog/2021/07/30/introducing-conventional-commits-plugin-for-jenkins&quot;&gt;Introducing the Conventional Commits Plugin&lt;/a&gt; blog.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal of this blog is to showcase the work done during the Google Summer of Code 2021 coding phases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer the part 1 of the blog for a detailed description of the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;abstract&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#abstract&quot; /&gt;Abstract&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project/plugin aims to fully automate a release process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin tries to achieve this goal by automatically determining the next semantic version based on commit messages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were 2 coding phases in the GSoC 2021.
I call the first phase - &quot;Read&quot; and the 2nd phase - &quot;Write&quot;, let’s see why.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;phase-1-read&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-1-read&quot; /&gt;Phase 1: Read&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this phase, the &quot;read&quot; aspect of the plugin was enhanced.
The plugin supported multiple project types (Maven, Gradle, NPM, Helm, Python, Make) and was able to read current version information from the configuration files of the supported project types.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;deliverables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliverables&quot; /&gt;Deliverables&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Support multiline comments&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support reading the current version from a maven pom.xml&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support reading the current version from a build.gradle&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support reading the current version from a Makefile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support reading the current version from a package.json&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support reading the current version from a helm Chart.yaml&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;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;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://github.com/jenkinsci/conventional-commits-plugin/milestone/1?closed=1&quot;&gt;List of related issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Phase 1 Demo and Presentation:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/_D0hiA1Cgz8?rel=0&amp;amp;start=3219&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&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;phase-2-write&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2-write&quot; /&gt;Phase 2: Write&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this phase, some work was done in extending the &quot;write&quot; aspect of the plugin.
A provision (optional parameter) to write back the calculated next semantic version to the configuration files of projects was added to the plugin.
Along with that, the plugin now can append &quot;Pre-Release&quot; and &quot;Build Metadata&quot; information to the calculated semantic version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;deliverables-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliverables-2&quot; /&gt;Deliverables&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add prerelease information to the calculated/new version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add build metadata to the calculated/new version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write next version in pom.xml&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write next version in package.json&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handle version mismatch between config file and latest tag&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;resources-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources-2&quot; /&gt;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://github.com/jenkinsci/conventional-commits-plugin/milestone/2?closed=1&quot;&gt;Link to related Issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/conventional-commits-plugin#using-optional-parameters&quot;&gt;Using optional parameters&lt;/a&gt; in the Conventional Commits Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1f1Ixv7GJWgtj_sZnF4zlYMTGvCvd4Tt9mZe6YJTERY0/edit?usp=sharing&quot;&gt;Phase 2 Presentation&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;next-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-steps&quot; /&gt;Next Steps&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Write back version for Python project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write back version for Gradle project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handle remote workspaces&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;feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feedback&quot; /&gt;Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would love to hear your feedback &amp;amp; suggestions for the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please reach out on the plugin’s &lt;a href=&quot;https://github.com/jenkinsci/conventional-commits-plugin&quot;&gt;GitHub&lt;/a&gt; repository, the link:https://app.gitter.im/#/room/#jenkinsci_conventional-commits-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt; channel or start a discussion on &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt;.&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/2021/08/23/jenkins-operator-security-work-report/</id>
<title>Security Validator for Jenkins Operator for Kubernetes</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-08-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/08/23/jenkins-operator-security-work-report/" />
<category term='gsoc21'></category>
<category term='kubernetes'></category>
<category term='security'></category>
<category term='plugins'></category>
<summary>
Background


Jenkins custom resources on a Kubernetes cluster are deployed using declarative YAML configuration files; hence some of the plugins declared in these files may contain security warnings.
So there is no way for the user to know other than manually checking for each on the site.
This project aims to add an extra step of validation before creating/updating a new Jenkins Custom Resource.




Deliverables


This project aims to add a validating admission webhook to the Jenkins Operator for Kubernetes to detect potential security vulnerabilities in the plugins before the object is created.




Dependencies


Webhooks communicate to the API server over HTTPS and use TLS. Thus, Jetstack/cert-manager...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins custom resources on a Kubernetes cluster are deployed using declarative YAML configuration files; hence some of the plugins declared in these files may contain security warnings.
So there is no way for the user to know other than manually checking for each on the site.
This project aims to add an extra step of validation before creating/updating a new Jenkins Custom Resource.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;deliverables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliverables&quot; /&gt;Deliverables&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project aims to add a validating admission webhook to the Jenkins Operator for Kubernetes to detect potential security vulnerabilities in the plugins before the object is created.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;dependencies&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dependencies&quot; /&gt;Dependencies&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Webhooks communicate to the API server over HTTPS and use TLS. Thus, &lt;a href=&quot;https://cert-manager.io/docs/&quot;&gt;Jetstack/cert-manager&lt;/a&gt; is used to provision TLS certificates and establish connection between Kubernetes API and webhook.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;implementation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementation&quot; /&gt;Implementation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Operator-SDK takes care of creating a new webhook and appending it to the manager and creating handlers.
Tls certificates are managed using cert-manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Validation Logic:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Proposed Implementations: Iterate through the list of plugins to be installed and fetch warnings for each plugin from the plugin center API and check if the version of that plugin has any of those warnings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Caveats: Webhooks add latency to an API request, hence they should evaluate as quickly as possible thus having max allowed timeout of 30s. In the earlier approach I was fetching the security warnings from the plugin site API in the validator interface itself, and since network operations are slow, it was causing a timeout in the case of validating a larger number of plugins or when the Internet connection was not good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updated Implementation: Instead of fetching information for each plugin, the information about all the plugins is downloaded and cached at the start of the operator and updated periodically, thus eliminating network calls and finishing validation in less than a second.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;evaluation-phase-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#evaluation-phase-1&quot; /&gt;Evaluation Phase 1:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Scaffoled a new validation webhook&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added manifests for ValidatingWebhookConfiguration, certificates and volumes, and updated Makefile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implemented the validator interface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updated helm charts&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;evaluation-phase-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#evaluation-phase-2&quot; /&gt;Evaluation Phase 2:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reimplemented the validator interface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added unit tests for internal functions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added e2e tests along with helm tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updated helm charts&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;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&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;Pull Requests&lt;/p&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/kubernetes-operator/pull/585&quot;&gt;Added validation webhook,manifests,and updated Makefile&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/kubernetes-operator/pull/593&quot;&gt;Implemented validation logic,added tests and updated helm charts&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xO2jGmv1fLo&quot;&gt;Phase 1 demo&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;user-guide&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#user-guide&quot; /&gt;User Guide&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The webhook feature is completely optional for the user. It can be easily deployed using Helm Chart by setting webhook.enabled in values.yaml and in the Operator command line flag.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt; webhook.enabled=true&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To enable security validation in the jenkins custom resource set&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;jenkins.ValidateSecurityWarnings=true&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Note: The webhook takes some time to get up and running, also when helm renders the template, the validating webhook configuration is applied last, hence if the user wants to deploy the Jenkins Custom Resource with validation turned on, he needs to wait for some time. After the webhook is up and running the user can deploy the Jenkins Custom Resource using &lt;strong&gt;helm&lt;/strong&gt; or &lt;strong&gt;kubectl&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;future-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-work&quot; /&gt;Future work&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Implementing a post-install hook in the helm charts that checks whether the webhook is up and running.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding validation for required core version of plugin and core version of Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Migrating other validation logic from controller to the webhook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding validation for the dependencies of the plugins.&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/2021/08/19/git-credentials-binding-work-report/</id>
<title>Git Credentials Binding for sh, bat, powershell</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-08-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/08/19/git-credentials-binding-work-report/" />
<category term='git'></category>
<category term='gsoc'></category>
<summary>
Abstract


This project implemented two new credential bindings to perform authenticated operations using command line git in Jenkins pipeline and freestyle jobs.


The two credential bindings are gitSshPrivateKey and gitUsernamePassword.




Implementation



Type

Feature

Location

The gitUsernamePassword binding is implemented in Jenkins git plugin v4.8.0.
The gitSshPrivateKey binding is implemented in a pull request to the Jenkins git plugin

Dependencies




Credentials Binding Plugin-
It is used to bind Git specific environment variables with shell scripts/commands which perform git authentication on behalf of the user, without their interaction with the command-line.


Bouncy Castle API Plugin-
Provides an API to do common tasks like PEM/PKCS#8 Encoding/Decoding and ensuring its stability among Bouncy Castle API versions.


SSH Server...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;abstract&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#abstract&quot; /&gt;Abstract&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project implemented two new credential bindings to perform authenticated operations using command line git in Jenkins pipeline and freestyle jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The two credential bindings are &lt;code&gt;gitSshPrivateKey&lt;/code&gt; and &lt;code&gt;gitUsernamePassword&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;implementation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementation&quot; /&gt;Implementation&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;Type&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Feature&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Location&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The &lt;code&gt;gitUsernamePassword&lt;/code&gt; binding is implemented in Jenkins &lt;a href=&quot;https://plugins.jenkins.io/git/&quot;&gt;git plugin&lt;/a&gt; &lt;a href=&quot;https://github.com/jenkinsci/git-plugin/releases/tag/git-4.8.0&quot;&gt;v4.8.0&lt;/a&gt;.
The &lt;code&gt;gitSshPrivateKey&lt;/code&gt; binding is implemented in a &lt;a href=&quot;https://github.com/jenkinsci/git-plugin/pull/1111&quot;&gt;pull request&lt;/a&gt; to the Jenkins &lt;a href=&quot;https://plugins.jenkins.io/git/&quot;&gt;git plugin&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Dependencies&lt;/dt&gt;
&lt;dd&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;https://plugins.jenkins.io/credentials-binding/&quot;&gt;Credentials Binding Plugin&lt;/a&gt;-
It is used to bind Git specific environment variables with shell scripts/commands which perform git authentication on behalf of the user, without their interaction with the command-line.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/bouncycastle-api/&quot;&gt;Bouncy Castle API Plugin&lt;/a&gt;-
Provides an API to do common tasks like PEM/PKCS#8 Encoding/Decoding and ensuring its stability among Bouncy Castle API versions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/sshd/&quot;&gt;SSH Server Plugin&lt;/a&gt;-
Provides an API to perform tasks like OpenSSH private key encoding and decoding.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;phase-1-git-username-password-binding-gitusernamepassword&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-1-git-username-password-binding-gitusernamepassword&quot; /&gt;Phase 1: Git Username Password Binding (gitUsernamePassword)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;deliverables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliverables&quot; /&gt;Deliverables&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Support git authentication over the &lt;strong&gt;HTTP&lt;/strong&gt; protocol&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use the &lt;code&gt;GIT_ASKPASS&lt;/code&gt; environment variable to provide user credentials to command line git&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support different&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;OS environments&lt;/em&gt;: CentOS 7, CentOS 8, Debian 9, Debian 10, FreeBSD 12, OpenBSD 6.9, openSUSE 15.2, Ubuntu 18.04, Ubuntu 20.04, Ubuntu 21.04, and Windows 10.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Processors&lt;/em&gt;: amd64, arm32, arm64, and s390x.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Authentication support for command line git only, not JGit or JGit Apache.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Check for specific git versions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setting git specific environment variables based on OS type&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automated test coverage more than 90%&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;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Requests&lt;/p&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/git-plugin/pull/1104&quot;&gt;Add Git Credentials binding for Username and Password&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/git-client-plugin/pull/724&quot;&gt;Check the least command line git version required&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/git-plugin/pull/1119/files&quot;&gt;Git username password binding doc update in git-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/git-credentials-binding/#git-username-and-password-binding&quot;&gt;gitUsernamePassword binding explanation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1LCH0dXzWka_l-WQ3SVMCXfU7w7jQENXS-bdz2E5GIgU/edit?usp=sharing&quot;&gt;Webinar slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2021/07/27/git-credentials-binding-phase-1/&quot;&gt;Git username password binding released blog post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Phase 1 demo and presentation:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/_D0hiA1Cgz8?rel=0&amp;amp;start=4068&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&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;phase-2-git-ssh-private-key-binding-gitsshprivatekey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2-git-ssh-private-key-binding-gitsshprivatekey&quot; /&gt;Phase 2: Git SSH Private Key Binding (gitSshPrivateKey)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;deliverables-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliverables-2&quot; /&gt;Deliverables&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To support git authentication over the &lt;strong&gt;SSH&lt;/strong&gt; protocol&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supports:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Private Key Formats&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OpenSSH&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PEM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PKCS#8&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Encryption algorithms&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RSA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DSA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ECDSA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ED25519&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;OS environments&lt;/em&gt;: CentOS 7, CentOS 8, Debian 9, Debian 10, FreeBSD 12, OpenBSD 6.9, openSUSE 15.3, Ubuntu 18.04, Ubuntu 20.04, Ubuntu 21.04, and Windows 10.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Processors&lt;/em&gt;: amd64, arm32, arm64, and s390x.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Authentication support for command line git only, not JGit or JGit Apache.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use git specific environment variables depending upon the minimum git version&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;GIT_SSH_COMMAND&lt;/code&gt; - If the version is greater than 2.3, provides ssh command including the necessary options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;SSH_ASKPASS&lt;/code&gt; - If the version is less than 2.3, an executable script is attached to the variable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setting variables based on the OS type&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;resources-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources-2&quot; /&gt;Resources&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Requests&lt;/p&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/git-plugin/pull/1111&quot;&gt;Add Git Credentials binding for SSH Private Key&lt;/a&gt;&lt;/p&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/git-plugin/pull/1111/commits/dd86551cda93447090584407304f83ca3030f154&quot;&gt;Last GSOC-2021 noted commit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/git-client-plugin/pull/727&quot;&gt;Scope change of getSSHExecutable method&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/git-credentials-binding/#git-ssh-private-key-binding&quot;&gt;gitSshPrivateKey binding explanation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1oVjwKt4OsxxDWs4eY3JL6jNxi2YyY9IQNizws-EAITM/edit?usp=sharing&quot;&gt;Webinar Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final phase demo and presentation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/XRnZGvaGSqE?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&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;achievements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#achievements&quot; /&gt;Achievements&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;The git credential bindings which are available through the git plugin automate the git authentication process for a user effortlessly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;gitUsernamePassword&lt;/code&gt; and &lt;code&gt;gitSshPrivateKey&lt;/code&gt; binding provides git authentication support for Pipeline and Freestyle Project users in various OS environments on different processors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;gitUsernamePassword&lt;/code&gt; binding has been released and is readily available from git plugin v4.8.0 and above&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;gitSshPrivateKey&lt;/code&gt; binding provides support for OpenSSH format which is default for OpenSSH v7.8 and above&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;future-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-work&quot; /&gt;Future Work&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;SSH private key binding pull request merge and release&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unexpected complications from Jenkins class loader required extra effort and investigation, including an experiment shading a dependency into the git plugin
We intentionally chose to avoid the complication and risk of shading the dependency
If the SSH library use requires shading, then we may need to use maven modules in the git plugin&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/08/17/docker-images-use-jdk-11-by-default/</id>
<title>Docker images use Java 11 by default</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-08-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/08/17/docker-images-use-jdk-11-by-default/" />
<category term='java'></category>
<category term='platform'></category>
<category term='docker'></category>
<summary>
The Jenkins project provides Docker images for controllers, inbound agents, outbound agents, and more.
Beginning with Jenkins 2.307 released August 17, 2021 and Jenkins 2.303.1 released August 25, 2021, the Docker images provided by the Jenkins project will use Java 11 instead of Java 8.


Controllers use Java 11 by default


If you are running one of the Jenkins Docker controller images that does not include a JDK version in its label, the Java runtime will switch from Java 8 to Java 11 with the upgrade.


For example:




Jenkins 2.306 running as jenkins/jenkins:latest uses Java 8.
When Jenkins 2.307 or later is run with jenkins/jenkins:latest, it...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://hub.docker.com/r/jenkins/jenkins/tags&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-08-docker-images-use-jdk-11-by-default/docker-images-use-jdk-11-by-default.png&quot; alt=&quot;Docker images use Java 11 by default&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project provides Docker images for controllers, inbound agents, outbound agents, and more.
Beginning with &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.307&quot;&gt;Jenkins 2.307&lt;/a&gt; released August 17, 2021 and &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.303.1&quot;&gt;Jenkins 2.303.1&lt;/a&gt; released August 25, 2021, the Docker images provided by the Jenkins project will use Java 11 instead of Java 8.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;controllers-use-java-11-by-default&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#controllers-use-java-11-by-default&quot; /&gt;Controllers use Java 11 by default&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are running one of the Jenkins Docker controller images that does not include a JDK version in its label, the Java runtime will switch from Java 8 to Java 11 with the upgrade.&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;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins 2.306 running as &lt;code&gt;jenkins/jenkins:latest&lt;/code&gt; uses Java 8.
When Jenkins 2.307 or later is run with &lt;code&gt;jenkins/jenkins:latest&lt;/code&gt;, it will use Java 11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins 2.289.3 running as &lt;code&gt;jenkins/jenkins:lts&lt;/code&gt; uses Java 8.
When Jenkins 2.303.1 or later is run with &lt;code&gt;jenkins/jenkins:lts&lt;/code&gt;, it will use Java 11&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Docker image tags affected by this upgrade include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;alpine&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;centos7&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;latest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;lts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;slim&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users that need to remain with Java 8 may use a different Docker image tag to run with Java 8.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins 2.306 running as &lt;code&gt;jenkins/jenkins:latest&lt;/code&gt; uses Java 8.
When Jenkins 2.307 or later is run with &lt;code&gt;jenkins/jenkins:latest-jdk8&lt;/code&gt;, it will use Java 8&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins 2.289.3 running as &lt;code&gt;jenkins/jenkins:lts&lt;/code&gt; uses Java 8.
When Jenkins 2.303.1 or later is run with &lt;code&gt;jenkins/jenkins:lts-jdk8&lt;/code&gt;, it will use Java 8&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;agents-use-java-11-by-default&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#agents-use-java-11-by-default&quot; /&gt;Agents use Java 11 by default&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the next 1-2 weeks (Aug 17, 2021 - Aug 31, 2021), the Jenkins agent images will be updated to use Java 11 instead of Java 8.&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;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Running a Jenkins agent from Docker image &lt;code&gt;jenkins/jenkins-inbound-agents:4.9-1&lt;/code&gt; uses Java 8.
When running a Jenkins agent from Docker image &lt;code&gt;jenkins/jenkins-inbound-agents:4.10-1&lt;/code&gt; it will use Java 11.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Running a Jenkins agent from Docker image &lt;code&gt;jenkins/jenkins-inbound-agents:latest&lt;/code&gt; uses Java 8.
When running a Jenkins agent from Docker image &lt;code&gt;jenkins/jenkins-inbound-agents:latest&lt;/code&gt; after the agent change, it will use Java 11.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users that need to remain with Java 8 may use a different Docker image tag to run with Java 8.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Running a Jenkins agent from Docker image &lt;code&gt;jenkins/jenkins-inbound-agents:4.9-1&lt;/code&gt; uses Java 8.
When running a Jenkins agent from Docker image &lt;code&gt;jenkins/jenkins-inbound-agents:4.10-1-jdk8&lt;/code&gt; it will also use Java 8.&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;docker-tag-updates-stopped&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-tag-updates-stopped&quot; /&gt;Docker tag updates stopped&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project will no longer update the Docker images that are based on CentOS 8.
The CentOS project has &lt;a href=&quot;https://blog.centos.org/2020/12/future-is-centos-stream/&quot;&gt;changed direction to track &lt;em&gt;just ahead&lt;/em&gt; of a Red Hat Enterprise Linux release&lt;/a&gt; rather than tracking &lt;em&gt;after&lt;/em&gt; a release.
They are no longer publishing updates for CentOS 8 Docker images.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users running Jenkins 2.306 or earlier with the &lt;code&gt;jenkins/jenkins:centos&lt;/code&gt; tag will need to switch to use a different tag.
They may consider using:&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;jenkins/jenkins:almalinux&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jenkins/jenkins:rhel-ubi8-jdk11&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;Users running Jenkins 2.289.3 or earlier with the &lt;code&gt;jenkins/jenkins:centos&lt;/code&gt; tag will need to switch to use a different tag&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;They may consider using:&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;jenkins/jenkins:lts-almalinux&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jenkins/jenkins:lts-rhel-ubi8-jdk11&lt;/code&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;window-1809-docker-images-stopped&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#window-1809-docker-images-stopped&quot; /&gt;Window 1809 Docker images stopped&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Windows Docker images have published versions based on both the &lt;code&gt;1809&lt;/code&gt; feature release and the Windows Server long term support channel (&quot;LTSC&quot;).
Windows support for the &lt;code&gt;1809&lt;/code&gt; images will no longer be published because Microsoft has ended mainstream support for the &lt;code&gt;1809&lt;/code&gt; images.
Users should switch to use the Jenkins images based on the &quot;LTSC&quot; channel.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/08/02/cloudevents-plugin-phase-I/</id>
<title>CloudEvents Plugin for Jenkins: Interoperability between Jenkins and other CI/CD Tools</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-08-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/08/02/cloudevents-plugin-phase-I/" />
<category term='gsoc'></category>
<category term='gsoc2021'></category>
<category term='cloudevents'></category>
<category term='interoperability'></category>
<category term='cloud-native'></category>
<summary>
The What, Why and How of Interoperability


With workloads and teams becoming more diverse and complex, there is an increasing need to automate various tasks in the CI/CD ecosystem of an application as a way to decrease complexity that can come with CI/CD.


A more diverse team working across different aspects of the application requires a diverse suite of CI/CD tools too, to test and deliver to a wide range of users. More often than not, we need these tools to work together and exchange data to form an effective CI/CD pipeline. However, chaining multiple services together can very easily increase complexity.


How?...
</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/2021-08-cloudevents-plugin/jcdevents.JPG&quot; alt=&quot;CloudEvents Plugin for Jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-what-why-and-how-of-interoperability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-what-why-and-how-of-interoperability&quot; /&gt;The What, Why and How of Interoperability&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With workloads and teams becoming more diverse and complex, there is an increasing need to automate various tasks in the CI/CD ecosystem of an application as a way to decrease complexity that can come with CI/CD.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A more diverse team working across different aspects of the application requires a diverse suite of CI/CD tools too, to test and deliver to a wide range of users. More often than not, we need these tools to work together and exchange data to form an effective CI/CD pipeline. However, chaining multiple services together can very easily increase complexity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How? Each of these services use a different &quot;language&quot; to communicate and represent the entity(an event) which occurred inside that service. In order for another service to understand this &quot;language&quot;, the service might need to develop customized clients and agents which specialize in understanding, traversing and taking-actions based on what was transmitted to it by the first service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One can think of it as a translator who specializes in a language called ABC, and each service who wants to communicate with the service who uses ABC will have to employ this translator, or perhaps get another trained translator. And there is no guarantee that this translator will also help communicate with other services speaking a completely different language.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can see how easily that can grow in cost and maintenance. A preferred way is to have a common language each of these services use and understand as a way to communicate amongst each other. This way, an event which is emitted using this common language will be available to any of the interested receiver without that receiver needing a special agent. This way of communication which uses a common/standard language also creates a way for agnostic communication where the sender or the receiver are sending and receiving data without creating a tight coupling between the two.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;CloudEvents specification is enabling that loosely-coupled, event-driven communication between services by enforcing a common language which defines how an event should be emitted and transferred between systems.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;cloudevents-and-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cloudevents-and-jenkins&quot; /&gt;CloudEvents and 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&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://cloudevents.io/&quot;&gt;&lt;img src=&quot;https://cncf-branding.netlify.app/img/projects/cloudevents/stacked/color/cloudevents-stacked-color.png&quot; alt=&quot;CloudEvents Specification&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;A specification for describing event data in a common way&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Consistency&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Consistent across tools and services.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accessibility&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Common event format means common libraries, tooling, and infrastructure for delivering event data across environments can be used to develop with CloudEvents.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Portability&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Easily port event-data across tools, truly leveraging event-driven architecture.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The CloudEvents plugin for Jenkins is developed as an effort to make interoperability between Jenkins and CI/CD tools much easier. The CloudEvents plugin for Jenkins is a GSoC project, and with the help from an amazing team of mentors, this project is aimed at enhancing event-driven interoperability between cloud-native CI/CD tools, making it easier for developers to include Jenkins in their CI/CD pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this plugin, Jenkins can send and receive CloudEvents-compliant events to and from a wide variety of CI/CD tools using CloudEvents as their event format. This plugin makes chaining Jenkins with multiple tools like Tekton, Keptn, Knative and more, very easy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;gsoc-phase-1-cloudevents-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gsoc-phase-1-cloudevents-plugin&quot; /&gt;GSoC Phase 1 - CloudEvents Plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;using-cloudevents-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-cloudevents-plugin-for-jenkins&quot; /&gt;Using CloudEvents plugin for Jenkins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin allows Jenkins to be configured as a source and sink, which can emit and consume CloudEvents from a range of tools simultaneously.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jenkins-as-a-source&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-as-a-source&quot; /&gt;Jenkins as a Source&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Configuring Jenkins as a Source enables Jenkins to send CloudEvents to a CloudEvents sink. For Phase-I of this project, there is support for HTTP Sinks, however CloudEvents supports various &lt;a href=&quot;https://github.com/cloudevents/spec#cloudevents-documents&quot;&gt;protocol bindings&lt;/a&gt;. Moving forward, there will also be support for other protocol bindings supported by CloudEvents.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To use Jenkins as a Source, the following configuration is needed:&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;Click on &lt;strong&gt;Manage Jenkins&lt;/strong&gt; in the Root-Actions menu on the left.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inside the Manage Jenkins UI, search for &lt;strong&gt;Configure System&lt;/strong&gt; under &lt;strong&gt;System Configuration&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the &lt;strong&gt;Configure System&lt;/strong&gt; UI, scroll down to the CloudEvents plugin section, and this is where all the plugin configuration will be present. Here, you will have to enter the following information:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sink Type (For now, HTTP Protocol Binding for CloudEvent and HTTP Sink is supported.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sink URL (URL of the Sink where you want the cloudevents sent.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events you want sent to the CloudEvents sink URL.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Step 1: Manage Jenkins&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-08-cloudevents-plugin/manage_jenkins.png&quot; alt=&quot;Manage Jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Step 2: Configure System&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-08-cloudevents-plugin/configure_system.png&quot; alt=&quot;Configure System&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Step 3: Configure CloudEvents Sink&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-08-cloudevents-plugin/sink-type.png&quot; alt=&quot;Configure Sink to Receive Events&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Jenkins as a Source configured, Jenkins will send a POST request to the configured sink right as the selected event occurs inside Jenkins. Each event has a different payload specific to the type of the event emitted.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;event-types-payload-and-metadata&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#event-types-payload-and-metadata&quot; /&gt;Event Types, Payload and Metadata&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;CloudEvents emitted by Jenkins follow the Binary-structure supported by CloudEvents, where the CloudEvents metadata is present inside the header, and the event-data is serialized as JSON, and present under request-body. This is the HTTP Protocol Binding for CloudEvents. Each protocol binding for CloudEvents follows a definition specific to the binding protocol.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For now, the following Jenkins events are supported in the CloudEvents Plugin-Jenkins as a Source:&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/cloudevents-plugin#queue-events&quot;&gt;&lt;strong&gt;Queue Events&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Queue Entered Waiting&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Queue Left&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/cloudevents-plugin#build-events&quot;&gt;&lt;strong&gt;Build Events&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Job Started&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Job Completed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Job Finalized&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Job Failed&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/cloudevents-plugin#job-events&quot;&gt;&lt;strong&gt;Job Events&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Job Created&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Job Updated&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/cloudevents-plugin#job-events&quot;&gt;&lt;strong&gt;Node Events&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Node Online&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Node Offline&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following is a table of the queue-entered waiting cloudevents metadata:&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;Event Metadata Headers Key&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Event Metadata Headers Value&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;ce-specversion&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;1.0&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;ce-type&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;org.jenkinsci.queue.entered_waiting&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;ce-source&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;job/test&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;ce-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;123-456-789&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;&lt;em&gt;All of these fields will be present inside the HTTP-request headers since the CloudEvents format used here is the Binary structure.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s also an example of event payload for the queue-entered event:&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;{
  &quot;ciUrl&quot;: &quot;http://3.101.116.80/&quot;,
  &quot;displayName&quot;: &quot;test2&quot;,
  &quot;entryTime&quot;: 1626611053609,
  &quot;exitTime&quot;: null,
  &quot;startedBy&quot;: &quot;shruti chaturvedi&quot;,
  &quot;jenkinsQueueId&quot;: 25,
  &quot;status&quot;: &quot;ENTERED_WAITING&quot;,
  &quot;duration&quot;: 0,
  &quot;queueCauses&quot;: [
    {
    &quot;reasonForWaiting&quot;: &quot;In the quiet period. Expires in 0 ms&quot;,
    &quot;type&quot;: &quot;entered_waiting&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;try-the-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#try-the-plugin&quot; /&gt;Try the Plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin will soon be releasing as the CloudEvents Plugin under &lt;a href=&quot;https://plugins.jenkins.io/&quot; class=&quot;bare&quot;&gt;https://plugins.jenkins.io/&lt;/a&gt;!!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s the GitHub Repo of the Plugin: &lt;a href=&quot;https://github.com/jenkinsci/cloudevents-plugin&quot;&gt;CloudEvents Plugin GitHub Repo&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;demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demo&quot; /&gt;Demo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is a video of the CloudEvents plugin with SockEye demoed at CDF GSoC Midterm Demos. &lt;a href=&quot;https://github.com/n3wscott/sockeye&quot;&gt;SockEye&lt;/a&gt; is an open-source tool which is designed as a way to visulaize cloudevents which are sent from a sink. In this demo, we will take a look at how Jenkins installed in a multi-node K8s environment work with the CloudEvents plugin as a Source, sending events over HTTP to the SockEye sink.&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/iQPAp4DAHnY?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;next-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-steps&quot; /&gt;Next Steps&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins as a Sink to allow Jenkins to trigger various actions as cloudevents are received from other tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enabling filtering on CloudEvents metadata to only act upon a certain kind of events received.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for other protocol bindings in CloudEvents.&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;feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feedback&quot; /&gt;Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would absolutely love to hear your suggestions and feedback. This will help us understand the various use-cases for the plugin, and iterate to support a variety of bindings and formats.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to log an issue at the &lt;a href=&quot;https://github.com/jenkinsci/cloudevents-plugin&quot;&gt;CloudEvents Plugin GitHub&lt;/a&gt; repository. We are on CDF slack under &lt;code&gt;gsoc-2021-jenkins-cloudevents-plugin&lt;/code&gt;. You can also start a discussion on &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt;. I also love emails! Drop me one on: &lt;a href=&quot;mailto:shrutichaturvedi16.sc@gmail.com&quot;&gt;shrutichaturvedi16.sc@gmail.com&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/07/31/remoting-monitoring-phase-1/</id>
<title>Remoting Monitoring with OpenTelemetry - Coding Phase 1</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-07-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/07/31/remoting-monitoring-phase-1/" />
<category term='gsoc'></category>
<category term='gsoc2021'></category>
<category term='remoting'></category>
<category term='open-telemetry'></category>
<summary>
Goal





The goal of this project:




collect telemetry data(metrics, traces, logs) of remoting module with
OpenTelemetry.


send the telemetry data to OpenTelemetry Protocol endpoint




Which OpenTelemetry endpoint to use and how to visualize the data are up to
users.




OpenTelemetry





An observability framework for cloud-native software




OpenTelemetry is a collection of tools, APIs, and SDKs.
You can use it to instrument, generate, collect, and export telemetry
data(metrics, logs, and traces) for analysis in order to understand your
software&#8217;s performance and behavior.






Phase 1 summary


User survey

Our team conducted a user survey to understand the pain point regarding Jenkins
remoting.


Fig 1. What agent type/plugins do you use?



Fig 1 shows what types of agent users use, and...
</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/2021-07-31-remoting-monitoring-phase-1/opengraph.png&quot; alt=&quot;Remoting Monitoring with OpenTelemetry&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;goal&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#goal&quot; /&gt;Goal&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-07-31-remoting-monitoring-phase-1/goal.png&quot; alt=&quot;Goal of Remoting Monitoring with OpenTelemetry&quot; width=&quot;700&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;The goal of this project:&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;collect telemetry data(metrics, traces, logs) of remoting module with
OpenTelemetry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;send the telemetry data to OpenTelemetry Protocol endpoint&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Which OpenTelemetry endpoint to use and how to visualize the data are up to
users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;opentelemetry&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#opentelemetry&quot; /&gt;OpenTelemetry&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&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://opentelemetry.io/&quot;&gt;&lt;img src=&quot;https://cncf-branding.netlify.app/img/projects/opentelemetry/horizontal/color/opentelemetry-horizontal-color.png&quot; alt=&quot;OpenTelemetry Logo&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;An observability framework for cloud-native software&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;OpenTelemetry is a collection of tools, APIs, and SDKs.
You can use it to instrument, generate, collect, and export telemetry
data(metrics, logs, and traces) for analysis in order to understand your
software’s performance and behavior.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;phase-1-summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-1-summary&quot; /&gt;Phase 1 summary&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;user-survey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#user-survey&quot; /&gt;User survey&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our team conducted a user survey to understand the pain point regarding Jenkins
remoting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Fig 1. What agent type/plugins do you use?&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-07-31-remoting-monitoring-phase-1/user-survey.png&quot; alt=&quot;End user survey result&quot; width=&quot;700&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Fig 1 shows what types of agent users use, and 17 unique respondents out of
28 use docker for agent. So I’m planning to publish a docker image to
demonstrate how we can build Docker image with our monitoring feature.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This survey and investigation of JIRA tickets of past two years also tell me five
common causes of agent unavailability.&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;Configuration mistakes&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins agent settings, e.g. misuse of &quot;tunnel connection through&quot; option.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Platform settings, e.g. invalid port setting of Kubernetes&#39; helm template.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Network settings, e.g. Load balancer misconfiguration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Uncontrolled shutdown of nodes&lt;/strong&gt; for downscaling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Timeout during provisioning&lt;/strong&gt; a new node.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Firewall, antivirus software or other network component kill the connection&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lack of hardware resources&lt;/strong&gt;, e.g. memory, temp space, etc…​&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also heard valuable user voice in the survey.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;What areas would you like to see better in Jenkins monitoring?&lt;/div&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have created a bunch of adhoc monitoring jobs to check on the agent’s health
and send e-mail. Would be nice to have this consolidated.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Having archive of nodes with the access to their logs/events would have been
nice.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope that implementing these feature with OpenTelemetry, which is expected to
become the industry standard for observability, will bring great monitoring
experience to Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;proof-of-concept&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#proof-of-concept&quot; /&gt;Proof of Concept&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;how-to-deliver-the-monitoring-program-to-agents&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-deliver-the-monitoring-program-to-agents&quot; /&gt;How to deliver the monitoring program to agents&lt;/h4&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;1-sending-monitoring-program-to-the-agent-over-remoting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-sending-monitoring-program-to-the-agent-over-remoting&quot; /&gt;1. Sending monitoring program to the agent over remoting&lt;/h5&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/2021-07-31-remoting-monitoring-phase-1/sending-monitoring-program-via-remoting.png&quot; alt=&quot;Sending monitoring program via remoting&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my first implementation, I prepared a Jenkins plugin and send the
monitoring program from Jenkins controller. However, this approach have
following disadvantages.&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;We cannot collect telemetry data before the initial connection.
We are likely to encounter a problem while provisioning a new node,
so it’s important to observe agents&#39; telemetry data from the beginning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some agent restarters (e.g. &lt;a href=&quot;https://javadoc.jenkins.io/jenkins/slaves/restarter/UnixSlaveRestarter.html&quot;&gt;UnixSlaveRestarter&lt;/a&gt;)
restart agent completely when reconnecting. It means that the agent lost
monitoring program every time the connection closed, and we cannot collect
telemetry data after the connection is lost before a new connection is
established.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we decided to take the next approach.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;2-install-monitoring-engine-when-provisioning-a-new-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-install-monitoring-engine-when-provisioning-a-new-agent&quot; /&gt;2. Install monitoring engine when provisioning a new agent&lt;/h5&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/2021-07-31-remoting-monitoring-phase-1/install-monitoring-engine-when-provisioning.png&quot; alt=&quot;Installing monitoring engine when provisioning&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this approach, user will download the monitoring program called monitoring
engine, which is a JAR file, and place it in the agent node when provisioning.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;how-to-instrument-remoting-to-produce-remoting-trace&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-instrument-remoting-to-produce-remoting-trace&quot; /&gt;How to instrument remoting to produce remoting trace&lt;/h4&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;add-instrumentation-extension-point-to-remoting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#add-instrumentation-extension-point-to-remoting&quot; /&gt;Add instrumentation extension point to remoting&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pull Request: &lt;a href=&quot;https://github.com/jenkinsci/remoting/pull/471&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/remoting/pull/471&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This approach makes the agent launch command more complicated,
and we have to overcome this problem.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-state&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-state&quot; /&gt;Current State&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;metrics&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#metrics&quot; /&gt;Metrics&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We currently support the following metrics and planning to support more.&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: 13.3333%;&quot;&gt;
&lt;col style=&quot;width: 6.6666%;&quot;&gt;
&lt;col style=&quot;width: 6.6666%;&quot;&gt;
&lt;col style=&quot;width: 20%;&quot;&gt;
&lt;col style=&quot;width: 53.3335%;&quot;&gt;
&lt;/col&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;metrics&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;unit&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;label&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;key&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;description&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;system.cpu.load&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;System CPU load. See &lt;code&gt;com.sun.management.OperatingSystemMXBean.getSystemCpuLoad&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;system.cpu.load.average.1m&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;System CPU load average 1 minute See &lt;code&gt;java.lang.management.OperatingSystemMXBean.getSystemLoadAverage&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;system.memory.usage&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;bytes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;state&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;used&lt;/code&gt;, &lt;code&gt;free&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;see &lt;code&gt;com.sun.management.OperatingSystemMXBean.getTotalPhysicalMemorySize&lt;/code&gt;
and &lt;code&gt;com.sun.management.OperatingSystemMXBean.getFreePhysicalMemorySize&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;system.memory.utilization&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;System memory utilization,
see &lt;code&gt;com.sun.management.OperatingSystemMXBean.getTotalPhysicalMemorySize&lt;/code&gt;
and &lt;code&gt;com.sun.management.OperatingSystemMXBean.getFreePhysicalMemorySize&lt;/code&gt;.
Report 0% if no physical memory is discovered by the JVM.&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;system.paging.usage&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;bytes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;state&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;used&lt;/code&gt;, &lt;code&gt;free&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;see &lt;code&gt;com.sun.management.OperatingSystemMXBean.getFreeSwapSpaceSize&lt;/code&gt;
and &lt;code&gt;com.sun.management.OperatingSystemMXBean.getTotalSwapSpaceSize&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;system.paging.utilization&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;see &lt;code&gt;com.sun.management.OperatingSystemMXBean.getFreeSwapSpaceSize&lt;/code&gt;
and &lt;code&gt;com.sun.management.OperatingSystemMXBean.getTotalSwapSpaceSize&lt;/code&gt;.
Report 0% if no swap memory is discovered by the JVM.&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;process.cpu.load&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;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Process CPU load. See &lt;code&gt;com.sun.management.OperatingSystemMXBean.getProcessCpuLoad&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;process.cpu.time&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;ns&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Process CPU time. See &lt;code&gt;com.sun.management.OperatingSystemMXBean.getProcessCpuTime&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; rowspan=&quot;2&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;runtime.jvm.memory.area&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; rowspan=&quot;2&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;bytes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;type&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;used&lt;/code&gt;, &lt;code&gt;committed&lt;/code&gt;, &lt;code&gt;max&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; rowspan=&quot;2&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;see &lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.management/java/lang/management/MemoryUsage.html&quot;&gt;MemoryUsage&lt;/a&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;area&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;heap&lt;/code&gt;, &lt;code&gt;non_heap&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; rowspan=&quot;2&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;runtime.jvm.memory.pool&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; rowspan=&quot;2&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;bytes&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;type&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;used&lt;/code&gt;, &lt;code&gt;committed&lt;/code&gt;, &lt;code&gt;max&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; rowspan=&quot;2&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;see &lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.management/java/lang/management/MemoryUsage.html&quot;&gt;MemoryUsage&lt;/a&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;pool&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;PS Eden Space&lt;/code&gt;, &lt;code&gt;G1 Old Gen&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;runtime.jvm.gc.time&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;ms&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;gc&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;G1 Young Generation&lt;/code&gt;, &lt;code&gt;G1 Old Generation&lt;/code&gt;, …​&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;see &lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/jdk.management/com/sun/management/GarbageCollectorMXBean.html&quot;&gt;GarbageCollectorMXBean&lt;/a&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;runtime.jvm.gc.count&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;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;gc&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;G1 Young Generation&lt;/code&gt;, &lt;code&gt;G1 Old Generation&lt;/code&gt;, …​&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;see &lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/jdk.management/com/sun/management/GarbageCollectorMXBean.html&quot;&gt;GarbageCollectorMXBean&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/col&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;traces&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#traces&quot; /&gt;Traces&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We tried several approaches to instrument remoting module, but good approach is not established yet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is a draft documentation of the spans to collect. &lt;a href=&quot;https://docs.google.com/document/d/1gjRamLWz3NwenVifC5pYyBMmxsUjl9MjspZF0mRYeaI/edit#heading=h.6xn68iwvd7gz&quot;&gt;Google Doc&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;logs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#logs&quot; /&gt;Logs&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Coming soon!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/col&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;metric-and-span-demo-visualization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#metric-and-span-demo-visualization&quot; /&gt;Metric and span demo visualization&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our team created a demo example with Docker compose and visualized the metrics and spans.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Click to open in new tab&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/2021-07-31-remoting-monitoring-phase-1/prometheus-metrics.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-07-31-remoting-monitoring-phase-1/prometheus-metrics.png&quot; alt=&quot;prometheus metric visualization&quot; width=&quot;40%&quot; /&gt;&lt;/a&gt;
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/2021-07-31-remoting-monitoring-phase-1/jaeger-spans.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-07-31-remoting-monitoring-phase-1/jaeger-spans.png&quot; alt=&quot;jaeger span visualization&quot; width=&quot;55%&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;google-summer-of-code-midterm-demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-summer-of-code-midterm-demo&quot; /&gt;Google Summer of Code Midterm Demo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Our project demo starts with 8:20&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;400&quot; height=&quot;300&quot; src=&quot;https://www.youtube.com/embed/_D0hiA1Cgz8?rel=0&amp;amp;start=514&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;next-step&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-step&quot; /&gt;Next Step&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;Log support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alpha release!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;/table&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/07/30/introducing-conventional-commits-plugin-for-jenkins/</id>
<title>Introducing the Conventional Commits Plugin for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-07-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/07/30/introducing-conventional-commits-plugin-for-jenkins/" />
<author>
<name>adi10hero</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2021'></category>
<category term='conventionalcommits'></category>
<category term='plugin'></category>
<summary>
The conventional commits plugin is a Google Summer of Code project.
Special thanks to the mentors Gareth Evans, Kristin Whetstone, Olivier Vernin and Allan Burdajewicz.


What are Conventional Commits

According to the official website, conventonal commits are, "A specification for adding human and machine readable meaning to commit messages."


Conventional commits are a lightweight convention on top of commit messages.


The following table shows major structural elements offered by the conventional commits convention.








Structural Element
Example




Chore
chore: improve logging


Fix
fix: minor bug fix


Feat
feat: add a new feature


Breaking Change
BREAKING CHANGE: reimplement





Why Conventional Commits

As the CI/CD world is moving more towards complete automation and minimal human interaction, the ability to fully...
</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/gsoc/2021/conventional-commits/conventionalCommitsPluginForJenkins.png&quot; alt=&quot;GSoC&quot; height=&quot;420&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The conventional commits plugin is a Google Summer of Code project.
Special thanks to the mentors Gareth Evans, Kristin Whetstone, Olivier Vernin and Allan Burdajewicz.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-are-conventional-commits&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-are-conventional-commits&quot; /&gt;What are Conventional Commits&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;According to the &lt;a href=&quot;https://www.conventionalcommits.org/&quot;&gt;official website&lt;/a&gt;, conventonal commits are, &quot;A specification for adding human and machine readable meaning to commit messages.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Conventional commits are a lightweight convention on top of commit messages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following table shows major structural elements offered by the conventional commits convention.&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;Structural Element&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Example&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;Chore&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;chore: improve logging&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;Fix&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;fix: minor bug fix&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;Feat&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;feat: add a new feature&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;Breaking Change&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;BREAKING CHANGE: reimplement&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-conventional-commits&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-conventional-commits&quot; /&gt;Why Conventional Commits&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the CI/CD world is moving more towards complete automation and minimal human interaction, the ability to fully automate a release is desired.
Conventional Commits enable the use of automated systems on top of commit messages.
These systems can &quot;truly&quot; automate a release with almost no human interaction.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The convention dovetails with &lt;a href=&quot;https://semver.org/&quot;&gt;semantic versioning&lt;/a&gt;.
Let’s take an example, a maven project is currently versioned at &lt;code&gt;1.2.0&lt;/code&gt;.
The following table shows how conventional commits would bump the version depending on the type of the commit.&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: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3334%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Commit Message&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Version Bump&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;SemVer Equivalent&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;&lt;code&gt;chore: improve logging&lt;/code&gt;&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;1.2.0&lt;/code&gt; → &lt;code&gt;1.2.0&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;No version bump&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;&lt;code&gt;fix: minor bug fix&lt;/code&gt;&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;1.2.0&lt;/code&gt; → &lt;code&gt;1.2.1&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Increment in the patch version&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;&lt;code&gt;feat: add a new feature&lt;/code&gt;&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;1.2.0&lt;/code&gt; → &lt;code&gt;1.3.0&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Increment in the minor version&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;&lt;code&gt;BREAKING CHANGE: reimplement&lt;/code&gt;&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;1.2.0&lt;/code&gt; → &lt;code&gt;2.0.0&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Increment in the major version&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-conventional-commits-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-conventional-commits-plugin&quot; /&gt;The Conventional Commits Plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The conventional commits plugin is a Jenkins plugin to programmatically determine the next semantic version of a git repository using:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Last tagged version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Commit message log&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Current version of the project&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;how-it-works&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-it-works&quot; /&gt;How it works?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin will read the commit messages from the latest tag or the current version of the project till the latest commit.
Using this information it will determine what would be the next semantic Version for that particular project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;supported-project-types&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#supported-project-types&quot; /&gt;Supported Project Types?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently the plugin can read the current version from various configuration files of the following project types:&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;Project Type&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Configuration File(s) Read&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;Maven&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;pom.xml&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;Gradle&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;build.gradle&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;Make&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Makefile&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;Python&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;setup.py&lt;/p&gt;
&lt;p class=&quot;tableblock&quot;&gt;setup.cfg&lt;/p&gt;
&lt;p class=&quot;tableblock&quot;&gt;pyproject.toml&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;Helm&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Charts.yml&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;Node (NPM)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;package.json&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;how-to-request-a-project-type-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-request-a-project-type-support&quot; /&gt;How to request a project type support?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please feel free to open an issue on the &lt;a href=&quot;https://github.com/jenkinsci/conventional-commits-plugin/&quot;&gt;GitHub repository&lt;/a&gt; of the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/table&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-use-the-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-use-the-plugin&quot; /&gt;How to use the plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recommended way of using the plugin is to add a step in a &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/tour/hello-world/#what-is-a-jenkins-pipeline&quot;&gt;Jenkins Pipeline Project&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;nextVersion()&lt;/code&gt; is the pipeline step to be used.&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&gt;pipeline {
    agent any

    environment {
        NEXT_VERSION = nextVersion()
    }

    stages {
        stage(&#39;Hello&#39;) {
            steps {
                echo &quot;next version = ${NEXT_VERSION}&quot;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tip: &lt;em&gt;The pipeline step can also be generated with the help of the Snippet Generator.&lt;/em&gt;
&lt;em&gt;Please select &quot;nextVersion&quot; in the Sample Step drop down and then click on &quot;Generate Pipeline Snippet&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin is released on every feature using JEP-229.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin is available to download from the &lt;a href=&quot;https://plugins.jenkins.io/conventional-commits&quot;&gt;plugins site&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demo&quot; /&gt;Demo&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can watch the plugin in action in a demo presented at the GSoC Midterm Presentations&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/_D0hiA1Cgz8?rel=0&amp;amp;start=3219&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;next-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-steps&quot; /&gt;Next Steps&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Support for pre-release information. Example: &lt;code&gt;1.0.0-alpha&lt;/code&gt;, &lt;code&gt;1.0.0-beta&lt;/code&gt;, etc&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for build metadata. Example: &lt;code&gt;1.0.0-beta+exp.sha.5114f85&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optionally writing the calculated &quot;Next Version&quot; into the project’s configuration file. Example: &lt;code&gt;pom.xml&lt;/code&gt; for a maven project, &lt;code&gt;setup.py&lt;/code&gt; for python.&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;feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feedback&quot; /&gt;Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would love to hear your feedback &amp;amp; suggestions for the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please reach out on the plugin’s &lt;a href=&quot;https://github.com/jenkinsci/conventional-commits-plugin&quot;&gt;GitHub&lt;/a&gt; repository, the link:https://app.gitter.im/#/room/#jenkinsci_conventional-commits-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt; channel or start a discussion on &lt;a href=&quot;https://community.jenkins.io&quot;&gt;community.jenkins.io&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/07/27/git-credentials-binding-phase-1/</id>
<title>Git username / password credentials binding</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-07-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/07/27/git-credentials-binding-phase-1/" />
<category term='git'></category>
<summary>
Google Summer of Code 2021 is implementing git credentials binding for sh, bat, and powershell.
Git credentials binding is one of the most requested features for Jenkins Pipeline (see JENKINS-28335).


The project involves extending the Credentials Binding Plugin to create custom bindings for two types of credentials essential to establish a remote connection with a git repository




Username/Password


SSH Private Key




Why use git credentials binding?


Many operations in a Jenkins Pipeline or Freestyle job can benefit from authenticated access to git repositories.
Authenticated access to a git repository allows a Jenkins job to




apply a tag and push the tag


merge a commit and push the merge


update submodules...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://plugins.jenkins.io/git/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-07-git-credentials-binding-phase-1/git-credentials-binding-phase-1-opengraph.png&quot; alt=&quot;Git username/password credentials binding&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Google Summer of Code 2021 is implementing &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/git-credentials-binding/&quot;&gt;git credentials binding for &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;bat&lt;/code&gt;, and &lt;code&gt;powershell&lt;/code&gt;&lt;/a&gt;.
Git credentials binding is one of the most requested features for Jenkins Pipeline (see &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-28335&quot;&gt;JENKINS-28335&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project involves extending the Credentials Binding Plugin to create custom bindings for two types of credentials essential to establish a remote connection with a git repository&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Username/Password&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSH Private Key&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-use-git-credentials-binding&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-use-git-credentials-binding&quot; /&gt;Why use git credentials binding?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many operations in a Jenkins Pipeline or Freestyle job can benefit from authenticated access to git repositories.
Authenticated access to a git repository allows a Jenkins job to&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;apply a tag and push the tag&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;merge a commit and push the merge&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;update submodules from private repositories&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;retrieve large files with git LFS&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The git credentials username / password binding included in git plugin 4.8.0 allows Pipeline and Freestyle jobs to use command line git from &lt;code&gt;sh&lt;/code&gt;, &lt;code&gt;bat&lt;/code&gt;, and &lt;code&gt;powershell&lt;/code&gt; for authenticated access to git repositories.&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-use-git-credentials-binding&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-use-git-credentials-binding&quot; /&gt;How to use git credentials binding?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The binding is accessible using the &lt;code&gt;withCredentials&lt;/code&gt; Pipeline step.
It requires two parameters:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;credentialsId&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Reference id provided by creating a Username/Password type credential in the Jenkins configuration. To understand how to configure credentials in a Jenkins environment: &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-credentials&quot;&gt;Using Credentials&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;gitToolName&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Name of the git installation in the machine running the Jenkins instance
(Check Global Tool Configuration section in Jenkins UI)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note: In case a user is not aware of the git tool installation of the particular machine, the default git installation will be chosen.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;examples&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#examples&quot; /&gt;Examples&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://www.jenkins.io/doc/pipeline/steps/credentials-binding/#withcredentials-bind-credentials-to-variables&quot;&gt;&lt;code&gt;withCredentials&lt;/code&gt;&lt;/a&gt; wrapper allows declarative and scripted Pipeline jobs to perform authenticated command line git operations with &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script&quot;&gt;&lt;code&gt;sh&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#bat-windows-batch-script&quot;&gt;&lt;code&gt;bat&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#powershell-powershell-script&quot;&gt;&lt;code&gt;powershell&lt;/code&gt;&lt;/a&gt; tasks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Shell example&lt;/div&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;withCredentials&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gitUsernamePassword&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;my-credentials-id&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;gitToolName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;git-tool&#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;git fetch --all&#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;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Batch example&lt;/div&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;withCredentials&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gitUsernamePassword&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;my-credentials-id&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;gitToolName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;git-tool&#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;bat&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;git submodule update --init --recursive&#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;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Powershell example&lt;/div&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;withCredentials&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gitUsernamePassword&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;my-credentials-id&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;gitToolName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;git-tool&#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;powershell&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;git push&#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;The &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/getting-started/#snippet-generator&quot;&gt;Pipeline Syntax Snippet Generator&lt;/a&gt; is a good way to explore the syntax of the &lt;code&gt;withCredentials&lt;/code&gt; step and the git username / password credentials binding.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;limitations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#limitations&quot; /&gt;Limitations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The git credentials username / password binding has been tested on command line git versions 1.8.3 through 2.32.0.
It has been tested on CentOS 7, CentOS 8, Debian 9, Debian 10, FreeBSD 12, OpenBSD 6.9, openSUSE 15.2, Ubuntu 18.04, Ubuntu 20.04, Ubuntu 21.04, and Windows 10.
Processor testing has included amd64, arm32, arm64, and s390x.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The binding does not support private key credentials.
The binding is not supported on command line git versions prior to 1.8.3.&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;Private key credentials support is coming soon.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/07/16/gsoc-midterm-presentation/</id>
<title>GSoC CDF Meetup: Google Summer of Code Midterm Demos</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-07-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/07/16/gsoc-midterm-presentation/" />
<author>
<name>marckk</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2021'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
Congratulations to all GSoC students who have made it through the first half of the GSoC 2021 coding phase!


This year, the Jenkins project has been participating in GSoC as part of the Continuous Delivery Foundation&#8217;s GSoC org.
To celebrate our GSoC students and the fantastic work they have been doing, the CDF is hosting an online meetup where students will present their work.
Students will be showcasing what they have learned and accomplished thus far in GSoC, demoing their work, and discussing their goals and plans for the second coding phase.


The CDF Google Summer of Code Midterm Demos will be held online...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to all GSoC students who have made it through the first half of the GSoC 2021 coding phase!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, the Jenkins project has been participating in GSoC as part of the Continuous Delivery Foundation’s GSoC org.
To celebrate our GSoC students and the fantastic work they have been doing, the CDF is hosting an online meetup where students will present their work.
Students will be showcasing what they have learned and accomplished thus far in GSoC, demoing their work, and discussing their goals and plans for the second coding phase.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The CDF Google Summer of Code Midterm Demos will be held online on July 20th, 13:00 UTC - 15:00 UTC.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;sign-up-here-meetup-event&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sign-up-here-meetup-event&quot; /&gt;Sign up here: &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/279467675/&quot;&gt;Meetup Event&lt;/a&gt;&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 center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/gsoc/2021/cdf_gsoc_org.jpeg&quot; alt=&quot;CDF GSoC&quot; height=&quot;420&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;speakers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#speakers&quot; /&gt;Speakers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;akihiro-kiuchi-jenkins-remoting-monitoring&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#akihiro-kiuchi-jenkins-remoting-monitoring&quot; /&gt;Akihiro Kiuchi - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/remoting-monitoring/&quot;&gt;Jenkins Remoting Monitoring&lt;/a&gt;&lt;/h3&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/2021/gsoc-akihiro-kiuchi.jpg&quot; alt=&quot;Akihiro Kiuchi&quot; height=&quot;220&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Akihiro is a student in the Department of information and communication engineering at the University of Tokyo.
He is improving the monitoring experience of Jenkins Remoting during Google Summer of Code 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: The University of Tokyo and Jenkins project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/Aki-7&quot;&gt;Aki-7&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;title-jenkins-remoting-monitoring-with-opentelemetry&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#title-jenkins-remoting-monitoring-with-opentelemetry&quot; /&gt;Title: Jenkins Remoting Monitoring with OpenTelemetry&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this talk, he will discuss the problems in maintaining Jenkins agents and how to support Jenkins admins in troubleshooting them.
As one of the solutions, he will introduce the new Remoting monitoring with OpenTelemetry plugin that collects Jenkins Remoting monitoring data and troubleshooting data using OpenTelemetry.
What kind of data the plugin will collect and how we will be able to visualize them using available open-source monitoring tools will be demonstrated.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;shruti-chaturvedi-cloudevents-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#shruti-chaturvedi-cloudevents-plugin-for-jenkins&quot; /&gt;Shruti Chaturvedi - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/cloudevents-plugin&quot;&gt;CloudEvents Plugin for Jenkins&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Shruti is an undergrad student of Computer Science at Kalamazoo College.
She is developing a CloudEvents integration for Jenkins, allowing other CloudEvents-compliant CI/CD tools to communicate easily.
Shruti is also the Founding Engineer of a California-based startup, MeetKlara, where she is building serverless solutions and advocating for developing CI/CD pipelines using open-source tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: Kalamazoo College and Jenkins project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/ShrutiC-git&quot;&gt;ShrutiC-git&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LinkedIn: &lt;a href=&quot;https://www.linkedin.com/in/shruti-chaturvedi-developer/&quot;&gt;Shruti Chaturvedi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;title-cloudevents-plugin-for-jenkins-moving-towards-interoperability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#title-cloudevents-plugin-for-jenkins-moving-towards-interoperability&quot; /&gt;Title: CloudEvents Plugin for Jenkins: Moving Towards Interoperability&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this talk, we will look at interoperability as an essential element in building workloads across several services.
We will also talk about how CloudEvents solves one of the biggest challenges in achieving interoperability between systems: lack of normalization/standardization.
Without any standard definition, in order to achieve interoperability, services have to develop adapters specific to a particular system.
That, however, is complex because services are always changing the way data/events are emitted.
CloudEvents solves this problem by defining a standard format for events, which can be emitted/consumed agnostically, thereby achieving indirect interoperability.
Shruti will demonstrate the workings of CloudEvents Plugin for Jenkins; she will walk us through how Jenkins can be configured as a source and a sink, emitting and consuming CloudEvents-compliant events in a platform-independent manner.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;daniel-ko-try-spinnaker-io&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#daniel-ko-try-spinnaker-io&quot; /&gt;Daniel Ko - try.spinnaker.io&lt;/h3&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/2021/gsoc-daniel-ko.jpg&quot; alt=&quot;Daniel Ko&quot; height=&quot;220&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Daniel is studying computer science at the University of Wisconsin - Madison.
He is developing a public Spinnaker sandbox environment for Google Summer of Code 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: University of Wisconsin - Madison and Spinnaker project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/ko28&quot;&gt;ko28&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;title-try-spinnaker-io-explore-spinnaker-in-a-sandbox-environment&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#title-try-spinnaker-io-explore-spinnaker-in-a-sandbox-environment&quot; /&gt;Title: try.spinnaker.io:  Explore Spinnaker in a Sandbox Environment!&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The talk will go through a brief explanation of Spinnaker and the challenges that users face during the installation process.
He will discuss the infrastructure of this project and how a public multi tenant spinnaker instance will be managed and installed.
We will end with a demo of the site so far and the various features implemented, including Github authentication, K8s manifest deployment, AWS Load Balancer Controller to expose deployments, private ECR registry and the blocking of all public images, and auto resource cleanup.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;aditya-srivastava-conventional-commits-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#aditya-srivastava-conventional-commits-plugin-for-jenkins&quot; /&gt;Aditya Srivastava - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/conventional-commits-plugin&quot;&gt;Conventional Commits Plugin for Jenkins&lt;/a&gt;&lt;/h3&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/2021/gsoc-aditya-srivastava.png&quot; alt=&quot;Aditya Srivastava&quot; height=&quot;220&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aditya is a curiosity driven individual striving to find ingenious solutions to real-world problems.
He is an open-source enthusiast and a lifelong learner.
Aditya is also the Co-Founder and Maintainer of an Open Source Organization - Auto-DL, where he’s leading the development of a Deep Learning Platform as a Service application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: V.E.S.I.T &amp;amp; Jenkins project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/ADI10HERO&quot;&gt;ADI10HERO&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LinkedIn: &lt;a href=&quot;https://www.linkedin.com/in/adi10hero&quot;&gt;Aditya S.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;title-conventional-commits-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#title-conventional-commits-plugin-for-jenkins&quot; /&gt;Title: Conventional Commits Plugin for Jenkins&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this talk, we’ll start with what are conventional commits and why they are needed.
Then we’ll see what the jenkins plugin, &quot;Conventional Commits&quot; is and what goal it is trying to achieve.
A demo of how the plugin can be used/integrated in the current workflow will be shown.
Finally, we’ll talk about the next steps in plugin development followed by the QnA.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;harshit-chopra-git-credentials-binding-for-sh-bat-and-powershell&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#harshit-chopra-git-credentials-binding-for-sh-bat-and-powershell&quot; /&gt;Harshit Chopra - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/git-credentials-binding&quot;&gt;Git credentials binding for sh, bat, and powershell&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Harshit Chopra is a recent graduate and is currently working on a Jenkins project which brings the authentication support for cli git commands in a pipeline job and freestyle project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: Punjab University &amp;amp; Jenkins Project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: link: &lt;a href=&quot;https://github.com/arpoch&quot;&gt;arpoch&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LinkedIn: &lt;a href=&quot;https://www.linkedin.com/in/harshit-chopra-275269178&quot;&gt;Harshit Chopra&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://latenighttechie.wordpress.com&quot;&gt;Website&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;title-git-credentials-binding-for-sh-bat-and-powershell&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#title-git-credentials-binding-for-sh-bat-and-powershell&quot; /&gt;Title: Git credentials binding for sh, bat, and powershell&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this talk, he will give an overview of the project and will move on further explaining what problems are being faced, a bit about the workaround that are being used to tackle the problems,
what makes the authentication support so important, why a feature and not a plugin in itself, accomplishments achieved and work done during the coding phase 1, will talk about the implementation of the feature, demonstration of git authentication support over HTTP protocol.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;pulkit-sharma-security-validator-for-jenkins-kubernetes-operator&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pulkit-sharma-security-validator-for-jenkins-kubernetes-operator&quot; /&gt;Pulkit Sharma - &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/projects/jenkins-operator-security&quot;&gt;Security Validator for Jenkins Kubernetes Operator&lt;/a&gt;&lt;/h3&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/2021/gsoc-pulkit-sharma.jpg&quot; alt=&quot;Pulkit Sharma&quot; height=&quot;220&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pulkit is a student at Indian Institute of Technology,BHU,Varanasi.
He is working on a GSoC Project under Jenkins where he aims to add a security validator to the Jenkins Kubernetes Operator.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Affiliation: Indian Institute of Technology, BHU and Jenkins Project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/sharmapulkit04&quot;&gt;sharmapulkit04&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;title-security-validator-for-jenkins-kubernetes-operator&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#title-security-validator-for-jenkins-kubernetes-operator&quot; /&gt;Title: Security Validator for Jenkins Kubernetes Operator&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this talk, we will discuss why we need a security validator for the Jenkins Kubernetes Operator and how we are going to implement it via admission webhooks.
We will have a look at how we are going to implement the validation webhook, the validation logic being used and what tools we are using to achieve it.
Pulkit will showcase his progress and will discuss his future plans for phase 2 and beyond as well.&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/06/21/student-luminy-project-security/</id>
<title>Four students and their master project in Jenkins security</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-06-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/06/21/student-luminy-project-security/" />
<category term='plugins'></category>
<category term='security'></category>
<category term='jenkins'></category>
<summary>
Context

Jenkins is a CI/CD solution and as such, it is critical that the open source plugins that constitute an integral part of it don’t expose the systems they are used on to any security risks and vulnerabilities.
It is in that context that we worked as an audit/code review team to track and report such flaws and problematic practices.


We worked in collaboration with Jenkins Security team member Wadeck Follonier, as part of an end-of-study project during our last year of the Master&#8217;s Degree - Reliability and IT Security in the university of Aix-Marseille.



Project Goals

The main goal of this project was to...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;context&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#context&quot; /&gt;Context&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is a CI/CD solution and as such, it is critical that the open source plugins that constitute an integral part of it don’t expose the systems they are used on to any security risks and vulnerabilities.
It is in that context that we worked as an audit/code review team to track and report such flaws and problematic practices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We worked in collaboration with Jenkins Security team member Wadeck Follonier, as part of an end-of-study project during our last year of the &lt;a href=&quot;https://formations.univ-amu.fr/ME5SIN-PRSIN5AA.html&quot;&gt;Master’s Degree - Reliability and IT Security&lt;/a&gt; in the university of Aix-Marseille.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-goals&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-goals&quot; /&gt;Project Goals&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main goal of this project was to allow us to discover and work on diverse security vulnerabilities in the context of a widely-used software solution, and in order to achieve that we had to separate the project in multiple other goals:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Learning about some of the most common vulnerabilities and the form in which they can be found on a Jenkins Instance and its plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Performing code review and technical audit on the application, and compiling our results as part of a security team.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reporting our findings to the Jenkins team and the plugin maintainers, while sometimes helping the latter to correct these vulnerabilities.&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;knowledge-sharing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#knowledge-sharing&quot; /&gt;Knowledge Sharing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the beginning of the project, we set up communication channels with our mentor through Slack and Google Meets, and agreed to schedule weekly sessions with him.
The goal of these sessions was both to teach us more about the functionalities of Jenkins and the types of vulnerabilities we would encounter, and to allow us to ask more specific questions regarding our findings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to our mentor developing a &lt;a href=&quot;https://github.com/Wadeck/emmenthal-plugin&quot;&gt;mock plugin&lt;/a&gt; compiling a variety of classic vulnerabilities and several of their implementations, including server side request forgery (&lt;a href=&quot;https://en.wikipedia.org/wiki/Server-side_request_forgery&quot;&gt;SSRF&lt;/a&gt;), cross site scripting (&lt;a href=&quot;https://en.wikipedia.org/wiki/Cross-site_scripting&quot;&gt;XSS&lt;/a&gt;), and XML external entity (&lt;a href=&quot;https://en.wikipedia.org/wiki/XML_external_entity_attack&quot;&gt;XXE&lt;/a&gt;) attacks, we have been able to learn through practice.
It allowed us to analyze the context of the code and the different ways the Jelly framework can be used to display information, expanding our payload options and giving us a clearer view of the patterns to look for during our code reviews.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have also had the opportunity to learn about the process used to report the vulnerabilities to the maintainers through Jira issues, and some ways we could correct them or provide steps to do so.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;searching-and-compiling&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#searching-and-compiling&quot; /&gt;Searching and compiling&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At first, we decided to work as a pretty loose team, with each member working on a different plugin and regrouping our findings to confirm or reject them, while staying in constant contact to ask each other questions.
This allowed us to broaden the scope of our searches, and is the reason why we have been able to find a larger number of vulnerabilities, in plugins that differed widely in popularity, than we would have working together from the start.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We used a single file to compile the plugins we audited and our findings, making it easier for our mentor to review them and give us feedback.
Pinpointing the specific portion of code causing the issue and providing reproduction steps as clear as we could proved useful for the reporting process, thus making the approval and correction faster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the last third of this project, we began to work together on bigger plugins, in order to have more points of view reflecting on the same problem.
With different analyses, we were able to come up with new payloads, and sometimes with new vulnerabilities where we only found one separately.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reporting-and-correcting-the-vulnerabilities&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporting-and-correcting-the-vulnerabilities&quot; /&gt;Reporting and correcting the vulnerabilities&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All of the reporting was done through Jira issues, which allows the Jenkins team to centralize and triage the vulnerabilities.
Once we provided the necessary information, along with the reproduction steps we had, a member of the Jenkins security team contacted the plugin maintainer and guided them through the next steps of the process, with hope that they would answer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have also tried to make the maintainers&#39; job easier, working on some fixes.
To achieve this, we delved not only into the functionalities of the vulnerable plugins, but also into some mitigation processes that we found either in the Jenkins documentation,  or with the help of our mentor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each one of our modifications has been tested locally, in order to assess whether the vulnerability was still present, and whether no function had been altered.
However, some of the plugins we audited demanded more complex fixes, due to their intrinsic logic, or the thought process of their developer, which led to us being unable to provide a clear fix.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Considering this, the fixes we have been able to bring into light were only suggestions to the maintainers, for them to use as inspiration or template, in order not to interfere with the plugin logic.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;Conclusion&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Through this project, we have been able to work as a team, delving into some of the different issues that security engineers are bound to face, and the ways they have at their disposal to mitigate them.
This has allowed us to complement our studies with a more practical aspect, that we couldn’t have had otherwise, and to transition into the companies we are now interns in.
This experience has strongly encouraged us to improve in and document ourselves on this branch of cybersecurity, which will have a significant impact on our professional future.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;useful-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#useful-links&quot; /&gt;Useful links&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/2021-03-30/&quot;&gt;Jenkins - 2021/03/30 Security Advisory - 5 from us&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2021-05-11/&quot;&gt;Jenkins - 2021/05/11 Security Advisory - 4 from us&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2021-05-25/&quot;&gt;Jenkins - 2021/05/25 Security Advisory - 3 from us&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2021-06-16/&quot;&gt;Jenkins - 2021/06/16 Security Advisory - 1 from us&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2021-06-18/&quot;&gt;Jenkins - 2021/06/18 Security Advisory - 1 from us&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;message-from-the-mentor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#message-from-the-mentor&quot; /&gt;Message from the mentor&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I didn’t expect to have four students with a so deep desire to learn new things, new tricks.
Their curiosity helped them to find numerous vulnerabilities that already led to 14 published CVEs.
The experience was great and I wish them all the best for their professional career and their never ending quest for knowledge.&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;If you are student, intern, or just someone really interested in security and Jenkins in particularly, please reach out to us to see if there is a possibility to organize something together.
Mailing list: &lt;a href=&quot;mailto:jenkinsci-cert@googlegroups.com&quot;&gt;jenkinsci-cert@googlegroups.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/06/17/libera-chat/</id>
<title>Jenkins IRC moves to Libera Chat</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-06-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/06/17/libera-chat/" />
<category term='community'></category>
<category term='announcement'></category>
<category term='chat'></category>
<summary>
We are happy to announce that
the Jenkins community has moved all its official IRC channels to Libera chat.
We have started our migration on May 26 as a response to the
hostile takeover
of hundreds of open source community channel by the new Freenode management.
As decided  by the Jenkins governance meeting on June 16th,
Libera Chat IRC channels are the only official channels going forward.


A more detailed history of the transition is available on the Jenkins developers mailing list.


What did we move?

We have created the following IRC chats:


that currently live on freenode to libera.chat:




#jenkins - general discussion channel for Jenkins users and developers.
We...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/chat/#internet-relay-chat-irc&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-06-libera-chat/jenkins-irc-on-libera-chat-opengraph.png&quot; alt=&quot;Jenkins IRC now on Libera Chat&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to announce that
the Jenkins community has moved all its &lt;a href=&quot;https://www.jenkins.io/chat/#internet-relay-chat-irc&quot;&gt;official IRC channels&lt;/a&gt; to &lt;a href=&quot;https://libera.chat/&quot;&gt;Libera chat&lt;/a&gt;.
We have started our migration on May 26 as a response to the
&lt;a href=&quot;https://www.theregister.com/2021/05/26/freenode_irc_takeover/&quot;&gt;hostile takeover&lt;/a&gt;
of hundreds of open source community channel by the new Freenode management.
As decided  by the Jenkins governance meeting on June 16th,
Libera Chat IRC channels are the only official channels going forward.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A more detailed history of the transition is available on the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/pEcun5ZSfgo/m/ztRg03VNAgAJ&quot;&gt;Jenkins developers mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-did-we-move&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-did-we-move&quot; /&gt;What did we move?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have created the following IRC chats:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;that currently live on freenode to libera.chat:&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;#jenkins&lt;/code&gt; - general discussion channel for Jenkins users and developers.
We no longer consider it a central chat for all things Jenkins, but we intend to keep it available to users
who want to keep using IRC.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;#jenkins-hosting&lt;/code&gt; - Chat used by the &lt;a href=&quot;https://www.jenkins.io/project/teams/hosting/&quot;&gt;Hosting Team&lt;/a&gt; to manage hosting automation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;#jenkins-infra&lt;/code&gt; - Chat used by the &lt;a href=&quot;https://www.jenkins.io/projects/infrastructure/#team&quot;&gt;Infrastructure Team&lt;/a&gt; to coordinate efforts related to Jenkins project infrastructure and the incident response&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;#jenkins-release&lt;/code&gt;- Chat used for Jenkins core release coordination by the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/docs/MAINTAINERS.adoc#team&quot;&gt;Release Team&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;All other channels have NOT been moved to Libera Chat IRC and were replaced by other channels.
Most notable channels:&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;#jenkins-meeting&lt;/code&gt; - the &lt;a href=&quot;https://www.jenkins.io/project/governance-meeting/&quot;&gt;Jenkins Governance Meeting&lt;/a&gt; uses combination of Zoom and Google Docs at the moment. We do not longer use the IRC chat for that purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;#jenkins-cert&lt;/code&gt; - no private chat going forward. The &lt;a href=&quot;https://www.jenkins.io/security&quot;&gt;Security Team&lt;/a&gt; will use mailing lists only going forward&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&lt;mark&gt;jenkins-community&lt;/mark&gt; - Replaced by the &lt;a href=&quot;https://app.gitter.im/&amp;lt;/mark&amp;gt;/room/#jenkinsci_advocacy-and-outreach-sig:gitter.im&quot;&gt;Advocacy&amp;amp;Outreach&lt;/a&gt; Gitter channel.&lt;/code&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;freenode-concerns-and-disclaimers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#freenode-concerns-and-disclaimers&quot; /&gt;Freenode concerns and disclaimers&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Going forward, the Jenkins community does not have &lt;strong&gt;ANY&lt;/strong&gt; official channels on Freenode.
All channels are either removed or left abandoned.
We no longer manage or control our channels.
Most of the Jenkins IRC channel operators use IRCCloud,
and hence they &lt;a href=&quot;https://twitter.com/oleg_nenashev/status/1403265278566412288&quot;&gt;were banned&lt;/a&gt; by the Freenode team on June 11th.
Only a few operators have reconnected since this event.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Taking the takeover of Freenode and hostile actions taken by the new management,
we can no longer guarantee any of the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Authenticity of registered users on Freenode.
All IRC accounts, cloaked or not, might have been taken over by the new Freenode management.
 Do not trust messages from the Jenkins contributor account IDs there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confidentiality of private channels like &lt;code&gt;#jenkins-cert&lt;/code&gt;.
We performed audit of the conversations there, and we believe there are no undisclosed security vulnerabilities referenced in the channel.
 After all, this IRC has been rather dormant for the last 18 months.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IRC User Passwords.
All passwords on Freenode IRC may be compromised in the future.
We strongly advise all users to rotate their passwords if they were used on Freenode IRC.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have made backups of IRC channel conversations in the abandoned channels.
If you need to access the conversation history, please reach out to the Jenkins Infrastructure team.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;acknowledgements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgements&quot; /&gt;Acknowledgements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We thank the entire &lt;a href=&quot;https://libera.chat/&quot;&gt;Libera Chat&lt;/a&gt; team and all contributors who have worked on creating
a Freenode replacement for hundreds of open source communities using IRC.
Within just a month, a new platform has been created and adopted by almost all active projects.
We remember the Hudson to Jenkins renaming days when a similar mobilization happened in the Jenkins community,
and we appreciate all the effort put by contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to Tim Jacomb, Gavin Mogan, Alex Earl, and Olivier Vernin for their work on the migration of IRC channels
and our automation like the &lt;a href=&quot;https://www.jenkins.io/projects/infrastructure/ircbot/&quot;&gt;IRC Bot&lt;/a&gt; used by the Jenkins hosting team.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s next?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Jenkins community we will keep using Libera Chat IRC and maintaining user and contributor channels there.
Other Jenkins chat channels like &lt;a href=&quot;https://www.jenkins.io/chat/#gitter&quot;&gt;Gitter&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/chat/#slack&quot;&gt;Slack&lt;/a&gt; are unchanged.
We intend to gradually replace many of those channels with &lt;a href=&quot;https://community.jenkins.io/&quot;&gt;community.jenkins.io&lt;/a&gt;.
This is a new portal powered by &lt;a href=&quot;https://www.discourse.org/&quot;&gt;Discourse&lt;/a&gt;.
The service is sponsored by &lt;a href=&quot;https://www.discourse.org/&quot;&gt;Civilized Discourse Construction Kit, Inc.&lt;/a&gt;.
It is currently in preview, stay tuned for announcements.
As always, we will appreciate any suggestions and &lt;a href=&quot;https://community.jenkins.io/c/site-feedback/2&quot;&gt;feedback&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/2021/06/10/jenkins-is-the-way-ebook-2/</id>
<title>New eBook: Jenkins is the Way for IT and software developers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-06-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/06/10/jenkins-is-the-way-ebook-2/" />
<author>
<name>alyssat</name>
</author>
<category term='jenkins-is-the-way'></category>
<category term='case-study'></category>
<category term='ebook'></category>
<category term='community'></category>
<category term='announcement'></category>
<summary>
A little over a year ago, we launched JenkinsIsTheWay.io, a website whose sole purpose is to share Jenkins user stories with the developers and engineers in our community.  Over a hundred of you have already shared your innovations, and they just keep coming.  It comes as no surprise that many of the submitted stories are from IT consultants and software developers around the world building next-generation DevOps and CI/CD platforms to fuel the modernization of enterprise companies far and wide.


That’s why we’ve dedicated our latest eBook to focus on Jenkins users in the global Information Technology sector. ...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/ebook/ebook2_front.png&quot; alt=&quot;Jenkins Is The Way. User Stories IT-eBook&quot; width=&quot;300&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A little over a year ago, we launched JenkinsIsTheWay.io, a website whose sole purpose is to share Jenkins user stories with the developers and engineers in our community.  Over a hundred of you have already &lt;a href=&quot;https://stories.jenkins.io&quot;&gt;shared your innovations&lt;/a&gt;, and they just keep coming.  It comes as no surprise that many of the submitted stories are from IT consultants and software developers around the world building next-generation DevOps and CI/CD platforms to fuel the modernization of enterprise companies far and wide.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s why we’ve dedicated &lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/03/2021-Jenkins-User-Story-IT-focused-ebook.pdf&quot;&gt;our latest eBook&lt;/a&gt; to focus on Jenkins users in the global Information Technology sector.  We shine the spotlight on these developers and engineers who have solved unique software development and DevOps challenges by turning to the leading open source automation server.  From powering large enterprises needing a better way to manage their inventory to innovative tech firms looking to advance technologies and healthcare initiatives during a pandemic, you’ll read about how teams everywhere solved their unique challenges — with the help of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-is-the-way-to&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-is-the-way-to&quot; /&gt;Jenkins is the Way to…&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our &lt;a href=&quot;https://www.surveymonkey.com/r/JenkinsIsTheWay&quot;&gt;short User Story Survey&lt;/a&gt;, we ask Jenkins users to fill in the blank: Jenkins is the way to …​…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve seen results-oriented submissions like &quot;Jenkins is the way to &lt;a href=&quot;https://stories.jenkins.io/user-story/to-deliver-our-new-releases-on-time/&quot;&gt;deliver our new releases on time&lt;/a&gt;!&quot; and &quot;Jenkins is the way to &lt;a href=&quot;https://stories.jenkins.io/user-story/to-understand-and-simplify-your-software-workflows-2/&quot;&gt;understand and simplify your software workflows&lt;/a&gt;.&quot;  Several submissions riffed off of something like &quot;Jenkins is the way to &lt;a href=&quot;https://stories.jenkins.io/user-story/to-completely-automate-your-ci-cd-workflow/&quot;&gt;completely automate your CI/CD workflow&lt;/a&gt;.&quot;  Meanwhile, others have had a bit more fun and languished praise on Jenkins, stating, &quot;Jenkins is the way to &lt;a href=&quot;https://stories.jenkins.io/user-story/to-help-teams-focus-on-what-is-really-important/&quot;&gt;help teams focus on what is really important&lt;/a&gt;, &lt;a href=&quot;https://stories.jenkins.io/user-story/to-make-our-life-easier/&quot;&gt;make our life easier&lt;/a&gt;&quot; and, even, &quot;Jenkins is the way to &lt;a href=&quot;https://stories.jenkins.io.io/user-story/to-save-the-day/&quot;&gt;save the day&lt;/a&gt;.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this new eBook, we focus on the challenges users in the community face, and what they’ve built using Jenkins to achieve their unique goals. For example, Build &amp;amp; Release Manager, Donald Morton, turned to Jenkins to establish &lt;a href=&quot;https://stories.jenkins.io/user-story/to-build-industry-leading-log-management/&quot;&gt;a flexible, modern, and more efficient DevOps platform&lt;/a&gt; for Graylog, a leading log management platform serving the enterprise.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With a Jenkins assist, Mark Baumann, DevOps Engineer with ITK Engineering, created “&lt;a href=&quot;https://stories.jenkins.io/user-story/to-tackle-any-challenge/&quot;&gt;one CI to rule them all&lt;/a&gt;.” He told us that “Jenkins provides a common CI/CD platform for all different kinds of projects and technology domains.”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When IBM Lead Software Engineer Alec Rieger sought to simplify the build and testing pipeline for the company’s software engineers and developers, he also turned to Jenkins.  For a company the size of IBM, which services enterprise clients worldwide, Rieger wanted to help his colleagues manage many nodes on a large scale. Now, according to his &lt;a href=&quot;https://stories.jenkins.io/user-story/to-keep-ibm-always-on/&quot;&gt;Jenkins Is The Way user story&lt;/a&gt;, IBM uses Jenkins pipelines for each of their builds and relies on the flexibility and countless plugin features to continually improve their processes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stronger-smarter-faster-software-innovation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stronger-smarter-faster-software-innovation&quot; /&gt;Stronger, Smarter, Faster Software Innovation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we all fondly think of Jenkins as a modest butler who has empowered developers with the open-source tools they need to succeed — on JenkinsIsTheWay.io, we liken him to an unpretentious, yet powerful superhero.  And like any great superhero, he (or she!) is sure to save the day.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For our Jenkins users, that means results — significant, measurable results with a common theme.  Using Jenkins has enabled you — the user — to help the businesses you serve save money, spin up software faster, and automate processes.  In doing so, you’ve freed up developers and engineers from countless hours of mundane tasks.  Thanks to Jenkins, you’re empowering entire IT teams to innovate, focus on what they love to do and, ultimately, build great stuff.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, we devote much of our &lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/03/2021-Jenkins-User-Story-IT-focused-ebook.pdf&quot;&gt;latest eBook&lt;/a&gt; to those victories.  Results like how RedHat’s &lt;a href=&quot;https://stories.jenkins.io/user-story/to-build-and-release-faster/&quot;&gt;releases are 5x faster&lt;/a&gt; thanks to Jenkins.  The fact that DevOps problem tickets were &lt;a href=&quot;https://stories.jenkins.io/user-story/to-automate-everything/&quot;&gt;reduced by over 90%&lt;/a&gt; for Electronic Health Solutions.  And why the CTO at Cloudologia was &lt;a href=&quot;https://stories.jenkins.io/user-story/to-experiments-and-eternity/&quot;&gt;psyched to share&lt;/a&gt; that — with a Jenkins at the helm — they were able to shorten onboarding for deployment &amp;amp; build release cycles from one week to a single day.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;share-your-user-story-too&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#share-your-user-story-too&quot; /&gt;Share Your User Story, Too!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am proud to share another common theme from the users who have submitted their story:  you turn to our community for collaboration, guidance, and advice.  A community of a million strong and growing, &lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/03/2021-Jenkins-User-Story-IT-focused-ebook.pdf&quot;&gt;this eBook&lt;/a&gt; and &lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;stories.jenkins.io&lt;/a&gt; are other ways to provide you with the insight and lessons learned by developers and engineers, like you, to innovate and build next-generation technologies for companies of all sizes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you’re ready to tell your story, we’re prepared to help you share it.  &lt;a href=&quot;https://www.surveymonkey.com/r/JenkinsIsTheWay&quot;&gt;Fill out our short questionnaire&lt;/a&gt;, and we’ll send you our Jenkins Is The Way T-shirt as a thank you once it’s published!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/03/2021-Jenkins-User-Story-IT-focused-ebook.pdf&quot;&gt;Jenkins IsThe Way. IT User Story eBook, chapter 2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/01/Jenkins-User-Story-Industry-focused-ebook-2020.pdf&quot;&gt;Jenkins IsThe Way. IT User Story eBook, chapter 1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;Visit Jenkins Is The Way&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.surveymonkey.com/r/JenkinsIsTheWay&quot;&gt;Share Your User Story&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;&lt;em&gt;Special thanks to &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;&lt;strong&gt;CloudBees, Inc.&lt;/strong&gt;&lt;/a&gt; for sponsoring this program.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/06/04/digester-removal/</id>
<title>Apache Commons Digester library removal (breaking changes!)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-06-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/06/04/digester-removal/" />
<author>
<name>batmat</name>
</author>
<category term='jenkins'></category>
<category term='core'></category>
<category term='developer'></category>
<category term='announcement'></category>
<summary>
Keeping up with our goal to clean up some of the technical debt inside Jenkins Core and reduce the maintenance overheads, we are happy to report we were able to remove a long-deprecated Apache Commons Digester library.


Jenkins Core does not depend anymore on Apache Commons Digester v.2.1, a version that has been released in 2010.


Some plugins will require update to operate properly after the Jenkins core upgrade.
See JEP-231 for the full list of the affected plugins.
Below there is the list of plugins that did not have their fix released at the time of writing.
They will start to break with the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Keeping up with our goal to clean up some of the technical debt inside Jenkins Core and reduce the maintenance overheads, we are happy to report we were able to remove a long-deprecated Apache Commons Digester library.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5320&quot;&gt;Jenkins Core does not depend anymore&lt;/a&gt; on &lt;a href=&quot;https://search.maven.org/artifact/commons-digester/commons-digester/2.1/jar&quot;&gt;Apache Commons Digester v.2.1&lt;/a&gt;, a version that has been released in 2010.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some plugins will require update to operate properly after the Jenkins core upgrade.
See &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/231&quot;&gt;JEP-231&lt;/a&gt; for the full list of the affected plugins.
Below there is the list of plugins that did &lt;em&gt;not&lt;/em&gt; have their fix released at the time of writing.
They will start to break with the weekly on the 7th of June, expected to be the 2.297.&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/teamconcert&quot;&gt;teamconcert&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/vs-code-metrics&quot;&gt;vs-code-metrics&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/BlameSubversion&quot;&gt;BlameSubversion&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/javatest-report&quot;&gt;javatest-report&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/vss&quot;&gt;vss&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/synergy&quot;&gt;synergy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/config-rotator&quot;&gt;config-rotator&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/harvest&quot;&gt;harvest&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/cmvc&quot;&gt;cmvc&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;In addition to these still-served plugins, a few others will break.
Note however that these were &lt;em&gt;already&lt;/em&gt; suspended &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; for various reasons, so we do recommend to move away from using them or step up as maintainers.
The IDs for these plugins are: &lt;code&gt;tfs&lt;/code&gt;, &lt;code&gt;svn-release-mgr&lt;/code&gt;, &lt;code&gt;cpptest&lt;/code&gt;, &lt;code&gt;cflint&lt;/code&gt;, &lt;code&gt;script-scm&lt;/code&gt;, &lt;code&gt;rtc&lt;/code&gt;.&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;It is always a good idea to update all your plugins &lt;em&gt;before&lt;/em&gt; upgrading Jenkins core.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please reach out on the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;developers’ list&lt;/a&gt; with any questions or suggestions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;getting-fixes-in-the-affected-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-fixes-in-the-affected-plugins&quot; /&gt;Getting fixes in the affected plugins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For all affected plugins we have submitted pull requests with compatibility patches.
These plugins seem to have no active maintainer, and hence we cannot commit on delivering those fixes.
In mean time you can build a custom patch locally to resolve the issue on your instances.
If you use any of those plugins, consider stepping up and &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-governance/adopt-a-plugin/&quot;&gt;adopting&lt;/a&gt; them so that the fixes could be released.
We will appreciate any contributions!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&lt;/h3&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/5320&quot;&gt;PR-5320&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;removing &lt;code&gt;commons-digester:2.1&lt;/code&gt;.
This also contains a complete list of impacted plugins and their PRs and statuses.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/231&quot;&gt;JEP-231&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;describing this change.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. this means these plugins are not served anymore by the Jenkins Project’s hosting service. Even if they were released, the releases would not show up until additional issues are fixed.
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/05/20/configure-plugins-with-jcasc/</id>
<title>Configure Plugins with JCasC</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-05-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/05/20/configure-plugins-with-jcasc/" />
<author>
<name>dheerajodha</name>
</author>
<category term='jcasc'></category>
<category term='tutorial'></category>
<category term='plugins'></category>
<category term='yaml'></category>
<summary>
This blog post is for anyone interested to know how to configure a plugin using the Jenkins Configuration as a Code (JCasC) plugin, more specifically, this blog will guide you to get the YAML equivalent of a plugin’s configuration and use it to do some changes to the plugin without using the Jenkins UI.



If you’re a beginner at JCasC and want to learn more about it, you can head over to the following resources to understand JCasC better:




JCasC Documentation


Overview of JCasC (Video Presentation)


Manage JCasC (DevOps World 2018)





Configuring your first plugin using JCasC (Video Demo)






Overview


So, these are the steps we will...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post is for anyone interested to know how to configure a plugin using the Jenkins Configuration as a Code (JCasC) plugin, more specifically, this blog will guide you to get the YAML equivalent of a plugin’s configuration and use it to do some changes to the plugin without using the Jenkins UI.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re a beginner at JCasC and want to learn more about it, you can head over to the following resources to understand JCasC better:&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/configuration-as-code/&quot;&gt;JCasC Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=wTzljM-EDjI&quot;&gt;Overview of JCasC (Video Presentation)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=47D3H1BZi4o&quot;&gt;Manage JCasC (DevOps World 2018)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Configuring your first plugin using JCasC (Video Demo)&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/YeWhqLPjvMs?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, these are the steps we will be following to achieve our aim:&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;&lt;a href=&quot;#brief-introduction-to-jenkins-yaml-file&quot;&gt;Brief Introduction to jenkins.yaml file&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#configure-the-plugin-on-the-ui&quot;&gt;Configure the plugin on the UI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#download-the-configuration&quot;&gt;Download the Configuration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#update-jcasc-file-locally&quot;&gt;Update JCasC file locally&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#load-the-jenkins-yaml-file-on-the-jenkins-server&quot;&gt;Load the jenkins.yaml file on the Jenkins server&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#verify-the-changes-on-the-ui&quot;&gt;Verify the changes on the UI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;brief-introduction-to-jenkins-yaml-file&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#brief-introduction-to-jenkins-yaml-file&quot; /&gt;Brief Introduction to jenkins.yaml file&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;The &lt;code&gt;jenkins.yaml&lt;/code&gt; file contains the configuration of the Jenkins instance in YAML format.
The JCasC plugin refers to this file to configure the Jenkins instance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The default location of &lt;code&gt;jenkins.yaml&lt;/code&gt; is &lt;code&gt;$JENKINS_HOME/jenkins.yaml&lt;/code&gt;, from where it can be fetched into the Jenkins server whenever you apply a new configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download your &lt;code&gt;jenkins.yaml&lt;/code&gt; file by going to &lt;code&gt;Manage Jenkins&lt;/code&gt; &amp;gt; &lt;code&gt;Configuration as Code&lt;/code&gt; &amp;gt; &lt;code&gt;Download Configuration&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure this file is saved at location &lt;code&gt;$JENKINS_HOME/jenkins.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let’s change the &lt;code&gt;systemMessage&lt;/code&gt; field to:&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/2021-05-15-configure-plugins-with-jcasc/updating-the-jenkins-file.png&quot; alt=&quot;Updating the jenkins.yaml file&quot; width=&quot;700px&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Updating the jenkins.yaml file&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reload the existing configuration to apply the system message change&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now, go back to the Dashboard and you can see the updated System Message on top:&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/2021-05-15-configure-plugins-with-jcasc/viewing-changes-in-jenkins-file.png&quot; alt=&quot;Viewing the changes&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Viewing the changes on Dashboard&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This file will be used later to configure the plugin using JCasC.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;configure-the-plugin-on-the-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-the-plugin-on-the-ui&quot; /&gt;Configure the plugin on the UI&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;For this demo, install the &lt;code&gt;View Job Filters&lt;/code&gt; plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let’s create a view by clicking on the &lt;code&gt;New View&lt;/code&gt; option on the left side of the Dashboard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Give it a name (say, “testView”) and set its type to &lt;code&gt;List View&lt;/code&gt;, and click on the &lt;code&gt;OK&lt;/code&gt; button.&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/2021-05-15-configure-plugins-with-jcasc/naming-the-view.png&quot; alt=&quot;Naming the View&quot; width=&quot;700px&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. Creating the View&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Now click on &lt;code&gt;Add Job Filter&lt;/code&gt; to add any kind of filter, so let’s select &lt;code&gt;Build Duration Filter&lt;/code&gt; and fill the field with any value (say, &quot;60&quot; minutes),&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/2021-05-15-configure-plugins-with-jcasc/add-filters-to-view.png&quot; alt=&quot;Add Filters&quot; width=&quot;700px&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. Adding filter to the view&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;code&gt;Apply&lt;/code&gt; &amp;gt; &lt;code&gt;Save&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To view the full configuration, check out your main &lt;code&gt;jenkins.yaml&lt;/code&gt; configuration file, by clicking on &lt;code&gt;Manage Jenkins&lt;/code&gt; &amp;gt; &lt;code&gt;Configuration as Code&lt;/code&gt; &amp;gt; &lt;code&gt;View Configuration&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to the &lt;code&gt;views&lt;/code&gt; section in this YAML file to see details related to the view,&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/2021-05-15-configure-plugins-with-jcasc/yaml-file-on-jenkins-ui.png&quot; alt=&quot;YAML file on Jenkins UI&quot; width=&quot;750px&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 5. Here, details regarding the view (which we just created) is visible&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;download-the-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#download-the-configuration&quot; /&gt;Download the Configuration&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;Now that you have successfully configured your plugin by UI, let’s download the configuration by going to &lt;code&gt;Manage Jenkins&lt;/code&gt; on the Dashboard, then click on &lt;code&gt;Configuration as Code&lt;/code&gt; under &quot;System Configuration&quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now click on the &lt;code&gt;Download Configuration&lt;/code&gt; button to save the configuration file locally.&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/2021-05-15-configure-plugins-with-jcasc/download-config-button.png&quot; alt=&quot;Download Configuration&quot; height=&quot;400px&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 6. Downloading the Configuration&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update-jcasc-file-locally&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update-jcasc-file-locally&quot; /&gt;Update JCasC file locally&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;Add some changes in your downloaded copy of the &lt;code&gt;jenkins.yaml&lt;/code&gt; file, to see those changes being automatically reflected on the UI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For demo purposes, let’s change the &lt;code&gt;name&lt;/code&gt; to “YoutubeDemoView” and set the &lt;code&gt;buildDurationMinutes&lt;/code&gt; as &quot;55&quot;.&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/2021-05-15-configure-plugins-with-jcasc/yaml-file-on-local-text-editor.png&quot; alt=&quot;YAML file on Text Editor&quot; width=&quot;750px&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 7. Changing the View details locally&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Save the file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;load-the-jenkins-yaml-file-on-the-jenkins-server&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#load-the-jenkins-yaml-file-on-the-jenkins-server&quot; /&gt;Load the jenkins.yaml file on the Jenkins server&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;Now to reflect the local changes done in the &lt;code&gt;jenkins.yaml&lt;/code&gt; file onto the Jenkins server, click on the &lt;code&gt;Reload existing configuration&lt;/code&gt; button.&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/2021-05-15-configure-plugins-with-jcasc/apply-new-config.png&quot; alt=&quot;Apply New Configuration&quot; height=&quot;400px&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 8. Applying the New Configuration to the Jenkins instance&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;verify-the-changes-on-the-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#verify-the-changes-on-the-ui&quot; /&gt;Verify the changes on the UI&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;Go back to the main page by clicking on the Jenkins logo on the top-left side.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And you will notice that the name of your view has been changed from &quot;testView&quot; to “YoutubeDemoView”,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And the field value of &lt;code&gt;Build Duration Filter&lt;/code&gt; has been changed from &quot;60&quot; to “55”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These two are the exact changes that we did locally in our &lt;code&gt;jenkins.yaml&lt;/code&gt; file.&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/2021-05-15-configure-plugins-with-jcasc/view-final-changes.png&quot; alt=&quot;View Updated Changes&quot; width=&quot;700px&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 9. Verifying the changes&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations! You’ve successfully configured a plugin (“View Job Filter”) automatically with the help of the “Jenkins Configuration as Code” plugin! You can repeat the same process for other plugins as well.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&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;&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;/hr&gt;&lt;/hr&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/04/23/jenkins-contributor-awards/</id>
<title>Jenkins Contributor Awards - Nominations Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-04-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/04/23/jenkins-contributor-awards/" />
<author>
<name>cdfoundation</name>
</author>
<category term='awards'></category>
<category term='jenkins'></category>
<category term='cdcon'></category>
<category term='community'></category>
<summary>
This year, the Jenkins Contributor Awards will be run by the Continuous Delivery Foundation (CDF) along with many other CDF Community Awards.


The nominations are currently open and are being accepted using GitHub issues to make the process more transparent. Any contributor is eligible this time around! The deadline to nominate someone is May 14, 2021, and voting will open in May.


Nominate contributors or vote with reactions/comments for all three Jenkins awards:




Most Valuable Jenkins Contributor


Most Valuable Jenkins Advocate


Jenkins Security MVP




The winners will be announced at cdCon 2021, where we&#8217;re also co-locating the Jenkins Contributor Summit on June 25, 2021!


You can also...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, the Jenkins Contributor Awards will be run by the Continuous Delivery Foundation (CDF) along with many other &lt;a href=&quot;https://cd.foundation/cdf-community-awards/&quot;&gt;CDF Community Awards&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nominations are currently open and are being accepted using GitHub issues to make the process more transparent. Any contributor is eligible this time around! The deadline to nominate someone is May 14, 2021, and voting will open in May.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominate contributors or vote with reactions/comments for all three Jenkins awards:&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/cdfoundation/foundation/issues/318&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/cdfoundation/foundation/issues/320&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/cdfoundation/foundation/issues/319&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;The winners will be announced at cdCon 2021, where we’re also co-locating the &lt;a href=&quot;https://www.jenkins.io/events/contributor-summit/&quot;&gt;Jenkins Contributor Summit&lt;/a&gt; on June 25, 2021!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also nominate Jenkins community members for global awards like &quot;Top CDF Ambassador&quot; or &quot;Top GitOps Evangelist&quot;!
For all CDF Community Awards and more details, visit the &lt;a href=&quot;https://cd.foundation/cdf-community-awards/&quot;&gt;CDF Award Page&lt;/a&gt;.&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/2021/jenkins-awards-2021.png&quot; alt=&quot;https://cd.foundation/cdf-community-awards/&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/04/21/tekton-plugin/</id>
<title>Easily reuse Tekton and Jenkins X from Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-04-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/04/21/tekton-plugin/" />
<category term='jenkins-x'></category>
<category term='kubernetes'></category>
<category term='pipeline'></category>
<category term='tekton'></category>
<category term='gitops'></category>
<category term='interoperability'></category>
<summary>
What is Tekton?





Tekton is a powerful and flexible open-source framework for creating CI/CD systems, allowing developers to build, test, and deploy across cloud providers and on-premises systems.


Why use Tekton?

Tekton pipelines have a number of benefits:




they are cloud native and designed from the ground up for kubernetes


each Tekton Pipeline is fully declarative and completely self described; it does not depend on any separate out of band Jenkins controllers, plugins or plugin/controller configurations


each Pipeline Task runs as a stand alone kubernetes Pod which is completely independent of any other pods and pipelines and are fully scheduled by Kubernetes to maximise resilience and...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-tekton&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-tekton&quot; /&gt;What is Tekton?&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 right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/projects/tekton-client-plugin/logo.png&quot; alt=&quot;TektonLogo&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://tekton.dev/&quot;&gt;Tekton&lt;/a&gt; is a powerful and flexible open-source framework for creating CI/CD systems, allowing developers to build, test, and deploy across cloud providers and on-premises systems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-use-tekton&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-use-tekton&quot; /&gt;Why use Tekton?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tekton pipelines have a number of benefits:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;they are cloud native and designed from the ground up for kubernetes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;each Tekton &lt;code&gt;Pipeline&lt;/code&gt; is fully declarative and completely self described; it does not depend on any separate out of band Jenkins controllers, plugins or plugin/controller configurations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;each &lt;code&gt;Pipeline Task&lt;/code&gt; runs as a stand alone kubernetes &lt;a href=&quot;https://kubernetes.io/docs/concepts/workloads/pods/&quot;&gt;Pod&lt;/a&gt; which is completely independent of any other pods and pipelines and are fully scheduled by Kubernetes to maximise resilience and optimize resource usage. A bad pipeline cannot take down another one &amp;amp; the kubernetes scheduler manages them all&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;each step can be any command in any container image with whatever secrets, volume mounts, environment variables and resource limits you need&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;there is no need to bundle a JVM or Jenkins Remoting container into the pod so you can keep resources and cost down&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;why-use-jenkins-and-tekton-together&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-use-jenkins-and-tekton-together&quot; /&gt;Why use Jenkins and Tekton together?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is the most popular open source automation server around. Lots of developers use it every day to get things done.
Jenkins can now be used to automate &lt;a href=&quot;https://tekton.dev/&quot;&gt;Tekton&lt;/a&gt; pipelines too which helps teams digitally transform to more cloud native solutions for their CI and CD.
In such a case, you can use Tekton pipeline engine while getting all benefits from Jenkins as an orchestrator, user interface and the reporting engine.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introducing-the-tekton-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-the-tekton-plugin-for-jenkins&quot; /&gt;Introducing the Tekton Plugin for Jenkins&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/jenkinsci/tekton-client-plugin&quot;&gt;Tekton Client plugin for Jenkins&lt;/a&gt; lets you easily use Jenkins to automate creating and running Tekton pipelines.
It bridges the Kubernetes learning gap and allows invoking Tekton Pipelines and resources through Jenkins.
This allows users to not have much of the Kubernetes specific knowledge beforehand and work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Its a single Jenkins plugin to install - so it’s easy to use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For background check out the  blog post &lt;a href=&quot;https://cd.foundation/blog/2020/11/05/bridging-the-gap-with-tekton-client-plugin-for-jenkins/&quot;&gt;Bridging the Gap with Tekton-client-plugin for Jenkins&lt;/a&gt; by the founder of the plugin &lt;a href=&quot;https://github.com/waveywaves&quot;&gt;Vibhav Bobade&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;requirements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#requirements&quot; /&gt;Requirements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin&quot;&gt;Tekton Client plugin for jenkins&lt;/a&gt; assumes you have access to a kubernetes cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The kubernetes cluster should have &lt;a href=&quot;https://tekton.dev/&quot;&gt;Tekton pipelines&lt;/a&gt; installed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have not yet installed &lt;a href=&quot;https://tekton.dev/&quot;&gt;Tekton&lt;/a&gt; you could use this &lt;a href=&quot;https://github.com/cdfoundation/tekton-helm-chart&quot;&gt;tekton helm chart&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins controller should also have kubernetes RBAC access to be able to create Tekton resources and watch them and their associated pods and pod logs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are running your Jenkins controller inside Kubernetes then an easy way to setup the RBAC is to install the &lt;a href=&quot;https://github.com/jenkins-x-charts/jenkins-resources&quot;&gt;Jenkins Resource Helm Chart&lt;/a&gt; in the same namespace as your Jenkins controller.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another option is to use an &lt;a href=&quot;https://jenkins-x.io/v3/&quot;&gt;installation of Jenkins X&lt;/a&gt; and let it &lt;a href=&quot;https://jenkins-x.io/v3/admin/guides/jenkins/&quot;&gt;setup a Jenkins controller via GitOps&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;specifying-the-tekton-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#specifying-the-tekton-pipelines&quot; /&gt;Specifying the Tekton pipelines&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can configure the Tekton pipeline via:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a file path in a git clone block&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a URL to a tekton YAML file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a block of YAML&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We recommend defining Tekton pipelines as YAML files and checking them into a git repository so that you can use &lt;a href=&quot;https://jenkins-x.io/v3/devops/patterns/gitops/&quot;&gt;GitOps&lt;/a&gt; and follow the &lt;a href=&quot;https://jenkins-x.io/v3/devops/patterns/pipeline_as_code/&quot;&gt;Pipeline As Code&lt;/a&gt; pattern.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This means that you can version your pipelines in git. It also means you can benefit from the &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/editing/#ide-support&quot;&gt;various IDE plugins&lt;/a&gt; available for Tekton such as &lt;a href=&quot;https://github.com/redhat-developer/vscode-tekton#tekton-pipelines-extension--&quot;&gt;VS Code&lt;/a&gt; and &lt;a href=&quot;https://plugins.jetbrains.com/plugin/14096-tekton-pipelines-by-red-hat&quot;&gt;IDEA&lt;/a&gt; so that you get auto completion, formatting and validation while editing the YAML.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So you can use the usual Git provider support in Jenkins to clone the git repository that contains then Tekton YAML file then reference the file by name.&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;reusing-pipelines-from-the-tekton-catalog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reusing-pipelines-from-the-tekton-catalog&quot; /&gt;Reusing Pipelines from the Tekton Catalog&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/tektoncd/catalog&quot;&gt;Tekton Catalog&lt;/a&gt; defines a ton of Tekton Tasks you can reuse in your pipelines&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have found when it comes to a microsevices style architecture you end up with lots of repositories and pipelines. Then using a &lt;a href=&quot;https://jenkins-x.io/v3/devops/patterns/pipeline_as_code/&quot;&gt;Pipeline As Code&lt;/a&gt; pattern with &lt;a href=&quot;https://jenkins-x.io/v3/devops/patterns/gitops/&quot;&gt;GitOps&lt;/a&gt; we want to &lt;a href=&quot;https://jenkins-x.io/v3/devops/patterns/version_everything/&quot;&gt;Version Everything&lt;/a&gt; but also make it easy for any repository to use any version of any task or pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;e.g. you may have many repositories using the current version of a pipeline but want to try out a new change to the pipeline in just 1 repository to verify it works well; then if it does, incrementally roll that change out to more repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This can make it hard trying to reuse as much as you can across the different git repositories while also minimising the number of versions and forks of git repositories you have and simplifying the maintenance of all of the pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have found on the &lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X project&lt;/a&gt; that &lt;a href=&quot;https://jenkins-x.io/blog/2021/02/25/gitops-pipelines/&quot;&gt;a nice way to do this via GitOps&lt;/a&gt; such that we reference versioned Tekton Tasks and Pipelines in git so that they are easy to &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/catalog/#referencing-a-task-or-step&quot;&gt;reuse&lt;/a&gt; or &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/catalog/#overriding-a-pipeline-step-locally&quot;&gt;override&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we reuse Tasks and Pipelines via the &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/catalog/#sourceuri-notation&quot;&gt;uses: image notation&lt;/a&gt; which lets us keep all of our Tekton Tasks and Pipelines in vanilla Tekton YAML; so that the IDE completion and validation works - but we can easily reuse Tasks or steps from libraries while also &lt;a href=&quot;https://jenkins-x.io/v3/devops/patterns/version_everything/&quot;&gt;Versioning Everything&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; that if wish to reuse steps/tasks via the &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/catalog/#sourceuri-notation&quot;&gt;uses: image notation&lt;/a&gt; then you must click the &lt;code&gt;Tekton Catalog&lt;/code&gt; flag in your Job definition which will then resolve the &lt;code&gt;uses:&lt;/code&gt; clause with the actual step/task.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-jenkins-x&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-jenkins-x&quot; /&gt;What is Jenkins X?&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 right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/jenkins-x/logo-with-text.svg&quot; alt=&quot;Jenkins X Logo&quot; width=&quot;250&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X project&lt;/a&gt; automates your CI/CD on kubernetes to help you &lt;a href=&quot;https://jenkins-x.io/v3/devops/accelerate/&quot;&gt;accelerate&lt;/a&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://jenkins-x.io/v3/develop/create-project/&quot;&gt;Automated CI/CD pipelines&lt;/a&gt; lets you focus on your actually application code while Jenkins X automatically creates battle tested &lt;a href=&quot;https://github.com/tektoncd/pipeline&quot;&gt;Tekton&lt;/a&gt; CI/CD pipelines for your project which are &lt;a href=&quot;https://jenkins-x.io/blog/2021/02/25/gitops-pipelines/&quot;&gt;managed via GitOps&lt;/a&gt; so that its super easy to keep your pipelines up to date across your repositories or to upgrade or &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/catalog/#overriding-a-pipeline-step-locally&quot;&gt;override pipelines or steps&lt;/a&gt; for specific repositories.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/v3/develop/environments/promotion&quot;&gt;Automatic promotion of versioned artifacts&lt;/a&gt; via &lt;a href=&quot;https://jenkins-x.io/v3/devops/patterns/gitops/&quot;&gt;GitOps&lt;/a&gt; through your &lt;a href=&quot;https://jenkins-x.io/v3/develop/environments/&quot;&gt;Environments&lt;/a&gt; such as &lt;code&gt;Staging&lt;/code&gt;, &lt;code&gt;Pre-production&lt;/code&gt; and &lt;code&gt;Production&lt;/code&gt; whether they are running in the same kubernetes cluster or you are using &lt;a href=&quot;https://jenkins-x.io/v3/admin/guides/multi-cluster/&quot;&gt;multiple clusters for your environments&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/v3/develop/environments/preview/&quot;&gt;Preview Environments&lt;/a&gt; lets you propose code changes via Pull Requests and have a Preview Environment automatically created, running your code in kubernetes to get fast feedback from your team before agreeing to merge changes to the main branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/v3/develop/developing/#using-chatops&quot;&gt;ChatOps&lt;/a&gt; comment on Pull Requests to give feedback, approve/hold changes, trigger optional pipelines for additional testing and other &lt;a href=&quot;https://jenkins-x.io/v3/develop/reference/chatops/&quot;&gt;ChatOps commands&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;All of the above is implemented in reusable Tekton pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reusing-jenkins-x-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reusing-jenkins-x-pipelines&quot; /&gt;Reusing Jenkins X Pipelines&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So how can we reuse automated CI/CD pipelines from &lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X project&lt;/a&gt; from Jenkins?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Make sure you have the &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin&quot;&gt;Tekton Client plugin for Jenkins&lt;/a&gt; installed in your Jenkins server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;using-a-working-template&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-a-working-template&quot; /&gt;Using a working template&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to start with a working example then&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/jstrachan/node-example/generate&quot;&gt;Create A Git Repository From This Template&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;add a new &lt;code&gt;Frestyle project&lt;/code&gt; to your Jenkins server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;enable the &lt;code&gt;Git&lt;/code&gt; source code management for your new github.com repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click &lt;code&gt;Add build Step&lt;/code&gt; (near the bottom of the page) and then select &lt;code&gt;Tekton : Create Resource (Raw)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;make sure that &lt;code&gt;FILE&lt;/code&gt; is selected for the input and enter the name &lt;code&gt;.lighthouse/jenkins-x/release.yaml&lt;/code&gt; for the file name&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;if you are using a Jenkins X cluster enter &lt;code&gt;jx&lt;/code&gt; for the namespace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ensure that &lt;code&gt;Enable Tekton Catalog&lt;/code&gt; is checked&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;now save the pipeline - it should look something like this:&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/projects/tekton-client-plugin/example.png&quot; alt=&quot;Jenkins Console&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now if you trigger the pipeline you should see it create a Tekton Pipeline and you should see the output of the tekton pipeline in the Jenkins console. The pipeline is actually running as a completely separate Pod in kubernetes; the Jenkins controller just tails the log into the console.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a Jenkins X cluster this pipeline should just work (reusing all the cloud resources and IAM roles setup by the Terraform) but in an arbitrary kubernetes cluster you may get issues around not being able to push images or promote due to lack of GitOps environments being defined which we can help you work through via the &lt;a href=&quot;https://jenkins-x.io/community/#slack&quot;&gt;Jenkins X slack room&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;using-an-existing-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-an-existing-repository&quot; /&gt;Using an existing repository&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can configure a Pull Request or Release pipeline in your project by copying the YAML file for the &lt;a href=&quot;https://github.com/jenkins-x/jx3-pipeline-catalog/tree/master/packs&quot;&gt;language pack&lt;/a&gt; you wish to use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;e.g. if you are using maven then copy &lt;a href=&quot;https://github.com/jenkins-x/jx3-pipeline-catalog/blob/master/packs/maven-java11/.lighthouse/jenkins-x/pullrequest.yaml&quot;&gt;pullrequest.yaml&lt;/a&gt; or &lt;a href=&quot;https://github.com/jenkins-x/jx3-pipeline-catalog/blob/master/packs/maven-java11/.lighthouse/jenkins-x/release.yaml&quot;&gt;release.yaml&lt;/a&gt; into your projects source code then reference it from your Jenkins Job:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then follow the above instructions for setting up a &lt;code&gt;Freestyle project&lt;/code&gt; for your git repository and referencing the file name for your pipeline.&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;overriding-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overriding-steps&quot; /&gt;Overriding steps&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Being able to reuse steps from libraries of pipelines is awesome; but sometimes you need to change things. The assumptions, commands, arguments, environment variables or approaches used for every step in a library may not quite match what you need on a specific application. You may need to run steps before/after steps in the library or you may need to override a specific step to do something different.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can easily &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/catalog/#customizing-an-inherited-step&quot;&gt;customize any inherited step&lt;/a&gt; in any shared pipeline or &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/catalog/#adding-your-own-steps&quot;&gt;add custom steps before/after any step&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The fact that all the Tekton YAML is fully declarative makes it super easy to modify things via your IDE with validation and smart completion and not have to use a scripting language and understand complex shared pipeline libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The easiest way to try overriding a step is to install the &lt;a href=&quot;&quot;&gt;jx binary to your $PATH&lt;/a&gt; then &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/catalog/#overriding-a-pipeline-step-locally&quot;&gt;use the jx pipeline override command&lt;/a&gt; which will create a new locally overridden step you can then just edit in your IDE.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then at any time you can &lt;a href=&quot;https://jenkins-x.io/v3/develop/pipelines/catalog/#viewing-the-effective-pipeline&quot;&gt;view the effective pipeline when you make local changes&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;comparing-the-kubernetes-and-tekton-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#comparing-the-kubernetes-and-tekton-plugins&quot; /&gt;Comparing the Kubernetes and Tekton plugins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Those of you using Jenkins on a &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; cluster are probably using the &lt;a href=&quot;https://plugins.jenkins.io/kubernetes/&quot;&gt;kubernetes plugin&lt;/a&gt; right now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/kubernetes-plugin/tree/master/examples/declarative_from_yaml_file&quot;&gt;Here is an example&lt;/a&gt; of how to use a &lt;a href=&quot;https://github.com/jenkinsci/kubernetes-plugin/blob/master/examples/declarative_from_yaml_file/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt; with a &lt;a href=&quot;https://github.com/jenkinsci/kubernetes-plugin/blob/master/examples/declarative_from_yaml_file/KubernetesPod.yaml&quot;&gt;pod YAML file&lt;/a&gt; so that you can run commands in different containers in the pod.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What this means is that:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a kubernetes pod is created based on the &lt;a href=&quot;https://github.com/jenkinsci/kubernetes-plugin/blob/master/examples/declarative_from_yaml_file/KubernetesPod.yaml&quot;&gt;pod YAML file&lt;/a&gt; which is scheduled by kubernetes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the &lt;a href=&quot;https://github.com/jenkinsci/kubernetes-plugin/blob/master/examples/declarative_from_yaml_file/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt; runs on the Jenkins controller talking over Jenkins remoting to the pod to tell it to run commands in different containers. The pod includes the &lt;code&gt;jnlp&lt;/code&gt; container which does the remoting between the Jenkins controller and the pod&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This has a few issues:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;each container in the pod must have a shell so that jnlp can invoke commands. This may mean you have to create your own images&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;it can be a little slow to start since there is chattiness with the Jenkins controller and the pod - whereas with Tekton pods just start and run locally without any coodination with the Jenkins controller&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;you have to maintain 2 files: the &lt;code&gt;Jenkinsfile&lt;/code&gt; and the &lt;code&gt;pod.yaml&lt;/code&gt; and it’s hard to share/override both of those files across multiple repositories as you need to make changes (e.g. overriding environment variables/images/commands/resource limits on demand on steps).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Though one downside of the tekton approach is that by default there is no automatic synchronisation of state; after a Task in tekton completes there’s no automatic upload of state to the Jenkins controllers disk. You can always add a step in your Task to upload workspace state to the Jenkins controller if that’s what you want.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Though remember that tekton plugin doesn’t take anything away; so you can mix and match the kubernetes and tekton plugins to suit your needs.&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;We are really excited about the combination of Jenkins, &lt;a href=&quot;https://tekton.dev/&quot;&gt;Tekton&lt;/a&gt; and &lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt; letting developers pick the best tool for the job while becoming more cloud native and increasing the automation help reduce the amount of manual work creating and maintaining pipelines while also helping to improve the quality and practices of our CI/CD.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please try it out and &lt;a href=&quot;https://github.com/jenkinsci/tekton-client-plugin/issues&quot;&gt;let us know how you get on&lt;/a&gt;!&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/2021/04/15/jenkins-operator-sub-project/</id>
<title>Jenkins Operator becomes an official sub-project!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-04-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/04/15/jenkins-operator-sub-project/" />
<category term='kubernetes'></category>
<category term='operator'></category>
<category term='contributing'></category>
<category term='announcement'></category>
<summary>
We are happy to announce that Jenkins Operator officially became an official Jenkins sub-project.


What does it mean for the project?





Becoming an official part of the Jenkins project was a major step towards better alignment with the overall Jenkins’ roadmap and more opportunities to increase adoption of the Jenkins Operator project.


Finally, with a dedicated team at VirtusLab actively maintaining the project we can engage with the wider community and participate in some of the Cloud-Native SIG meetings.
This opens a room for everyone to voice their opinions or start supporting the project.


We truly believe that this community engagement will result in significant...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to announce that Jenkins Operator officially &lt;a href=&quot;https://www.jenkins.io/projects/jenkins-operator/&quot;&gt;became an official Jenkins sub-project&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-does-it-mean-for-the-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-does-it-mean-for-the-project&quot; /&gt;What does it mean for the project?&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 left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/logos/kubernetes-operator/256.png&quot; alt=&quot;Jenkins Operator&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Becoming an official part of the Jenkins project was a major step towards better alignment with the overall Jenkins’ roadmap and more opportunities to increase adoption of the Jenkins Operator project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, with a dedicated team at &lt;a href=&quot;http://virtuslab.com/&quot;&gt;VirtusLab&lt;/a&gt; actively maintaining the project we can engage with the wider community and participate in some of the &lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native/#meetings&quot;&gt;Cloud-Native SIG meetings&lt;/a&gt;.
&lt;strong&gt;This opens a room for everyone to voice their opinions or start supporting the project.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We truly believe that this community engagement will result in significant improvements to Jenkins Operator, as well as the Jenkins ecosystem itself.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;bridging-the-gap-between-jenkins-and-kubernetes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bridging-the-gap-between-jenkins-and-kubernetes&quot; /&gt;Bridging the gap between Jenkins and Kubernetes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Running Jenkins in a cloud-native environment like Kubernetes is not a trivial task.
With Jenkins Operator project we want to enable the community to take full advantage of Kubernetes and public cloud capabilities by:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;native integration with public cloud services in areas of observability, storage and cloud security&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes autoscaling and self-healing mechanism&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;secure access to Jenkins instance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;declarative configuration using Kubernetes Custom Resources&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;full lifecycle management, eventually transforming it to autopilot&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;take-part-in-the-journey-toward-global-trends&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#take-part-in-the-journey-toward-global-trends&quot; /&gt;Take part in the journey toward global trends&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Start &lt;a href=&quot;https://github.com/jenkinsci/kubernetes-operator/blob/master/CONTRIBUTING.md&quot;&gt;contributing&lt;/a&gt; and play an important role in creating the automated Jenkins experience! Don’t hesitate - engage in the community.&lt;/strong&gt;
Join us in our work of creating the functionalities you see beneficial.
You are welcome to create issues and pull requests. We are actively resolving community issues and providing answers on a dedicated &lt;a href=&quot;https://github.com/jenkinsci/kubernetes-operator#community&quot;&gt;Slack channel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the project has been initially developed and still actively maintained by &lt;a href=&quot;http://virtuslab.com/&quot;&gt;VirtusLab&lt;/a&gt;, we started &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/OA5nb_SAgh0/m/OoBS2o8nAwAJ:&quot;&gt;discussion&lt;/a&gt; towards an open governance model to facilitate communication and collaboration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;lead-the-way-we-are-heading-by-providing-us-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lead-the-way-we-are-heading-by-providing-us-feedback&quot; /&gt;Lead the way we are heading by providing us feedback&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To celebrate the new possibilities that are being opened for our project, we would like to invite you to take part in a short survey that will help put us on the right track.
If you have been using Jenkins Operator or running Jenkins in any other environment, please take a moment to fill out our quick survey.
&lt;strong&gt;We will choose at least three of the most informative answers and send you an awesome Jenkins Operator T-shirt with our cute Gopher butler.&lt;/strong&gt;
The survey can be found &lt;a href=&quot;https://docs.google.com/forms/d/1doIkgnm3_WbjtlwWSU4sOoiI7QoneHlYIjXEJOVMrfQ/edit?usp=sharing&quot;&gt;here&lt;/a&gt;. Remember, the most sincere answers are the best.&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/2021-04-jenkins-operator/tshirt-logo.jpg&quot; alt=&quot;T-shirt&quot; width=&quot;400px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And if you still haven’t used Jenkins Kubernetes Operator, you’re more than welcome to do so.
Give it a shot and discover a new kind of simplicity of running Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/jenkins-operator/#getting-started&quot;&gt;How to get started&lt;/a&gt;.&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/2021/04/07/contributhon-participants/</id>
<title>Welcome the She Code Africa Contributhon participants!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-04-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/04/07/contributhon-participants/" />
<author>
<name>markewaite</name>
</author>
<category term='events'></category>
<category term='community'></category>
<category term='documentation'></category>
<category term='outreach-programs'></category>
<category term='contributing'></category>
<summary>
The She Code Africa Contributhon started April 1, 2021.
The She Code Africa Contributhon is a boot camp where African women are paid to work with open source organizations on selected projects with dedicated mentors.
This program aims to create a more diverse, inclusive, and innovative culture within the African open source ecosystem by matching African women in technology with sponsor and mentor open source organizations.
The 5 mentees joining the Jenkins project come from Nigeria, Kenya, and Rwanda.


The Jenkins project has been accepted as a Contributhon mentoring organization.
Our project idea will introduce mentees to Jenkins and plugin development as they create Pipeline...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon&quot;&gt;She Code Africa Contributhon&lt;/a&gt; started April 1, 2021.
The &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon&quot;&gt;She Code Africa Contributhon&lt;/a&gt; is a boot camp where African women are paid to work with open source organizations on selected projects with dedicated mentors.
This program aims to create a more diverse, inclusive, and innovative culture within the African open source ecosystem by matching African women in technology with sponsor and mentor open source organizations.
The 5 mentees joining the Jenkins project come from Nigeria, Kenya, and Rwanda.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has been accepted as a &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon/mentor-orgs/accepted-organizations&quot;&gt;Contributhon mentoring organization&lt;/a&gt;.
Our &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon/mentor-orgs/accepted-organizations/jenkins&quot;&gt;project idea&lt;/a&gt; will introduce mentees to Jenkins and plugin development as they create Pipeline examples and create Pipeline help for Jenkins Pipeline plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Twice weekly mentoring sessions are scheduled with the mentees and are listed in the &lt;a href=&quot;https://www.jenkins.io/events&quot;&gt;events calendar&lt;/a&gt;.
We’ve already received the first pull request to improve the embedded documentation that generates the &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/&quot;&gt;Steps Reference&lt;/a&gt; and provides contextual help in the &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/getting-started/#snippet-generator&quot;&gt;Snippet Generator&lt;/a&gt;.
We’re looking forward to more pull requests and more improvements throughout April, 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’d like to introduce our mentees so that you recognize them and can welcome them during code review and online chat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;onyinye-ezike&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#onyinye-ezike&quot; /&gt;Onyinye Ezike&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-04-contributhon-participants/onyinye-ezike.jpg&quot; alt=&quot;Onyinye Ezike&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Onyinye is based in Lagos, Nigeria.
She’s a junior fullstack software developer who is very passionate about learning.
She uses Angular, React, Nodejs, and Spring Boot.
She has spent the last two years building up herself in software development and she’s hoping to become a world-class software developer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/Onyimatics&quot;&gt;&lt;code&gt;Onyimatics&lt;/code&gt;&lt;/a&gt; on GitHub and on the &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=creator%20%3D%20%20onyimatics&quot;&gt;Jenkins issue tracker&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;sharon-jebitok&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sharon-jebitok&quot; /&gt;Sharon Jebitok&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-04-contributhon-participants/sharon-jebitok.jpg&quot; alt=&quot;Sharon Jebitok&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sharon is based in Kenya.
She’s a software development student at Microverse, a remote school for software developers.
She has been an active member of She Code Africa and she’s presently a mentee on She Code Africa’s Contributhon Program with the Jenkins project.
She has spent one year in the software industry since she switched her career into tech, learning to write meaningful code and collaborate with other developers/designers and the tech community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/jebitok-dev&quot;&gt;&lt;code&gt;jebitok-dev&lt;/code&gt;&lt;/a&gt; on GitHub and as &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=creator%20%3D%20%20jebitok16_&quot;&gt;&lt;code&gt;jebitok16_&lt;/code&gt;&lt;/a&gt; on the &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=creator%20%3D%20%20jebitok16_&quot;&gt;Jenkins issue tracker&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;esther-ejidike&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#esther-ejidike&quot; /&gt;Esther Ejidike&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-04-contributhon-participants/esther-ejidike.jpg&quot; alt=&quot;Esther Ejidike&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Esther is a frontend developer based in Lagos, Nigeria.
She is one of the participants in the She Code Africa Contributhon Open Source Program working with Jenkins and will be contributing to the nodes and processes plugin.
She loves to convert designs to exact replicas in the form of webpages and she likes to learn new things in her free time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/Queen-esther01&quot;&gt;&lt;code&gt;Queen-esther01&lt;/code&gt;&lt;/a&gt; on GitHub and as &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=creator%20%3D%20%20esther101&quot;&gt;&lt;code&gt;esther101&lt;/code&gt;&lt;/a&gt; on the &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=creator%20%3D%20%20esther101&quot;&gt;Jenkins issue tracker&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;cynthia-iradukunda&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cynthia-iradukunda&quot; /&gt;Cynthia Iradukunda&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-04-contributhon-participants/cynthia-iradukunda.png&quot; alt=&quot;Cynthia Iradukunda&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cynthia Iradukunda is based in Kigali, Rwanda.
She is currently a junior Computing student at the African Leadership University (ALU) in Mauritius.
She wants to be a software engineer because it will help her solve real-world problems while also allowing her to use her coding skills.
Her coding skills include but not limited to Java, JavaScript, and attention to detail.
By contributing to the Git plugin, she hopes to help users have a smooth process using its documentation, get involved with the project, and connect with other community members.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/ciradu2204&quot;&gt;&lt;code&gt;ciradu2204&lt;/code&gt;&lt;/a&gt; on GitHub and as &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=creator%20%3D%20%20ciradu2204&quot;&gt;&lt;code&gt;ciradu2204&lt;/code&gt;&lt;/a&gt; on the &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=creator%20%3D%20%20ciradu2204&quot;&gt;Jenkins issue tracker&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;lucy-karimi&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lucy-karimi&quot; /&gt;Lucy Karimi&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021-04-contributhon-participants/lucy-karimi.jpg&quot; alt=&quot;Lucy Karimi&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lucy is based in Nairobi, Kenya.
She is a software developer with experience in mobile app development.
She is very passionate about tech and is currently involved in the SheCodeAfrica Contributhon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll recognize her contributions as &lt;a href=&quot;https://github.com/luciahroyalty101&quot;&gt;&lt;code&gt;luciahroyalty101&lt;/code&gt;&lt;/a&gt; on GitHub and as &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=creator%20%3D%20%20luciahroyalty&quot;&gt;&lt;code&gt;luciahroyalty101&lt;/code&gt;&lt;/a&gt; on the &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=creator%20%3D%20%20luciahroyalty101&quot;&gt;Jenkins issue tracker&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;about-the-contributhon-projects&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-contributhon-projects&quot; /&gt;About the Contributhon projects&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.jenkins.io/blog/2021/03/19/SheCodeAfrica-announcement/&quot;&gt;previous blog post&lt;/a&gt; for more information about She Code Africa, the Contributhon, and the plans 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://docs.google.com/document/d/1xhmEtwYIlGuuKtwn6Ek8DWyBEkPFA5q8CfWRRL7xZ9U/edit#&quot;&gt;Jenkins development tasks&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon/mentor-orgs/accepted-organizations&quot;&gt;She Code Africa Contributhon mentoring organizations&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon&quot;&gt;She Code Africa Contributhon&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shecodeafrica.org/&quot;&gt;She Code Africa&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;Conversations related to the Contributhon are happening in a &lt;a href=&quot;https://cdeliveryfdn.slack.com/archives/C01TDDNSC90&quot;&gt;Continuous Delivery Foundation slack channel&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;mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mentors&quot; /&gt;Mentors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re very grateful to the mentors from the Jenkins project that are hosting mentoring sessions, reviewing pull requests, and encouraging the mentees.
Thanks to:&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/StackScribe&quot;&gt;Meg McRoberts&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/markewaite/&quot;&gt;Mark Waite&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/kwhetstone/&quot;&gt;Kristin Whetstone&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/oleg_nenashev/&quot;&gt;Oleg Nenashev&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/ajard/&quot;&gt;Angélique Jard&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;We also thank &lt;a href=&quot;https://www.jenkins.io/blog/authors/zaycodes/&quot;&gt;Zainab Abubakar&lt;/a&gt; of She Code Africa for her efforts to facilitate the Contributhon and encourage participation.&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/2021/03/22/governance-updates/</id>
<title>Welcome Ewelina Wilkosz - new Jenkins Governance Board member</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-03-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/03/22/governance-updates/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<summary>
We would like to announce changes in the Jenkins Governance Board.
As it was announced earlier this month, Marky Jackson has decided to step down from his elected roles.
On behalf of the Jenkins community, we would like to thank Marky for all contributions and for the continued participation in the Jenkins community.
As an active Jenkins contributor and community leader, Marky helped a lot of initiatives to happen:
 Jenkins and Kubernetes ecosystem, terminology changes, GSoC and GSoD, pipeline authoring SIG and many more activities.
Thank you Marky!


The governance board has followed the interim procedure
to nominate the new governance board member until the end...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would like to announce changes in the Jenkins Governance Board.
As it was &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/A6sTbC7VwTM/m/aqhNXXKaAQAJ&quot;&gt;announced&lt;/a&gt; earlier this month, Marky Jackson has decided to step down from his elected roles.
On behalf of the Jenkins community, we would like to thank Marky for all contributions and for the continued participation in the Jenkins community.
As an active Jenkins contributor and community leader, Marky helped a lot of initiatives to happen:
 Jenkins and Kubernetes ecosystem, terminology changes, GSoC and GSoD, pipeline authoring SIG and many more activities.
Thank you Marky!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The governance board has followed the &lt;a href=&quot;https://www.jenkins.io/project/board-election-process/#interim-procedures&quot;&gt;interim procedure&lt;/a&gt;
to nominate the new governance board member until the end of the term.
The board decided to respect the results of the &lt;a href=&quot;https://www.jenkins.io/blog/2020/12/03/election-results/&quot;&gt;2020 elections&lt;/a&gt; and
to nominate &lt;a href=&quot;https://www.jenkins.io/blog/authors/ewelinawilkosz/&quot;&gt;Ewelina Wilkosz&lt;/a&gt; who received the most of the votes after the elected candidates.
She has accepted the nomination, and on March 10th the Governance Meeting has confirmed it.
We are happy to welcome Ewelina Wilkosz as a new Governance Board Member!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ewelina will join other governance Board Members:
&lt;a href=&quot;https://www.jenkins.io/blog/authors/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/uhafner&quot;&gt;Ullrich Hafner&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;, and
&lt;a href=&quot;https://www.jenkins.io/blog/authors/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt;.
The term will last until December 2022.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-ewelina-wilkosz&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-ewelina-wilkosz&quot; /&gt;About Ewelina Wilkosz&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ewelina has been a Jenkins Contributor since 2017, when she got involved in Jenkins Configuration as Code Plugin development.
Voted Most Valuable Jenkins Contributor in 2018.
She has 14 years of experience in IT, working as a CI/CD consultant since the beginning of 2017.
In that role she’s trying to solve numerous issues Jenkins users are facing daily - as developers, administrators, maintainers.&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/post-images/2021-03-governance-updates/profile-ewelina.jpg&quot; alt=&quot;Ewelina Wilkosz - new governance board member&quot; width=&quot;250px&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is Ewelina’s statement from the elections:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;As a consultant I support my customers with their Jenkins issues since the beginning of 2017.
And almost from the start it was some kind of &quot;as code&quot; approach.
The experience I gained during that time resulted in getting myself involved in the development of Configuration as Code Plugin for Jenkins.
I consider becoming a part of Jenkins Community one of the most valuable experiences in my career so far.
I appreciate how much I have learned and how welcoming the community is.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;I am not a very active contributor these days, at least when it comes to code, but what I have to offer is rather extensive experience
with Jenkins end users - from small, single instance setups to environments with hundreds of controllers run in a different way on different operating systems.
Every day I see challenges those users go through, I know what issues they are facing and which features they consider valuable or missing.
As a Jenkins Governance Board Member I can represent those users.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Thanks to my involvement in Configuration as Code Plugin development
I had a chance to deliver a number of public presentations
where I focused on the benefits of the solution and tried to make it easier for newcomers to try it.
Here are a few examples of my activities related to Jenkins Configuration as Code:
&lt;a href=&quot;https://www.praqma.com/stories/start-jenkins-config-as-code/&quot;&gt;blogpost&lt;/a&gt;,
&lt;a href=&quot;https://www.youtube.com/watch?v%3DwTzljM-EDjI&quot;&gt;cdCON presentation&lt;/a&gt;,
&lt;a href=&quot;https://open.spotify.com/episode/4beEdOeirazc65AdEARIOM?si%3DY63V4gBDT02_UBMQ3vahvg&quot;&gt;podcast recording&lt;/a&gt;.
So my focus is not only on representing users but also on educating them, and educating myself,
so I actually know what they need and why.&lt;/em&gt;&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-for-the-jenkins-governance-board&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next-for-the-jenkins-governance-board&quot; /&gt;What’s next for the Jenkins Governance Board?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In February we had the &lt;a href=&quot;https://www.jenkins.io/blog/2021/02/16/contributor-summit-online/&quot;&gt;Jenkins Contributor Summit&lt;/a&gt;.
There we discussed many topics related to the Jenkins evolution and its &lt;a href=&quot;https://www.jenkins.io/project/roadmap&quot;&gt;roadmap&lt;/a&gt;.
We identified several initiatives we would like to focus on,
including but not limited to improving user experience, contributor onboarding, and securing Jenkins delivery pipelines.
These initiatives will be a key focus until the next contributor summit we plan to organize in June.
The board will also focus on maintaining the Jenkins governance processes
(meetings, budget approvals, funding, etc.) and facilitating contributions to 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;participating-in-jenkins-governance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#participating-in-jenkins-governance&quot; /&gt;Participating in Jenkins Governance&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://www.jenkins.io/project/board/&quot;&gt;Jenkins Governance Board&lt;/a&gt; has just a representative function in the community.
The project and the community have a long history of open and inclusive governance driven by many contributors.
We invite all community members to participate in the project by joining the
&lt;a href=&quot;https://www.jenkins.io/project/governance-meeting/&quot;&gt;governance meeting&lt;/a&gt;,
participating in the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;mailing list&lt;/a&gt; conversations,
and joining &lt;a href=&quot;https://www.jenkins.io/sigs&quot;&gt;special interest groups&lt;/a&gt; driving particular topics.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.jenkins.io/participate&quot;&gt;this page&lt;/a&gt; to know more about contributing to Jenkins in general.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/03/19/SheCodeAfrica-announcement/</id>
<title>Jenkins accepted in She Code Africa Contributhon</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-03-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/03/19/SheCodeAfrica-announcement/" />
<author>
<name>markewaite</name>
</author>
<category term='events'></category>
<category term='community'></category>
<summary>
She Code Africa is a non-profit organization focused on celebrating and empowering young girls and women in technology across Africa.
They provide resources and events that help women grow and achieve their personal and career goals.
Their mentoring programs provide help and guidance as participants learn and grow in their careers.


This year, She Code Africa is organizing the She Code Africa Contributhon.
Contributhon is a boot camp where African women are paid to work with open source organizations on selected projects with dedicated mentors.
This program aims to create a more diverse, inclusive, and innovative culture within the African open source ecosystem by matching...
</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/post-images/2020-03-contributhon/she-code-africa-logo.svg&quot; alt=&quot;She Code Africa logo&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shecodeafrica.org/&quot;&gt;She Code Africa&lt;/a&gt; is a non-profit organization focused on celebrating and empowering young girls and women in technology across Africa.
They provide resources and events that help women grow and achieve their personal and career goals.
Their mentoring programs provide help and guidance as participants learn and grow in their careers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, She Code Africa is organizing the &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon&quot;&gt;She Code Africa Contributhon&lt;/a&gt;.
Contributhon is a boot camp where African women are paid to work with open source organizations on selected projects with dedicated mentors.
This program aims to create a more diverse, inclusive, and innovative culture within the African open source ecosystem by matching African women in technology with sponsor and mentor open source organizations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-in-she-code-africa-contributhon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-in-she-code-africa-contributhon&quot; /&gt;Jenkins in She Code Africa Contributhon&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 left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/logos/jenkins/jenkins.svg&quot; alt=&quot;Jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has been accepted as a &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon/mentor-orgs/accepted-organizations&quot;&gt;Contributhon mentoring organization&lt;/a&gt;.
Our &lt;a href=&quot;https://sites.google.com/shecodeafrica.org/contributhon/mentor-orgs/accepted-organizations/jenkins&quot;&gt;project idea&lt;/a&gt; will introduce participants to Jenkins and plugin development as they create Pipeline examples and create Pipeline help for Jenkins Pipeline plugins.
Participants will learn more about Jenkins Pipeline and will submit plugin pull requests with examples and online help.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/&quot;&gt;Pipeline Steps Reference&lt;/a&gt; and Pipeline online help often receive &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1nA8xVOkyKmZ8oTYSLdwjborT0w-BpBNNZT0nxR9deZ8/edit#gid=1087292709&quot;&gt;feedback&lt;/a&gt; that more examples are needed, that step return values need to be described, and that arguments need more description of their purpose, allowed values, and expected results.
Most plugin maintainers do not provide detailed documentation of the pipeline steps, or the arguments to those pipeline steps.
This project will improve the documentation of pipeline steps and their arguments while introducing Jenkins Pipeline, Jenkins plugin development, Jenkins documentation as code, and the concepts of GitHub forks and pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve identified &lt;a href=&quot;https://docs.google.com/document/d/1xhmEtwYIlGuuKtwn6Ek8DWyBEkPFA5q8CfWRRL7xZ9U/edit#&quot;&gt;development tasks&lt;/a&gt; that up to three Contributhon participants will complete during April.
The tasks will introduce the participants to Jenkins plugin development.
They will experiment with plugin changes in Jenkins and submit pull requests to provide Pipeline examples and help.
They will meet twice a week with Jenkins mentors, Kristin Whetstone, Mark Waite, and Meg McRoberts to review their progress, provide coaching, and help with issues.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;data-driven-choices&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#data-driven-choices&quot; /&gt;Data driven choices&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve been collecting &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1nA8xVOkyKmZ8oTYSLdwjborT0w-BpBNNZT0nxR9deZ8/edit#gid=1087292709&quot;&gt;Jenkins documentation feedback&lt;/a&gt; since 2017.
Now we’re using that feedback to prioritize the plugins to improve as part of this project.
The top 10 Pipeline plugins that have received the most feedback 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/doc/pipeline/steps/pipeline-build-step/&quot;&gt;Build step&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-scm-step/&quot;&gt;SCM step&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/git/&quot;&gt;Git step&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/pipeline-input-step/&quot;&gt;Input step&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-durable-task-step/&quot;&gt;Nodes and processes steps&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/ws-cleanup/&quot;&gt;Workspace cleanup step&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/&quot;&gt;Basic Pipeline steps&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/slack/&quot;&gt;Slack notification steps&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/http_request/&quot;&gt;HTTP request step&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/email-ext/&quot;&gt;Email extension steps&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;what-about-my-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-about-my-plugin&quot; /&gt;What about my plugin?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are a plugin maintainer and would like help to add examples and online help for the Pipeline steps in your plugin, let us know in the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkins/docs:matrix.org&quot;&gt;jenkinsci/docs gitter channel&lt;/a&gt;.
We’ll consider including additional plugins as we better understand the development pace for She Code Africa participants.&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/2021/03/17/gsoc2021-announcement/</id>
<title>Jenkins accepted in Google Summer Of Code 2021!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-03-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/03/17/gsoc2021-announcement/" />
<author>
<name>marckk</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2021'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
On behalf of the Jenkins GSoC org team,
I am happy to announce that this year, for the first time, the Jenkins projects will be participating in
Google Summer of Code 2021
as part of the
Continuous Delivery Foundation (CDF) GSoC organization.


We&#8217;re very excited to have the Jenkins project participate in GSoC as part the CDF mentoring organisation along with
fellow CDF projects such as Ortelius, Screwdriver, Spinnaker, and Tekton. We believe that being part of the CDF
GSoC org will create an environment for students with even more mentoring channels, potential cross-fertilization of ideas,
and an even greater community of DevOps practitioners to join!





What&#8217;s next?
GSoC is...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the Jenkins GSoC org team,
I am happy to announce that this year, for the first time, the Jenkins projects will be participating in
&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code 2021&lt;/a&gt;
as part of the
&lt;a href=&quot;https://summerofcode.withgoogle.com/organizations/5542063241691136/&quot;&gt;Continuous Delivery Foundation (CDF) GSoC organization&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re very excited to have the Jenkins project participate in GSoC as part the CDF mentoring organisation along with
fellow CDF projects such as Ortelius, Screwdriver, Spinnaker, and Tekton. We believe that being part of the CDF
GSoC org will create an environment for students with even more mentoring channels, potential cross-fertilization of ideas,
and an even greater community of DevOps practitioners to join!&lt;/p&gt;
&lt;/div&gt;
&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/gsoc/2021/cdf_gsoc_org.jpeg&quot; alt=&quot;CDF GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;What’s next?&lt;/strong&gt;
GSoC is officially announced, and please expect more students to contact projects in our
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc#contacts&quot;&gt;Gitter channels and mailing lists&lt;/a&gt;.
Many communications will also happen in SIG and sub-project channels.
Also, please join the &lt;code&gt;&lt;mark&gt;gsoc&lt;/mark&gt; channel on the &lt;a href=&quot;https://cdeliveryfdn.slack.com/join/shared_invite/enQtODM2NDI1NDc0MzIxLTA1MDcxMzUyMGU2NWVlNmQwN2M1N2M4MWJjOWFkM2UzMDY0OWNkNjAzNzM0NzVkNjQ5M2NkMmY2MTRkMWY4MWY&amp;lt;/mark&amp;gt;/&quot;&gt;CDF Slack&lt;/a&gt;.
We will be working hard in order to help students to find interesting projects, to explore the area,
and to prepare their project proposals before the deadline on April 13th.
Then we will process the applications, select projects and assign mentor teams.&lt;/code&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All information about the Jenkins GSoC is available on its &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;sub-project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;i-am-a-student-how-do-i-apply&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-am-a-student-how-do-i-apply&quot; /&gt;I am a student. How do I apply?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors&quot;&gt;Information for students&lt;/a&gt; page for full application guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage interested students to reach out to the Jenkins community early and to start exploring project ideas.
All project ideas have chats and mailing lists referenced on their pages.
We will be also organizing office hours for students,
and you can use these meetings to meet org admins and mentors and to ask questions.
Also, join our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;Gitter channel&lt;/a&gt;
to receive information about such incoming events in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The application period starts on March 29th, but you can prepare now!
Use the time before the application period to discuss and improve your project proposals.
We also recommend that you become familiar with Jenkins and start exploring your proposal areas.
Project ideas include quick-start guidelines and reference newbie-friendly issues
which may help with initial study.
If you do not see anything interesting,
you can &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;propose your own project idea&lt;/a&gt;
or check out ideas proposed by &lt;a href=&quot;https://github.com/cdfoundation/soc&quot;&gt;other CDF organizations&lt;/a&gt;
participating in GSoC.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;i-want-to-be-a-mentor-is-it-too-late&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-want-to-be-a-mentor-is-it-too-late&quot; /&gt;I want to be a mentor. Is it too late?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s not!
We are looking for more project ideas and for Jenkins contributors/users
who are passionate about Jenkins and want to mentor students.
No hardcore experience required, mentors can study the project internals together with students and technical advisors.
We are especially interested in ideas beyond the Java stack, and in ideas focusing new technologies and areas
(e.g. Kubernetes, IoT, Python, Go, whatever).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can either propose a new project idea or join an existing one.
See the &lt;a href=&quot;https://www.jenkins.io/blog/2020/12/16/call-for-mentors/&quot;&gt;Call for Mentors post&lt;/a&gt;
and &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors&quot;&gt;Information for mentors&lt;/a&gt; for details.
If you want to propose a new project,
please do so as soon as possible so that students have time to explore them and to prepare their proposals.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year mentorship does &lt;strong&gt;NOT&lt;/strong&gt; require strong expertise in Jenkins development.
The objective is to guide students and to get involved into the Jenkins community.
GSoC org admins will help to find advisers if special expertise is required.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;testimonials-from-former-jenkins-gsoc-participants-️&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testimonials-from-former-jenkins-gsoc-participants-️&quot; /&gt;Testimonials from former Jenkins GSoC participants ❤️&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;I participated in Google Summer of Code 2020 in cooperation with the Jenkins organization
and I work on a project called Windows Service Wrapper, which allows running Jenkins as a service on a Windows machine.
GSoC was the most wonderful and the most valuable experience I gained during my student life.
The whole journey was full of experiences and Jenkins mentors always were there for us.
I experienced a huge development of my skills while I was working on the project.
I had many meetings, knowledge sharing sessions, and one pair-coding session with my mentors.
One of the best things that I learned is the open-source community and open source mentality.
It is not only about taking, but also about giving.
Today I am maintaining an open-source project which is a simple programming language for kids
which allows them to code in their native language, which will help to learn coding to students in rural areas of my country.
Finally, Jenkins is a wonderful family and they always were there for us in all the ups and downs.
I am proud to be a part of the Jenkins community.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Buddhika Chathuranga, GSoC 2020 student, Support for YAML Configuration in Windows Service Wrapper&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;My GSoC journey in the Jenkins community starts by a draft proposal full of comments from mentors and ends by two plugins with hundreds of installations.
Along with the daily coding review, the weekly meeting and the growth of the project,
I increased my skills on programming and became a much more eligible engineer.
What is more, the support from the whole Jenkins community leads me to a broader career path.
I learned how to maintain a project, how to communicate with users and other developers on GitHub.
Most importantly, the Jenkins community teaches me the principles of the open source world
and welcomes me to the open source world with all their kind help.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kezhi Xiong, GSoC 2020 students, GitHub Checks API project&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;I worked as a Google Summer of Code student with the Jenkins project during the summer of 2019.
The project provided me with an excellent opportunity to contribute to the world’s most popular automation server,
learn about building performant and reliable applications, and interact with awesome people around the globe.
Jenkins&#39; ever helpful and extremely knowledgeable community made working on my project a real treat.
I even got a chance to present my project at DevOps World in Lisbon!
If you’re deciding which organization to work for this year, choose the Jenkins project — you can’t have a better GSoC experience than this!&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Abhyudaya Sharma, GSoC 2019 student, Role Strategy Performance Improvements&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;I participated in Google Summer of Code 2018 with Jenkins as a student developer.
Working for Jenkins in GSoC 2018 was one of the best experiences I have ever had.
During 3 months of summer, I learned a lot of new things when working on the open-source project with Jenkins.
Another best thing about Jenkins is the people, I received a lot of support from my mentors
and other developers from the Jenkins community when working on my project.
After GSoC, I also had a chance to go to the Jenkins World Conference in San Francisco
to meet and connect with my mentors and other people in the Jenkins community.
Overall, GSoC with Jenkins was a great experience and
I highly recommend Jenkins as a great community to kickstart your open source journey.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pham Vu Tuan, GSoC 2018 student, Remoting over Apache Kafka project&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;important-dates-for-gsoc-2021&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates-for-gsoc-2021&quot; /&gt;Important dates for GSoC 2021&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;Apr 13 - deadline for student applications&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;May 17 - accepted projects announced, teams start community bonding and coding&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aug 16 - coding period ends&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aug 31 - Results announced&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://summerofcode.withgoogle.com/how-it-works/#timeline&quot;&gt;GSoC Timeline&lt;/a&gt; for more info.&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/2021/03/15/update-center-certificate-rotation/</id>
<title>Update-Center certificate rotation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-03-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/03/15/update-center-certificate-rotation/" />
<author>
<name>olblak</name>
</author>
<category term='announcement'></category>
<category term='update-center'></category>
<summary>
On the 29th of March 2021, we’ll rotate the Jenkins update center certificate.
The existing certificate expires in April 2021.
When the new certificate is installed on March 29, 2021, Jenkins versions older than 2.178 (April 2018), won’t be able to communicate with the default and experimental update centers.
Instances using alternative update centers (self-hosted or vendor-provided) will not be affected by this change.
Regarding plugins update, the update-center usually supports up to one-year-old Jenkins core versions with 2.204 being the oldest version supported.


If you don&#8217;t update regularly, please review the Jenkins security advisories and use this change as your motivation to update to...
</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/post-images/2021-03-01-update-center-certificate-rotation/certificate-rotation-opengraph.png&quot; alt=&quot;Jenkins update center certificate rotation&quot; height=&quot;270&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the 29th of March 2021, we’ll rotate the Jenkins update center certificate.
The existing certificate expires in April 2021.
When the new certificate is installed on March 29, 2021, Jenkins versions older than 2.178 (April 2018), won’t be able to communicate with the default and experimental update centers.
Instances using alternative update centers (self-hosted or vendor-provided) will not be affected by this change.
Regarding plugins update, the update-center usually supports up to one-year-old Jenkins core versions with &lt;a href=&quot;https://updates.jenkins.io/2.204/&quot;&gt;2.204&lt;/a&gt; being the oldest version supported.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you don’t update regularly, please review the Jenkins &lt;a href=&quot;https://www.jenkins.io/security/advisories/&quot;&gt;security advisories&lt;/a&gt; and use this change as your motivation to update to a more recent Jenkins version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Who&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins users running Jenkins versions older than 2.178 will not see any further updates after the update center certificate change March 29, 2021.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins developers will not see plugin updates when they use &lt;code&gt;mvn hpi:run&lt;/code&gt; to test their plugin if the Jenkins version is older than 2.178.
Plugin developers can update their minimum Jenkins version to a newer Jenkins version.
Refer to the guidelines in &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-development/choosing-jenkins-baseline/&quot;&gt;&quot;Choosing a Jenkins version&quot;&lt;/a&gt; when selecting the new minimum Jenkins version.
Plugin developers may also be able to test with a newer Jenkins version using arguments like &lt;code&gt;mvn -Djenkins.version=2.249.1 hpi:run&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins users running versions 2.178 or newer are &lt;strong&gt;not affected&lt;/strong&gt; by this change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;What&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins uses the &lt;a href=&quot;https://updates.jenkins.io/&quot;&gt;update center&lt;/a&gt; to identify updates to core and to plugins.
The service signs its metadata with a certificate that is cross-signed by a root certificate.
Jenkins is bundled with the root certificate so it can confirm the authenticity of update center data.
When updates are available, an alert is shown to Jenkins users that reminds them to update.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The root certificate bundled in Jenkins was created in April 2011 and will expire in April 2021.
We prepared for this rotation in April 2018 when we bundled the new root certificate with Jenkins core releases.
It’s now time to use the new root certificate with a new update center certificate.
The new root certificate will expire in April 2028.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can follow the work for this certificate rotation in this ticket &lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-2902&quot;&gt;INFRA-2902&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So again, keep your instance updated and everything should be fine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you in 2028,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Various Links:&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://issues.jenkins.io/browse/INFRA-2902&quot;&gt;INFRA-2902&lt;/a&gt; - Rotate the update center certificate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-2732&quot;&gt;INFRA-2732&lt;/a&gt; - Annual certificate update&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-1502&quot;&gt;INFRA-1502&lt;/a&gt; - Add new root certificate (2018)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/update-center2/tree/master/resources/certificates&quot;&gt;jenkins-infra/update-center2&lt;/a&gt; - Jenkins update center certificates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://updates.jenkins.io&quot;&gt;updates.jenkins.io&lt;/a&gt; - Jenkins update center&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisories/&quot;&gt;advisories&lt;/a&gt; - Jenkins security advisories&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/02/17/cfp-cdcon/</id>
<title>cdCon 2021 - Call for Jenkins Proposals</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-02-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/02/17/cfp-cdcon/" />
<author>
<name>cdfoundation</name>
</author>
<category term='cdcon'></category>
<category term='cfp'></category>
<category term='cicd'></category>
<category term='continuous delivery'></category>
<summary>
Hear ye! Hear ye! Jenkins Community,


cdCon 2021 (the Continuous Delivery Foundation&#8217;s annual flagship event) is happening June 23-24 and its call for papers is open!


This is your chance to share what you&#8217;ve been doing with Jenkins.
Are you building something cool?
Using it to solve real-world problems?
Are you making things fast?
Secure?
Or maybe you&#8217;re a contributor and want to share what&#8217;s new.
In all cases, we want to hear from you!


Submit your talk for cdCon 2021 to be part of the conversation driving the future of software delivery for technology teams, enterprise leadership, and open-source communities.


Submission Deadlines



Early-Bird Deadline

Friday, February 19 by 11:59 PM PST

Final...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hear ye! Hear ye! Jenkins Community,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://events.linuxfoundation.org/cdcon/&quot;&gt;cdCon 2021&lt;/a&gt; (the Continuous Delivery Foundation’s annual flagship event) is happening June 23-24 and its call for papers is open!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is your chance to share what you’ve been doing with Jenkins.
Are you building something cool?
Using it to solve real-world problems?
Are you making things fast?
Secure?
Or maybe you’re a contributor and want to share what’s new.
In all cases, we want to hear from you!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Submit your talk for cdCon 2021 to be part of the conversation driving the future of software delivery for technology teams, enterprise leadership, and open-source communities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;submission-deadlines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#submission-deadlines&quot; /&gt;Submission Deadlines&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;Early-Bird Deadline&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Friday, February 19 by 11:59 PM PST&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Final Deadline&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Friday, March 5 at 11:59 PM PST&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;topics&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#topics&quot; /&gt;Topics&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are the suggested tracks:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Continuous Delivery Ecosystem&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;This track spans the entire Continuous Delivery ecosystem, from workflow orchestration, configuration management, testing, security, release automation, deployment strategies, developer experience, and more.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Advanced Delivery Techniques&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;For talks on the very cutting edge of continuous delivery and emerging technology, for example, progressive delivery, observability, and MLOps.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitOps &amp;amp; Cloud-Native CD&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Submit to this track for talks related to continuous delivery involving containers, Kubernetes, and cloud*native technologies. This includes GitOps, cloud-native CD pipelines, chatops, best practices, etc.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Continuous Delivery in Action&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;This track is for showcasing real-world continuous delivery addressing challenges in specific domains e.g. fintech, embedded, healthcare, retail, etc. Talks may cover topics such as governance, compliance, security, etc.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Leadership Track&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Talks for leaders and decision-makers on topics such as measuring DevOps, build vs buy, scaling, culture, security, FinOps, and developer productivity.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Community Track&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;There is more to open source than code contributions. This track covers topics such as growing open source project communities, diversity &amp;amp; inclusion, measuring community health, project roadmaps, and any other topic around sustaining open source and open source communities.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Singular project focus and/or interoperability between:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins X&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ortelius&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spinnaker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Screwdriver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tekton&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Other – e.g. Keptn, Flagger, Argo, Flux&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;View all tracks and read &lt;a href=&quot;https://events.linuxfoundation.org/cdcon/program/cfp/&quot;&gt;CFP details&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We look forward to reading your proposal!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://events.linuxfoundation.org/cdcon/program/cfp/&quot;&gt;Submit it here&lt;/a&gt;&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/2021/cdcon2021jenkinscfp.png&quot; alt=&quot;cdcon2021jenkinscfp&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/02/16/contributor-summit-online/</id>
<title>Jenkins Contributor Summit Online Feb 23-25</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-02-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/02/16/contributor-summit-online/" />
<author>
<name>markewaite</name>
</author>
<category term='community'></category>
<category term='events'></category>
<summary>
The Jenkins Contributor Summit brings together current and future contributors to the Jenkins project.
We&#8217;re hosting an online summit this year to encourage contributors from around the world to meet, discuss, and plan for the future.


The Contributor Summit will be Tuesday, February 23rd 2021 through Thursday, February 25, 2021.
The summit brings together community members to learn, meet, and help shape the future of Jenkins.
In the Jenkins community we value all types and sizes of contributions and love to welcome new participants.





Format


The online format allows greater flexibility for meeting times and topics.
Contributors will meet to discuss specific topics in smaller groups at...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor Summit brings together current and future contributors to the Jenkins project.
We’re hosting an online summit this year to encourage contributors from around the world to meet, discuss, and plan for the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Contributor Summit will be &lt;strong&gt;Tuesday, February 23rd 2021 through Thursday, February 25, 2021&lt;/strong&gt;.
The summit brings together community members to learn, meet, and help shape the future of Jenkins.
In the Jenkins community we value all types and sizes of contributions and love to welcome new participants.&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;a class=&quot;image&quot; href=&quot;https://docs.google.com/forms/d/e/1FAIpQLSdTABEUvRlXdMptACYNFu5tP1aNrhpzUZ60uQEzGH-qTRDvbg/viewform&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/register-button.png&quot; alt=&quot;register button&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;format&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#format&quot; /&gt;Format&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The online format allows greater flexibility for meeting times and topics.
Contributors will meet to discuss specific topics in smaller groups at times that are convenient for those in the meeting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;opening-session&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#opening-session&quot; /&gt;Opening session&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The opening session will start Tuesday, February 23, 2021 at 15:00 UTC.
After an initial welcome and overview, we’ll hear from leaders in the Jenkins project as they share the results from the previous 12 months and outline ideas for the next 12 months.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2021/2021-02-16-contributor-summit.png&quot; alt=&quot;2021 02 16 contributor summit&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Security - Daniel Beck&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure - Olivier Vernin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release - Tim Jacomb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User experience - Félix Queiruga&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chinese localization - 赵晓杰(Rick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuration as code - Tim Jacomb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Google Summer of Code - Kara de la Marck&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation - Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events and Advocacy - Alyssa Tong&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cloud Native - Kara de la Marck&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Platforms - Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After those presentations, we’ll create &quot;breakout rooms&quot; in the online meeting that will allow those interested in specific tracks to meet, identify preferred times for their tracks, and prepare draft agendas for their tracks.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tracks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tracks&quot; /&gt;Tracks&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Smaller sessions (&quot;tracks&quot;) will be run in the 48 hour period between the opening session and the closing session.
These smaller sessions will be focused on specific topics.
A track leader will organize the track meeting, facilitate discussions in the track meeting, and present a summary of the track results in the closing session.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;closing-session&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#closing-session&quot; /&gt;Closing session&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The opening session will start Thursday, February 25, 2021 at 15:00 UTC.
After an initial welcome and overview, we’ll hear from track leaders as they share the results from their track meetings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll identify items that should be added to the &lt;a href=&quot;https://www.jenkins.io/project/roadmap/&quot;&gt;Jenkins roadmap&lt;/a&gt;, items that should be further investigated by &lt;a href=&quot;https://www.jenkins.io/sigs/&quot;&gt;special interest groups&lt;/a&gt;, and items that need further discussion elsewhere.&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/2021/02/08/docker-base-os-upgrade/</id>
<title>Docker image updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-02-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/02/08/docker-base-os-upgrade/" />
<author>
<name>markewaite</name>
</author>
<category term='announcement'></category>
<category term='docker'></category>
<category term='platform-sig'></category>
<summary>
Beginning with Jenkins 2.279 and Jenkins 2.263.4, the Jenkins project is upgrading the base operating system and Java version used in the jenkins/jenkins:latest and jenkins/jenkins:lts images.
The update replaces OpenJDK 8u242 with AdoptOpenJDK 8u282 and replaces Debian 9 ("Stretch") with Debian 10 ("Buster").





Why?


We&#8217;re changing the base image so that we have a better supported operating system and a more current Java release for Jenkins controllers.


Better supported operating system

The Docker images provided by the Jenkins project rely on the operating system security processes of the operating system provider.


Our Docker images have used Debian 9 ("Stretch") for multiple years.
Debian 9 security updates have...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning with Jenkins 2.279 and Jenkins 2.263.4, the Jenkins project is upgrading the base operating system and Java version used in the &lt;code&gt;jenkins/jenkins:latest&lt;/code&gt; and &lt;code&gt;jenkins/jenkins:lts&lt;/code&gt; images.
The update replaces OpenJDK 8u242 with AdoptOpenJDK 8u282 and replaces Debian 9 (&lt;a href=&quot;https://www.debian.org/releases/stretch/&quot;&gt;&quot;Stretch&quot;&lt;/a&gt;) with Debian 10 (&lt;a href=&quot;https://www.debian.org/releases/buster/&quot;&gt;&quot;Buster&quot;&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/docker/dockerJenkins.png&quot; alt=&quot;Jenkins and Docker&quot; height=&quot;224&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why&quot; /&gt;Why?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re changing the base image so that we have a better supported operating system and a more current Java release for Jenkins controllers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;better-supported-operating-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#better-supported-operating-system&quot; /&gt;Better supported operating system&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Docker images provided by the Jenkins project rely on the operating system security processes of the operating system provider.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our Docker images have used Debian 9 (&lt;a href=&quot;https://www.debian.org/releases/stretch/&quot;&gt;&quot;Stretch&quot;&lt;/a&gt;) for multiple years.
Debian 9 security updates have been &lt;a href=&quot;https://www.debian.org/releases/stretch/&quot;&gt;discontinued as of July 6, 2020&lt;/a&gt;.
Debian 9 Long Term Support security updates will be discontinued at the &lt;a href=&quot;https://www.debian.org/releases/stretch/&quot;&gt;end of June 2022&lt;/a&gt;.
The upgrade to Debian 10 keeps us on an operating system maintained by the operating system security team.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;more-current-java-release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-current-java-release&quot; /&gt;More current Java release&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Debian 9 Docker images were based on the &lt;a href=&quot;https://hub.docker.com/layers/openjdk/library/openjdk/8-jdk-stretch/images/sha256-6896e96ce729fd54da25b8d831400773efeef39780c65bffb2d64c1412189455&quot;&gt;&lt;code&gt;openjdk:8-jdk-stretch&lt;/code&gt; Docker image&lt;/a&gt;.
The last update to that image was one year ago with the release of JDK 8u242.
We need a maintained Docker base image that keeps pace with JDK releases and operating system updates so that the controller is running the most recent Java updates and most recent operating system updates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other Jenkins controller images have already switched from using &lt;code&gt;openjdk&lt;/code&gt; base images to instead use base images provided by &lt;a href=&quot;https://projects.eclipse.org/projects/adoptium&quot;&gt;Eclipse Adoptium&lt;/a&gt;.
&lt;a href=&quot;https://projects.eclipse.org/projects/adoptium&quot;&gt;Eclipse Adoptium&lt;/a&gt; is the Eclipse project formed when &lt;a href=&quot;https://blog.adoptopenjdk.net/2020/06/adoptopenjdk-to-join-the-eclipse-foundation/&quot;&gt;AdoptOpenJDK joined the Eclipse Foundation&lt;/a&gt;.
This change adapts the &lt;code&gt;jenkins/jenkins:latest&lt;/code&gt; and &lt;code&gt;jenkins/jenkins:lts&lt;/code&gt; images to use the Adoptium JDK images in the same pattern as is already used for the Jenkins JDK 11 Docker images like &lt;code&gt;jenkins/jenkins:lts-jdk11&lt;/code&gt;.
The Jenkins Platform SIG has enjoyed very good results in our interactions with the Eclipse Adoptium project.
We look forward to continuing our collaboration with them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks a lot to &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://github.com/james-crowley&quot;&gt;Jim Crowley&lt;/a&gt; for the image build restructuring groundwork that made the image upgrade possible!
Also thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev/&quot;&gt;Oleg Nenashev&lt;/a&gt; and other contributors for their reviews and testing.&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;packaging-changes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#packaging-changes&quot; /&gt;Packaging changes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Docker image based on Debian 10 (&quot;Buster&quot;) includes some different packages than Debian 9 (&quot;Stretch&quot;).
Some packages have been removed because they are no longer supported by their communities.
Some packages have been removed due to infrequent and decreasing use.
Users of the Jenkins Docker images may need to extend their definition of their Docker image to include packages that are no longer included in the base image.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;scm-packages-removed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#scm-packages-removed&quot; /&gt;SCM packages removed&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following source control management packages are no longer included in the Jenkins controller images for &lt;code&gt;jenkins/jenkins:latest&lt;/code&gt; or for &lt;code&gt;jenkins/jenkins:lts&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;bzr&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mercurial&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;subversion&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-packages-removed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-packages-removed&quot; /&gt;Other packages removed&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additional packages that are no longer included in the Jenkins controller images include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;bzip2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mime-support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;python (the Python project stopped supporting Python 2 January 1, 2020)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;xz-utils&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A detailed list of the exact package changes is available in the &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/1070&quot;&gt;pull request&lt;/a&gt;.&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;upgrade-and-compatibility-notes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-and-compatibility-notes&quot; /&gt;Upgrade and compatibility notes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins controller images are designed to be extended to meet user needs.
Custom Jenkins controller images can be created from the base images and are designed to allow additional Jenkins plugins and additional operating system packages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, the &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/docker/&quot;&gt;Installing Docker&lt;/a&gt; instructions illustrate a technique to install the &lt;a href=&quot;https://plugins.jenkins.io/blueocean&quot;&gt;Blue Ocean plugins&lt;/a&gt; and some operating system packages in a custom Docker image.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;docker-image-with-subversion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-image-with-subversion&quot; /&gt;Docker image with Subversion&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following Docker image definition installs the most recent &lt;a href=&quot;https://www.jenkins.io/download/lts/&quot;&gt;Jenkins Long Term Support&lt;/a&gt; release with the &lt;a href=&quot;https://plugins.jenkins.io/subversion&quot;&gt;subversion plugin&lt;/a&gt; and the operating system &lt;code&gt;subversion&lt;/code&gt; 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&gt;FROM jenkins/jenkins:lts
USER root
RUN apt-get update &amp;amp;&amp;amp; \
    apt-get install -y --no-install-recommends subversion
USER jenkins
RUN jenkins-plugin-cli --plugins subversion:2.14.0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build a new docker image from this Dockerfile and assign the image a meaningful name, e.g. &quot;myjenkins-subversion:1.1&quot;:&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;docker build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; myjenkins-subversion:1.1 .&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;docker-image-with-mercurial&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-image-with-mercurial&quot; /&gt;Docker image with Mercurial&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following Docker image definition installs the most recent &lt;a href=&quot;https://www.jenkins.io/download/weekly/&quot;&gt;Jenkins Weekly&lt;/a&gt; release with the &lt;a href=&quot;https://plugins.jenkins.io/mercurial&quot;&gt;mercurial plugin&lt;/a&gt; and the operating system &lt;code&gt;hg&lt;/code&gt; 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&gt;FROM jenkins/jenkins:latest
USER root
RUN apt-get update &amp;amp;&amp;amp; \
    apt-get install -y --no-install-recommends mercurial
USER jenkins
RUN jenkins-plugin-cli --plugins mercurial:2.12&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build a new docker image from this Dockerfile and assign the image a meaningful name, e.g. &quot;myjenkins-mercurial:1.1&quot;:&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;docker build &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; myjenkins-mercurial:1.1 .&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;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;We will continue Docker image updates as new Java versions are released.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested in new features in Jenkins Docker packaging,
stay tuned for future announcements!
There are multiple ongoing initiatives which you can find on the &lt;a href=&quot;https://www.jenkins.io/project/roadmap/&quot;&gt;public Jenkins roadmap&lt;/a&gt;.
Some stories:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Switching to AdoptOpenJDK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;General availability of Windows images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for more platforms (AArch64, IBM s390x, PowerPC).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Introducing multi-platform Docker images.&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 interested in any of these projects and would like to contribute,
please reach out to the &lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Platform Special Interest Group&lt;/a&gt; which coordinates initiatives related to Jenkins in Docker.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2021/01/26/new-ebook-build-deploy-and-automate-great-stuff-with-jenkins/</id>
<title>New eBook: Build, deploy, and automate great stuff with Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-01-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/01/26/new-ebook-build-deploy-and-automate-great-stuff-with-jenkins/" />
<author>
<name>alyssat</name>
</author>
<category term='jenkins'></category>
<category term='jenkinsistheway'></category>
<category term='casestudies'></category>
<category term='Jenkinsuserstories'></category>
<summary>
In April of last year, we launched a new Jenkins community website called JenkinsIsTheWay.
The Jenkins Is The Way site has collected the experiences of Jenkins users around the world as they develop software and create solutions.
They are charting new paths, discovering new opportunities, and overcoming challenges.


That&#8217;s what makes Jenkins Is The Way tick.
Engineers in the Netherlands might have already met challenges faced by developers in India.
Solutions uncovered by DevOps teams in Spain may benefit those just starting in the USA.
Interns in Bogota may develop pipeline solutions that can be integrated into workflows used across the globe in Tokyo.
Or vice versa!


No...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right center&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://stories.jenkins.io/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/jenkins-is-the-way.png&quot; alt=&quot;Jenkins Is The Way&quot; height=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In April of last year, we launched a new Jenkins community website called &lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;JenkinsIsTheWay&lt;/a&gt;.
The Jenkins Is The Way site has collected the experiences of Jenkins users around the world as they develop software and create solutions.
They are charting new paths, discovering new opportunities, and overcoming challenges.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s what makes Jenkins Is The Way tick.
Engineers in the Netherlands might have already met challenges faced by developers in India.
Solutions uncovered by DevOps teams in Spain may benefit those just starting in the USA.
Interns in Bogota may develop pipeline solutions that can be integrated into workflows used across the globe in Tokyo.
Or vice versa!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No matter where you are, regardless of whether your solution is regional or global in nature, Jenkins Is The Way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;telling-your-stories-in-a-new-ebook&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#telling-your-stories-in-a-new-ebook&quot; /&gt;Telling your stories in a new eBook&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To date, we have nearly 60 user stories, a handful of case studies, and some new user testimonial videos from the Jenkins community.
You shared how using Jenkins has helped make your builds faster, your pipelines more secure, and your developers and software engineers happier.
In essence, Jenkins Is The Way showcases how Jenkins has made it a whole lot easier to do the work you do every day.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve now gathered some of those stories in our first &lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/01/Jenkins-User-Story-Industry-focused-ebook-2020.pdf&quot;&gt;Jenkins Is The Way ebook&lt;/a&gt;, covering various challenges and solutions from six different industries: Aerospace, Education, Finance, Insurance, Retail, and Travel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/01/Jenkins-User-Story-Industry-focused-ebook-2020.pdf&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/ebook-cover.png&quot; alt=&quot;ebook cover&quot; height=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll read about innovations from &lt;strong&gt;KP Labs&lt;/strong&gt; in Poland and &lt;strong&gt;Preply&lt;/strong&gt; in Ukraine.
You’ll discover how automation helped &lt;strong&gt;Avoris&lt;/strong&gt; out of Spain &amp;amp; Portugal and &lt;strong&gt;Tymit&lt;/strong&gt; in the United Kingdom.
And you’ll be inspired by what China’s &lt;strong&gt;JD.com&lt;/strong&gt; and &lt;strong&gt;Topdanmark&lt;/strong&gt; in Denmark were able to achieve after tapping into the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This curated collection of stories illustrates how Jenkins community members build next-generation DevOps and CI/CD platforms as the backbone for software innovation across companies of all sizes.
They highlight the innovation, ingenuity, and keen ability to adapt Jenkins plugins to handle everyday business issues, everywhere.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The technology landscape is full of solutions perfected to tackle all aspects of software development.
But time and time again, developers keep coming back to Jenkins.
Your engineering time and resources are too valuable to be spent re-inventing the wheel or handling manual testing and deployment cycles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins&#39; vast array of plugins and pre-built solutions will have you automating more than you ever imagined.
So, get inspired to build great stuff with Jenkins.
And, please &lt;a href=&quot;https://stories.jenkins.io/wp-content/uploads/2021/01/Jenkins-User-Story-Industry-focused-ebook-2020.pdf&quot;&gt;share this ebook&lt;/a&gt; with your network.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;share-your-story&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#share-your-story&quot; /&gt;Share your story!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And when you’re ready to tell your story, we’re prepared to help you share it.
&lt;a href=&quot;https://www.surveymonkey.com/r/JenkinsIsTheWay&quot;&gt;Fill out the short questionnaire&lt;/a&gt;, and we’ll send you our Jenkins Is The Way T-shirt as a thank you!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Special thanks to &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;&lt;strong&gt;CloudBees, Inc.&lt;/strong&gt;&lt;/a&gt; for sponsoring this program.&lt;/em&gt;&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/2021/01/12/new-year-report/</id>
<title>2020 A Year Like No Other</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2021-01-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2021/01/12/new-year-report/" />
<category term='community'></category>
<category term='new-year-blogpost'></category>
<category term='governance'></category>
<summary>
The Jenkins community congratulates all users and contributors with the New Year!
Let’s take a look at some changes this year.
We would like to thank all awesome Jenkins users and contributors who have been with us during this year.





Highlights


Some of the key highlights:




Hundreds of first-timer contributors joined the community


Major UI/UX improvements in the Jenkins core, including the landing page, plugin manager, dark theme, and read-only configurations support


Outreach programs like Google Summer of Code (7 projects), Google Season of Docs, UI/UX hackfest, etc.


Public roadmap for the project


Terminology changes in the project, new Code of Conduct


Technical debt cleanup: XStream unforking, Acegi Security replacement,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins community congratulates all users and contributors with the New Year!
Let’s take a look at some changes this year.
We would like to thank all awesome Jenkins users and contributors who have been with us during this year.&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/2017-12-31-new-year/card.png&quot; alt=&quot;NewYear&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#highlights&quot; /&gt;Highlights&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of the key highlights:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hundreds of first-timer contributors joined the community&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Major UI/UX improvements in the Jenkins core, including the landing page, plugin manager, dark theme, and read-only configurations support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Outreach programs like Google Summer of Code (7 projects), Google Season of Docs, UI/UX hackfest, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Public roadmap for the project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Terminology changes in the project, new Code of Conduct&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Technical debt cleanup: XStream unforking, Acegi Security replacement, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continued evolution of the plugin ecosystem, especially in the area of Cloud Native solutions and tool integrations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continued documentation cleanup, great progress with plugin documentation migration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Graduation in the Continuous Delivery Foundation&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;jenkins-user-interface-and-user-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-user-interface-and-user-experience&quot; /&gt;Jenkins User Interface and User Experience&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year there were many activities around Jenkins user experience and long-anticipated user interface changes.
This is a coordinated effort being led by the User Experience SIG, and by many contributors to the project.
Key project highlights:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Look &amp;amp; Feel updates of the Jenkins Web UI, including styling rework, new typography and layouts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Major rework of plugin management UI/UX&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dark theme for Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accessibility improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for read-only configuration pages&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In May we also organized a &lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/&quot;&gt;Jenkins UI/UX hackfest&lt;/a&gt; where we worked on some key stories improving user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-security&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-security&quot; /&gt;Jenkins security&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2020 the Jenkins security team has released 19 advisories for the Jenkins core, plugins and other components.
In total 198 vulnerabilities were fixed, and 72 plugin vulnerabilities were announced without a fix at the time of advisory publishing.
As a project, we are receiving a continuous flow of new reports and continue to provide corrections.
Cross-site scripting (XSS) vulnerabilities were the most popular type this year, followed by unprotected credentials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There have also been developer tooling improvements,
including &lt;a href=&quot;https://www.jenkins.io/blog/2020/11/04/codeql/&quot;&gt;GitHub CodeQL evaluation&lt;/a&gt; for targeted security issues search
and &lt;a href=&quot;https://www.jenkins.io/blog/2020/03/02/findsecbugs/&quot;&gt;Find-Sec-Bugs adoption&lt;/a&gt; for static analysis of the plugin and Jenkins core code.
Along with wider adoption of Dependabot and automated dependency scanning on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;documentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation&quot; /&gt;Documentation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Documentation SIG is working on creating more documentation for Jenkins on different platforms,
including cloud platforms.
Jenkins on Kubernetes was one of the key stories this year for the SIG,
along with documentation migration to jenkins.io and wider adoption of Documentation-as-code in plugins.
95% of the 200 most installed Jenkins plugins have moved to &quot;documentation as code&quot; or have a pending pull request with updates.
In total, almost 600 plugins have already been migrated.
There were major updates in Jenkins documentation on jenkins.io, with a lot of content being moved from the old Jenkins Wiki.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2020 was the first year when Jenkins participated in Google Season of Docs (GSoD).
This program brings together open-source and technical writers communities for the benefit of both.
This year’s student, &lt;a href=&quot;https://www.jenkins.io/blog/authors/zaycodes&quot;&gt;Zainab Abubakar&lt;/a&gt;,
did an amazing job documenting Jenkins on Kubernetes.
Now Jenkins users can find official documentation about deploying and scaling Jenkins in Kubernetes.
See the project report by Zainab &lt;a href=&quot;https://www.jenkins.io/blog/2020/12/04/gsod-project-report/&quot;&gt;here&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;jenkins-release-automation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-release-automation&quot; /&gt;Jenkins Release Automation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has delivered weekly and long term support releases since it was formed in 2011.
Those releases were delivered by Kohsuke Kawaguchi from his release infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning in April 2020, those releases are delivered by the new release automation setup.
It is hosted within the Jenkins’ Kubernetes cluster, with fully automated management and continuous delivery of services within the setup.
We transitioned to new build processes, new code signing certificates, and new release automation jobs.
Thanks to Olivier Vernin and all Infrastructure sub-project contributors for the successful completion of the release automation project!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Moreover, there is ongoing work on continuous delivery of Jenkins plugins (&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/229/README.adoc&quot;&gt;JEP-229&lt;/a&gt;) and on re-designing other Jenkins instances within the project (infra-ci, trusted-ci, and ci.jenkins.io for plugins).
In the next few months these stories should provide Jenkins contributors with a modern environment for CI and CD of all Jenkins components.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;terminology-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#terminology-updates&quot; /&gt;Terminology updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since July, we have officially replaced the old &quot;master&quot; terminology with the &quot;controller&quot; term.
It is a follow-up to the &quot;agent&quot; terminology introduced in 2016.
We have also deprecated usages of the “blacklist/whitelist” terminology in all components.
Currently the community is working on the cleanup of the remaining occurrences in the codebase and documentation, and we invite everyone to contribute.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a part of the terminology cleanup, last spring we announced the renaming of the official Docker images for Jenkins agents.
As a reminder, it does not have any immediate impact on Jenkins users, but they are expected to gradually upgrade their instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See more information about terminology updates &lt;a href=&quot;https://cd.foundation/blog/2020/08/25/jenkins-terminology-changes/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/2020/06/18/terminology-update/&quot;&gt;here&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;jenkins-is-the-way-program&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-is-the-way-program&quot; /&gt;“Jenkins is the Way” program&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year the Advocacy and Outreach SIG started the “Jenkins is the Way” initiative which focuses on promoting user success stories.
Over the year, the team published 54 user stories and six case studies on &lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;https://stories.jenkins.io/&lt;/a&gt; as well as a significant amount of community marketing.
We also published a number of testimonial videos advertising user stories,
including this &lt;a href=&quot;https://www.youtube.com/watch?v=fgd1bBlQXBE&quot;&gt;Introduction to &quot;Jenkins is the Way&quot;&lt;/a&gt; video.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See all the stories &lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;HERE&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;events&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#events&quot; /&gt;Events&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;google-summer-of-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-summer-of-code&quot; /&gt;Google Summer of Code&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2020 we had seven students working in the Jenkins mentoring organization.
We had 6 projects focused on Jenkins and one project focused on Jenkins X.
As usual, in GSoC we focused on problems important to the Jenkins users and community members.
The projects delivered highly anticipated new features and key architecture changes needed for the long-term evolution of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the first-ever time in Jenkins when all GSoC students have reached the final evaluation and successfully passed it.
It was an incredible effort by all the project members and, most importantly, by the students. Thanks a lot to them!&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/2020/12/22/gsoc-report/&quot;&gt;Read more on the blog page&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-in-hacktoberfest-2020&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-in-hacktoberfest-2020&quot; /&gt;Jenkins in Hacktoberfest 2020&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In October we participated in Hacktoberfest.
Our featured projects included the Jenkins core, jenkins.io website and plugins.jenkins.io, Helm charts, and multiple plugins.
We also encouraged contributors to participate in the Documentation as Code and terminology cleanup across the entire Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the details in the &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/&quot;&gt;Hacktoberfest page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In total we received 226 pull requests from Hacktoberfest participants.
Some stats per Jenkins GitHub organization:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&#39;jenkinsci&#39;, PRs: 189, Hacktoberfest contributors: 61&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;jenkins-infra&#39;, PRs: 100, Hacktoberfest contributors: 40&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;jenkins-zh&#39;, PRs: 37, Hacktoberfest contributors: 2&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;jenkins-at-devops-world&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-at-devops-world&quot; /&gt;Jenkins at DevOps World&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The annual &lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World&lt;/a&gt;,
formerly known as DevOps World | Jenkins World held on Sept 22-24, with workshops on Sept 25.
Just like other events in 2020, DevOps World pivoted to a virtual event but that didn’t mean there was a shortage of sessions or networking opportunities. There were over 50 Jenkins/open-source.
And a special congratulations is in order to this year’s &lt;a href=&quot;https://www.jenkins.io/blog/2020/12/11/devops-world-2020-jenkins-contributors-awarded-top-honors-at-devops-worlds-2020/&quot;&gt;Jenkins Contributor Award&lt;/a&gt; winners:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;James Holderness - Jenkins security MVP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Marky Jackson - Most valuable Jenkins advocate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tim Jacomb - Most valuable Jenkins contributor&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below are just a few sessions, the full agenda can be found &lt;a href=&quot;https://sessions.devopsworld.com/sessions&quot;&gt;HERE&lt;/a&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://www.cloudbees.com/resources/jenkins-future-pipeline-features&quot;&gt;Jenkins Where It Is and Where It Is Going&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/resources/jenkins-master-pdi-software&quot;&gt;One Jenkins to Rule them All&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/resources/jenkins-ui-makeover&quot;&gt;Jenkins UI Gets a Makeover&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/resources/devsecops-jenkins-pipeline-api-security&quot;&gt;Jenkins Pipeline and DevSecOps for API Security&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;graduation-at-continuous-delivery-foundation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#graduation-at-continuous-delivery-foundation&quot; /&gt;Graduation at Continuous Delivery Foundation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is the first project to graduate in the CD Foundation.
In August the project announced that the Jenkins project has achieved the graduated status in the &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation (CDF)&lt;/a&gt;.
Thanks to all contributors who made our graduation possible!
Below you can find a few key changes we have applied during the graduation process:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We introduced a new &lt;a href=&quot;https://www.jenkins.io/project/roadmap/&quot;&gt;public roadmap&lt;/a&gt; for the Jenkins project.
This roadmap aggregates key initiatives in all community areas: features, infrastructure, documentation, community, etc.
It makes the project more transparent to all Jenkins users and adopters, and at the same time helps potential contributors find the hot areas and opportunities for contribution.
The roadmap is driven by the Jenkins community and it has a fully public process documented in &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/14/README.adoc&quot;&gt;JEP-14&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new &lt;a href=&quot;https://www.jenkins.io/project/adopters&quot;&gt;list of Jenkins adopters&lt;/a&gt; was introduced on jenkins.io.
This list highlights Jenkins users and references their case studies and success stories,
including ones submitted through the &lt;a href=&quot;https://www.jenkins.io/blog/2020/04/30/jenkins-is-the-way/&quot;&gt;Jenkins Is The Way&lt;/a&gt; portal.
Please do not hesitate to add your company there!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We passed the &lt;a href=&quot;https://www.coreinfrastructure.org/&quot;&gt;Core Infrastructure Initiative (CII)&lt;/a&gt; certification.
This certification helps us to verify compliance with open source best practices and to make adjustments in the project (see the bullets below).
It also provides Jenkins users and adopters with a public summary about compliance with each best practice.
Details are on the &lt;a href=&quot;https://bestpractices.coreinfrastructure.org/en/projects/3538&quot;&gt;Jenkins core page&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/conduct/&quot;&gt;Jenkins Code of Conduct was updated&lt;/a&gt; to the new version of Contributor Covenant.
In particular, it sets best practices of behavior in the community, and expands definitions of unacceptable behavior.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More information can be found &lt;a href=&quot;https://cd.foundation/announcement/2020/08/04/cd-foundation-announces-jenkins-graduation/&quot;&gt;HERE&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/2020/08/04/cdf-graduation/&quot;&gt;HERE&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;public-roadmap&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#public-roadmap&quot; /&gt;Public Roadmap&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project now has a public, community-driven &lt;a href=&quot;https://www.jenkins.io/project/roadmap/&quot;&gt;project roadmap&lt;/a&gt;.  Roadmap items are major initiatives and are considered as official plans.
The roadmap aggregates key initiatives in all areas of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many of the 2020 released roadmap items are mentioned elsewhere in this document, including release automation, &lt;a href=&quot;https://www.coreinfrastructure.org/&quot;&gt;Core Infrastructure Initiative (CII)&lt;/a&gt; certification,
user interface improvements, &lt;a href=&quot;https://www.jenkins.io/blog/2020/05/25/read-only-jenkins-announcement/&quot;&gt;read-only configuration pages&lt;/a&gt;,
and Google Summer of Code projects like the GitHub Checks API or External Fingerprint Storage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other roadmap items include mirror infrastructure improvements, a new &lt;a href=&quot;https://www.jenkins.io/blog/2020/08/12/windows-installers-upgrade/&quot;&gt;Windows installer&lt;/a&gt;,
and preview releases of pluggable storage for external fingerprints, build logs, and unit test results.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-2020-elections&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-2020-elections&quot; /&gt;Jenkins 2020 Elections&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In October-December the Jenkins community held the regular elections.
This year we were  electing for 2 governance board members and for all five officer positions, namely: Security, Events, Release, Infrastructure, and Documentation. These roles are an essential part of Jenkins&#39; community governance and well-being. We 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;Key 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://github.com/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt; and &lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky Jackson&lt;/a&gt; joined 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://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt; was elected as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky Jackson&lt;/a&gt; became the new &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;Olivier Vernin, Daniel Beck, and Mark Waite will continue as Infrastructure, Security and Documentation officers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2020/12/03/election-results/&quot;&gt;Full election results&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;and-even-more&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#and-even-more&quot; /&gt;And even more&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post does not provide a full overview of what changed in the project,
it is just a slice of the key highlights mentioned by the contributors.
The Jenkins project consists of more than 2000 plugins and components which are developed by thousands of contributors.
Thanks to them, a lot of changes happen in the project every day. We are cordially grateful to everybody who participates in the project, regardless of contribution size. Everything matters: new features, bug fixes, documentation, blog posts, well reported issues, Stackoverflow responses, etc. THANKS A LOT TO ALL CONTRIBUTORS!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, keep updating Jenkins and exploring new features.
And stay tuned, there is much more to come next year!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s next?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Technical changes.&lt;/strong&gt; 2021 will be another busy year for the Jenkins community.
There are many long-overdue changes in the project, which need to happen if we want Jenkins to succeed.
There are many areas on the &lt;a href=&quot;https://www.jenkins.io/project/roadmap/&quot;&gt;roadmap&lt;/a&gt;: UX revamp, cloud native Jenkins, pluggable storage, etc.
There will also be a continued cleanup of old dependencies and technical debt.
Several key changes are expected to land in the March LTS baseline: update to Spring Security, XStream unforking, JQuery update, etc.(&lt;a href=&quot;https://www.jenkins.io/blog/2020/11/10/major-changes-in-weekly-releases/&quot;&gt;announcement&lt;/a&gt;).
In addition to that, we will keep working on expanding platform support in Jenkins, including provisioning support for new Java versions and official images for more architectures like Arm.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Documentation.&lt;/strong&gt; Documentation efforts will continue in the next year,
with a focus on documenting Jenkins usage on modern platforms and and automation use-cases.
Wide adoption of documentation-as-code will also continue for plugins By this time almost 600 plugins have been migrated, but there are hundreds more plugins to go.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Security.&lt;/strong&gt; Another important area is Jenkins security. Automation tools like Jenkins are a key part of the software delivery process in organizations, and their security is essential for the security of products.
Misconfigured or outdated systems are a common attack vector, but there are also areas for improvement on the project’s side.
Be sure there will be security advisories and vulnerability fixes in 2021.
We plan to keep adopting best security development and software delivery practices, and to improve dependency management and developer tools in the project. These areas will be in the spotlight for the project next year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Events.&lt;/strong&gt; Next month we will participate in &lt;a href=&quot;https://fosdem.org/&quot;&gt;FOSDEM&lt;/a&gt;, and there will be a virtual Jenkins stand there.
There will also be a CI/CD devroom.
If you are interested to meet Jenkins contributors, it is a great opportunity. We also plan to continue all outreach programs and on onboarding more contributors.
At the moment we are looking for Google Summer of Code 2020 mentors and project ideas (&lt;a href=&quot;https://www.jenkins.io/blog/2020/12/16/call-for-mentors/&quot;&gt;announcement&lt;/a&gt;).
We are also ready to consider other non-coding project ideas as a part of CommunityBridge.
If you are interested, please contact the &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/&quot;&gt;Advocacy and Outreach SIG&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;join-us-in-2021&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#join-us-in-2021&quot; /&gt;Join us in 2021!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are always looking for more contributors, regardless of the profile and experience.
Jenkins is a vast ecosystem which includes many modern technologies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We invite Jenkins users and contributors to participate in the community and to move these initiatives forward!
Join us in the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;mailing lists&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/sigs/&quot;&gt;special interest groups&lt;/a&gt;,&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/2020/12/22/gsoc-report/</id>
<title>Google Summer of Code 2020 summary</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-12-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/12/22/gsoc-report/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<category term='jenkins'></category>
<category term='community'></category>
<category term='events'></category>
<category term='mentor'></category>
<summary>
With the mentor summit and the project retrospectives finished in October,
now we can call Google Summer of Code 2020 officially over in the Jenkins community.
On behalf of the Jenkins org team, we would like to thank all participants: students, mentors, applicants, and dozens of other contributors who participated in the project this year.
Google Summer of Code would not be successful without the active participation of the Jenkins community.





If you follow the Jenkins blog, you may have already seen many GSoC 2020 articles created by the project teams.
Here I would like to focus on the key highlights from the project.


Projects


In 2020...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the mentor summit and the project retrospectives finished in October,
now we can call Google Summer of Code 2020 officially over in the Jenkins community.
On behalf of the Jenkins org team, we would like to thank all participants: students, mentors, applicants, and dozens of other contributors who participated in the project this year.
Google Summer of Code would not be successful without the active participation of the Jenkins community.&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;paragraph&quot;&gt;
&lt;p&gt;If you follow the Jenkins blog, you may have already seen &lt;a href=&quot;https://www.jenkins.io/blog/tags/gsoc2020/&quot;&gt;many GSoC 2020 articles&lt;/a&gt; created by the project teams.
Here I would like to focus on the key highlights from the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;projects&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#projects&quot; /&gt;Projects&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2020 we had seven students working in the Jenkins mentoring organization.
We had 6 projects focused on Jenkins and one project focused on Jenkins X.
As usual, in GSoC we focused on problems important to the Jenkins users and community members.
The projects delivered highly anticipated new features and key architecture changes
needed for long-term evolution of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are the projects we had this year:&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/2020/projects/custom-jenkins-distribution-build-service&quot;&gt;Custom Jenkins distribution build service&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/sladyn98&quot;&gt;Sladyn Nunes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/external-fingerprint-storage&quot;&gt;External Fingerprint Storage&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/stellargo&quot;&gt;Sumit Sarin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/git-plugin-performance&quot;&gt;Git Plugin Performance Improvements&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/rishabhbudhouliya&quot;&gt;Rishabh Budhouliya&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/github-checks&quot;&gt;GitHub Checks API for Jenkins Plugins&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/XiongKezhi&quot;&gt;Kezhi Xiong&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/jenkins-x-apps-consolidation&quot;&gt;Jenkins X: Apps/Addons consolidation&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/nodece&quot;&gt;Zixuan Liu&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/machine-learning&quot;&gt;Machine Learning Plugins for Data Science&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/loghijiaha&quot;&gt;Loghi Perinpanayagam&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/winsw-yaml-configs&quot;&gt;Jenkins Windows Services: YAML Configuration Support&lt;/a&gt; by &lt;a href=&quot;https://www.jenkins.io/blog/authors/buddhikac96&quot;&gt;Buddhika Chathuranga&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;Please refer to the project pages for more information, links to the blog posts, and project demos.
Let’s focus on the results instead.
This is the &lt;strong&gt;first ever&lt;/strong&gt; time in Jenkins when all GSoC students have reached the final evaluation and successfully passed it.
It was an incredible effort by all the project members and, most importantly, by the students. Thanks a lot to them!&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/gsoc/2020/summary_report/student_photos.png&quot; alt=&quot;GSoC 2020 students&quot; /&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks a lot to all mentors who were guiding students during their projects:
&lt;a href=&quot;https://www.jenkins.io/blog/authors/linuxsuren&quot;&gt;Zhao Xiaojie&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/kwhetstone&quot;&gt;Kristin Whetstone&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/baymac&quot;&gt;Parichay Barpanda&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/afalko&quot;&gt;Andrey Falko&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/mikecirioli&quot;&gt;Mike Cirioli&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/fcojfernandez&quot;&gt;Francisco Fernandez&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/justinharringa&quot;&gt;Justin Harringa&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/omkar_dsd&quot;&gt;Omkar Deshpande&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/uhafner&quot;&gt;Ulli Hafner&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/timja&quot;&gt;Tim Jacomb&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/marckk&quot;&gt;Kara de la Marck&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/jstrachan&quot;&gt;James Strachan&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/nehagup&quot;&gt;Neha Gupta&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/sharepointoscar&quot;&gt;Oscar Medina&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/nikhildarocha&quot;&gt;Nikhil Da Rocha&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/sahilrkalra&quot;&gt;Sahil Kalra&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/kinow&quot;&gt;Bruno P. Kinoshita&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/imoutsatsos&quot;&gt;Ioannis Moutsatsos&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markyjackson-taulia&quot;&gt;Marky Jackson&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/nextturn&quot;&gt;Next Turn&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC 2020 Org admin team:
&lt;a href=&quot;https://www.jenkins.io/blog/authors/marckk/&quot;&gt;Kara de la Marck&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markyjackson-taulia&quot;&gt;Marky Jackson&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev&quot;&gt;Oleg Nenashev&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;events&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#events&quot; /&gt;Events&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the GSoC organization stipend from Google and other donations,
the Jenkins project usually provides travel grants to successful students so that they can visit a major community event, meet their mentors and community members in person, and present their work there.
Here are some notes about the &lt;a href=&quot;https://www.jenkins.io/blog/2020/01/29/gsoc-report/#gsoc-team-at-devops-world-jenkins-world&quot;&gt;GSoC 2019 travel&lt;/a&gt;.
Unfortunately this year it was not possible, and GSoC went completely virtual this year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Online meetups&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;In August we organized Jenkins Online Meetups where students have presented their projects
(&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/272722782/&quot;&gt;part 1&lt;/a&gt;, &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/272722843/&quot;&gt;part 2&lt;/a&gt;).
You can find recordings of these presentations in &lt;a href=&quot;https://www.youtube.com/playlist?list=PLN7ajX_VdyaNZ9rU46k0uT14KAcq3_z68&quot;&gt;this playlist&lt;/a&gt; on the Jenkins YouTube channel.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;DevOps World&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;This year CloudBees, one of the Jenkins corporate sponsors, invited all students to participate in the &lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World&lt;/a&gt; virtual conference on September 23-25.
GSoC students did lighting talks about their projects, attended other conference talks, and joined the Continuous Delivery Foundation booth which represented the project at the conference.
You can find recordings of the talks and all materials &lt;a href=&quot;https://www.cloudbees.com/devops-world/sessions?additional=Community&quot;&gt;here&lt;/a&gt;.
Although the conference was in September, the talks were pre-recorded in early August.
Please refer to the Jenkins online meetup recordings for the recent versions.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GSoC Mentor summit&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;This is a regular gathering for Google Summer of Code mentors and org admins where they share their experiences about GSoC, outreach programs, community management, and tools.
Usually it is organized as a multi-day unconference after the end of GSoC, with 2-3 representatives from each project.
It has been a great learning experience to participate in it.
This year it was a single-day virtual event, and all mentors were able to attend.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/shivaylamba/&quot;&gt;Shivay Lamba&lt;/a&gt;, one of the GSoC 2020 mentors, also did a lightning talk about the GSoC projects he was working on in Jenkins and CNCF (&lt;a href=&quot;https://drive.google.com/file/d/1Ian5JvKp9UuAg3k7NnGPefgFwIxQfpJm/view&quot;&gt;slides&lt;/a&gt;).&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;swag&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#swag&quot; /&gt;Swag&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All Google Summer of Code students and mentors get swag from Google.
This year, &lt;a href=&quot;https://cd.foundation/&quot;&gt;Contrinuos Delivery Foundation (CDF)&lt;/a&gt; has sponsored swag for 50 most active GSoC participants:
all students, mentors, and many other contributors who participated and helped the projects to succeed.
This is the third year when the Jenkins organization sends extra GSoC swag,
In the previous years the swag logistics was one of the most challenging tasks for org admins during the entire project.
and we highly appreciate help from CDF with this part.
As DevOps World presenters, the students have also received special edition speaker swag from CloudBees.&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/gsoc/2020/summary_report/swag.jpg&quot; alt=&quot;GSoC swag by the Jenkins project&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks a lot to &lt;a href=&quot;https://opensource.google/&quot;&gt;Google&lt;/a&gt;, &lt;a href=&quot;https://cd.foundation/&quot;&gt;Contrinuos Delivery Foundation (CDF)&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&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;retrospective&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#retrospective&quot; /&gt;Retrospective&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After completion of the coding phases,
org admins have reached out to all GSoC 2020 participants to gather their feedback and suggestions.
We also recommended that project teams hold their own retrospective meetings.
Such information is instrumental to continuously improving GSoC in the Jenkins community.
We thank all contributors who shared their feedback!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The organization-wide retrospective was organized as a survey and a series of retrospective meetings.
You can find aggregated results in &lt;a href=&quot;https://docs.google.com/document/d/1NIszUtuXmHiu8X2WrgAEQFK6aVodsmM4I0RSNRf4TS0/edit?usp=sharing&quot;&gt;this Google Doc&lt;/a&gt;.
Overall, we received very positive feedback from students and mentors.
The GSoC framework in Jenkins has matured significantly during the previous years.
The effort we invested to create guidelines and recommendations for all parties helped a lot because all the expectations were known in advance.
As usual, there is much to improve, especially with regards to the community bonding phases and cross-project communications.
We are processing the feedback, and we will expand our documentation and the contributor onboarding plans next year.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;some-personal-notes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-personal-notes&quot; /&gt;Some personal notes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been involved in leading and coordinating Google Summer of Code in open source projects since 2016.
This year I visited the GSoC stand at FOSDEM and met a few organizers and former students.
A few days after, I proposed participating in GSoC at the Jenkins contributor summit in Brussels,
and several contributors supported this idea.
We spent several hours to create the first Jenkins GSoC page and brainstorm on project ideas.
We submitted our application and were accepted.
Thanks a lot to the Google team that gave us a chance!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is great to work with the students and see how they explore the open source community and grow professionally as engineers.
It is also awesome to see how some of them stay in the project and keep contributing,
including becoming plugin maintainers and GSoC mentors.
But, for me, Google Summer of Code is not just about mentoring.
It also helps a lot with the community bonding…​ for the existing community like Jenkins which has a lot of isolated sub-communities in plugins.
Many maintainers work alone, and it can be quite lonely working to maintain a plugin without feedback, developer ideas, and user interactions.
When plugin contributors become project mentors, they join the wider community effort and work in teams.
In many cases they start contributing to the organization-wide activities and goals,
and it grows the &quot;backbone&quot; of the Jenkins community.
Like other community-driven projects, we need such backbone to scale the community and onboard more contributors to the countless Jenkins components.
So far it works really well and GSoC excels among outreach programs in this regard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to thank the Google Open Source team, students and all Jenkins community members for the great Google Summer of Code this year.
We also thank the Continuous Delivery Foundation for their help to recognize contributors and allow organization administrators to focus on projects.
Last but not least, I would like to thank the Jenkins org admin team:
&lt;a href=&quot;https://www.jenkins.io/blog/authors/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markyjackson-taulia&quot;&gt;Marky Jackson&lt;/a&gt;, and
&lt;a href=&quot;https://www.jenkins.io/blog/authors/marckk/&quot;&gt;Kara de la Marck&lt;/a&gt;.
This was a crazy year for everyone. Regardless of that, the org admins stepped up and took responsibility for students and mentors involved in the project, with a serious time commitment.
Not all work by the organizers is publicly visible (applications, project selection, resolving conflicts),
but this work is essential to the project’s success.
Thanks a lot to org admins and mentors who helped with the administrative tasks this year!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-about-gsoc-2021&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-about-gsoc-2021&quot; /&gt;What’s about GSoC 2021?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, we plan to participate in Google Summer of Code 2021.
The application period for organizations will start in a few months,
but we have already started preparing for the next GSoC session.
We are looking for mentors, org admins and project ideas.
Please &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#contacts&quot;&gt;contact us&lt;/a&gt; if you are interested!&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/2020/12/16/call-for-mentors/&quot;&gt;Call for Mentors and Project Ideas&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/project-ideas&quot;&gt;GSoC 2021 project ideas&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas&quot;&gt;HOWTO: Propose a project idea&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors&quot;&gt;Information for mentors&lt;/a&gt;: guidelines and expectations&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We invite potential students to start exploring the project and the available project ideas.
Original ideas are always welcome in the project, and starting early is a great opportunity to
get introduced to the Jenkins community, collect more information about the problem areas,
and to create a good proposal.
&quot;Start early&quot; is the most popular recommendation from GSoC 2020 participants to future GSoC students,
and we encourage you to follow this advice!&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/2020/12/17/jira-upgrade-for-the-jenkins-project/</id>
<title>Jira upgrade for the Jenkins project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-12-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/12/17/jira-upgrade-for-the-jenkins-project/" />
<author>
<name>markewaite</name>
</author>
<category term='jenkins'></category>
<category term='infrastructure'></category>
<category term='jira'></category>
<summary>
The Jenkins project has used Jira to track issues for many years.
Jenkins core, Jenkins modules, Jenkins infrastructure, and many Jenkins plugins manage their issue reports with our Jira server.


Jira helps the Jenkins project manage issues and tasks related to over 250&#160;000 Jenkins installations.
It tracks bugs, enhancement requests, tasks, and security issues.
It is used regularly by users around the world.


We&#8217;re grateful for the long-standing contribution that Atlassian provides by donating the Jira license to the Jenkins project.
We&#8217;re grateful to the Oregon State University Open Source Lab for their donation of equipment and bandwidth to host the server.


Upgrade Timeline


We were running Jira...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020-12-17-jira-upgrade-for-the-jenkins-project/jira-logo.png&quot; alt=&quot;jira logo&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has used Jira to track issues for many years.
Jenkins core, Jenkins modules, Jenkins infrastructure, and many Jenkins plugins manage their issue reports with our &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;Jira server&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jira helps the Jenkins project manage issues and tasks related to over 250 000 Jenkins installations.
It tracks bugs, enhancement requests, tasks, and security issues.
It is used regularly by users around the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re grateful for the long-standing contribution that Atlassian provides by donating the Jira license to the Jenkins project.
We’re grateful to the &lt;a href=&quot;https://osuosl.org/&quot;&gt;Oregon State University Open Source Lab&lt;/a&gt; for their donation of equipment and bandwidth to host the server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;upgrade-timeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-timeline&quot; /&gt;Upgrade Timeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We were running Jira 7.13 and had been managing that installation for a few years.
Atlassian announced that Jira 7.13 would end its support life on November 28, 2020.
We needed to upgrade from Jira 7.13 to a more recent version of Jira.
As part of our membership in the Continuous Delivery Foundation, a Linux Foundation initiative, we could use their project services team to manage our Jira server.
We decided to move from hosting our own Jira server to having the Jira experts at the Linux Foundation host it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The upgrade timeline looked like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;November 2019 - Infrastructure team begins discussions about the November 2020 end of support for Jira 7.13&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;August 2020 - First conversations with Linux Foundation to host Jira for the Jenkins project.  Draft of the upgrade plan assembled and shared with the community&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;September 2020 - Schedule for testing week and final transition week proposed.  Authentication options evaluated and selected&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;October 2020 - Test upgrade performed and tested&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;November 2020 - Final upgrade completed and verified&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;confronting-the-complications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#confronting-the-complications&quot; /&gt;Confronting the Complications&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Initial discussions between the Jenkins infrastructure team and the Linux Foundation identified complications related to authentication and SSL certificates.
We planned, negotiated, and tested our assumptions throughout the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;authentication&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#authentication&quot; /&gt;Authentication&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jira servers at the Linux Foundation typically use Linux Foundation accounts for user access.
Unfortunately, the Jenkins LDAP database includes over 100,000 users and for many of them, Linux Foundation username doesn’t correspond to Jenkins account username.
It was not feasible to transition 100,000 user accounts from the Jenkins LDAP database to the Linux Foundation accounts system and still complete the Jira upgrade before the November 28, 2020 deadline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Linux Foundation Project Services team evaluated authentication alternatives and confirmed that they could use the Jenkins LDAP server.
Using the Jenkins LDAP server spared us from two transitions, LDAP and Jira, and kept the project timeline feasible.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;ssl-certificates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ssl-certificates&quot; /&gt;SSL Certificates&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jira servers at the Linux Foundation use Let’s Encrypt to generate SSL certificates for HTTPS.
The Linux Foundation uses the DNS method to obtain SSL certificates.
Unfortunately, the Jenkins project uses the HTTP method to obtain SSL certificates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thankfully, Olivier Vernin of the Jenkins project and Anton Baranov of the Linux Foundation found a solution.
They created an ACME record in the Jenkins DNS server and pointed the issues.jenkins.io DNS record at the new Linux Foundation Jira server.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;building-the-prototype&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#building-the-prototype&quot; /&gt;Building the Prototype&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anton Baranov created a prototype Jira server, restored an older Jenkins Jira backup, and upgraded it to Jira 8.13.
That first restore detected that we had not provided the Jira attachments or the Jira avatars.
That attachments and avatars added multiple gigabytes to the initial backup data and were vital to complete the update.&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;testing-the-upgrade&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-the-upgrade&quot; /&gt;Testing the Upgrade&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A group of volunteers including Jenkins users, security team members, and infrastructure team members tested the upgrade during the week of October 26, 2020.
The tests confirmed that authentication worked as expected and that the Jira prototype was functioning as expected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We thank the test team, including:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Daniel Beck&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tim Jacomb&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Olivier Vernin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The tests included:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Creating and routing issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Commenting on issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Viewing dashboards with the expected content&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LDAP settings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Email notification&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The tests detected minor issues that Anton was able to correct in preparation for the final upgrade.
The testing team agreed that the tests were successful.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;deploying-the-upgrade&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deploying-the-upgrade&quot; /&gt;Deploying the Upgrade&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Olivier Vernin announced the final upgrade by &lt;a href=&quot;https://groups.google.com/g/jenkins-infra/c/i7SaB-24L1o/m/NeUFrH82AAAJ&quot;&gt;email to the Jenkins infra list&lt;/a&gt; with details of the changes happening during the upgrade.
Monday, November 9, 2020, the final backup of the existing Jira server was copied into the new Linux Foundation server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final upgrade encountered issues that we had not seen during the initial tests.
The &quot;bumps and bruises&quot; from the unexpected issues were resolved by Anton Baranov as he used a multi-step upgrade process.
The steps included:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Restore the earlier backup to Jira 7.13&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restore the most recent backup&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade to Jira 8.13&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install avatars, attachments, and other images&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update DNS entries to point to the new Jenkins Jira server&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;lessons-from-the-upgrade&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lessons-from-the-upgrade&quot; /&gt;Lessons from the Upgrade&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lessons were related to timing, estimation, and communication.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;scheduling-the-upgrade&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#scheduling-the-upgrade&quot; /&gt;Scheduling the Upgrade&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The test upgrade started the week of October 19, 2020.
It took several days longer than originally expected.
Thankfully, we had allowed an extra week between the test upgrade and the production upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://groups.google.com/g/jenkins-infra/c/8SC8bQuhD7s/m/Qtnz9o8gBAAJ&quot;&gt;originally announced schedule&lt;/a&gt; for the final upgrade was intentionally placed in a week that would not include a long term support release.
That reduced the risk of disruption if the upgrade took longer than required or failed and we had to roll back.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;estimating-the-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#estimating-the-work&quot; /&gt;Estimating the Work&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Discussions with the Jenkins project Jira administrators and the Linux Foundation Jira experts provided very reasonable estimates of time to complete the work.
We intentionally allowed additional time between first test and final upgrade.
We needed that additional time and used it well as the testing week.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;communicating-the-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#communicating-the-plan&quot; /&gt;Communicating the Plan&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The distributed nature of the Jenkins project makes communication challenging for major changes.
We communicated plans at various stages but still found occasions where the communication was insufficient.
In this case, the adage held true that it is, &quot;impossible to communicate too much&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks for your patience during the upgrade and thanks to the Linux Foundation for administering the Jenkins Jira server.&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/2020/12/16/call-for-mentors/</id>
<title>Google Summer of Code 2021 call for Project Ideas and Mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-12-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/12/16/call-for-mentors/" />
<author>
<name>marckk</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2021'></category>
<category term='community'></category>
<category term='events'></category>
<category term='developer'></category>
<summary>
Google Summer of Code (GSoC)
is a program where students are paid a stipend by Google to work on a free open source project.
Students work on the project for three months (June to August).
Prior to the coding phase, there is a month of community bonding, to welcome students to the Jenkins community and acquaint them with the projects processes for communication and collaboration.
Mentors are actively involved with students from March when students start to work on and submit their applications.
(see the timeline)








We are looking for project ideas and mentors to participate in GSoC 2021.
GSoC project ideas are coding projects that university...
</summary>
<content type='html'>
&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;a href=&quot;https://developers.google.com/open-source/gsoc/&quot;&gt;Google Summer of Code&lt;/a&gt; (GSoC)
is a program where students are paid a stipend by Google to work on a free open source project.
Students work on the project for three months (June to August).
Prior to the coding phase, there is a month of community bonding, to welcome students to the Jenkins community and acquaint them with the projects processes for communication and collaboration.
Mentors are actively involved with students from March when students start to work on and submit their applications.
(see the &lt;a href=&quot;https://summerofcode.withgoogle.com/how-it-works/#timeline&quot;&gt;timeline&lt;/a&gt;)
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;paragraph&quot;&gt;
&lt;p&gt;We are looking for project ideas and mentors to participate in GSoC 2021.
GSoC project ideas are &lt;strong&gt;coding projects&lt;/strong&gt; that university or college students can accomplish in about three months.
The coding projects can be new features, plugins, test frameworks, infrastructure, etc.
Anyone can submit a project idea, but of course we like it even better if you offer to mentor your project idea.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We accept new project ideas at any time,
However, project ideas need to be finalised before February 19th, 2021 at 7pm UTC,
which is the deadline for the Jenkins organization to apply to the GSoC program.
Please send us your project ideas before the beginning of February so they can get a proper review by the GSoC committee and by the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 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;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Create a pull-request with your idea in a &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/2021/project-ideas&quot;&gt;project ideas&lt;/a&gt;.
It is not necessary to submit a Google Doc, but it will still work if you want to do that.
See the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas&quot;&gt;instructions&lt;/a&gt; on submitting ideas which include an &lt;code&gt;.adoc&lt;/code&gt; template and some examples.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-list-of-ideas&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-list-of-ideas&quot; /&gt;Current list of ideas&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We currently have a &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2021/project-ideas&quot;&gt;list of project ideas&lt;/a&gt; for students to browse.
Note that this list is subject to change.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 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;/h3&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;.
Note that being a GSoC mentor does not require expert knowledge of Jenkins.
Mentors do not work alone. We make sure that every project has at least two mentors.
GSoC org admins will help to find technical advisers, so you can study together with your students.&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 sometimes a bit of cheerleading.
They review student proposals, pull-requests and the students presentations
at the evaluation phase.
They fill in the Google provided evaluation report form at the end of coding periods.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-do-you-get-in-exchange&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-do-you-get-in-exchange&quot; /&gt;What do you get in exchange?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In return of mentoring, a student works on your project full time for three months.
Think about the projects that you’ve always wanted to do but never had the time…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentoring is also an opportunity to improve your management and people skills, while giving back to the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There will be a Google Mentor Summit which takes place every year.
In 2020, the Mentor Summit was virtual, but in previous years the summit has taken place in person.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.jenkins.io/blog/2019/10/08/google-summer-of-code-mentor-and-org-admin-perspective/&quot;&gt;this post&lt;/a&gt;
about the 2019 in person Mentor Summit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC is a fantastic program and the Jenkins project is happy to participate in GSoC again in 2021!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For any question, 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 chat&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/12/11/devops-world-2020-jenkins-contributors-awarded-top-honors-at-devops-worlds-2020/</id>
<title>“Jenkins Contributors Awarded Top Honors at DevOps World 2020”</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-12-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/12/11/devops-world-2020-jenkins-contributors-awarded-top-honors-at-devops-worlds-2020/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='devopsworld2020'></category>
<summary>
At DevOps World on September 24, 2020, through the sponsorship of CloudBees, three Jenkins contributors were recognized for their contributions to the Jenkins project.  The Jenkins Contributor Awards honor those who have made significant contributions to the Jenkins project.  The 2020 Jenkins Contributor Award winners are:


Most Valuable Jenkins Contributor


This award is presented to an individual who has contributed to the Jenkins project the most through new features, bug fixes or plugin development efforts.




Tim Jacomb - Tim is everywhere in the Jenkins community: plugins, Jenkins core maintenance, Google Summer of Code, infrastructure, and new initiatives like GitHub App authentication...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At DevOps World on September 24, 2020, through the sponsorship of CloudBees, three Jenkins contributors were recognized for their contributions to the Jenkins project.  The Jenkins Contributor Awards honor those who have made significant contributions to the Jenkins project.  The 2020 Jenkins Contributor Award winners are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;most-valuable-jenkins-contributor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#most-valuable-jenkins-contributor&quot; /&gt;Most Valuable Jenkins Contributor&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This award is presented to an individual who has contributed to the Jenkins project the most through new features, bug fixes or plugin development efforts.&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;&lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt;&lt;/strong&gt; - Tim is everywhere in the Jenkins community: plugins, Jenkins core maintenance, Google Summer of Code, infrastructure, and new initiatives like GitHub App authentication and Dark Theme. His software, frontend and infrastructure skills help to push the Jenkins project forward. Several examples of features shipped by Tim in 2020: Read-only Jenkins configuration, GitHub App Authentication support, Jenkins Dark Theme and many other smaller features here and there. Tim is also the second most active code reviewer in the Jenkins core.&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;jenkins-security-mvp&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-security-mvp&quot; /&gt;Jenkins Security MVP&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This award is presented to the individual who most consistently provides excellent Jenkins security reports or resolves Jenkins security issues.&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;&lt;a href=&quot;https://github.com/j4james&quot;&gt;James Holderness&lt;/a&gt;&lt;/strong&gt; - Security issues reported by James have been included in nine of the nineteen security advisories published by the Jenkins project in the last 12 months. His issue reports have detected many cases where sensitive information was being stored insecurely by plugin maintainers. Jenkins users and the Jenkins security team are sincerely grateful for the issue reports that James has provided.&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;most-valuable-jenkins-advocate&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#most-valuable-jenkins-advocate&quot; /&gt;Most Valuable Jenkins Advocate&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This award is presented to an individual who has helped advocate for Jenkins through organization of a local Jenkins Area Meetup(s), or virtual equivalent.&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;&lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky Jackson&lt;/a&gt;&lt;/strong&gt; -  Marky has been very active in many Jenkins advocacy &amp;amp; Outreach initiatives. He was a leader of the Advocacy &amp;amp; Outreach SIG, and he participated in many promotional initiatives organized by the SIG. Marky was also a copy-editor of the Jenkins Twitter account where he contributed a lot to it. In addition to that, Marky has presented talks as well as provided technical support on Jenkins at multiple events including Jenkins Online Meetups, in person as well as virtual conferences.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to James, Marky and Tim! We are grateful for their contributions to the betterment of the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/12/05/3-Cases-Jenkins-Success-stories-from-the-community/</id>
<title>3 Cases: Jenkins success stories from the community</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-12-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/12/05/3-Cases-Jenkins-Success-stories-from-the-community/" />
<author>
<name>alyssat</name>
</author>
<category term='Jenkinsistheway'></category>
<category term='Jenkinsuserstories'></category>
<summary>
Back in April, when we started canvassing the Jenkins community for user stories concerning how Jenkins helped enterprise companies, startups, and students, we thought we&#8217;d see some exciting tales of DevOps inspiration and CI/CD integration. We found that some submitted stories were far too big to be constrained by our format of 'background/goal/solution/results.'


Some Jenkins users had a much more complex story to tell, whether it was about getting upper management to buy-in, keeping developers happy, or simply making sure pipelines weren&#8217;t just bottlenecks in disguise.


Here are a handful of Jenkins Case Studies we&#8217;ve published in the past few months, with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back in April, when we started canvassing the Jenkins community for user stories concerning how Jenkins helped enterprise companies, startups, and students, we thought we’d see some exciting tales of DevOps inspiration and CI/CD integration. We found that some submitted stories were far too big to be constrained by our format of &#39;background/goal/solution/results.&#39;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some Jenkins users had a much more complex story to tell, whether it was about getting upper management to buy-in, keeping developers happy, or simply making sure pipelines weren’t just bottlenecks in disguise.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are a handful of &lt;a href=&quot;https://stories.jenkins.io/case-studies/&quot;&gt;Jenkins Case Studies&lt;/a&gt; we’ve published in the past few months, with many more on the way!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;case-study-1-d4science&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#case-study-1-d4science&quot; /&gt;Case Study #1: D4Science&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;amping-up-scientific-research-with-cicd-powered-by-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#amping-up-scientific-research-with-cicd-powered-by-jenkins&quot; /&gt;Amping up scientific research with CI/CD powered by Jenkins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To promote open science practices and support scientific communities while serving 11k registered users in 45 countries, &lt;a href=&quot;https://www.d4science.org/&quot;&gt;D4Science&lt;/a&gt; introduced a new delivery pipeline that replaced their pre-existing build platform.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, they had to build and release their software framework (gCube) in a way that would support multi-project releases at scale — from 200+ Git repositories within the same day! It had to be fast, automate all release activities, and it had to deliver incremental releases to address user requirements quickly. Most of all, the solution had to be cost-effective.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using Jenkins, they created an innovative approach to software delivery: a continuous integration/continuous delivery (CI/CD) pipeline, scalable, easy to maintain, and upgradable at a minimal cost.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Discover how D4Science empowers e-Science and virtual research communities with software released via Jenkins. &lt;a href=&quot;https://stories.jenkins.io/case-studies/d4science-amps-up-their-scientific-research-platform-with-ci-cd-powered-by-jenkins/&quot;&gt;Read the Jenkins case study featuring D4Science here!&lt;/a&gt;&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;case-study-2-gainsight&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#case-study-2-gainsight&quot; /&gt;Case Study #2: Gainsight&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;humanizing-csx-with-tech-innovation-and-a-robust-devsecops-platform&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#humanizing-csx-with-tech-innovation-and-a-robust-devsecops-platform&quot; /&gt;Humanizing CSX with tech innovation and a robust DevSecOps platform&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.gainsight.com/&quot;&gt;Gainsight’s&lt;/a&gt; customer service experience platform helps customer success teams at more than 100 leading IT and healthcare clients. How? By driving engagement for tens of thousands of their customers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s why the engineering team at Gainsight approached the customer experience by building a smarter, faster DevSecOps platform using Jenkins. They stuck to an infrastructure-as-code approach while integrating various tools and programming languages all within the platform. And they secured processes with better visibility and air-tight quality control.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The result was a flexible DevSecOps infrastructure, 95% of which is scalable with code. And the cost of infrastructure costs was 40% less. That provides Gainsight with ease of collaboration, keener operational insight, and — because builds are 30% faster — the ability to stay a step ahead of the competition.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read why Gainsight’s lead DevOps engineer, Prudviraj Pentakota, says &quot;Jenkins is the epicenter of DevSecOps in our organization.&quot; &lt;a href=&quot;https://stories.jenkins.io/case-studies/jenkins-case-study-gainsight/&quot;&gt;Get the full story here.&lt;/a&gt;&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;case-study-3-avoris-travel&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#case-study-3-avoris-travel&quot; /&gt;Case Study #3: Avoris Travel&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reinventing-travel-with-an-inventive-technology-platform&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reinventing-travel-with-an-inventive-technology-platform&quot; /&gt;Reinventing travel with an inventive technology platform&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Part of Barceló Group, &lt;a href=&quot;https://www.avoristravel.com/&quot;&gt;Ávoris Travel&lt;/a&gt; is behind prominent destination travel brands like LeSki, Le Musik, and a selection of author travels under its &quot;Viagens Com Assinatura&quot; signature travel concept. A proprietary database and a smart, dynamic booking engine are the tickets to offering differentiating and inventive travel opportunities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also unique to Avoris is a discreet machining technology that enables agents to enter specific criteria to search and find all types of trips and travel opportunities across the entire network.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;Our infrastructure is very important because we have to be online to meet customer demand anywhere in the world,&quot; said Alejandro Alvarez Vazquez, Sysadmin, Avoris Travel. &quot;Our CI/CD platform is used by 200 people. The services that we build and deploy are used by thousands of potential clients and by our network of 675 own agencies located in Spain and Portugal.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://stories.jenkins.io/case-studies/jenkins-case-study-avoris-travel/&quot;&gt;Read the case study&lt;/a&gt; to learn how the flexibility of Jenkins plugins helped Avoris reduce build times by over 50% and became a go-to, scalable infrastructure supporting 675 agencies and over 2.8 million international consumers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-your-story&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-your-story&quot; /&gt;What’s your story?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We want to know what you’re building with Jenkins and would love to post your case study on our &lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;&quot;Jenkins Is The Way&quot;&lt;/a&gt; website, a global showcase of how developers and engineers build, deploy, and automate great stuff with Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The best way to get started is to &lt;a href=&quot;https://www.surveymonkey.com/r/JenkinsIsTheWay&quot;&gt;share your Jenkins User story with us&lt;/a&gt;. We’ll send you a free Jenkins Is The Way T-Shirt in return and publish your account for the entire Jenkins community to see. And if it’s selected for a Case Study, we’ll be in touch for a one-on-one interview! Hope to hear from you soon!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/12/04/gsod-project-report/</id>
<title>GSOD Project Report: Document Jenkins on Kubernetes</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-12-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/12/04/gsod-project-report/" />
<author>
<name>zaycodes</name>
</author>
<category term='kubernetes'></category>
<category term='helm'></category>
<category term='documentation'></category>
<category term='gsod'></category>
<category term='gsod2020'></category>
<summary>
Jenkins is the world&#8217;s leading open-source automation server used by companies large and small around the globe to implement continuous integration and continuous delivery.
Kubernetes is a portable, extensible, open-source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation.
Kubernetes is compatible with the majority of CI/CD tools which allow developers to run tests, deploy builds in Kubernetes and update applications with no downtime.
One of the most popular CI/CD tools now is Jenkins thereby making Jenkins on Kubernetes a popular theme for Jenkins users.


During the Google Season Of Docs program, I worked with the Jenkins organization on...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is the world’s leading open-source automation server used by companies large and small around the globe to implement continuous integration and continuous delivery.
Kubernetes is a portable, extensible, open-source platform for managing containerized workloads and services, that facilitates both declarative configuration and automation.
Kubernetes is compatible with the majority of CI/CD tools which allow developers to run tests, deploy builds in Kubernetes and update applications with no downtime.
One of the most popular CI/CD tools now is Jenkins thereby making Jenkins on Kubernetes a popular theme for Jenkins users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the Google Season Of Docs program, I worked with the Jenkins organization on the project - Document Jenkins on Kubernetes.
The original proposal for this project can be found &lt;a href=&quot;https://docs.google.com/document/d/1zTEKtOp2i1K2fw5RQ_a_KVOB2z0gz9987NYzTnIS6G8/edit?usp=sharing&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-goals&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-goals&quot; /&gt;Project Goals&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After my proposal was accepted by the Jenkins organization, my mentors and I agreed on the expectations for the Google Season of Docs project.
The goal of this project was to create a new Kubernetes Volume which would describe the concepts, techniques, and choices for Kubernetes users running Jenkins thereby providing the following advantages:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Improve the user experience of Jenkins on Kubernetes users by giving them a one-stop-shop for information on Jenkins on Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make it easy to track, update and maintain information on Jenkins on Kubernetes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reference the existing community documentation for Jenkins on K8s (plugins and tools/integrations).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to guides, tutorials and explanations of concepts and techniques in Jenkins on Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just-In-Time documentation which means that rather than documenting every feature comprehensively, we produce and release documentation in bits but continuously based on popular questions, feedback and area of interests gathered from the community and users.&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;community-bonding-planning-the-solution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-bonding-planning-the-solution&quot; /&gt;Community Bonding: Planning the solution&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Find below an outline of my activities during the community bonding phase:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Setting up communication channels: meetings, mailings, chats: My mentors and I agreed on the right time and channel for communication due to time difference.
We agreed to meet twice weekly, on Mondays and Thursdays at 7:00 PM GMT +1 and use Jenkins documentation &lt;a href=&quot;https://app.gitter.im/#/room/#jenkins/docs:matrix.org&quot;&gt;gitter&lt;/a&gt; channel for other communications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contacting Stakeholders and onboarding contributors: The project was  announced on social media and different Jenkins channels.
I wrote a &lt;a href=&quot;https://www.jenkins.io/blog/2020/09/25/document-jenkins-on-kubernetes-introduction/&quot;&gt;blog post&lt;/a&gt; to announce the project and created a &lt;a href=&quot;https://www.jenkins.io/sigs/docs/gsod/2020/projects/document-jenkins-on-kubernetes/&quot;&gt;project page&lt;/a&gt; on Jenkins.io.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Knowledge transfer: I and my mentors planned knowledge sharing sessions and fixed tentative dates based on the availability of the trainers.
My mentors also shared useful resources to help me prepare for the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Getting permissions: I and my mentors agreed I didn’t need any special permissions from the beginning, however, this topic was left open for discussion if the need arose later on in the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pre-planning of the project: I refined my goals and set expectations with my mentor and also learned more about the community(Jenkins).
I also had to ensure that the proposed documentation structure I drafted was in line with the goals of the organization so my mentors vetted it and we finalized on the proposed sections that I was supposed to work on.&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;documentation-development-phase&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-development-phase&quot; /&gt;Documentation Development Phase&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;knowledge-sharing-sessions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#knowledge-sharing-sessions&quot; /&gt;Knowledge Sharing Sessions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the development phase, my mentors hosted two knowledge sharing sessions:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;katacoda-and-helm-by-marky-jackson&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#katacoda-and-helm-by-marky-jackson&quot; /&gt;Katacoda and Helm by &lt;a href=&quot;https://twitter.com/markyjackson5&quot;&gt;Marky Jackson&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://docs.google.com/presentation/d/1LD7btYQaSiI3R8226OIAI6EIUqRZHTyjefVMdF4ydSg/edit?usp=sharing&quot;&gt;slides&lt;/a&gt;&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/BkIiGXDCEGA?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;helm-by-torsten-walter&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#helm-by-torsten-walter&quot; /&gt;Helm by &lt;a href=&quot;https://twitter.com/torsten_walter&quot;&gt;Torsten Walter&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://docs.google.com/presentation/d/1RS8PwlR_FzxYypBlwtp4LcZls8hr3dG_4KJ65U00Xlo/edit#slide=id.gc6f80d1ff_0_0&quot;&gt;slides&lt;/a&gt;&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/9WIGVLBIfNM?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These sessions gave me an in-depth understanding of concepts and tools needed for the project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-on-kubernetes-documentation-skeleton&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-on-kubernetes-documentation-skeleton&quot; /&gt;Jenkins on Kubernetes Documentation Skeleton&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the application phase, I drafted a &lt;a href=&quot;https://docs.google.com/document/d/1wMeeN4oA7AN4F3pfLBIAJZWXD7PdqSKHotdk76yCw68/edit?usp=sharing&quot;&gt;structure&lt;/a&gt; describing the proposed Jenkins on Kubernetes section.
My intention was to use it as a guide during the implementation phase of the project, but when the development phase kicked off, my mentors and I thought of a better approach to creating a new Jenkins on Kubernetes section which was to add the Jenkins on Kubernetes contents to existing related sections for easier navigation and better user experience.
An example of this approach would be creating the &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/&quot;&gt;Installing Jenkins on Kubernetes&lt;/a&gt; section under the &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/&quot;&gt;Installing Jenkins&lt;/a&gt; section rather than putting it under an entirely new section.
With this new approach, I was assigned a task to create a skeleton with all the proposed Jenkins on Kubernetes sections on Jenkins.io and mark these sections as
Work In Progress (WIP).
The Plan was to use this skeleton as a guide throughout the GSOD Project.
The Jenkins on Kubernetes skeleton PR can be found &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/3845&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;documenting-jenkins-on-kubernetes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documenting-jenkins-on-kubernetes&quot; /&gt;Documenting Jenkins on Kubernetes&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While working on this project, I had to do a lot of research and test all the documented steps locally before pushing the documentation out for review.
I also made sure to use updated terms and terminologies where necessary like Controller instead of Master and Agents instead of Slave.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the documentation phase, I was able to work on documenting &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/&quot;&gt;Installing Jenkins on Kubernetes&lt;/a&gt; with three sections &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#install-jenkins-with-helm-v3&quot;&gt;Helm&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#install-jenkins-with-yaml-files&quot;&gt;Set of Yaml files&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#install-jenkins-with-jenkins-operator&quot;&gt;Jenkins Operator&lt;/a&gt;.
I also worked on creating a directory for Jenkins on kubernetes sample files in Jenkins.io repository, documenting &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/3979&quot;&gt;Scaling Jenkins on Kubernetes&lt;/a&gt; and Jenkins on AWS which is still in progress.&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;work-done&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#work-done&quot; /&gt;Work Done&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Pull Requests&lt;/strong&gt;: All the pull requests I submitted to Jenkins.io documentation can be found &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pulls?q=is%3Apr+author%3Azaycodes&quot;&gt;here&lt;/a&gt;.
This &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1Jvu9HkWmNycjMkGxUkgCQXhkgX4gzvTQsFn7i7c9NUA/edit?usp=sharing&quot;&gt;spreadsheet&lt;/a&gt; contains links to the published documentation on &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;Jenkins.io&lt;/a&gt;.
The &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1Jvu9HkWmNycjMkGxUkgCQXhkgX4gzvTQsFn7i7c9NUA/edit?usp=sharing&quot;&gt;spreadsheet&lt;/a&gt; also highlights the initial proposed tasks and the status of each of them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you would like to contribute to the Jenkins on Kubernetes documentation, you can check out pending tasks &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1Jvu9HkWmNycjMkGxUkgCQXhkgX4gzvTQsFn7i7c9NUA/edit?usp=sharing&quot;&gt;here&lt;/a&gt; and reach out in the Jenkins documentation &lt;a href=&quot;https://app.gitter.im/#/room/#jenkins/docs:matrix.org&quot;&gt;gitter&lt;/a&gt; channel.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges&quot; /&gt;Challenges&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using a Windows computer was a bit of a challenge for me.
To run Jenkins.io locally, the project uses GNU/Make and Docker in order to generate the fully statically generated &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;jenkins.io&lt;/a&gt; web site.
The key tool for converting source code into the site is the &lt;a href=&quot;https://github.com/awestruct/awestruct&quot;&gt;Awestruct&lt;/a&gt; static site generator, which is downloaded automatically as part of the build process.
To achieve this, I needed to have GNU/Make and Docker available on my machine.
Docker was not a problem, but to achieve the latter, I needed to use &lt;a href=&quot;https://docs.microsoft.com/en-us/windows/wsl/install-win10&quot;&gt;Windows Subsystem for Linux&lt;/a&gt; (WSL).
WSL had two versions WSL1 and WSL2. Using WSL2 would have been much more convenient, but my version of windows wasn’t compatible with WSL2 as it required Version 1903 or higher, with Build 18362 or higher for x64 systems.
With this obstacle, I had to stick to making WSL1 work but I still couldn’t get this to work, a series of issues came up which I was able to pass through with the help of my mentors until I got stuck at permission issues.
I raised the issue with my mentor and after looking through the issue with me and trying to solve it to no avail, he suggested setting up an Ubuntu VM in Hyper-V.
This &lt;a href=&quot;https://www.nakivo.com/blog/run-linux-hyper-v/&quot;&gt;article&lt;/a&gt; helped me achieve this and that solved my problem.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-did-i-learn&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-did-i-learn&quot; /&gt;What did I learn?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I learned a lot more about the Jenkins project, Kubernetes, helm package manager, Jenkins Operator and much more.
This project also gave me the opportunity to work with cloud providers like AWS which was totally new to me and also learn from field experts through knowledge sharing sessions and weekly meetings with my mentors and org admin.
My technical writing skill and communication skill have definitely become better and I owe it to this project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overall, contributing to the Jenkins.io project is an amazing experience for me.
I have been using Jenkins, and the fact that I was able to contribute to the organization and collaborate with the community is an honor.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/12/03/election-results/</id>
<title>2020 Jenkins Board and Officer Elections Results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-12-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/12/03/election-results/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
The Jenkins community has recently completed the 2020 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:




Gavin Mogan and Marky Jackson will join
Kohsuke Kawaguchi,  Ullrich Hafner and Oleg Nenashev
on the Jenkins Governance Board


Tim Jacomb was elected as Release Officer


Marky Jackson will become the new Events Officer (uncontested)


Olivier Vernin will continue in the role of Infrastructure Officer for another term (uncontested)


Daniel Beck will continue in the role of Security Officer for another term (uncontested)


Mark Waite will continue in the role...
</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/2020/opengraph.png&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 recently completed the 2020 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://github.com/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt; and &lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky Jackson&lt;/a&gt; will join
&lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;,  &lt;a href=&quot;https://github.com/uhafner&quot;&gt;Ullrich Hafner&lt;/a&gt; and &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&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://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt; was elected as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;Release Officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky Jackson&lt;/a&gt; will become the new &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://github.com/olblak&quot;&gt;Olivier Vernin&lt;/a&gt; will continue in the role of &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#infrastructure&quot;&gt;Infrastructure Officer&lt;/a&gt; for another term (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt; will continue in the role of &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#security&quot;&gt;Security Officer&lt;/a&gt; for another term (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; will continue in the role of &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt; for another term (uncontested)&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 Jenkins&#39; community governance and well-being,
and we are excited to see contributors taking these roles.
If you are interested to learn more, please see the blog post below.&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 &lt;a href=&quot;https://www.jenkins.io/blog/2020/10/28/election-candidates/#governance-board&quot;&gt;nine candidates&lt;/a&gt; participating in Jenkins Governance Board elections:
Andrey Falko, Ewelina Wilkosz, Frederic Gurr, Gavin Mogan, Justin Harringa,
Mark Waite, Marky Jackson, Steven Terrana, and Zhao Xiaojie (Rick).
All of them are awesome community leaders who actively contribute to the Jenkins project and
represent its users.
It would be an honor to have them on the Jenkins board.
Regardless of the election results, we appreciate their participation and the time they invested in these elections.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we were electing 2 governance board members.
We were using the &lt;a href=&quot;https://civs.cs.cornell.edu/&quot;&gt;Condorcet Internet Voting Service&lt;/a&gt; that allows voters to rank their choices rather than just picking their one favorite choice.
You can find full voting results &lt;a href=&quot;https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_f622a8a94f337478&quot;&gt;here&lt;/a&gt;:&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;Mark Waite  (Condorcet winner: wins contests with all other choices)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Marky Jackson&lt;/strong&gt;  loses to Mark Waite by 48–12&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gavin Mogan&lt;/strong&gt;  loses to Mark Waite by 51–10, loses to Marky Jackson by 31–20&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ewelina Wilkosz  loses to Mark Waite by 48–14, loses to Gavin Mogan by 29–28&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Justin Harringa  loses to Mark Waite by 51–11, loses to Ewelina Wilkosz by 35–16&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Steven Terrana  loses to Mark Waite by 47–16, loses to Justin Harringa by 20–19&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zhao Xiaojie (Rick)  loses to Mark Waite by 57–5, loses to Steven Terrana by 25–24&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Frederic Gurr  loses to Mark Waite by 52–10, loses to Zhao Xiaojie (Rick) by 25–24&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Andrey Falko  loses to Mark Waite by 56–6, loses to Frederic Gurr by 26–13&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although Mark Waite came first in the voting results,
being on the board would violate the &lt;a href=&quot;https://www.jenkins.io/project/board-election-process/#corporate-involvement&quot;&gt;Corporate Involvement clause&lt;/a&gt; which states that
&quot;the number of board members affiliated with one company must be less than 50%&quot;.
Mark will continue to be &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation officer&lt;/a&gt;.
Regardless of his official role, Mark has been leading many initiatives and helping a lot with various aspects of the community governance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to Marky and Gavin, and thanks to all candidates!
All new board members are elected for a 2-year term unless they decide to step down earlier.
The estimated end of the term for them is December 02, 2022.
We would also like to thank &lt;a href=&quot;https://github.com/slide&quot;&gt;Alex Earl&lt;/a&gt; and &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt; who step down from the Jenkins Governance Board this year.
Thanks to them for all contributions and for continued community leadership.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Statement from Marky Jackson:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is a tremendous honor to be elected to this roles. I am so humbled.
Being part of this community is a fantastic opportunity that I have had. It has given me so many joys. Whether helping to foster community collaboration, working on the roadmap, leading various SIG’s or helping meetups or conferences, this community has given me so much.
My goals are bridging the Jenkins project with other interoperability projects, defining the roadmap, achieving roadmap goals, continuing to help meetups thrive, and our conferences focus on the community. I want to ensure we are transparent in our goals and how we achieved them. I want to continue to build up a welcoming community that holds diversity and inclusion at the forefront.
I look forward to working with the other members of the Governance Board to continue to deliver on the incredible things this project is known for.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Marky Jackson, Jenkins Governance Board Member and Events Officer
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Statement from Gavin Mogan:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Gavin here. I’m still in shock that I got voted in for the Jenkins board.
It felt like yesterday I just got started helping people randomly on IRC. This is truly exciting.
I plan to continue to help out as much as I can wherever I can, just in a bit more official capacity.
This is truly exciting. I have no firm plans or agenda, just keep pushing advocacy and getting people to help each other in a positive and safe way.
My specialities lie in outside of Jenkins core, whether it be working on the plugin site, or hanging out on IRC, Gitter and Reddit helping out where I can.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Gavin Mogan, Jenkins Governance Board Member
&lt;/div&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 Dec 02, 2021.
After the initial review of nominations and confirmations with potential candidates,
4 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;Olivier Vernin&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;Marky Jackson&lt;/strong&gt; - &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#events&quot;&gt;Events officer&lt;/a&gt;.
Marky inherits this role from &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;
who decided to step down from the officer role and to focus on the Jenkins community marketing,
including &lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;Jenkins Is The Way&lt;/a&gt; and many other initiatives started by Alyssa.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mark Waite&lt;/strong&gt; - &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;li&gt;
&lt;p&gt;&lt;strong&gt;Daniel Beck&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;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Release Officer election results&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt; won the biggest support as a Release officer (&lt;a href=&quot;https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_287cb63d82ce7972&quot;&gt;voting results&lt;/a&gt;).
Tim will replace in this role &lt;a href=&quot;https://github.com/olivergondza&quot;&gt;Oliver Gondža&lt;/a&gt;
who has been leading the Release Team and the release processes since 2016 when the role was officially introduced.&lt;/p&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;Tim Jacomb&lt;/strong&gt;  (Condorcet winner: wins contests with all other choices)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Baptiste Mathus  loses to Tim Jacomb by 40–23&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Victor Martinez  loses to Tim Jacomb by 38–25, loses to Baptiste Mathus by 32–31&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is a statement from Tim Jacomb:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m excited for the year ahead, let’s see where we can take the Jenkins release area in the future.
As a Release Officer I would like to increase automation, ease onboarding of new contributors to the release team,
and ensure that responsibilities rotate among people so that I wouldn’t be a bottleneck for any task.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Tim Jacomb, Jenkins Release Officer
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; and &lt;a href=&quot;https://github.com/olivergondza&quot;&gt;Oliver Gondža&lt;/a&gt; for their long-time service as Jenkins officers!
We are looking to continue working with them in the Jenkins community.
And congratulations to Tim Jacomb and Marky Jackson for joining the team!&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 92 registered voters and around 65 actual votes.
It is significantly lower than in the &lt;a href=&quot;https://www.jenkins.io/blog/2019/12/16/board-election-results/&quot;&gt;2019 elections&lt;/a&gt; when we had almost 350 voters.
It can be partially explained by the change of the communication process.
This year we decided to not use the previous &lt;a href=&quot;https://www.jenkins.io/blog/2019/11/08/board-elections/&quot;&gt;voter registration system&lt;/a&gt;,
and we relied on the user and developer mailing lists instead of sending messages to the entire LDAP user database.
This is definitely something we need to review at the retrospective.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next-for-the-board&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next-for-the-board&quot; /&gt;What’s next for the board?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last year was awesome for the Jenkins project governance.
With help of many contributors and with the renewed board,
we have been able to facilitate many initiatives in the Jenkins project,
for example hosting contributor summits,
publishing the &lt;a href=&quot;https://www.jenkins.io/project/roadmap/&quot;&gt;public roadmap&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/project/conduct/&quot;&gt;Code of Conduct update&lt;/a&gt;,
&lt;a href=&quot;https://cd.foundation/blog/2020/08/25/jenkins-terminology-changes/&quot;&gt;terminology changes&lt;/a&gt;,
and &lt;a href=&quot;https://www.jenkins.io/blog/2020/08/04/cdf-graduation/&quot;&gt;graduation in the Continuous Delivery Foundation&lt;/a&gt;.
There is a lot more work to do to grow the community and to ensure the long term sustainability of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In short term, our key priority is to organize knowledge and permission transfers to the new board members and officers so that they can be effective in their new roles.
The board will also focus on maintaining the Jenkins governance processes
(meetings, budget approvals, funding, etc.) and defining the next steps and priorities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are many longer-term initiatives the board could facilitate:
long-anticipated features and architecture changes,
changing the &lt;a href=&quot;https://github.com/jenkinsci/jep&quot;&gt;Jenkins Enhancement Proposal&lt;/a&gt; process,
creating better communication channels with Jenkins users,
and onboarding of new contributors and maintainers.
Such initiatives are instrumental for the evolution of the Jenkins project.
The ideas will be discussed in &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;mailing lists&lt;/a&gt; and during governance meetings.
If you would like to share your vision and ideas about what’s needed in the project,
it is definitely a great time to contribute!&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;Jenkins project plans to conduct elections every year.
We will appreciate and welcome any feedback regarding the election process so that we can improve the process.
We have started a &lt;a href=&quot;https://docs.google.com/document/d/1VUpcn-ISyhN1ueSHa7rDOLxYrTABC5vKPXPiqBe87DI/edit?usp=sharing&quot;&gt;Retrospective document&lt;/a&gt; for these elections.
Everyone can suggest changes in this document, and we will integrate them.
There will be also a public retrospective review at the next &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/&quot;&gt;Advocacy and Outreach SIG&lt;/a&gt; meeting on Dec 17.&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 send an email to 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 class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&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/project/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/project/board-election-process&quot;&gt;Jenkins Board Election Process&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/project/team-leads&quot;&gt;Jenkins Officers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2020/09/24/board-elections/&quot;&gt;2020 election announcement&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2020/10/28/election-candidates&quot;&gt;2020 election candidates&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1VUpcn-ISyhN1ueSHa7rDOLxYrTABC5vKPXPiqBe87DI/edit?usp=sharing&quot;&gt;Retrospective document&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/2020/11/10/spring-xstream/</id>
<title>Spring and XStream updates (breaking changes!)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-11-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/11/10/spring-xstream/" />
<author>
<name>jglick</name>
</author>
<category term='jenkins'></category>
<category term='core'></category>
<category term='developer'></category>
<summary>
Cleaning up technical debt is a perennial topic among Jenkins core developers,
and one of the most visible issues is the use of obsolete and/or forked third-party libraries.
In a world where Dependabot is offering updates to libraries released just hours before,
it is unpleasant to be working with dependencies that are many years old.
Since large organizations in particular are unhappy to install software using obsolete or nonstandard versions,
my employer (CloudBees) gave its blessing for me to spend some time cleaning up some of the worst offenders.


The toughest nut to crack was the Acegi Security library used for authentication,
which has long since been...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cleaning up technical debt is a perennial topic among Jenkins core developers,
and one of the most visible issues is the use of obsolete and/or forked third-party libraries.
In a world where Dependabot is offering updates to libraries released just hours before,
it is unpleasant to be working with dependencies that are many years old.
Since large organizations in particular are unhappy to install software using obsolete or nonstandard versions,
my employer (CloudBees) gave its blessing for me to spend some time cleaning up some of the worst offenders.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The toughest nut to crack was the Acegi Security library used for authentication,
which has long since been replaced by Spring Security
(and Jenkins was also bundling a long-outdated version of some Spring Framework dependencies).
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/227/README.adoc&quot;&gt;JEP-227&lt;/a&gt; tracks the complicated task of updating to Spring Security
without breaking the numerous plugins that interact with authentication,
especially those offering a &lt;strong&gt;Security Realm&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another longstanding problem was the XStream library which Jenkins uses to read and write XML configuration files.
This had been forked long ago by what was then the Hudson project and a few fixes applied.
Unfortunately, some of those fixes were rejected upstream as invalid (representing unsupported usage patterns),
and the fork fell behind the upstream version.
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/228/README.adoc&quot;&gt;JEP-228&lt;/a&gt; describes the impact of switching to the upstream library in a more standard usage mode,
including fixes to a smaller number of plugins which would otherwise be incompatible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that the Jenkins 2.266 weekly release includes both updates,
it is important for both Jenkins administrators and plugin maintainers to check for actual or potential incompatibilities.
There are two tables listing the impact of these changes on plugins:&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/jep/blob/master/jep/227/compatibility.adoc&quot;&gt;Spring Security compatibility&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/228/compatibility.adoc&quot;&gt;XStream compatibility&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;If you &lt;strong&gt;use Jenkins&lt;/strong&gt; then it is a good idea before upgrading to take a look at these tables
to see if you are running any plugins considered &lt;em&gt;incompatible&lt;/em&gt;.
If so, try not to rely on that plugin, or find out if there is an active maintainer who could help.
For entries marked &lt;em&gt;unknown&lt;/em&gt;, it would be appreciated if you could do a sanity check after upgrading
and offer a pull request to the table page (click &lt;strong&gt;Edit this file&lt;/strong&gt;) with a more informative status.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you find a regression in a plugin, please file a bug report in Jira and link to it from the table.
Also please add a &lt;code&gt;JEP-227&lt;/code&gt; or &lt;code&gt;JEP-228&lt;/code&gt; label as appropriate, for ease of tracking:&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://issues.jenkins.io/issues/?jql=resolution%20%3D%20Unresolved%20and%20labels%20in%20(JEP-227)&quot;&gt;Open JEP-227 issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=resolution%20%3D%20Unresolved%20and%20labels%20in%20(JEP-228)&quot;&gt;Open JEP-228 issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;It is a good idea to update all your plugins &lt;em&gt;before&lt;/em&gt; upgrading Jenkins core.
In the case of the Spring Security update, some security realm plugins including LDAP and Active Directory must be updated in advance.
(You can safely run the new plugin versions on Jenkins releases &lt;em&gt;prior&lt;/em&gt; to this change.)
Otherwise, you risk being unable to log in to Jenkins—and thus unable to update those plugins from the GUI!
The LDAP plugin additionally has a new version available only after the core upgrade, but there is no rush in switching to that.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you &lt;strong&gt;maintain a Jenkins plugin&lt;/strong&gt; then please check whether it is marked anything less than &lt;em&gt;compatible&lt;/em&gt;.
In some cases, there are already pull requests awaiting merge.
In other cases, some minor aspects of the source code have been identified that could be edited to improve compatibility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We expect to see a bit of disruption from these changes
but hope that in the long run they will save time for core and plugin developers
and lead to a more secure and stable tool.
Please reach out on the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;developers’ list&lt;/a&gt; with any questions or suggestions.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/11/10/major-changes-in-weekly-releases/</id>
<title>Jenkins 2.264+: Major changes in the weekly release line</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-11-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/11/10/major-changes-in-weekly-releases/" />
<author>
<name>markewaite</name>
</author>
<category term='jenkins'></category>
<category term='core'></category>
<category term='testing'></category>
<category term='ui'></category>
<summary>
Recently we have selected Jenkins 2.263 as a new baseline for the LTS release line, with ETA in December 2020.
It allows delivering significant and in some cases breaking changes which have been previously on hold.
Beginning with the Jenkins 2.264 release on October 27, 2020, we&#8217;ve entered a period where the Jenkins weekly releases will include more significant changes than usual.
That period of more significant changes is expected to continue for a month or more.
As you may have seen from the release community ratings, there might be regressions and instabilities during this period.


We&#8217;re excited for the changes.
They help to improve user...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently we have &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/AWOPeU4k0DI&quot;&gt;selected Jenkins 2.263 as a new baseline&lt;/a&gt; for the &lt;a href=&quot;https://www.jenkins.io/download/lts/&quot;&gt;LTS release line&lt;/a&gt;, with ETA in December 2020.
It allows delivering significant and in some cases breaking changes which have been previously on hold.
Beginning with the Jenkins 2.264 release on October 27, 2020, we’ve entered a period where the Jenkins weekly releases will include more significant changes than usual.
That period of more significant changes is expected to continue for a month or more.
As you may have seen from the &lt;a href=&quot;https://www.jenkins.io/changelog/&quot;&gt;release community ratings&lt;/a&gt;, there might be regressions and instabilities during this period.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re excited for the changes.
They help to improve user experience and to address the technical debt accumulated in the Jenkins core.
We invite Jenkins users to evaluate those changes and provide feedback.
This is an especially valuable time for users and administrators to test the weekly releases and report issues with them,
especially on Jenkins test environments.
In the Jenkins project we have invested a lot in test coverage for the main functionality,
but in many cases we rely on user feedback for exotic plugins and environments not yet covered by our test automation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The most notable changes include:&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;#configuration-ui-tables-to-divs&quot;&gt;Configuration UI - Tables to Divs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#core-spring-security-replaces-acegi-security&quot;&gt;Core - Spring Security replaces Acegi Security&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#core-xstream-unfork&quot;&gt;Core - XStream unfork&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#ui-jquery-upgrade&quot;&gt;UI - JQuery upgrade&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;configuration-ui-tables-to-divs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-ui-tables-to-divs&quot; /&gt;Configuration UI - Tables to Divs&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.264 is the first weekly release to include the &quot;Tables to Divs migration&quot; user interface work of &lt;a href=&quot;https://github.com/jsoref/&quot;&gt;Josh Soref&lt;/a&gt;, &lt;a href=&quot;https://github.com/timja/&quot;&gt;Tim Jacomb&lt;/a&gt;, and &lt;a href=&quot;https://github.com/fqueiruga&quot;&gt;Felix Queiruga&lt;/a&gt;.
It is a significant step to improve forms in the Jenkins user interface (configuration pages, build parameters, etc.), especially for users on narrow devices like tablets and phones.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-better-user-interface&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-better-user-interface&quot; /&gt;A better user interface&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The transition from using HTML &lt;code&gt;table&lt;/code&gt; tags to using HTML &lt;code&gt;div&lt;/code&gt; tags provides a more attractive user interface for all users and a much better experience for users on narrower devices.
Before the conversion from table tags to div tags, the &lt;strong&gt;&quot;Manage Jenkins&quot;&lt;/strong&gt; page looked like this in a 1024x768 window:&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/2020-11-10-major-changes-in-weekly-releases/ui-using-tables.png&quot; alt=&quot;Before the pull request&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the conversion, the &lt;strong&gt;&quot;Manage Jenkins&quot;&lt;/strong&gt; page now looks like this:&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/2020-11-10-major-changes-in-weekly-releases/ui-using-divs.png&quot; alt=&quot;After the pull request&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The user interface improvements from the transition are a nice step forward for Jenkins.
However, because the user interface improvements require changes in plugins, we need your help.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We need users to test the latest weekly Jenkins releases with the plugins and configurations that are most important to them.
When users detect an issue, we need them to &lt;a href=&quot;https://www.jenkins.io/participate/report-issue/&quot;&gt;report the issue&lt;/a&gt; with enough detail that a plugin maintainer can fix the issue.
Please add the &lt;code&gt;tables-to-divs-regression&lt;/code&gt; label to the issues.
The &lt;code&gt;tables-to-divs-regression&lt;/code&gt; label makes it easier to find issues related to the tables to divs transition.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;plugin-developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-developers&quot; /&gt;Plugin developers&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several plugins have already been identified that may need changes.
See the &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62437&quot;&gt;Jira epic&lt;/a&gt; for plugins that are likely to need changes for the new user interface layout.
The list of &lt;a href=&quot;https://issues.jenkins.io/issues/?filter=22840&quot;&gt;open &lt;code&gt;tables-to-divs-regression&lt;/code&gt; issues&lt;/a&gt; can also be used to see plugins that need changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you can assist with plugin testing and code changes, select one of the plugins from that epic, test it, and propose a pull request to help with this user interface transition.
If you’re not comfortable proposing a pull request, describe the problems you see in a bug report.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.jenkins.io/doc/developer/views/table-to-div-migration/&quot;&gt;tables to divs migration guide&lt;/a&gt; is available.
It describes areas that typically need to be changed as part of the migration from tables to divs.
It also includes detailed examples that allow the plugin to continue supporting older Jenkins versions with table layouts and use div layouts for newer Jenkins versions.&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;core-spring-security-replaces-acegi-security&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#core-spring-security-replaces-acegi-security&quot; /&gt;Core - Spring Security replaces Acegi Security&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins 2.266 release on November 10, 2020 will include the migration to the Spring Security libraries from the Acegi security libraries that &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; has proposed and developed through &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/227/README.adoc&quot;&gt;JEP-227: Jenkins Enhancement Proposal 227&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This upgrade replaces the Acegi Security library with the current release of the Spring Security library.
Details of the change are described in &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/227/README.adoc&quot;&gt;JEP-227&lt;/a&gt; and in the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/4848&quot;&gt;pull request&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We need users to test the latest Jenkins weekly releases with their plugins and watch for issues related to authentication.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://www.jenkins.io/blog/2020/11/10/spring-xstream/&quot;&gt;Jesse Glick’s blog post&lt;/a&gt; that introduces the details of the change and provides links to the &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/227/compatibility.adoc&quot;&gt;Spring Security compatibility&lt;/a&gt; table.
Jesse’s blog post provides specific instructions for those who report bugs related to this change.
Please use those instructions as you submit bug reports related to the Spring Security upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;core-xstream-unfork&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#core-xstream-unfork&quot; /&gt;Core - XStream unfork&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has been using a fork of the XStream serialization library to read and write XML files.
The XStream library was forked over 10 years ago and had a few fixes applied to it.
Unfortunately, at that time the fixes were rejected by the upstream maintainers of XStream (unsupported patterns of API use) and the fork fell behind the upstream version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins 2.266 release on November 10, 2020 will include the migration to the upstream version of the XStream library that &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; has proposed and developed through &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/228/README.adoc&quot;&gt;JEP-228: Jenkins Enhancement Proposal 228&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://www.jenkins.io/blog/2020/11/10/spring-xstream/&quot;&gt;Jesse Glick’s blog post&lt;/a&gt; that introduces the details of the change and provides links to the &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/228/compatibility.adoc&quot;&gt;XStream compatibility&lt;/a&gt; table.
Jesse’s blog post provides specific instructions for those who report bugs related to this change.
Please use those instructions as you submit bug reports related to the XStream upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ui-jquery-upgrade&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ui-jquery-upgrade&quot; /&gt;UI - JQuery upgrade&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins uses a 1.x version of the &lt;a href=&quot;https://jquery.com/&quot;&gt;jQuery user interface library&lt;/a&gt; for some of its components.
&lt;a href=&quot;https://github.com/fqueiruga&quot;&gt;Felix Queiruga&lt;/a&gt; has started the work to update that library to a current jQuery version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It will arrive in a future Jenkins weekly release.
When it arrives, it will be noted in the &lt;a href=&quot;https://www.jenkins.io/changelog/&quot;&gt;Jenkins weekly changelog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the jQuery update arrives, We will need users to test the Jenkins weekly release with the plugins and configurations that are most important to them.
When users detect an issue, we need them to &lt;a href=&quot;https://www.jenkins.io/participate/report-issue/&quot;&gt;report the issue&lt;/a&gt; with enough detail that a plugin maintainer can fix the issue.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;call-to-test&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#call-to-test&quot; /&gt;Call to test&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a great time to help the Jenkins project by testing the weekly releases.
We encourage you to test the user interface and the interactions that are most important to you.
If you find an issue, please &lt;a href=&quot;https://www.jenkins.io/participate/report-issue/&quot;&gt;report the issue&lt;/a&gt; so that others can benefit from your discovery.&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/2020/11/05/installing-jenkins-on-kubernetes/</id>
<title>Document Jenkins on Kubernetes: Installing Jenkins on Kubernetes Documentation Release</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-11-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/11/05/installing-jenkins-on-kubernetes/" />
<author>
<name>zaycodes</name>
</author>
<category term='kubernetes'></category>
<category term='helm'></category>
<category term='documentation'></category>
<category term='gsod'></category>
<category term='gsod2020'></category>
<summary>
We are super excited to announce that the Document Jenkins on Kubernetes Project recently merged its first PR into Jenkins.io.
This PR adds a new Kubernetes section to the existing Installing Jenkins chapter of Jenkins.io.





This new section describes two options to install/run Jenkins on Kubernetes, how to setup a minikube cluster on which to run your Jenkins deployment and finally a bonus segment that explains some Post-installation setups such as unlocking Jenkins, customizing Jenkins with plugins and creating your first administrator user.


The first installation option covered in this section is helm a package manager for Kubernetes whose package format is called...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are super excited to announce that the &lt;a href=&quot;https://www.jenkins.io/sigs/docs/gsod/2020/projects/document-jenkins-on-kubernetes/&quot;&gt;Document Jenkins on Kubernetes Project&lt;/a&gt; recently merged its first PR into Jenkins.io.
This &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/3822&quot;&gt;PR&lt;/a&gt; adds a new &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/&quot;&gt;Kubernetes&lt;/a&gt; section to the existing &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/&quot;&gt;Installing Jenkins&lt;/a&gt; chapter of Jenkins.io.&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/2020/2020-10-30-installing-jenkins-on-kubernetes/installing-jenkins-on-kubernetes-section.png&quot; alt=&quot;Installing Jenkins on Kubernetes Section&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This new section describes two options to install/run Jenkins on Kubernetes, &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#create-a-minikube-cluster&quot;&gt;how to setup a minikube cluster&lt;/a&gt; on which to run your Jenkins deployment and finally a bonus segment that explains some &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#setup-wizard&quot;&gt;Post-installation setups&lt;/a&gt; such as &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#unlocking-jenkins&quot;&gt;unlocking Jenkins&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#customizing-jenkins-with-plugins&quot;&gt;customizing Jenkins with plugins&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#creating-the-first-administrator-user&quot;&gt;creating your first administrator user&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first installation option covered in this section is &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#install-jenkins-with-helm-v3&quot;&gt;helm&lt;/a&gt; a package manager for Kubernetes whose package format is called a chart. The &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#install-jenkins-with-helm-v3&quot;&gt;helm section&lt;/a&gt; covers the prerequisites for installing Jenkins on Kubernetes using Helm, installing and configuring helm, creating a persistent volume and service account, and finally, Installing Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second option describes how to &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#install-jenkins-with-yaml-files&quot;&gt;install Jenkins using a set of yaml files&lt;/a&gt;.
This section explains how to &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#create-jenkins-deployment-file&quot;&gt;create a Jenkins deployment file&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#deploy-jenkins&quot;&gt;Deploy Jenkins&lt;/a&gt;, grant access to jenkins service, and finally &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/kubernetes/#access-jenkins-dashboard&quot;&gt;access your Jenkins dashboard after installation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;splitting-the-installing-jenkins-chapter&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#splitting-the-installing-jenkins-chapter&quot; /&gt;Splitting the Installing Jenkins Chapter&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The addition of the Kubernetes section highlighted a long-standing challenge with the &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/&quot;&gt;Installing Jenkins&lt;/a&gt; chapter.
It was too long and contained too many topics, making it difficult and unpleasant for
most users to navigate.
To top the icing on the cake and further improve the experience on Jenkins documentation users, another &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/3874&quot;&gt;PR&lt;/a&gt; was merged into Jenkins.io to split the Installing Jenkins chapter into smaller chapters for better separation of concerns and easy navigation. This PR also redirects bookmarks that linked to the previous locations like &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/#debianubuntu&quot;&gt;&quot;Installing Jenkins on Debian and Ubuntu&quot;&lt;/a&gt; using Javascript.&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/2020/2020-10-30-installing-jenkins-on-kubernetes/installing-jenkins-chapter-before-splitting.png&quot; alt=&quot;Installing Jenkins chapter before the PR&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The image above is a snapshot of what the &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/&quot;&gt;Installing Jenkins&lt;/a&gt; chapter looked like before the PR.
All sections of this chapter such as &lt;strong&gt;docker, Kubernetes and others&lt;/strong&gt; were lumped up on the same page making it too long with so much information thereby making it difficult to navigate or even find information on this page.&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/2020/2020-10-30-installing-jenkins-on-kubernetes/installing-jenkins-chapter-after-splitting.png&quot; alt=&quot;Installing Jenkins chapter after the PR&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This snapshot shows what the Installing Jenkins chapter looks like after the PR.
With this chapter split into smaller sections, it’s neater, clearer and most importantly easier to navigate to the section of interest without having to scroll through so much information that’s not necessarily needed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;testing-participating-and-contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-participating-and-contributing&quot; /&gt;Testing, Participating and Contributing&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Community invites the general public to try out these documentation updates and give feedback to help us further improve the documentation.
If you have any feedback, suggestions, or would like to contribute to the Jenkins on Kubernetes project,  drop a message indicating your interest in the Jenkins documentation &lt;a href=&quot;https://app.gitter.im/&amp;lt;mark&amp;gt;/room/#jenkins/docs:matrix.org&quot;&gt;Gitter&lt;/a&gt; channel.
You can also find the Google season of docs office hour notes and recordings for Jenkins on Kubernetes &lt;a href=&quot;https://docs.google.com/document/d/17cPLUrJ4Ul4Y8MREjDyfWBEN7PlnlrmPh6wuKMPFmPg/edit?usp=sharing&quot;&gt;here&lt;/a&gt;.
GSOD office hours take place twice a week on Mondays and Thursdays between 6 pm GMT+1 and 7 pm GMT+1, if you would like to be part of these meetings, you can indicate interest in the Jenkins Documentation &lt;a href=&quot;https://app.gitter.im/&amp;lt;/mark&amp;gt;/room/#jenkins/docs:matrix.org&quot;&gt;Gitter&lt;/a&gt; channel and we would be happy to have you.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;additional-resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#additional-resources&quot; /&gt;Additional Resources&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://github.com/jenkins-infra/jenkins.io/pull/3822&quot;&gt;Installing Jenkins on Kubernetes 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/jenkins.io/pull/3874&quot;&gt;Splitting Installing Jenkins Chapter PR&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/sigs/docs/gsod/2020/projects/document-jenkins-on-kubernetes/&quot;&gt;Document Jenkins on Kubernetes Project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1zTEKtOp2i1K2fw5RQ_a_KVOB2z0gz9987NYzTnIS6G8/edit?usp=sharing&quot;&gt;GSoD Proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/17cPLUrJ4Ul4Y8MREjDyfWBEN7PlnlrmPh6wuKMPFmPg/edit?usp=sharing&quot;&gt;GSoD Office Hours Notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1m0rTrXk7WisPXUeaKGj81dOFO2CcW4o_Nvo7NvcoL98/edit?usp=sharing&quot;&gt;Google Season of Docs - Startup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/sigs/docs/gsod/&quot;&gt;Google Season of Docs&lt;/a&gt; on jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1uNNo0QJKPHnNp8PGr_jLI8p3K_94ZYD-M0evZOEZ93c/edit#heading=h.8q8l1ah569xk&quot;&gt;Docs SIG&lt;/a&gt; for Google Season of Docs startup (&lt;a href=&quot;https://www.youtube.com/watch?v=sY2gI47zho8&amp;amp;list=PLN7ajX_VdyaNp0lk5BmyAgqPS52u_4tC8&quot;&gt;video&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/2020/11/04/codeql/</id>
<title>First results from using GitHub CodeQL to discover security vulnerabilities in Jenkins plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-11-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/11/04/codeql/" />
<author>
<name>daniel-beck</name>
</author>
<category term='jenkins'></category>
<category term='security'></category>
<summary>
A little over a month ago, GitHub announced the general availability of its code scanning solution.
It&#8217;s based on CodeQL, which makes it pretty easy to write queries for it and run them using the CodeQL GitHub action, CodeQL command line tools, or on lgtm.com.


Many of the security vulnerabilities discovered in Jenkins plugins are fairly similar to each other, and unfortunately they&#8217;re usually specific to Jenkins, which means existing generic tools would not be able to discover them.
So I decided to write CodeQL queries for Jenkins-specific issues and invited maintainers to sign their plugins up for a "private beta" of code...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A little over a month ago, &lt;a href=&quot;https://github.blog/2020-09-30-code-scanning-is-now-available/&quot;&gt;GitHub announced the general availability of its code scanning solution&lt;/a&gt;.
It’s based on &lt;a href=&quot;https://github.com/github/codeql&quot;&gt;CodeQL&lt;/a&gt;, which makes it pretty easy to write queries for it and run them using the CodeQL GitHub action, CodeQL command line tools, or on &lt;a href=&quot;https://lgtm.com&quot;&gt;lgtm.com&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many of the security vulnerabilities discovered in Jenkins plugins are fairly similar to each other, and unfortunately they’re usually specific to Jenkins, which means existing generic tools would not be able to discover them.
So I decided to write CodeQL queries for Jenkins-specific issues and &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/0hw97zAdUMw/zt4TeGV7AQAJ&quot;&gt;invited maintainers to sign their plugins up for a &quot;private beta&quot;&lt;/a&gt; of code scanning for these issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today’s security advisory is the first one that includes findings discovered through that initiative.
All these issues were discovered with assistance by this tooling:&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/security/advisory/2020-11-04/#SECURITY-2101&quot;&gt;SECURITY-2101&lt;/a&gt; in &lt;a href=&quot;https://plugins.jenkins.io/aws-global-configuration&quot;&gt;AWS Global Configuration Plugin&lt;/a&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2020-11-04/#SECURITY-2102&quot;&gt;SECURITY-2102&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/security/advisory/2020-11-04/#SECURITY-2103&quot;&gt;SECURITY-2103&lt;/a&gt; in &lt;a href=&quot;https://plugins.jenkins.io/kubernetes&quot;&gt;Kubernetes Plugin&lt;/a&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2020-11-04/#SECURITY-2104&quot;&gt;SECURITY-2104&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/security/advisory/2020-11-04/#SECURITY-2115&quot;&gt;SECURITY-2115&lt;/a&gt; in &lt;a href=&quot;https://plugins.jenkins.io/mercurial&quot;&gt;Mercurial Plugin&lt;/a&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2020-11-04/#SECURITY-2110&quot;&gt;SECURITY-2110&lt;/a&gt; in &lt;a href=&quot;https://plugins.jenkins.io/azure-keyvault&quot;&gt;Azure Key Vault Plugin&lt;/a&gt;, and&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2020-11-04/#SECURITY-2126&quot;&gt;SECURITY-2126&lt;/a&gt; in &lt;a href=&quot;https://plugins.jenkins.io/active-directory&quot;&gt;Active Directory 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;While there were of course also false positives we had to review and mark as ignored, the integration with the GitHub UI made this pretty straightforward.
Overall I’m very happy with the results so far, especially considering how new this initiative is.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Interested in making the plugin you are maintaining more secure?
Sign up now by &lt;a href=&quot;https://issues.jenkins.io/browse/INFRA&quot;&gt;filing an INFRA issue&lt;/a&gt; in the &lt;code&gt;github&lt;/code&gt; component and list the plugin repositories you’d like to have scanned.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/10/28/election-candidates/</id>
<title>2020 Elections: Governance Board and Officer candidates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-10-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/10/28/election-candidates/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
Jenkins 2020 Elections are over, thanks to all participants!
Please see the results announcement .





As you probably know, in a few weeks we will have the Jenkins 2020 elections.
We will be electing two governance board members and five officers,
namely: Security, Events, Release, Infrastructure, and Documentation.
After the announcement on Sep 24,
we have been accepting nominations from community members.


After the processing and confirmations with potential candidates,
the Jenkins 2020 Elections committee is happy to announce the candidates for the Jenkins Governance Board and Officer roles:




Governance Board candidates: Andrey Falko, Ewelina Wilkosz, Frederic Gurr, Gavin Mogan, Justin Harringa, Mark Waite, Marky Jackson, Steven Terrana, Zhao...
</summary>
<content type='html'>
&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;
Jenkins 2020 Elections are over, thanks to all participants!
Please see the &lt;a href=&quot;https://www.jenkins.io/blog/2020/12/03/election-results&quot;&gt;results announcement &lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you probably know, in a few weeks we will have the Jenkins 2020 elections.
We will be electing two &lt;a href=&quot;https://www.jenkins.io/project/board&quot;&gt;governance board&lt;/a&gt; members and five &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;officers&lt;/a&gt;,
namely: Security, Events, Release, Infrastructure, and Documentation.
After the &lt;a href=&quot;https://www.jenkins.io/blog/2020/09/24/board-elections/&quot;&gt;announcement on Sep 24&lt;/a&gt;,
we have been accepting nominations from community members.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the processing and confirmations with potential candidates,
the Jenkins 2020 Elections committee is happy to announce the candidates for the Jenkins Governance Board and Officer roles:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Governance Board candidates: Andrey Falko, Ewelina Wilkosz, Frederic Gurr, Gavin Mogan, Justin Harringa, Mark Waite, Marky Jackson, Steven Terrana, Zhao Xiaojie (Rick)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release officer: Baptiste Mathus, Tim Jacomb, Victor Martinez&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security officer: Daniel Beck (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events officer: Marky Jackson (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure Officer: Olivier Vernin (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation officer: Mark Waite (uncontested)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage all community members to support the candidates and to participate in the elections!&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;a class=&quot;image&quot; href=&quot;https://forms.gle/y3qDo8EM8iQnd3fY9&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/register-button.png&quot; alt=&quot;register button&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-dates&quot; /&gt;Key dates&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;Nov 10&lt;/strong&gt; - Voting begins. &lt;a href=&quot;https://civs.cs.cornell.edu/&quot;&gt;Condorcet Internet Voting Service&lt;/a&gt; will be used for voting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nov 24&lt;/strong&gt; - Voting sign-up is over.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nov 27&lt;/strong&gt; - Voting ends, 11PM UTC.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dec 03&lt;/strong&gt; - Election results are announced and take effect.&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;signing-up-for-voting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#signing-up-for-voting&quot; /&gt;Signing up for voting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Any Jenkins individual contributor is eligible to vote in the election
if there was a contribution made before September 01, 2020.
&lt;em&gt;Contribution&lt;/em&gt; does not mean a &lt;em&gt;code contribution&lt;/em&gt;,
all contributions count:
documentation patches,
code reviews,
substantial issue reports,
issues and mailing list responses,
social media posts,
testing,
etc.
Such a contribution should be public.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can register to vote in one of two ways:&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;Fill out &lt;a href=&quot;https://forms.gle/y3qDo8EM8iQnd3fY9&quot;&gt;this Google Form&lt;/a&gt;.
This way requires logging into your Google Account to verify authenticity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Send an email to &lt;a href=&quot;mailto:jenkins-2020-elections@googlegroups.com&quot;&gt;jenkins-2020-elections@googlegroups.com&lt;/a&gt;.
You will need to provide the information specified &lt;a href=&quot;https://www.jenkins.io/project/board-election-process/#voter-sign-up-and-eligibility&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once sign-up is over, the election committee will process the form submissions and prepare a list of the registered voters.
In the case of rejection, one of the election committee members will send a rejection email.
Every individual contributor is expected to vote only once.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;candidates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#candidates&quot; /&gt;Candidates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below you can find statements, affiliations and profile links provided by the candidates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Minimum copy-editing was applied to the content by the Jenkins 2020 Elections Committee.
Candidates are sorted by the first name.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;governance-board&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#governance-board&quot; /&gt;Governance Board&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;andrey-falko&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#andrey-falko&quot; /&gt;Andrey Falko&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been a Jenkins user and administrator on and off since around 2010.
In 2016, I got into evangelism by organizing a
&lt;a href=&quot;https://www.meetup.com/76594722-7914-4a11-b924-f727428c938a/events/234424002/&quot;&gt;Jenkins Area Meetup in San Francisco&lt;/a&gt;.
I spoke at &lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/BcIk/devops-leadership-panel&quot;&gt;Jenkins World 2017&lt;/a&gt; 
and again at
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/event/FD6C/auto-cascading-security-updates-through-docker-images&quot;&gt;Jenkins World 2018&lt;/a&gt;.
Justin Harringa and I wrote and open sourced the &lt;a href=&quot;https://plugins.jenkins.io/config-driven-pipeline/&quot;&gt;Config Driven Pipeline Plugin&lt;/a&gt;.
For two years running, I’ve been a mentor for two Google Summer of Code projects:
&lt;a href=&quot;https://www.jenkins.io/blog/2020/06/27/external-fingerprint-storage/&quot;&gt;External Fingerprint Storage Project&lt;/a&gt; and
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/remoting-over-apache-kafka-docker-k8s-features/&quot;&gt;Remoting over Apache Kafka with Kubernetes features&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this nomination, I hope to continue helping strengthen and
progress the community further. As a member of the governance board,
I’ll bring a fresh perspective by asking questions, providing feedback,
and finding opportunities for others to contribute.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/afalko&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/andrey-falko&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Stripe&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;ewelina-wilkosz&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ewelina-wilkosz&quot; /&gt;Ewelina Wilkosz&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a consultant I support my customers with their Jenkins issues since the beginning of 2017.
And almost from the start it was some kind of &quot;as code&quot; approach.
The experience I gained during that time resulted in getting myself involved in the development of Configuration as Code Plugin for Jenkins.
I consider becoming a part of Jenkins Community one of the most valuable experiences in my career so far.
I appreciate how much I have learned and how welcoming the community is.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am not a very active contributor these days, at least when it comes to code, but what I have to offer is rather extensive experience
with Jenkins end users - from small, single instance setups to environments with hundreds of controllers run in a different way on different operating systems.
Every day I see challenges those users go through, I know what issues they are facing and which features they consider valuable or missing.
As a Jenkins Governance Board Member I can represent those users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to my involvement in Configuration as Code Plugin development
I had a chance to deliver a number of public presentations
where I focused on the benefits of the solution and tried to make it easier for newcomers to try it.
Here are a few examples of my activities related to Jenkins Configuration as Code:
&lt;a href=&quot;https://www.praqma.com/stories/start-jenkins-config-as-code/&quot;&gt;blogpost&lt;/a&gt;,
&lt;a href=&quot;https://www.youtube.com/watch?v%3DwTzljM-EDjI&quot;&gt;cdCON presentation&lt;/a&gt;,
&lt;a href=&quot;https://open.spotify.com/episode/4beEdOeirazc65AdEARIOM?si%3DY63V4gBDT02_UBMQ3vahvg&quot;&gt;podcast recording&lt;/a&gt;.
So my focus is not only on representing users but also on educating them, and educating myself,
so I actually know what they need and why.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/ewelinawilkosz/&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/ewelinawilkosz/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/EwelinaWilkosz&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Eficode (former Praqma)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;frederic-gurr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#frederic-gurr&quot; /&gt;Frederic Gurr&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started to use Jenkins back in 2008, when it still had a different name.
In 2011 I started to contribute and created my first little plugin called
&lt;a href=&quot;https://plugins.jenkins.io/extra-columns/&quot;&gt;extra-columns&lt;/a&gt;.
Since then, using and administering Jenkins servers has become a major part of my work life,
while getting involved with the Jenkins community
kickstarted my interest and involvement with open source software and communities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been working as a release engineer at the &lt;a href=&quot;https://www.eclipse.org/&quot;&gt;Eclipse Foundation&lt;/a&gt; since 2016,
supporting 250+ Jenkins instances for various open source projects.
I’d be honored to bring a user and admin oriented perspective to the Governance Board and help
shape the future of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/fredg02&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/fr3dg&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Eclipse Foundation&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;gavin-mogan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gavin-mogan&quot; /&gt;Gavin Mogan&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I got started with Jenkins early on when I was just getting started with testing.
I knew there had to be a way to run the tests automatically and report on them back to people.
I started hacking my own tools before I came across Jenkins (then Hudson) and was hooked ever since.
Over the years I’ve managed to install and configure Jenkins at various jobs,
and even was employed making internal and external plugins and integrations.
You’ll often find me on the Jenkins IRC and Gitter channels as well as the subreddit giving a hand to people who are stuck.
I also try to get involved with Jenkins Infrastructure projects as much as I can.
I currently maintain the plugin site, plugin site API, Jenkins Wiki exporter, and a bunch of other minor projects.
I also help run Vancouver’s chapter of Nodeschool.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If elected, I would like to address improving commercial support avenues.
Right now it’s a lot of people flailing in isolation.
I would like to not only improve things so people can find easier ways to get help,
but also encourage more users to help others, and push for a
centralized source of companies providing commercial support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/halkeye&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/halkeye&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Digital Ocean, Nodeschool Vancouver&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;justin-harringa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#justin-harringa&quot; /&gt;Justin Harringa&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nomination is quite an honor for me.
I have been a Hudson/Jenkins user since around 2009/2010 when
I started working through driving continuous integration in a corporate environment at John Deere.
As time went on, I began contributing some small fixes to plugins such as the Job DSL Plugin, OpenID Plugin, and the Workflow Job Plugin.
Eventually, I ended up helping maintain Salesforce’s Chatter plugin and then open sourcing plugins such as the Config-Driven Pipeline Plugin with Andrey Falko.
More recently, I have also had the extreme pleasure of mentoring in 2 Jenkins projects for Google Summer of Code
(Multi-branch Pipeline support for Gitlab in 2019 and Git Plugin Performance Improvements in 2020).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have learned so much from working with Jenkins and I would love to give back to the project further.
Having introduced Jenkins at both small and large companies,
I would love to help contribute to the direction of the project through the Roadmap/SIGs/JEPs and encourage others to also contribute / improve Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/justinharringa&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/justinharringa&quot;&gt;Twitter&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/justinharringa&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Salesforce, Spinnaker SIG for Azure&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;mark-waite&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mark-waite&quot; /&gt;Mark Waite&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m a Jenkins contributor, a member of the Jenkins core team,
one of the leaders of the Platform Special Interest Group,
and leader of the Documentation Special Interest Group.
I’ve served as the Jenkins Documentation Officer since 2019.
I was a mentor for Google Season of Code 2020 and am one of the maintainers of the Git plugin for Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If elected and allowed to serve on the Jenkins Board, I’ll work to increase community involvement and community development.
I’m deeply interested in tooling and environments that support the Jenkins project,
including the Jenkins CI environments, issue tracker, artifact repository, and source code repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/markewaite&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/MarkEWaite&quot;&gt;Twitter&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/markwaite/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Jenkins Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: CloudBees&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;marky-jackson&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#marky-jackson&quot; /&gt;Marky Jackson&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been involved in the Jenkins project for many years.
I started out as a plugin maintainer, SIG member and general helper.
I moved to a SIG lead, speakers and Google Summer of Code and Docs org admin and mentor.
My current goals are to help continue the work of the public roadmap as well and gain most community members by continuing to be a champion of the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me, being on the Jenkins Board is another opportunity to improve upon the great work
we have all done as well as work toward branching out our efforts to have more women, people of color and LGBTQIA members.
I would be honored to have this opportunity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/markyjackson5&quot;&gt;Twitter&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/marky-jackson/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markyjackson-taulia/&quot;&gt;Jenkins Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Equinix Metal, Continuous Delivery Foundation, Kubernetes, Ortelius&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;steven-terrana&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#steven-terrana&quot; /&gt;Steven Terrana&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been a Jenkins user since 2017 and contributor since 2018.
I am the primary maintainer of the Jenkins Templating Engine,
a plugin that allows users to create truly templated Jenkins pipelines that can be shared across teams.
Through that work, I’ve had the great pleasure of helping to organize the Pipeline Authoring Special Interest Group,
contributing to the Jenkins Pipeline documentation, and contributing bug fixes to various plugins
(including the pipeline plugin and workflow-cps library).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a Continuous Delivery Foundation Ambassador,
I’ve enjoyed doing what I can to advance the community’s approach to CI/CD and simplifying DevSecOps adoption within large organizations.
It would be a privilege to serve on the Jenkins Governance Board and offer my support wherever I can.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/steven-terrana&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/sterrana/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Booz Allen Hamilton, Continuous Delivery Foundation&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;zhao-xiaojie-rick&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#zhao-xiaojie-rick&quot; /&gt;Zhao Xiaojie (Rick)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Three years ago I joined the Jenkins community.
I learned a lot during the process of contributing.
I even became a Jenkins hero in my city.
The most exciting thing I want to do is help more new users of Jenkins get started, and let more contributors feel comfortable.
I always love to host a JAM no matter if it’s online or offline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plans: improve the experience of using Jenkins in different
countries; reorganize the knowledge of Jenkins, for example the tutorial
by text or video format; help other SIG leaders to organize meetings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/LinuxSuRen&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/suren69811254&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: N/A&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;release-officer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#release-officer&quot; /&gt;Release Officer&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;baptiste-mathus&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#baptiste-mathus&quot; /&gt;Baptiste Mathus&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been using and contributing to Jenkins for so long that it is difficult for me to check when it started exactly.
My first pull-request to Jenkins was in 2011 and I had started to use it long before it.
Throughout the years, I have contributed to various areas:
created our local Jenkins Area Meetup with Michaël Pailloncy,
helped users and developers on our mailing lists and IRC channels,
contributed to the Jenkins infrastructure, the website,
processing plugins hosting requests, worked full time on Jenkins Evergreen,
and I am still present today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For all these reasons, it would be an honor to serve as the Release Officer for the Jenkins Project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/batmat&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/bmathus&quot;&gt;Twitter&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/batmat/&quot;&gt;Jenkins Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: CloudBees&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tim-jacomb&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tim-jacomb&quot; /&gt;Tim Jacomb&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been a user of Jenkins for the last 8 years and a regular contributor since 2018.
I began with maintaining the Slack plugin and over the last couple of years I have since expanded that to many more plugins and the Jenkins core.
These are some of the components I maintain when I have time: Slack, Azure Key Vault, Junit,
most of the Database plugins, Dark theme, Plugin installation manager, Jenkins Helm chart, Configuration as code plugin.
I am also a member of the Jenkins infrastructure team,
and I was involved in the release automation project and the mirrors modernisation effort,
along with the day to day support helping people regain access to accounts etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a Release Officer I would like to increase automation,
ease onboarding of new contributors to the release team, and ensure that
responsibilities rotate among people so that I wouldn’t be a bottleneck for any task.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/timja&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;Jenkins Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Kainos&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;victor-martinez&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#victor-martinez&quot; /&gt;Victor Martinez&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been involved in the Jenkins project since 2011 by different means, as a user, as an administrator, as a contributor
(bug reporting, plugin development, documentation, hackfest),
being active in the different Jenkins forums such as the Jenkins-dev and Jenkins-user mailing lists,
working with the jenkins-infra shared library and so on.
I’m also an advocate for the Jenkins project through some presentations anytime that I had the opportunity such as
&lt;a href=&quot;https://www.cloudbees.com/resources/continuous-improvement-process-jenkins&quot;&gt;DevOps World 2020&lt;/a&gt; and
&lt;a href=&quot;https://www.youtube.com/watch?v%3DDVejh9AiQrY&quot;&gt;Jenkins World 2017&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been happily nominated for the Release officer role which matches not just my area of professional expertise that
I’ve been doing for the last 14 years in different roles for different companies but also that’s an area of personal interest
where I’d like to spend time with the Jenkins community to understand, document and automate the process
in a way we can keep the project sustainable for a long term as it’s today,
it’s not just about what I can bring for the community but also about growing together.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If elected as a Release officer I would aim to focus on the following areas:
proceed with the existing responsibilities for this role;
document and automate the release process;
being an enabler for the Continuous Delivery not just for the plugins but also for the core.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/v1v&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/victormartinezrubio/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: Elastic&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;security-officer-uncontested&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-officer-uncontested&quot; /&gt;Security Officer - uncontested&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;daniel-beck&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#daniel-beck&quot; /&gt;Daniel Beck&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been a Jenkins user since 2011, contributor since 2013, and core maintainer since 2014.
In 2015, I took on the scheduling and authoring of security advisories and have been doing that ever since,
working with reporters, maintainers, and the Jenkins security team to deliver security fixes.
Beyond that, I regularly contribute to Jenkins and project infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since I’ve started in the Security Officer role, we’ve made significant
improvements:
&lt;a href=&quot;https://www.jenkins.io/blog/2017/04/10/security-advisory/&quot;&gt;Plugins no longer allow ordinary users to run arbitrary scripts (no sandbox!) as a regular feature&lt;/a&gt;. I introduced fine-grained permission management
&lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/ksKAsmsmVng/lG2lNEaJBQAJ&quot;&gt;for our GitHub repositories&lt;/a&gt; and
&lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/VrKsEf8UIg4/nxuNo2DuBwAJ&quot;&gt;the Maven repository hosting our releases&lt;/a&gt;.
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/10/security-warnings/&quot;&gt;Warnings directly in Jenkins inform admins when an installed component has known security issues&lt;/a&gt; (and their UX was &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/4513&quot;&gt;improved&lt;/a&gt; earlier this year).
The Jenkins project &lt;a href=&quot;https://twitter.com/jenkinsci/status/1080483425973424128&quot;&gt; is now a CVE Numbers Authority&lt;/a&gt;,
to ensure timely and high-quality information in the CVE vulnerability database.
Working with Tyler, &lt;a href=&quot;https://www.jenkins.io/blog/2018/10/09/telemetry/&quot;&gt;I added telemetry to Jenkins&lt;/a&gt;,
which allowed us to deliver multiple large-scale security fixes with
&lt;a href=&quot;https://www.jenkins.io/blog/2019/05/05/telemetry-success/&quot;&gt;minimal&lt;/a&gt; impact.
More recently, I’ve started writing code scanning rules for common problems in Jenkins and
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/0hw97zAdUMw/m/zt4TeGV7AQAJ&quot;&gt;invited maintainers&lt;/a&gt; to sign their plugins up,
which is something I hope to properly publish and roll out more widely soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;GitHub&lt;/a&gt;
&lt;a href=&quot;https://www.jenkins.io/blog/authors/daniel-beck/&quot;&gt;Jenkins Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: CloudBees&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;events-officer-uncontested&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#events-officer-uncontested&quot; /&gt;Events Officer - uncontested&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;marky-jackson-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#marky-jackson-2&quot; /&gt;Marky Jackson&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been a part of the Jenkins community for some time, and I have received the utmost joy in volunteering.
I have been extremely fortunate to have played a lead role in the Outreach &amp;amp; Advocacy SIG, the pipeline-Authoring SIG,
and, most recently, the Cloud-Native SIG.
I have taken part in many meetups, org admin, and mentor in the GSoC &amp;amp; GSoD.
Finally, At DevOps World 2020, I received Jenkins most valuable advocate at DevOps World.
I have experience advocating in other communities as well:
Kubernetes Release Manager Associate, Kubernetes Mentoring Lead, Ortelius Community Manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is the most widely used Continuous Integration tool around,
and I want to continue to promote that by focusing on the following areas: meetups; conference presentation from the Jenkins community;
new user outreach and onboarding; cross-community collaboration (e.g., Kubernetes community);
working with the Continuous Delivery Foundation on interoperability; focusing on SIG events.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My roots are open-source, and I am so proud to be a part of the Jenkins community.
You can read more about my journey in open-source &lt;a href=&quot;https://www.cncf.io/blog/2020/02/18/why-i-contribute-to-the-open-source-community-and-you-should-too/&quot;&gt;here&lt;/a&gt;.
You can also see some of my presentations &lt;a href=&quot;https://www.youtube.com/watch?v%3Dh4hKSXjCqyI&quot;&gt;here&lt;/a&gt; and
&lt;a href=&quot;https://www.cloudbees.com/resources/power-of-open-source-community&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/markyjackson5&quot;&gt;Twitter&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/marky-jackson/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markyjackson-taulia/&quot;&gt;Jenkins Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: OpsMx, Continuous Delivery Foundation, Kubernetes, Ortelius, Spinnaker&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;infrastructure-officer-uncontested&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#infrastructure-officer-uncontested&quot; /&gt;Infrastructure Officer - uncontested&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;olivier-vernin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#olivier-vernin&quot; /&gt;Olivier Vernin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been actively contributing to the Jenkins project for the past four years with contributions across many areas,
and infrastructure is one of my favorite topics.
Over my previous mandate as a Jenkins infrastructure officer, I focused on improving contribution experience,
and let community members opportunities to take ownership of the different services.
I worked on various sponsoring initiatives to make the Jenkins infrastructure more sustainable.
We provided a new environment for releasing Jenkins core (and one plugin!), and also many more things.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the coming year, It is hard to make commitments on what it will look like as we have things we know,
like services that need some attention (“ci.jenkins.io/) and the things we don’t know yet.
Anyway, It’s important to me to have a transparent project where everybody could read, learn, participate,
and understand how the Jenkins project manages infrastructure and I want to continue down that path.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/Olblak&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/0lblak&quot;&gt;Twitter&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/olblak/&quot;&gt;Jenkins Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: CloudBees&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;documentation-officer-uncontested&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-officer-uncontested&quot; /&gt;Documentation Officer - uncontested&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;mark-waite-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mark-waite-2&quot; /&gt;Mark Waite&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m a Jenkins contributor, a member of the Jenkins core team, one of the leaders of the Platform Special Interest Group,
and leader of the Documentation Special Interest Group.
I’ve served as the Jenkins Documentation Officer since 2019.
I was a mentor for Google Season of Code 2020 and am one of the maintainers of the Git plugin for Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If elected and allowed to serve as Documentation Officer,
I’ll continue efforts to invite more contributors through regular Documentation Office Hours and outreach programs like Google Season of Docs, CommunityBridge, Outreachy, and Jenkins Hackfests.
I’ll work to assure an inviting and welcoming environment for contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Profile links:
&lt;a href=&quot;https://github.com/markewaite&quot;&gt;GitHub&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/MarkEWaite&quot;&gt;Twitter&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/markwaite/&quot;&gt;LinkedIn&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite/&quot;&gt;Jenkins Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Affiliations: CloudBees&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;more-information&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-information&quot; /&gt;More 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;&lt;a href=&quot;https://www.jenkins.io/blog/2020/09/24/board-elections/&quot;&gt;Jenkins 2020 elections announcement&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/project/board&quot;&gt;Jenkins Governance Board&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;Jenkins Officers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/project/board-election-process&quot;&gt;Jenkins Board and Officer Election Process&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2019/12/16/board-election-results/&quot;&gt;2019 election results&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/NQg-_xhrT-0&quot;&gt;Elections coordination in the mailing list&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/2020/10/21/a-sustainable-pattern-with-shared-library/</id>
<title>A sustainable pattern with shared library</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-10-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/10/21/a-sustainable-pattern-with-shared-library/" />
<author>
<name>tomasbjerre</name>
</author>
<category term='pipeline'></category>
<category term='scalability'></category>
<category term='sharedlibrary'></category>
<category term='infrastructure'></category>
<summary>
Table of Contents

Context
The Problems
The Solution

Shared Library
Duplication
Documentation
Scalability
Installation Agnostic
Feature Toggling





This post will describe how I use a shared library in Jenkins. Typically when using multibranch pipeline.


If possible (if not forced to) I implement the pipelines without multibranch. I previously wrote about how I do that with my Generic Webhook Trigger Plugin in a previous post. But this will be my second choice, If I am not allowed to remove the Jenkinsfile:s from the repositories entirely.


Context


Within an organization, you typically have a few different kinds of repositories. Each repository versioning one application. You may use different techniques for different kinds of applications. The...
</summary>
<content type='html'>
&lt;div id=&quot;toc&quot; class=&quot;toc&quot;&gt;
&lt;div id=&quot;toctitle&quot;&gt;Table of Contents&lt;/div&gt;
&lt;ul class=&quot;sectlevel1&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#context&quot;&gt;Context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#the-problems&quot;&gt;The Problems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#the-solution&quot;&gt;The Solution&lt;/a&gt;
&lt;ul class=&quot;sectlevel2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#shared-library&quot;&gt;Shared Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#duplication&quot;&gt;Duplication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#documentation&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#scalability&quot;&gt;Scalability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#installation-agnostic&quot;&gt;Installation Agnostic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#feature-toggling&quot;&gt;Feature Toggling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post will describe how I use a &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;shared library&lt;/a&gt; in Jenkins. Typically when using multibranch pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If possible (if not forced to) I implement the pipelines without multibranch. I previously wrote about how I do that with my &lt;a href=&quot;https://www.jenkins.io/blog/2019/12/14/generic-webhook-trigger-plugin/&quot;&gt;Generic Webhook Trigger Plugin in a previous post&lt;/a&gt;. But this will be my second choice, If I am not allowed to remove the &lt;code&gt;Jenkinsfile&lt;/code&gt;:s from the repositories entirely.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;context&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#context&quot; /&gt;Context&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Within an organization, you typically have a few different kinds of repositories. Each repository versioning one application. You may use different techniques for different kinds of applications. The &lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;Jenkins organization on GitHub&lt;/a&gt; is an example with 2300 repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-problems&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-problems&quot; /&gt;The Problems&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Large &lt;strong&gt;Jenkinsfiles in every repository containing duplicated code&lt;/strong&gt;. It seems common that the &lt;code&gt;Jenkinsfile&lt;/code&gt;:s in every repository contains much more than just the things that are unique for that repository. The &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;shared libraries&lt;/a&gt; feature may not be used, or it is used but not with an optimal pattern.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Installation specific Jenkinsfile:s&lt;/strong&gt; that only work with one specific Jenkins installation. Sometimes I see multiple &lt;code&gt;Jenkinsfile&lt;/code&gt;:s, one for each purpose or Jenkins installation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;No documentation&lt;/strong&gt; and/or no natural place to write documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Development is slow&lt;/strong&gt;. Adding new features to repositories is a time consuming task. I want to be able to push features to 1000+ repositories without having to update their &lt;code&gt;Jenkinsfile&lt;/code&gt;:s.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;No flexible way of doing feature toggling&lt;/strong&gt;. When maintaining a large number of repositories it is sometimes nice to introduce a feature to a subset of those repositories. If that works well, the feature is introduced to all repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-solution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-solution&quot; /&gt;The Solution&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My solution is a pattern that is inspired by how the &lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;Jenkins organization on GitHub&lt;/a&gt; does it with its &lt;a href=&quot;https://github.com/jenkins-infra/pipeline-library/blob/master/vars/buildPlugin.groovy&quot;&gt;buildPlugin()&lt;/a&gt;. But it is not exactly the same.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;shared-library&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#shared-library&quot; /&gt;Shared Library&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is how I organize my &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;shared libraries&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jenkinsfile&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsfile&quot; /&gt;Jenkinsfile&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I put this in the &lt;code&gt;Jenkinsfile&lt;/code&gt;:s:&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;buildRepo&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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;default-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#default-configuration&quot; /&gt;Default Configuration&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I provide a default configuration that any repository will get, if no other configuration is given in &lt;code&gt;buildRepo()&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I create a &lt;code&gt;vars/getConfig.groovy&lt;/code&gt; with:&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;givenConfig&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultConfig&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;cm&quot;&gt;/**
      * The Jenkins node, or label, that will be allocated for this build.
      */&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;jenkinsNode&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;BUILD&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/**
      * All config specific to NPM repo type.
      */&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;npm&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;cm&quot;&gt;/**
        * Whether or not to run Cypress tests, if there are any.
        */&lt;/span&gt;
      &lt;span class=&quot;s2&quot;&gt;&quot;cypress&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;maven&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;cm&quot;&gt;/**
        * Whether or not to run integration tests, if there are any.
        */&lt;/span&gt;
      &lt;span class=&quot;s2&quot;&gt;&quot;integTest&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;c1&quot;&gt;// https://e.printstacktrace.blog/how-to-merge-two-maps-in-groovy/&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;effectiveConfig&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;defaultConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;givenConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Configuration is documented here: https://whereverYouHos/getConfig.groovy&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Default config: &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultConfig&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Given config: &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;givenConfig&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Effective config: &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;effectiveConfig&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;effectiveConfig&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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;build-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-plan&quot; /&gt;Build Plan&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I construct a build plan as early as possible. Taking decisions on what will be done in this build. So that the rest of the code becomes more streamlined.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I try to rely as much as possible on conventions. I may provide configuration that lets users turn off features, but they are otherwise turned on if they are detected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I create a &lt;code&gt;vars/getBuildPlan.groovy&lt;/code&gt; with:&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;effectiveConfig&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;derivedBuildPlan&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;s2&quot;&gt;&quot;repoType&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;NOT DETECTED&quot;&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;npm&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;s2&quot;&gt;&quot;maven&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;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deleteDir&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;GitSCM&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;branches:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;*/branchName&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]],&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;extensions:&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;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SparseCheckoutPaths&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nl&quot;&gt;sparseCheckoutPaths:&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;SparseCheckoutPath&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;path:&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;package.json,pom.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;nl&quot;&gt;userRemoteConfigs:&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;someID&#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;git@link.git&#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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fileExists&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;package.json&#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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;packageJSON&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;readJSON&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;file:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;package.json&#39;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;derivedBuildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repoType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;NPM&quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;derivedBuildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cypress&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;effectiveConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cypress&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;packageJSON&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;devDependencies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cypress&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;derivedBuildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;eslint&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;packageJSON&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;devDependencies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;eslint&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;derivedBuildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;tslint&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;packageJSON&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;devDependencies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;tslint&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fileExists&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;pom.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;n&quot;&gt;derivedBuildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repoType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;MAVEN&quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;derivedBuildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;maven&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;integTest&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;effectiveConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;maven&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;integTest&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fileExists&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;src/integtest&#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;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;RuntimeException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Unable to detect repoType&#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;println&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Build plan: &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;derivedBuildPlan&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deleteDir&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;derivedBuildPlan&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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;public-api&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#public-api&quot; /&gt;Public API&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the public API, this is what I want the users of this library to actually invoke.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I implement a &lt;code&gt;buildRepo()&lt;/code&gt; method that will use that default configuration. It can also be called with a subset of the default configuration to tweak it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I create a &lt;code&gt;vars/buildRepo.groovy&lt;/code&gt; with:&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;givenConfig&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;effectiveConfig&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;givenConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;buildPlan&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getBuildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;effectiveConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repoType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;MAVEN&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;buildRepoMaven&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&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;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repoType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;NPM&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;buildRepoNpm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&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;A user can get all the default behavior with:&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;buildRepo&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;A user can also choose not to run Cypress, even if it exists in the repository:&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;buildRepo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;npm&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;s2&quot;&gt;&quot;cypress&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;supporting-methods&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#supporting-methods&quot; /&gt;Supporting Methods&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is usually much more complex, but I put some code here just to have a complete implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I create a &lt;code&gt;vars/buildRepoNpm.groovy&lt;/code&gt; with:&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;jenkinsNode&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Install&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;npm install&quot;&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;s2&quot;&gt;&quot;Build&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;npm run build&quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;tslint&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;TSlint&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;npm run tslint&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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;eslint&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ESlint&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;npm run eslint&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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;cypress&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Cypress&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;npm run e2e:cypress&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;I create a &lt;code&gt;vars/buildRepoMaven.groovy&lt;/code&gt; with:&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;jenkinsNode&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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildPlan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;maven&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;integTest&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Verify&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;mvn verify&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;k&quot;&gt;else&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;s2&quot;&gt;&quot;Package&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;mvn package&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&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;duplication&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#duplication&quot; /&gt;Duplication&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;Jenkinsfile&lt;/code&gt;:s are kept extremely small. It is only when they, for some reason, diverge from the default config that they need to be changed.&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;There is one single point where documentation is written, the &lt;code&gt;getConfig.groovy&lt;/code&gt;-file. It can be referred to whenever someone asks for documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;scalability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#scalability&quot; /&gt;Scalability&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a highly scalable pattern. Both with regards to performance and maintainability in code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It scales in performance because the &lt;code&gt;Jenkinsfile&lt;/code&gt;:s can be used by any Jenkins installation. So that you can scale by adding several completely separate Jenkins installations, not only nodes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It scales in code because it adds just a tiny &lt;code&gt;Jenkinsfile&lt;/code&gt; to repositories. It relies on conventions instead, like the existence of attributes in &lt;code&gt;package.json&lt;/code&gt; and location of integration tests in &lt;code&gt;src/integtest&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;installation-agnostic&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installation-agnostic&quot; /&gt;Installation Agnostic&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;Jenkinsfile&lt;/code&gt;:s does not point at any implementation of this API. It just invokes it and it is up to the Jenkins installation to implement it, with a &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;shared libraries&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It can even be used by something that is not Jenkins. Perhaps you decide to do something in a Docker container, you can still parse the &lt;code&gt;Jenkinsfile&lt;/code&gt; with Groovy or (with some magic) with any language.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;feature-toggling&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feature-toggling&quot; /&gt;Feature Toggling&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;shared library&lt;/a&gt; can do feature toggling by:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Letting some feature be enabled by default for every repository with name starting with &lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Or, adding some default config saying &lt;code&gt;&quot;feature-x-enabled&quot;: false&lt;/code&gt;, while some repos change their &lt;code&gt;Jenkinsfile&lt;/code&gt;:s to &lt;code&gt;buildRepo([&quot;feature-x-enabled&quot;: true])&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;Whenever the feature feels stable, it can be enabled for everyone by changing only the &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;shared library&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/2020/10/20/Cross-Industry-DevOps-3-Firms-Get-It-Right-with-Jenkins/</id>
<title>Cross-Industry DevOps: 3 Firms Get It Right with Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-10-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/10/20/Cross-Industry-DevOps-3-Firms-Get-It-Right-with-Jenkins/" />
<author>
<name>alyssat</name>
</author>
<category term='jenkinsistheway'></category>
<category term='Jenkinsuserstories'></category>
<summary>
Some months ago, we took a significant step in helping the Jenkins community share their stories of how they improved workflows, sped up testing, and saw better quality results after implementing Jenkins into their software development processes.


By the end of the year, we’ll have over 50 Jenkins user stories published with many more in the pipeline. We invite you to explore them all but wanted to share three inspiring examples highlighting how various organizations approach — and implement — Jenkins in the workplace. Enjoy!


Story 1: Jenkins is the way to tackle any challenge


Enterprise-wide CI/CD solution caters to the complex problems...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some months ago, we took a significant step in helping the Jenkins community share their stories of how they improved workflows, sped up testing, and saw better quality results after implementing Jenkins into their software development processes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By the end of the year, we’ll have &lt;a href=&quot;https://stories.jenkins.io/all/&quot;&gt;over 50 Jenkins user stories published&lt;/a&gt; with many more in the pipeline. We invite you to explore them all but wanted to share three inspiring examples highlighting how various organizations approach — and implement — Jenkins in the workplace. Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;story-1-jenkins-is-the-way-to-tackle-any-challenge&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#story-1-jenkins-is-the-way-to-tackle-any-challenge&quot; /&gt;Story 1: Jenkins is the way to tackle any challenge&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;enterprise-wide-cicd-solution-caters-to-the-complex-problems-that-project-teams-face-each-day-as-told-by-jenkins-user-mark-baumann&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enterprise-wide-cicd-solution-caters-to-the-complex-problems-that-project-teams-face-each-day-as-told-by-jenkins-user-mark-baumann&quot; /&gt;Enterprise-wide CI/CD solution caters to the complex problems that project teams face each day, as told by Jenkins user Mark Baumann:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;“Our development teams work in a wide range of projects and domains. We have a very diverse tooling landscape since the projects work with all kinds of different software tools. Of course, projects in the embedded domain will have different toolsets than those working in the automotive domain.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Each project team created its own CI Toolchain, which caused a lot of work for the developers and the IT department. Each project needed to set up their own virtual machine, install and manage their own CI Server, Version Management, and whatever they needed. Creating such a toolchain could easily take up weeks until it was running because there was no standard solution and each team had to start from scratch.”&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Discover how ITK-Engineering GmbH developed a company-wide, common, internal CI/CD toolchain and increased the number of builds for each project and how nearly all departments are now practicing CI/CD. &lt;a href=&quot;https://stories.jenkins.io/user-story/to-tackle-any-challenge/&quot;&gt;The full Jenkins / ITK Engineering story is here!&lt;/a&gt;&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;story-2-jenkins-is-the-way-to-add-spicy-flavors-to-agency-processes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#story-2-jenkins-is-the-way-to-add-spicy-flavors-to-agency-processes&quot; /&gt;Story 2: Jenkins is the way to add spicy flavors to agency processes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-creative-agency-start-up-simplifies-the-build-test-and-deploy-steps-allowing-the-small-team-to-focus-more-on-the-deliverables-and-less-on-the-process-as-told-by-jenkins-user-erik-woitschig&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-creative-agency-start-up-simplifies-the-build-test-and-deploy-steps-allowing-the-small-team-to-focus-more-on-the-deliverables-and-less-on-the-process-as-told-by-jenkins-user-erik-woitschig&quot; /&gt;A creative agency start-up simplifies the build, test, and deploy steps, allowing the small team to focus more on the deliverables and less on the process. As told by Jenkins user Erik Woitschig:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;“It was quite a challenge to streamline and combine all the services to build an artifact to deploy. Because of our micro service-oriented and distributed architecture, the most challenging part of rethinking our build, test, and deploy process was to figure out how best to sync the deployment of all services. We also had to retest builds properly to go live or initiate a rollback.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;With Jenkins and some pipelines, it was relatively simple to create a local and distributed artifact of our application to quickly share and deploy across the team, locally and globally.”&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because Jenkins is simple to install and easy to maintain, Muzkat has increased productivity far beyond that of a 3-person team. Read on to learn how this bootstrapped Berlin-based agency is making a go of it with Jenkins.  &lt;a href=&quot;https://stories.jenkins.io/user-story/to-add-spicy-flavors-to-muzkats-processes/&quot;&gt;The full Jenkins / Muzkat story is here!&lt;/a&gt;&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;story-3-jenkins-is-the-way-to-focus-on-your-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#story-3-jenkins-is-the-way-to-focus-on-your-code&quot; /&gt;Story 3: Jenkins is the way to focus on your code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;as-demands-for-the-wright-medicals-services-grew-they-required-an-agile-devops-environment-that-would-grow-and-scale-along-with-the-tech-team-as-told-by-jenkins-user-christophe-carpentier&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#as-demands-for-the-wright-medicals-services-grew-they-required-an-agile-devops-environment-that-would-grow-and-scale-along-with-the-tech-team-as-told-by-jenkins-user-christophe-carpentier&quot; /&gt;As demands for the Wright Medical’s services grew, they required an agile DevOps environment that would grow and scale along with the tech team, as told by Jenkins user Christophe Carpentier:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;“What was critical to our success was the stability of Jenkins and a significant number of reliable plugins! We could take a few plugins, set up our workflow, and add GitLab and SonarQube integration without ever stopping or losing data in over a year. We found that all of the problems we encountered were our own, and that is why it was critical to make Jenkins an essential part of our workflow.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;With this implementation, Jenkins allows more than would be manually possible. It flawlessly updates our staging environments, blocks commits based on the SonarQube analysis, and provides us with near-instant feedback on merge requests.”&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Learn how Wright Medical supports a growing dev team by switching to an agile DevOps process that allows for automatic daily releases — versus weekly manual builds. Best of all, it’s letting the developers focus on building great code rather than infrastructure. &lt;a href=&quot;https://stories.jenkins.io/user-story/to-focus-on-your-code/&quot;&gt;The full Jenkins / Wright Medical story is here!&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-are-you-building&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-are-you-building&quot; /&gt;What are you building?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hope you enjoy these Jenkins user stories. You’ll find that “Jenkins Is The Way” website is a global showcase of how developers and engineers build, deploy, and automate great stuff with Jenkins. If you want to &lt;a href=&quot;https://www.surveymonkey.com/r/JenkinsIsTheWay&quot;&gt;share your story&lt;/a&gt;, we’ll send you a free Jenkins Is The Way T-Shirt in return. Hope to hear from you soon!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/09/25/document-jenkins-on-kubernetes-introduction/</id>
<title>Documenting Jenkins on Kubernetes Introduction</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-09-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/09/25/document-jenkins-on-kubernetes-introduction/" />
<author>
<name>zaycodes</name>
</author>
<category term='kubernetes'></category>
<category term='documentation'></category>
<category term='gsod'></category>
<category term='gsod2020'></category>
<summary>
I&#8217;m thrilled to announce that I will be participating in Google Season of Docs (GSoD)
2020 with the Jenkins project. I started contributing to Jenkins documentation during the technical writer
exploration phase for Google Season of Docs 2020 and I must say, my journey so far
has been nothing short of amazing majorly because of the supportive community behind this project.
I chose the Jenkins project because I understood this project from a user point of view as I had been exposed to setting up, configuring,
and using Jenkins to automate CI/CD processes. I piqued interest in two of Jenkins project ideas,
Plugin documentation migration and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m thrilled to announce that I will be participating in &lt;a href=&quot;https://developers.google.com/season-of-docs/&quot;&gt;Google Season of Docs (GSoD)&lt;/a&gt;
2020 with the &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;Jenkins&lt;/a&gt; project. I started contributing to Jenkins documentation during the technical writer
exploration phase for &lt;a href=&quot;https://developers.google.com/season-of-docs&quot;&gt;Google Season of Docs&lt;/a&gt; 2020 and I must say, my journey so far
has been nothing short of amazing majorly because of the supportive community behind this project.
I chose the Jenkins project because I understood this project from a user point of view as I had been exposed to setting up, configuring,
and using Jenkins to automate CI/CD processes. I piqued interest in two of Jenkins &lt;a href=&quot;https://www.jenkins.io/sigs/docs/gsod/&quot;&gt;project ideas&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/sigs/docs/#plugin-documentation-on-github&quot;&gt;Plugin documentation migration and update&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/sigs/docs/#jenkins-on-kubernetes&quot;&gt;Document Jenkins on Kubernetes&lt;/a&gt;, submitted proposals for these two projects and to my utmost joy, the latter was selected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this article, I’m going to be explaining what my selected project is about and why this project is important to the Jenkins community and its users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;introduction&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introduction&quot; /&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kubernetes is a platform-agnostic container orchestration tool created by Google and heavily supported
by the open-source community as a project of the Cloud Native Computing Foundation.
It allows you to use container instances and manage them for scaling and fault tolerance.
It also handles a wide range of management activities that would otherwise require separate solutions or custom code,
including request routing, container discovery, health checks, and rolling updates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kubernetes is compatible with the majority of CI/CD tools which allow developers to run tests,
deploy builds in Kubernetes and update applications with no downtime.
One of the most popular CI/CD tools now is Jenkins for the following reasons:&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;It is open-source and free.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;it is user-friendly, easy to install and does not require additional installations or components.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins is also quite easy to configure, modify and extend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It deploys code and generates test reports.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It also boasts a rich plugin ecosystem. The extensive pool of plugins makes Jenkins flexible and allows building, deploying and automating across various platforms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins can be configured according to the requirements for continuous integrations and continuous delivery.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins is available for all platforms and different operating systems, whether it is OS X, Windows or Linux.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most of the integration work is automated. Hence fewer integration issues. This saves both time and money over the lifespan of a project.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following reasons have made Jenkins on Kubernetes a popular theme for Jenkins users, however,
there’s currently no central location for documentation describing Jenkins on Kubernetes,
thereby making it difficult for Jenkins on Kubernetes users to navigate and find information.
This project would create a new Kubernetes Volume on &lt;a href=&quot;https://www.jenkins.io/solutions/&quot;&gt;Jenkins.io&lt;/a&gt; which would describe the concepts,
techniques, and choices for Kubernetes users running Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-state&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-state&quot; /&gt;&lt;strong&gt;Current State&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are a lot of presentations and articles about running Jenkins on Kubernetes, however,
there’s no central location for describing Jenkins on Kubernetes. This makes it difficult for:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins on Kubernetes users to navigate and find information&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Track, update and maintain information on Jenkins on Kubernetes&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;project-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-improvements&quot; /&gt;&lt;strong&gt;Project Improvements&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To solve the existing issue with Jenkins on Kubernetes documentation,
a new Kubernetes volume will be created on &lt;a href=&quot;https://www.jenkins.io/solutions/&quot;&gt;Jenkins.io&lt;/a&gt;.
This Volume is going to aggregate user guides, information on cloud providers and demos on Jenkins on Kubernetes.
You can find the proposed contents for the new volume &lt;a href=&quot;https://docs.google.com/document/d/1wMeeN4oA7AN4F3pfLBIAJZWXD7PdqSKHotdk76yCw68/edit?usp=sharing&quot;&gt;here&lt;/a&gt;.
Feel free to comment on any suggestions you might have in the proposed content doc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project will also provide the following advantages:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Improve the user experience of Jenkins on Kubernetes users by giving them a one-stop-shop for information on Jenkins on Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make it easy to track, update and maintain information on Jenkins on Kubernetes using the Solutions page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reference the existing community documentation for Jenkins on K8s (plugins and tools/integrations).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to guides, tutorials and explanations of concepts and techniques in Jenkins on Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just-In-Time documentation which means that rather than documenting every feature comprehensively,
we will produce and release documentation in bits but continuously based on popular questions,
feedback and area of interests gathered from the community and users.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;project-timeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-timeline&quot; /&gt;&lt;strong&gt;Project Timeline&lt;/strong&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Find below a summary of the project timeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Community bonding (&lt;/strong&gt;&lt;strong&gt;August 17 - September 13&lt;/strong&gt;&lt;strong&gt;)&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;Set up a communication channel and time (due to time difference).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Refine my goals and set expectations on both sides.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn more about the community and Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gather and thoroughly study existing resources that will be useful and helpful to the project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pre-planning of the project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contacting Stakeholders and onboarding contributors&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;Documentation Period&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This period is going to be focused on creating contents which include user guides,
tutorials, demos, etc. for Jenkins on Kubernetes.
Some of the topics to be covered include Installing Jenkins on Kubernetes,
Administering Jenkins on Kubernetes, Cloud providers and much more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Documentation Timeline&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;1st Month (September - October)&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some basic prerequisites for installing jenkins on kubernetes include docker, a kubernetes cluster, and optionally Helm or the Jenkins Operator for Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Helm is a package manager which automates the process of installing, configuring, upgrading, and removing complex Kubernetes application. A Helm chart defines several Kubernetes resources as a set. Helm can make deployments easier and repeatable because all resources for an application are deployed by running one command.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Helm has two elements, a client (helm) and a server (Tiller). The server element runs inside a Kubernetes cluster and manages the installation of charts. With Helm, configuration settings are kept in values.yaml file separate from the manifest formats. The configuration values can be changed according to application need without touching the rest of the manifest.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the other hand, the Jenkins operator is a Kubernetes native operator which fully manages Jenkins on Kubernetes. It is easy to install with just a few manifests and allows users to configure and manage Jenkins on Kubernetes. To run jenkins-operator, you need to have a running Kubernetes cluster and kubectl installed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Operator provides out of the box:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Integration with Kubernetes — preconfigured kubernetes-plugin for provisioning dynamic Jenkins Slaves as Pods&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipelines as Code — declarative way to version your pipelines in VCS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extensibility via Groovy scripts or Configuration as Code plugin-customize your Jenkins, configure OAuth authorization and more&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security and Hardening — an initial security hardening of Jenkins instance via Groovy scripts to prevent security vulnerabilities&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the first month, the focus will be on documenting an introductory section.
This section will include but is not limited to Setting up Kubernetes cluster, Installing Jenkins on Kubernetes, exploring the various approaches by which this can be achieved such as using helm package manager or the Jenkins Operator as explained above and Administering Jenkins on Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;2nd Month (October - November)&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the second month, the focus will be on documenting how to setup up CI/CD pipelines using Jenkins and Kubernetes on different cloud providers.
Some of the cloud providers we will be looking at include but are not limited to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Amazon Web Service (AWS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Azure Kubernetes Service&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Google Cloud&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;3rd Month (November - December)&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the final month, the focus will be on creating demos and tutorials,
submitting project report, evaluation of mentors and finally,
publishing a report of my experience as a participant in Season of Docs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins community is actively working towards improving its documentation to create a better
experience for Jenkins users and invites technical writers to join the community and contribute to the Jenkins on Kubernetes project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To contribute to the Jenkins on Kubernetes project, simply join the Jenkins documentation &lt;a href=&quot;https://app.gitter.im/&amp;lt;mark&amp;gt;/room/#jenkins/docs:matrix.org&quot;&gt;Gitter&lt;/a&gt; channel and drop a message,
you can also find the Google season of docs office hour notes and recordings for Jenkins on Kubernetes &lt;a href=&quot;https://docs.google.com/document/d/17cPLUrJ4Ul4Y8MREjDyfWBEN7PlnlrmPh6wuKMPFmPg/edit?usp=sharing&quot;&gt;here&lt;/a&gt;.
GSOD office hours take place twice a week on Mondays and Thursdays between 6pm GMT+1 and 7pm GMT+1,
if you would like to be part of these meetings, you can indicate interest in the Jenkins Documentation
&lt;a href=&quot;https://app.gitter.im/&amp;lt;/mark&amp;gt;/room/#jenkins/docs:matrix.org&quot;&gt;Gitter&lt;/a&gt; channel and we would be happy to have you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are also a newcomer and would like to contribute to Jenkins, documentation is a great place to contribute.
A lot of small patches can be done from the GitHub web interface even without cloning repositories locally.
You can find some good first issues to get started with &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/labels/good%20first%20issue&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Find more information on contributing to Jenkins documentation &lt;a href=&quot;https://www.jenkins.io/participate/document&quot;&gt;here&lt;/a&gt;.
If you have further questions about the Jenkins on Kubernetes project or contributing to Jenkins,
you can reach out on the Jenkins documentation &lt;a href=&quot;https://app.gitter.im/#/room/#jenkins/docs:matrix.org&quot;&gt;Gitter&lt;/a&gt; channel.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;additional-resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#additional-resources&quot; /&gt;&lt;strong&gt;Additional Resources&lt;/strong&gt;&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1zTEKtOp2i1K2fw5RQ_a_KVOB2z0gz9987NYzTnIS6G8/edit?usp=sharing&quot;&gt;GSoD Proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/17cPLUrJ4Ul4Y8MREjDyfWBEN7PlnlrmPh6wuKMPFmPg/edit?usp=sharing&quot;&gt;GSoD Office Hours Notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1m0rTrXk7WisPXUeaKGj81dOFO2CcW4o_Nvo7NvcoL98/edit?usp=sharing&quot;&gt;Google Season of Docs - Startup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/sigs/docs/gsod/&quot;&gt;Google Season of Docs&lt;/a&gt; on jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1uNNo0QJKPHnNp8PGr_jLI8p3K_94ZYD-M0evZOEZ93c/edit#heading=h.8q8l1ah569xk&quot;&gt;Docs SIG&lt;/a&gt; for Google Season of Docs startup (&lt;a href=&quot;https://www.youtube.com/watch?v=sY2gI47zho8&amp;amp;list=PLN7ajX_VdyaNp0lk5BmyAgqPS52u_4tC8&quot;&gt;video&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/09/24/board-elections/</id>
<title>2020 Jenkins Board and Officer elections. Nominations and voter registration are open!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-09-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/09/24/board-elections/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
Jenkins 2020 Elections are over, thanks to all participants!
Please see the results announcement.





We are happy to announce the 2020 elections in the Jenkins project!
Nominations are open for two governance board and for all five officer positions,
namely: Security, Events, Release, Infrastructure, and Documentation.
The board positions and officer roles are an essential part of Jenkins' community governance and well-being.
We invite Jenkins contributors and community members to sign-up for elections and to nominate contributors for the elected roles.
Deadline for nominations is Oct 15, voter registration ends on Nov 02.


These are the second elections held by the Jenkins project.
During the 2019 elections, we elected...
</summary>
<content type='html'>
&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;
Jenkins 2020 Elections are over, thanks to all participants!
Please see the &lt;a href=&quot;https://www.jenkins.io/blog/2020/12/03/election-results&quot;&gt;results announcement&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to announce the 2020 elections in the Jenkins project!
Nominations are open for two &lt;a href=&quot;https://www.jenkins.io/project/board&quot;&gt;governance board&lt;/a&gt; and for all five &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;officer&lt;/a&gt; positions,
namely: Security, Events, Release, Infrastructure, and Documentation.
The board positions and officer roles are an essential part of Jenkins&#39; community governance and well-being.
We invite Jenkins contributors and community members to sign-up for elections and to nominate contributors for the elected roles.
Deadline for nominations is &lt;strong&gt;Oct 15&lt;/strong&gt;, voter registration ends on &lt;strong&gt;Nov 02&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These are the second elections held by the Jenkins project.
During the 2019 elections, we elected 3 board members and 5 officers.
You can find the voting results &lt;a href=&quot;https://www.jenkins.io/blog/2019/12/16/board-election-results/&quot;&gt;here&lt;/a&gt;.
This year, we decided to make a few changes in the &lt;a href=&quot;https://www.jenkins.io/project/board-election-process&quot;&gt;election process&lt;/a&gt; based on the 2019 elections feedback.&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;a class=&quot;image&quot; href=&quot;https://forms.gle/y3qDo8EM8iQnd3fY9&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/register-button.png&quot; alt=&quot;register button&quot; height=&quot;48&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;key-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-dates&quot; /&gt;Key dates&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;Sep 24&lt;/strong&gt; - Nominations open, voting sign-up begins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oct 15&lt;/strong&gt; - Board and officer nominations deadline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oct 26&lt;/strong&gt; (or later) - List of candidates is published, including personal statements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nov 10&lt;/strong&gt; - Voting begins. &lt;a href=&quot;https://civs.cs.cornell.edu/&quot;&gt;Condorcet Internet Voting Service&lt;/a&gt; will be used for voting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nov 24&lt;/strong&gt; - Voting sign-up is over.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nov 27&lt;/strong&gt; - Voting ends, 11PM UTC.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dec 03&lt;/strong&gt; - Election results are announced and take effect.&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;signing-up-for-voting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#signing-up-for-voting&quot; /&gt;Signing up for voting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Any Jenkins individual contributor is eligible to vote in the election
if there was a contribution made before September 01, 2020.
&lt;em&gt;Contribution&lt;/em&gt; does not mean a &lt;em&gt;code contribution&lt;/em&gt;,
all contributions count:
documentation patches,
code reviews,
substantial issue reports,
issues and mailing list responses,
social media posts,
testing,
etc.
Such a contribution should be public.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can register to vote in one of two ways:&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;Fill out &lt;a href=&quot;https://forms.gle/y3qDo8EM8iQnd3fY9&quot;&gt;this Google Form&lt;/a&gt;.
This way requires logging into your Google Account to verify authenticity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Send an email to &lt;a href=&quot;mailto:jenkins-2020-elections@googlegroups.com&quot;&gt;jenkins-2020-elections@googlegroups.com&lt;/a&gt;.
You will need to provide the information specified &lt;a href=&quot;https://www.jenkins.io/project/board-election-process/#voter-sign-up-and-eligibility&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the registration period, the election committee will process the form submissions and prepare a list of the registered voters.
In the case of rejection, one of the election committee members will send a rejection email.
Every individual contributor is expected to vote only once.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Deadline for the voter registration is &lt;strong&gt;November 24&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;nominating-contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#nominating-contributors&quot; /&gt;Nominating contributors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Suggestions from the community members are highly valued,
and the board welcomes additional nominations.
If you feel that a particular person is well suited to help guide Jenkins, please submit a name and the reason for your nomination to &lt;a href=&quot;mailto:jenkinsci-board@googlegroups.com&quot;&gt;jenkinsci-board@googlegroups.com&lt;/a&gt;.
Self nominations are also welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Deadline for nominations is &lt;strong&gt;October 15&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;terms&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#terms&quot; /&gt;Terms&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The terms of office for these elected positions are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Officer positions (1 year): December 03, 2020 to December 2, 2021&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Governing board member (2 years): December 03, 2020 to December 2, 2022&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;elections-committee&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#elections-committee&quot; /&gt;Elections committee&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2020 elections are coordinated by the Jenkins Governance Board members who are not up for re-election this year:
&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/uhafner/&quot;&gt;Ullrich Hafner&lt;/a&gt;, and
&lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev/&quot;&gt;Oleg Nenashev&lt;/a&gt;.
These contributors are responsible for managing the process,
preparing the nominee list for elections,
forming and verifying the voter list,
processing the votes,
and announcing the results.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can contact the election committee via &lt;a href=&quot;mailto:jenkins-2020-elections@googlegroups.com&quot;&gt;jenkins-2020-elections@googlegroups.com&lt;/a&gt;.
Please use this email for any queries and feedback regarding the elections.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&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/project/board&quot;&gt;Jenkins Governance Board&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/project/team-leads/&quot;&gt;Jenkins Officers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/project/board-election-process&quot;&gt;Jenkins Board and Officer Election Process&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2019/12/16/board-election-results/&quot;&gt;2019 election results&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev/c/NQg-_xhrT-0&quot;&gt;Elections coordination in the mailing list&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/2020/09/19/jenkins-at-devops-world-2020/</id>
<title>Jenkins at DevOps World 2020</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-09-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/09/19/jenkins-at-devops-world-2020/" />
<author>
<name>alyssat</name>
</author>
<category term='events'></category>
<category term='conference'></category>
<category term='cicd'></category>
<category term='talks'></category>
<category term='workshops'></category>
<summary>
The annual DevOps World, formerly known as DevOps World | Jenkins World is next week - Sept 22-24, with workshops on Sept 25. Just like other events this year, DevOps World pivoted to a virtual event but that doesn’t mean there is a shortage of sessions or networking opportunities. There will be over 50 Jenkins/open source sessions and opportunities to virtually connect with over 20,000+ attendees on the event platform. Below are just a few sessions, the full agenda can be found HERE:


Jenkins: Where It Is and Where It is Going


Date: Tuesday, September 22, 7:00 a.m.-7:30 a.m (PDT)


Speaker: Oleg Nenashev


Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The annual &lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World&lt;/a&gt;, formerly known as DevOps World | Jenkins World is next week - Sept 22-24, with workshops on Sept 25. Just like other events this year, DevOps World pivoted to a virtual event but that doesn’t mean there is a shortage of sessions or networking opportunities. There will be over 50 Jenkins/open source sessions and opportunities to virtually connect with over 20,000+ attendees on the event platform. Below are just a few sessions, the full agenda can be found &lt;a href=&quot;https://sessions.devopsworld.com/sessions&quot;&gt;HERE&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-where-it-is-and-where-it-is-going&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-where-it-is-and-where-it-is-going&quot; /&gt;Jenkins: Where It Is and Where It is Going&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Date: Tuesday, September 22, 7:00 a.m.-7:30 a.m (PDT)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Speaker: &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins keeps evolving to address demands from its users and contributors: configuration as code, better support of cloud-native technologies, etc. Recently, we have introduced a public roadmap for the project, and there are many key initiatives in development and preview phases. This session will cover the current state of Jenkins and what’s next for 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;managing-devsecops-pipelines-at-scale-with-jenkins-templating-engine&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#managing-devsecops-pipelines-at-scale-with-jenkins-templating-engine&quot; /&gt;Managing DevSecOps Pipelines at Scale with Jenkins Templating Engine&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Date: Tuesday, September 22, 11:30 a.m.-12:00 p.m. (PDT)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Speaker: &lt;a href=&quot;https://github.com/steven-terrana/steven-terrana&quot;&gt;Steven Terrana&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Are you currently helping build or maintain a Jenkins pipeline for more than one application or team? Are you tired of copying and pasting Jenkinsfiles and tweaking them to fit each team’s specific needs? This session will feature a live demonstration of getting up and running with the Jenkins Templating Engine (JTE). Attendees will learn how to stop creating bespoke pipelines on a per-application basis and, instead, create tool-agnostic pipeline templates that multiple teams can inherit - regardless of tech stack.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ebays-journey-building-ci-at-scale&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ebays-journey-building-ci-at-scale&quot; /&gt;eBay’s Journey Building CI at Scale&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Date: Tuesday, September 22, 12:30 p.m.-1:00 p.m.(PDT)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Speakers: Ravi Kiran Rao Bukka &amp;amp; Vasumathy Seenuvasan&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A scalable CI platform with 6,000+ Jenkins instances serving around 43,000 builds per day on multi-cluster Kubernetes. A system built with metrics, key resource tuning, remediation’s and security in place. Join this session to hear from eBay on their journey of best practices and learnings about 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;machine-learning-plugins-for-data-science-in-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#machine-learning-plugins-for-data-science-in-jenkins&quot; /&gt;Machine Learning Plugins for Data Science in Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Date: Wednesday, September 23, 11:00 a.m.-11:15 a.m.(PDT)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Speaker: Loghi Perinpanayagam&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Machine Learning has evolved rapidly in the software industry for recent years. Jenkins CI/CD can be a good practice to deliver a high reliable product in the end. We have done an initial startup on this plugin that can be used to build Jupyter Notebooks, Python files and JSON files in Zeppelin format. In addition, the build wrappers could be used to convert Jupyter Notebooks to Python/JSON and/or copy the files to the workspace for more actions.  This Machine Learning plugin will endeavor to satisfy the data science community together with the help of other plugins. Success of this plugin will definitely serve much benefits to the community and Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-ui-gets-a-makeover&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-ui-gets-a-makeover&quot; /&gt;Jenkins UI Gets a Makeover&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Date: Thursday, September 24, 7:30 a.m.-8:00 a.m.(PDT)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Speakers: &lt;a href=&quot;https://github.com/fqueiruga&quot;&gt;Felix Queiruga&lt;/a&gt; &amp;amp; Jeremy Hartley&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An overview of the Jenkins UI overhaul. We are taking an iterative approach to gradually refresh the Jenkins UI. This approach will make Jenkins look fresh and modern, without changing the way users are accustomed to working with Jenkins or require plugins to be rewritten to render properly in the new Jenkins UI. Join this session to learn the changes we’ve made and how you can help to improve the Jenkins UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The event is free to everyone and recordings will be available on-demand. &lt;a href=&quot;https://experience.cloudbees.com/e/DevOpsWorld&quot;&gt;Registration&lt;/a&gt; is required to access the on-demand recordings. And don’t forget to visit the CDF booth in the expo hall for one on one Q&amp;amp;A’s with Jenkins experts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/09/12/new-jenkins-release-observations/</id>
<title>Testing Jenkins 2.249.1 on Windows</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-09-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/09/12/new-jenkins-release-observations/" />
<category term='windows'></category>
<category term='platform-sig'></category>
<category term='installers'></category>
<category term='announcement'></category>
<summary>
This article describes our observations during Windows testing of the Jenkins 2.249.1 release candidate.


Upgrade testing


Jenkins 2.249.1 is a new long term support release with user interface improvements and changes in Windows support.
It is the first long term support release to drop support for Microsoft.NET framework 2.0.
The end of support for Microsoft.NET framework 2.0 was announced in the Windows Support Updates blog post.
The Windows support upgrade guidelines describe major things to consider when upgrading Jenkins controllers and agents on Windows.


As part of our preparation for the release, we tested several configurations.
This article describes our experiences with those configurations.


Upgrade approaches

We tested controller...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This article describes our observations during Windows testing of the Jenkins 2.249.1 release candidate.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;upgrade-testing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-testing&quot; /&gt;Upgrade testing&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.249.1 is a new long term support release with user interface improvements and changes in Windows support.
It is the first long term support release to drop support for Microsoft.NET framework 2.0.
The end of support for Microsoft.NET framework 2.0 was announced in the &lt;a href=&quot;https://www.jenkins.io/blog/2020/07/23/windows-support-updates/&quot;&gt;Windows Support Updates blog post&lt;/a&gt;.
The Windows support &lt;a href=&quot;https://www.jenkins.io/blog/2020/07/23/windows-support-updates/#upgrade-guidelines&quot;&gt;upgrade guidelines&lt;/a&gt; describe major things to consider when upgrading Jenkins controllers and agents on Windows.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As part of our preparation for the release, we tested several configurations.
This article describes our experiences with those configurations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;upgrade-approaches&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-approaches&quot; /&gt;Upgrade approaches&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We tested controller and agent upgrades from Jenkins 2.235.x to 2.249.1-rc on Windows.
The tests included:&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;#32-bit-windows-msi&quot;&gt;32 bit Windows MSI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#64-bit-windows-msi&quot;&gt;64 bit Windows MSI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#war-file-on-windows&quot;&gt;WAR (file) on Windows&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;upgrade-process&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-process&quot; /&gt;Upgrade process&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our upgrade process included:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install a previous version of Jenkins controller on Windows&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install a previous version of Jenkins agent on Windows and configure it as a service&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade Jenkins controller from &quot;Manage Jenkins&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart the Jenkins Windows service for the controller&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the Jenkins agent on Windows with the latest &lt;code&gt;agent.jar&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart the Jenkins Windows service for the agent&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-results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-results&quot; /&gt;Testing results&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We successfully tested&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Restarting Windows service for controller (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/63198&quot;&gt;JENKINS-63198&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restarting Windows service for agents (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/63223&quot;&gt;JENKINS-63223&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;We confirmed that we can continue our &lt;a href=&quot;https://www.jenkins.io/blog/2020/07/23/windows-support-updates/#new-policy&quot;&gt;Level 1 support policy&lt;/a&gt; for Jenkins 2.249.1.&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;32-bit-windows-msi&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#32-bit-windows-msi&quot; /&gt;32 bit Windows MSI&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Prior to Jenkins 2.235.3, the Jenkins LTS Windows installer was provided as a 32 bit MSI and included a bundled Java 8 runtime environment.
The Jenkins agent can be downloaded and run through Java web start using the bundled Java 8 runtime environment.
The agent can also be configured to run as a service using the bundled Java 8 runtime environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-controller&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-controller&quot; /&gt;Jenkins controller&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.235.1 installs JRE 8u144 for 32 bit Windows.
The installer configures the Jenkins controller to run as the SYSTEM user.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://www.jenkins.io/blog/2019/02/01/windows-installers/&quot;&gt;Windows Installer Updates blog post&lt;/a&gt; for details of the controller installation process with the 32 bit MSI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-agent&quot; /&gt;Jenkins agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins agents on Windows are often configured to &quot;Launch agent by connecting it to the master&quot;.
The Jenkins agent configuration correctly warns that the controller must open the TCP port for inbound agents in the &quot;Configure Global Security&quot; page.
It is easiest to allow Jenkins to choose the port (a &quot;Random&quot; port).
Jenkins selects a random available port number and shares that port number with agents during their initial connection to the Jenkins http port.&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/2020/2020-09-09-new-jenkins-release-observations/tcp-port-for-inbound-agents.png&quot; alt=&quot;TCP port for inbound agents&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;configure-the-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-the-agent&quot; /&gt;Configure the agent&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the Jenkins TCP port is open for inbound agents, a new agent is configured from the Jenkins &quot;Nodes&quot; menu
This creates an &quot;inbound Jenkins agent&quot; that uses the Jenkins &lt;code&gt;agent.jar&lt;/code&gt; to initiate the connection to the Jenkins controller.&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/2020/2020-09-09-new-jenkins-release-observations/inbound-agent-configuration.png&quot; alt=&quot;Inbound agent configuration&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;download-the-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#download-the-agent&quot; /&gt;Download the agent&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent starts the first time by clicking the &quot;Launch&quot; button on the agent configuration page (only available with Java 8).
That downloads the &quot;slave-agent.jnlp&quot; file from the web browser.&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/2020/2020-09-09-new-jenkins-release-observations/launch-inbound-agent-from-jenkins.png&quot; alt=&quot;Launch inbound agent from Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;start-the-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#start-the-agent&quot; /&gt;Start the agent&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The downloaded file needs to be opened from a command prompt using the &lt;code&gt;javaws&lt;/code&gt; command that is included with the bundled JRE:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;C:\&amp;gt; &quot;C:\Program Files (x86)\Jenkins\jre\bin\javaws.exe&quot; -wait slave-agent.jnlp&lt;/pre&gt;
&lt;/div&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;
The &lt;code&gt;javaws&lt;/code&gt; program has been removed from  the most recent releases of Java 8 and from Java 11.
Refer to &lt;a href=&quot;#Jenkins agent and icedtea&quot;&gt;[Jenkins agent and icedtea]&lt;/a&gt; for a technique that can help users of the most recent releases of Java 8.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java web start (javaws.exe) prompts for permission to run the program with this dialog:&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/2020/2020-09-09-new-jenkins-release-observations/javaws-prompt-for-remoting-agent.png&quot; alt=&quot;Java Web Start prompt for remoting agent&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;install-the-agent-as-a-service&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#install-the-agent-as-a-service&quot; /&gt;Install the agent as a service&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent runs and displays a window on the desktop with a single menu entry, &quot;Install as a service&quot;.&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/2020/2020-09-09-new-jenkins-release-observations/install-agent-as-a-service.png&quot; alt=&quot;Install agent as a service&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the &quot;Install as a service&quot; menu item is clicked, the agent is adjusted to run as a Windows service using the SYSTEM account.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;upgrade-the-controller&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-the-controller&quot; /&gt;Upgrade the controller&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins controller on Windows can be upgraded to Jenkins 2.249.1 from the &quot;Manage Jenkins&quot; page.
The upgrade process downloads the new &lt;code&gt;jenkins.war&lt;/code&gt; file, saves the current version in case of later downgrade, and offers to restart.&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/2020/2020-09-09-new-jenkins-release-observations/upgrade-jenkins-from-manage-jenkins.png&quot; alt=&quot;Upgrade Jenkins from Manage Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;upgrade-the-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-the-agent&quot; /&gt;Upgrade the agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins inbound agent is not upgraded automatically.
The agent administrator downloads the most recent &lt;code&gt;agent.jar&lt;/code&gt; from their Jenkins controller, stops the running agent, and replaces the installed &lt;code&gt;agent.jar&lt;/code&gt; with the downloaded version.
The agent service will reconnect to the Jenkins controller after the administrator restarts it.&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;64-bit-windows-msi&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#64-bit-windows-msi&quot; /&gt;64 bit Windows MSI&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning with &lt;a href=&quot;https://www.jenkins.io/blog/2020/08/12/windows-installers-upgrade/&quot;&gt;Jenkins 2.235.3&lt;/a&gt;, the Jenkins LTS Windows installer is a 64 bit MSI.
It runs Jenkins with the 64 bit JDK (Java 8 or Java 11) selected by the user.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-controller-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-controller-2&quot; /&gt;Jenkins controller&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.235.3 was installed using AdoptOpenJDK Java 8u262 in one test.
It was installed using AdoptOpenJDK Java 11.0.8 in another test.
In both cases, the installer configured the Jenkins controller to run with the Windows service account we had previously configured.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://www.jenkins.io/blog/2019/02/01/windows-installers/#screenshots&quot;&gt;Windows Installer Updates blog post&lt;/a&gt; for details of the controller installation process with the 64 bit MSI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-agent-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-agent-2&quot; /&gt;Jenkins agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins agents on Windows are often configured to &quot;Launch agent by connecting it to the master&quot;.
The Jenkins agent configuration correctly warns that the controller must open the TCP port for inbound agents in the &quot;Configure Global Security&quot; page.
It is easiest to allow Jenkins to choose the port (a &quot;Random&quot; port).
Jenkins selects a random available port number and shares that port number with agents during their initial connection to the Jenkins http port.&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/2020/2020-09-09-new-jenkins-release-observations/tcp-port-for-inbound-agents.png&quot; alt=&quot;TCP port for inbound agents&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;configure-the-agent-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-the-agent-2&quot; /&gt;Configure the agent&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the Jenkins TCP port is open for inbound agents, a new agent is configured from the Jenkins &quot;Nodes&quot; menu
This creates an &quot;inbound Jenkins agent&quot; that uses the Jenkins &lt;code&gt;agent.jar&lt;/code&gt; to initiate the connection to the Jenkins controller.
Once the Jenkins TCP port is open for inbound agents, a new agent is configured from the Jenkins &quot;Nodes&quot; menu
This creates an &quot;inbound Jenkins agent&quot; that uses the Jenkins &lt;code&gt;agent.jar&lt;/code&gt; to initiate the connection to the Jenkins controller.
Once the Jenkins TCP port is open for inbound agents, a new agent is configured from the Jenkins &quot;Nodes&quot; menu
This creates an &quot;inbound Jenkins agent&quot; that uses the Jenkins &lt;code&gt;agent.jar&lt;/code&gt; to initiate the connection to the Jenkins controller.&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/2020/2020-09-09-new-jenkins-release-observations/inbound-agent-configuration.png&quot; alt=&quot;Inbound agent configuration&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;download-the-agent-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#download-the-agent-2&quot; /&gt;Download the agent&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent was started the first time by clicking the &quot;Launch&quot; button on the agent configuration page (only available with Java 8).
That downloads the &quot;slave-agent.jnlp&quot; file from the web browser.&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/2020/2020-09-09-new-jenkins-release-observations/launch-inbound-agent-from-jenkins.png&quot; alt=&quot;Launch inbound agent from Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;start-the-agent-with-icedtea-web&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#start-the-agent-with-icedtea-web&quot; /&gt;Start the agent with IcedTea-Web&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recent versions of Java 8 and all versions of Java 11 have removed the &lt;code&gt;javaws&lt;/code&gt; command.
Jenkins agents for Java 8 can still be started with the &lt;code&gt;javaws&lt;/code&gt; command, but it needs to be downloaded separately from the JVM.
We open &quot;slave-agent.jnlp&quot; from a command prompt using the &lt;code&gt;javaws&lt;/code&gt; command that is available from &lt;a href=&quot;https://adoptopenjdk.net/icedtea-web.html&quot;&gt;AdoptOpenJDK IcedTea&lt;/a&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;nowrap&quot;&gt;C:\&amp;gt; C:\icedtea-web-1.8.3.win.bin\icedtea-web-image\bin\javaws.exe -wait slave-agent.jnlp&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java web start (javaws.exe) prompts for permission to run the program with this dialog:&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/2020/2020-09-09-new-jenkins-release-observations/javaws-prompt-for-remoting-agent.png&quot; alt=&quot;Java Web Start prompt for remoting agent&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;install-the-agent-as-a-service-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#install-the-agent-as-a-service-2&quot; /&gt;Install the agent as a service&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent runs and displays a window on the desktop with a single menu entry, &quot;Install as a service&quot;.&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/2020/2020-09-09-new-jenkins-release-observations/install-agent-as-a-service.png&quot; alt=&quot;Install agent as a service&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the &quot;Install as a service&quot; menu item is clicked, the agent is installed and configured to run as a Windows service using the SYSTEM account.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;upgrading-the-controller&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrading-the-controller&quot; /&gt;Upgrading the controller&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins controller on Windows was upgraded to Jenkins 2.249.1 from the &quot;Manage Jenkins&quot; page.
The upgrade process downloads the new &lt;code&gt;jenkins.war&lt;/code&gt; file, saves the current version in case of later downgrade, and offers to restart.&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/2020/2020-09-09-new-jenkins-release-observations/upgrade-jenkins-from-manage-jenkins.png&quot; alt=&quot;Upgrade Jenkins from Manage Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;upgrading-the-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrading-the-agent&quot; /&gt;Upgrading the agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins inbound agent is not upgraded automatically or from a Jenkins user interface.
The agent administrator downloads the most recent &lt;code&gt;agent.jar&lt;/code&gt; from their Jenkins controller and replaces the installed &lt;code&gt;agent.jar&lt;/code&gt; with the downloaded version.&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;war-file-on-windows&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#war-file-on-windows&quot; /&gt;WAR (file) on Windows&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins allows users to run the Jenkins web archive (WAR) file from a command line and then install it as a service from within Jenkins.
This installation technique uses the Jenkins WAR file but does &lt;strong&gt;not&lt;/strong&gt; use a Windows MSI package.
The Jenkins WAR file includes the necessary components to install and configure Jenkins as a service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;install-controller-as-a-service&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#install-controller-as-a-service&quot; /&gt;Install controller as a service&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the Jenkins war file is started from a Windows command prompt, &quot;Manage Jenkins&quot; includes &quot;Install as a service&quot;.
An administrator selects that entry and Jenkins will configure itself to run as a service/
The installer configures the Jenkins controller to run as the SYSTEM user.&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/2020/2020-09-09-new-jenkins-release-observations/install-controller-as-service-from-manage-jenkins.png&quot; alt=&quot;Install Jenkins as a service from Manage Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-agent-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-agent-3&quot; /&gt;Jenkins agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins agents on Windows are often configured to &quot;Launch agent by connecting it to the master&quot;.
The Jenkins agent configuration correctly warns that the controller must open the TCP port for inbound agents in the &quot;Configure Global Security&quot; page.
It is easiest to allow Jenkins to choose the port (a &quot;Random&quot; port).
Jenkins selects a random available port number and shares that port number with agents during their initial connection to the Jenkins http port.&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/2020/2020-09-09-new-jenkins-release-observations/tcp-port-for-inbound-agents.png&quot; alt=&quot;TCP port for inbound agents&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;configure-the-agent-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-the-agent-3&quot; /&gt;Configure the agent&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After opening the Jenkins TCP port for inbound agents, we configured a new agent from the &quot;Nodes&quot; menu
This created an &quot;inbound Jenkins agent&quot; that uses the Jenkins &lt;code&gt;agent.jar&lt;/code&gt; to initiate the connection to the Jenkins controller.&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/2020/2020-09-09-new-jenkins-release-observations/inbound-agent-configuration.png&quot; alt=&quot;Inbound agent configuration&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;download-the-agent-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#download-the-agent-3&quot; /&gt;Download the agent&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent was started the first time by clicking the &quot;Launch&quot; button on the agent configuration page (only available with Java 8).
That downloads the &quot;slave-agent.jnlp&quot; file from the web browser.&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/2020/2020-09-09-new-jenkins-release-observations/launch-inbound-agent-from-jenkins.png&quot; alt=&quot;Launch inbound agent from Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;start-the-agent-with-icedtea-web-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#start-the-agent-with-icedtea-web-2&quot; /&gt;Start the agent with IcedTea-Web&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recent versions of Java 8 and all versions of Java 11 have removed the &lt;code&gt;javaws&lt;/code&gt; command.
Jenkins agents for Java 8 can still be started with the &lt;code&gt;javaws&lt;/code&gt; command, but it needs to be downloaded separately from the JVM.
Open &quot;slave-agent.jnlp&quot; from a command prompt using the &lt;code&gt;javaws&lt;/code&gt; command that is available from &lt;a href=&quot;https://adoptopenjdk.net/icedtea-web.html&quot;&gt;AdoptOpenJDK IcedTea-Web&lt;/a&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;nowrap&quot;&gt;C:\&amp;gt; C:\icedtea-web-1.8.3.win.bin\icedtea-web-image\bin\javaws.exe -wait slave-agent.jnlp&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java web start (javaws.exe) prompts for permission to run the program with this dialog:&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/2020/2020-09-09-new-jenkins-release-observations/javaws-prompt-for-remoting-agent.png&quot; alt=&quot;Java Web Start prompt for remoting agent&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;install-the-agent-as-a-service-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#install-the-agent-as-a-service-3&quot; /&gt;Install the agent as a service&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agent runs and displays a window on the desktop with a single menu entry, &quot;Install as a service&quot;.&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/2020/2020-09-09-new-jenkins-release-observations/install-agent-as-a-service.png&quot; alt=&quot;Install agent as a service&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the &quot;Install as a service&quot; menu item is clicked, the agent is installed and configured to run as a Windows service using the SYSTEM account.&lt;/p&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;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;Jenkins controller installation is best done with the new 64 bit MSI package.
Previous controller installations can be upgraded to the most recent Jenkins release from within Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins inbound agent installation is more complicated now that the &lt;code&gt;javaws.exe&lt;/code&gt; program is not included in the JDK.
The &lt;a href=&quot;https://adoptopenjdk.net/icedtea-web.html&quot;&gt;AdoptOpenJDK IcedTea-Web project&lt;/a&gt; allows administrators to install and configure Jenkins inbound agents with most of the ease that was available in prior Java releases.&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;&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/09/10/jenkins-continuous-evolution-cdcon/</id>
<title>Learn more about Jenkins&#39; continuous evolution at CDCon</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-09-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/09/10/jenkins-continuous-evolution-cdcon/" />
<author>
<name>cdfoundation</name>
</author>
<category term='cdcon'></category>
<category term='talks'></category>
<category term='jcasc'></category>
<category term='cicd'></category>
<category term='tekton'></category>
<summary>
The Jenkins project has been around for over fifteen years and is the defacto platform for CI/CD. One of the reasons it continues to be so ubiquitous is that Jenkins constantly evolves and offers flexibility to integrate other tools that work well for your solution.


At CDCon, on October 7-8, there are two particular Jenkins talks that will focus on new directions that the Jenkins platform is evolving too and getting better and better for users.


Heard of JCasC and Not Sure Where to Start? Let me Help You!


Configuration as code is a best practice for your CI/CD setup as it makes...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has been around for over fifteen years and is the defacto platform for CI/CD. One of the reasons it continues to be so ubiquitous is that Jenkins constantly evolves and offers flexibility to integrate other tools that work well for your solution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At &lt;a href=&quot;https://events.linuxfoundation.org/cdcon/&quot;&gt;CDCon&lt;/a&gt;, on October 7-8, there are two particular Jenkins talks that will focus on new directions that the Jenkins platform is evolving too and getting better and better for users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;heard-of-jcasc-and-not-sure-where-to-start-let-me-help-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#heard-of-jcasc-and-not-sure-where-to-start-let-me-help-you&quot; /&gt;&lt;a href=&quot;https://sched.co/dqOc&quot;&gt;Heard of JCasC and Not Sure Where to Start? Let me Help You!&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Configuration as code is a best practice for your CI/CD setup as it makes the complex process of setting up Jenkins simpler and more reproducible. Jenkins Configuration as Code (JCasc) enables Jenkins users to define the whole configuration as a simple, plain text YAML syntax. With JCasc, setting up a new Jenkins controller is easier than ever before. To get started with JCasC some initial effort is required. This talk walks you through a basic setup for easily spinning up new Jenkins instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;October 7 at 2:20 PM PST
Speaker: Ewelina Wilkosz, Eficode&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ewelina W is passionate about making sure that her customers&#39; software is being built, tested and released in the best possible way. And, most importantly, that software developers don’t hate the process. Ewelina has been involved in Jenkins Configuration as Code plugin development from the very beginning. This is a must-see talk where Ewelina will also share some tips and tricks. The talk will feature using Docker, Jenkins and GitHub Actions as a quick way to build… Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;bridging-the-gap-with-tekton-client-plugin-for-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bridging-the-gap-with-tekton-client-plugin-for-jenkins&quot; /&gt;&lt;a href=&quot;https://sched.co/dpvN&quot;&gt;Bridging the Gap with Tekton-client-plugin for Jenkins&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tekton provides Kubernetes-native CI/CD building blocks. It enables users to take full advantage of cloud-native features around scalability and high availability. Jenkins flexibility enables integration with Tekton. This talk showcases the new tekton-client-plugin for Jenkins that enables Jenkins to interact with Tekton pipelines on a Kubernetes cluster. Tekton and Jenkins are both CDF projects and this talk highlights the first steps towards better Tekton and Jenkins interoperability, a key goal of the CD Foundation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;October 7 at 11:40 AM PST
Speaker: Vibhav Bobade, Red Hat&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;register-for-cdcon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#register-for-cdcon&quot; /&gt;&lt;a href=&quot;https://events.linuxfoundation.org/cdcon/&quot;&gt;Register for CDCon&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both these talks showcase the ultimate flexibility and power of the Jenkins platform and how it continues to evolve to meet the challenges of modern-day CI/CD. Don’t miss out; &lt;a href=&quot;https://events.linuxfoundation.org/cdcon/&quot;&gt;register for CDCon&lt;/a&gt; to attend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;CDCon has pledged to donate 100% of the proceeds received from CDCon 2020 registration to charitable causes: Black Girls Code, Women Who Code and the CDF Diversity Fund. Registrants indicate which charitable fund they want their 25 USD registration fees to go to during registration. If you can’t afford the registration cost, please apply for the &lt;a href=&quot;https://events.linuxfoundation.org/cdcon/attend/scholarships/&quot;&gt;diversity scholarship&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://events.linuxfoundation.org/cdcon/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/cdcon-register.png&quot; alt=&quot;Register for CDCon&quot; /&gt;
&lt;/a&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/2020/08/31/github-checks-api-plugin-coding-phase-3/</id>
<title>GitHub Checks API Plugin Project - Coding Phase 3</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/31/github-checks-api-plugin-coding-phase-3/" />
<author>
<name>XiongKezhi</name>
</author>
<category term='github'></category>
<category term='api'></category>
<category term='plugins'></category>
<category term='developer'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
This blog post is about our phase 3 progress on GitHub Checks API Project, you can find our previous blog posts for phase 1 and phase 2.


At the end of this summer, the GSoC journey for GitHub Checks API Project comes to an end as well.
In this blog post, I&#8217;ll show you our works during the last month:




Pipeline Support


Rerun Request Support


Git SCM Support


Documentation




All the above features will be available in our planned 1.0.0 version of Checks API Plugin and GitHub Checks Plugin.


Coding Phase 3 Demo





Pipeline Support

The pipeline support allows users to directly publish checks in their pipeline script without depending...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post is about our phase 3 progress on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/github-checks/&quot;&gt;GitHub Checks API Project&lt;/a&gt;, you can find our previous blog posts for &lt;a href=&quot;https://www.jenkins.io/blog/2020/07/09/github-checks-api-plugin-coding-phase-1&quot;&gt;phase 1&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/2020/08/03/github-checks-api-plugin-coding-phase-2&quot;&gt;phase 2&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the end of this summer, the GSoC journey for &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/github-checks/&quot;&gt;GitHub Checks API Project&lt;/a&gt; comes to an end as well.
In this blog post, I’ll show you our works during the last month:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pipeline Support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rerun Request Support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git SCM Support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;All the above features will be available in our planned 1.0.0 version of &lt;a href=&quot;https://plugins.jenkins.io/checks-api&quot;&gt;Checks API Plugin&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/github-checks&quot;&gt;GitHub Checks Plugin&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Coding Phase 3 Demo&lt;/div&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/S-pEgT3lzpk?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;pipeline-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-support&quot; /&gt;Pipeline Support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The pipeline support allows users to directly publish checks in their pipeline script without depending on any other consumers.&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/2020/08-github-checks-api-plugin-coding-phase-3/pipeline-check.png&quot; alt=&quot;Pipeline Checks&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The check in the above screenshot is published by script:&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;publishChecks&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;pipeline check&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;title:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;pipeline &#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;summary:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;# A pipeline check example&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;text:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;## This check is published through the pipeline script&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;detailsURL:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;https://ci.jenkins.io&#39;&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;em&gt;If you want to publish checks to GitHub, please install the &lt;a href=&quot;https://github.com/jenkinsci/github-checks-plugin&quot;&gt;GitHub implementation&lt;/a&gt; and refer to the &lt;a href=&quot;https://docs.github.com/en/rest/reference/checks&quot;&gt;GitHub API documentation&lt;/a&gt; for the requirements for each field. A default value (build link) for &lt;code&gt;detailsURL&lt;/code&gt; will be provided automatically.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature can be useful when many stages exist in your pipeline script and each takes a long time: you can publish a check for each stage to keep track of the build.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;rerun-request-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#rerun-request-support&quot; /&gt;Rerun Request Support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The rerun request allows GitHub users to rerun the failed builds. When a build failed (which leads to a failed check), a &lt;code&gt;Re-run&lt;/code&gt; button will be added automatically by GitHub.&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/2020/08-github-checks-api-plugin-coding-phase-3/failed-checks.png&quot; alt=&quot;Failed Checks&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By clicking the &lt;code&gt;Re-run&lt;/code&gt; button, Jenkins will reschedule a build for the last commit of this branch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Since all checks of a commit are produced by a single build, you don’t have to rerun all failed checks, just rerun any one of the failed check will refresh all checks.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;git-scm-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#git-scm-support&quot; /&gt;Git SCM Support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/uhafner&quot;&gt;Ullrich&lt;/a&gt;&#39;s great help, the &lt;a href=&quot;https://plugins.jenkins.io/github-checks&quot;&gt;GitHub Checks Plugin&lt;/a&gt; now supports &lt;a href=&quot;https://github.com/jenkinsci/git-plugin&quot;&gt;Git SCM&lt;/a&gt;.
This means now you can publish checks for your freestyle project or any other projects that use Git SCM.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;document&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#document&quot; /&gt;Document&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/checks-api-plugin/blob/master/docs/consumers-guide.md&quot;&gt;Consumers Guide&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkinsci/checks-api-plugin/blob/master/docs/implementation-guide.md&quot;&gt;Implementation Guide&lt;/a&gt; are now available.
As a Jenkins developer, you can now start consuming our API or even providing an implementation for other SCM platforms beside GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;acknowledgment&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgment&quot; /&gt;Acknowledgment&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The whole &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/github-checks/&quot;&gt;GitHub Checks API project&lt;/a&gt; is started as a Google Summer of Code project. Much appreciate my mentors (&lt;a href=&quot;https://github.com/timja&quot;&gt;Tim&lt;/a&gt; and &lt;a href=&quot;https://github.com/uhafner&quot;&gt;Ullrich&lt;/a&gt;) for their great help during the whole summer. Also huge thanks to the &lt;a href=&quot;https://www.jenkins.io/sigs/gsoc/&quot;&gt;Jenkins GSoC SIG&lt;/a&gt; and the whole community for the technique support and resources.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&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://github.com/jenkinsci/checks-api-plugin&quot;&gt;Checks API Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/github-checks-plugin&quot;&gt;GitHub Checks Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/github-checks/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_github-checks-api:gitter.im&quot;&gt;Gitter Channel&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/2020/08/31/custom-distribution-service/</id>
<title>Custom Distribution Service : Phase 3 Blogpost</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/31/custom-distribution-service/" />
<author>
<name>sladyn98</name>
</author>
<category term='service'></category>
<category term='distribution'></category>
<category term='cloud-native'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<category term='packaging'></category>
<category term='platform-sig'></category>
<summary>
Hello everyone,


This is the final blog post for the Custom Distribution Service project during the Google Summer of Code timeline.
I have mixed feelings since we are almost near the finish line for one of the most amazing open source programs out there.
However, it is time to wrap things up for this project and achieve a state where the project can be built upon and extended further.
This phase has been super busy with respect to the bug fixes, testing and getting the project hosted, so let us get straight into the phase 3 updates.


Fixes and Code quality assurance


Set Jenkinsfile agent to...
</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 is the final blog post for the Custom Distribution Service project during the Google Summer of Code timeline.
I have mixed feelings since we are almost near the finish line for one of the most amazing open source programs out there.
However, it is time to wrap things up for this project and achieve a state where the project can be built upon and extended further.
This phase has been super busy with respect to the bug fixes, testing and getting the project hosted, so let us get straight into the phase 3 updates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;fixes-and-code-quality-assurance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fixes-and-code-quality-assurance&quot; /&gt;Fixes and Code quality assurance&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;set-jenkinsfile-agent-to-linux&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#set-jenkinsfile-agent-to-linux&quot; /&gt;Set Jenkinsfile agent to linux&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We realised that the build was failing on windows and that there was not really a use-case
for running it on windows for right now. Maybe it could be on a future roadmap. Therefore, we
decided to shift the testing to only linux agents with respect to running the tests on the jenkins
server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/116&quot;&gt;#116&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;backend-port-error-message&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#backend-port-error-message&quot; /&gt;Backend port error message&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Spring boot has a default message on the &lt;code&gt;port:8080&lt;/code&gt; and therefore we wanted to change
it to a custom message on the backend. So the major takeaway here is that we needed to
implement the &lt;code&gt;Error Controller&lt;/code&gt; interface and include a custom message in it.
This was technical debt from the last phase and was completed and merged during this phase.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/92&quot;&gt;#92&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;pmd-analysis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pmd-analysis&quot; /&gt;PMD Analysis&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to enhance the quality of the code, the PMD source code analyser was applied to the project.
It helped me catch tons of errors. When the initial PMD check was run and we found approximately 162 PMD errors. We realised some of them were not relevant and some of them could be fixed later.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/102&quot;&gt;#102&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;findbugs-analysis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#findbugs-analysis&quot; /&gt;Findbugs Analysis&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another tool to improve code quality that we included in this phase was findbugs.
It did catch around 5-10 bugs in my code which I immediately resolved. Most of them were
around the &lt;code&gt;Closeable HTTP Request&lt;/code&gt; and an easy fix was the &lt;code&gt;try with resources&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/118&quot;&gt;#118&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;jacoco-code-coverage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jacoco-code-coverage&quot; /&gt;Jacoco Code Coverage&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We needed to make sure most of the code we write had proper coverage for all branches and
lines. Therefore we decided to include a JaCoco Code Coverage reporter that helped us find the
uncovered lines and areas we need to improve coverage on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/103&quot;&gt;#103&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;remove-jcasc-generation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#remove-jcasc-generation&quot; /&gt;Remove JCasC generation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While developing the service we quickly realised that the generation of the war package broke if we
included a &lt;code&gt;configuration as code&lt;/code&gt; section but did not provide a path to the corresponding required &lt;code&gt;yml&lt;/code&gt;
file. Therefore we took a decision to remove the &lt;code&gt;casc&lt;/code&gt; section all together. Maybe it will comeback in
a future patch&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request link: &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/127&quot;&gt;#127&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Issue link: &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/issues/65&quot;&gt;#65&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;minor-fixes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#minor-fixes&quot; /&gt;Minor Fixes&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Logging Fix: &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/99&quot;&gt;#99&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docs Fix : link: &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/120&quot;&gt;#120&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update Center Dump Fix : link: &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/125&quot;&gt;#125&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Class Path Fix: link: &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/126&quot;&gt;#126&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release Drafter Addition: link: &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/136&quot;&gt;#136&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;front-end&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#front-end&quot; /&gt;Front end&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;community-config-navigation-link&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-config-navigation-link&quot; /&gt;Community Config Navigation link&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was no community configuration link present for navigation which was added here.
 Now it is easier to navigate to the community page from the home page itself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/100&quot;&gt;#100&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;docker-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-updates&quot; /&gt;Docker updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;build-everything-with-docker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-everything-with-docker&quot; /&gt;Build everything with Docker&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was one of the major changes this phase with respect to making the service very easy to spin up locally, this change will greatly help community adoption since it eliminates the tools one needs to install locally. Initially the process was to run maven locally, generate all of the files and then copy all of its contents into the container. However, with this change we are going to generate all of the files inside the docker container itself. Allowing the user to just run a couple of commands to get the service up and running.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So some of the major changes we did with respect to the dockerfile was:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a) Copy all of the configuration files and &lt;code&gt;pom.xml&lt;/code&gt; into the container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;b) Run the command &lt;code&gt;mvn clean package&lt;/code&gt; inside the container which generates the jar.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;c) Run the jar inside the container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/104&quot;&gt;#104&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;hosting-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hosting-updates&quot; /&gt;Hosting updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This process was supposed to be a future roadmap, however the infra team approved and was super helpful
in making this process as smooth as possible. Thanks to Gavin, Tim and Oblak for making this possible.
Here is the google group &lt;a href=&quot;https://groups.google.com/g/jenkins-infra/c/v3UJfiFte8w&quot;&gt;discussion&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project has now been hosted &lt;a href=&quot;https://customize.jenkins.io/&quot;&gt;here&lt;/a&gt; as a preview. It still needs
some fixes to be fully functional.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Infra Docker PR &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/131&quot;&gt;#131&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Infra Project Addition PR link: &lt;a href=&quot;https://github.com/jenkins-infra/charts/pull/393&quot;&gt;#393&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;testing-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-updates&quot; /&gt;Testing Updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;unit-test-the-services&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#unit-test-the-services&quot; /&gt;Unit test the services&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With respect to community hosting and adoption, testing of the service one of the most important and major milestones for this phase was to test the majority of the code and we have completed the testing with flying colors. All of the services have been completely unit tested, which is a major accomplishment.
For the testing of the service we decided to go with wiremock which can be used to mock external services. Kezhi’s &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/105#issuecomment-668087069&quot;&gt;comment&lt;/a&gt; helped us to understand what we needed to do since he had done something quite similar in his Github Checks API project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we basically wiremocked the update-center url and made sure we were getting
the accurate response with appropriate control flow logic tested.&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;wireMockRule.stubFor(get(urlPathMatching(&quot;/getUpdateCenter&quot;))
                .willReturn(aResponse()
                        .withStatus(200)
                        .withHeader(&quot;Content-Type&quot;, &quot;application/json&quot;)
                        .withBody(updateCenterBody)));&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/105&quot;&gt;#105&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;add-update-center-controller-tests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#add-update-center-controller-tests&quot; /&gt;Add Update Center controller tests&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another major testing change involved testing the controllers. For this we decided to use the &lt;code&gt;wiremock&lt;/code&gt; library in java to mock the server response when the controllers were invoked.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example: If I have a controller that serves in an api called &lt;code&gt;/api/plugin/getPluginList&lt;/code&gt;
wiremock can be used to stub out its response when the system is under test. So we use something like this to test it out.&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; when(updateService.downloadUpdateCenterJSON()).thenReturn(util.convertPayloadToJSON(dummyUpdateBody))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the particular controller is called the underlying service is mocked and it returns a response according to the one provided by us. To find more details the PR is here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/106&quot;&gt;#106&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;add-packager-controller-tests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#add-packager-controller-tests&quot; /&gt;Add Packager Controller Tests&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Along with the update center controller tests another controller that needed to be tested was the
packager controller. Also we needed to make sure that all the branches for the controllers were properly tested. Additional details can be found in the PR below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/133&quot;&gt;#133&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;docker-compose-tests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-compose-tests&quot; /&gt;Docker Compose Tests&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One problem that we faced the entire phase was the docker containers. We regularly found out that due to
some changes in the codebase the docker container build sometimes broke, or even sometimes the inner api’s seemed to malfunction. In order to counteract that we decided to come up with some tests locally.
So what I did was basically introduce a set of bash scripts that would do the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a) Build the container using the &lt;code&gt;docker-compose&lt;/code&gt; command.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;b) Run the container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;c) Test the api’s using the exposed port.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;d) Teardown the running containers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/131&quot;&gt;#131&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;user-documentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#user-documentation&quot; /&gt;User Documentation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also included a user docs guide so that it makes it super easy to get started with the service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/145&quot;&gt;#145&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;future-roadmap&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-roadmap&quot; /&gt;Future Roadmap&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This has been a super exciting project to work on and I can definitely see this project being built
upon and extended in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to talk about some of the features that are left to come in and can be taken up in
a future roadmap discussion&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a) &lt;strong&gt;JCasC Support&lt;/strong&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Description: Support the generation of a Jenkins Configuration as Code file asking the user interactively for the plugins they select what would be the configuration they would want eg: If the user selects the slack plugin we need to ask him questions like &lt;code&gt;what is the slack channel? what is the token? etc&lt;/code&gt;, and on the basis of this generate a &lt;code&gt;casc&lt;/code&gt; file. This feature was initially planned to go into the service but we realised this is a project in its own capacity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;b) &lt;strong&gt;Auto Pull Request Creation&lt;/strong&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Description: Allow users to create a configuration file and immediately open a pull request on github
without leaving the user interface. This was originally planned using a github bot and we started the work on it. But we were in doubt if the service would be hosted or not and therefore put the development on hold.
You can find the pull requests here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Github Controller &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/72&quot;&gt;#72&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull Request Creation Functions &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/66&quot;&gt;#66&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;c) &lt;strong&gt;Synergy with Image Controller&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Description: This feature requires some planning, some of the questions we can ask are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a) Can we generate the images (i.e Image Controller).
b) Can we have the service as a multipurpose generator ?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;statistics&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#statistics&quot; /&gt;Statistics&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This phase has been the busiest of all phases and it has involved a lot of work, more than I had
initially expected in the phase. Although lines
of code added is not an indication of work done, however 800 lines of Code added is a real personal milestone for me.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all&quot; style=&quot;width: 25%;&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 83.3333%;&quot;&gt;
&lt;col style=&quot;width: 16.6667%;&quot;&gt;
&lt;/col&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;Pull Requests Opened&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;26&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;Lines of Code Added&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;1096&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;Lines of Docs Added&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;200&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;other-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-links&quot; /&gt;Other links&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jenkins-custom-distribution-service:gitter.im&quot;&gt;Gitter Channel Link&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://docs.google.com/document/d/1C7VQJ92Yhr0KRDcNVHYxn4ri7OL9IGZmgxY6UFON6-g/edit?usp=sharing&quot;&gt;GSoC Proposal&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://docs.google.com/document/d/1-ujWVJ2a5VYkUF6UA7m4bEpSDxmb3mJZhCbmoKO716U/edit?usp=sharing&quot;&gt;Design Document&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://docs.google.com/document/d/1DSCH-3wh6uV9Rm_j8PcBzq2lvQPhZ31AIwmWkEaLxvc/edit?usp=sharing&quot;&gt;Daily Notes&lt;/a&gt;&lt;br /&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;/p&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/2020/08/29/git-performance-improvement-phase3/</id>
<title>Git Plugin Performance Improvement: Final Phase and Release</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/29/git-performance-improvement-phase3/" />
<author>
<name>rishabhbudhouliya</name>
</author>
<category term='plugins'></category>
<category term='git'></category>
<category term='platform-sig'></category>
<category term='developer'></category>
<category term='performance'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
Since the beginning of the project, the core value which drove its progress was "To enhance the user experience for running Jenkins jobs by reducing the overall execution time".


To achieve this goal, we laid out a path:




Compare the two existing git implementations i.e CliGitAPIImpl and JGitAPIImpl using performance benchmarking


Use the results to create a feature which would improve the overall performance of git plugin


Also, fix existing user reported performance issues




Let&#8217;s take a journey to understand how we&#8217;ve built the new features. If you&#8217;d like to skip the journey part, you can directly go to the [major performance improvements] section and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the beginning of the project, the core value which drove its progress was &quot;To enhance the user experience for running Jenkins jobs by reducing the overall execution time&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To achieve this goal, we laid out a path:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Compare the two existing git implementations i.e CliGitAPIImpl and JGitAPIImpl using performance benchmarking&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the results to create a feature which would improve the overall performance of git plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also, fix existing user reported performance issues&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s take a journey to understand how we’ve built the new features. If you’d like to skip the journey part, you can directly go to the &lt;a href=&quot;#major performance improvements&quot;&gt;[major performance improvements]&lt;/a&gt; section and the &lt;a href=&quot;#minor performance section&quot;&gt;[minor performance section]&lt;/a&gt; to see what we’ve done!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;journey-to-release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#journey-to-release&quot; /&gt;Journey to release&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project started with deciding to choose a git operation and then trying to compare the performance of that operation by using &lt;code&gt;command line git&lt;/code&gt; and then with &lt;code&gt;JGit&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stage-1-benchmark-results-with-git-fetch&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-1-benchmark-results-with-git-fetch&quot; /&gt;Stage 1: Benchmark results with git fetch&lt;/h3&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/2020/07-git-plugin-performance-improvement/git-fetch-results.png&quot; alt=&quot;git-fetch-results&quot; width=&quot;938&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The performance of git fetch (average execution time/op) is strongly correlated to the size of a repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There exists an inflection point on the scale of repository size after which the nature of &lt;code&gt;JGit&lt;/code&gt; performance changes (it starts to degrade)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After running multiple benchmarks, it is safe to say that for a large sized repository &lt;code&gt;command line git&lt;/code&gt; would be a better choice of implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We can use this insight to implement a feature which avoids &lt;code&gt;JGit&lt;/code&gt; with large repositories.&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;stage-2-comparing-platforms&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-2-comparing-platforms&quot; /&gt;Stage 2: Comparing platforms&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project was also concerned that there might be important differences between operating systems.
For example, what if command line Git for Windows performed very differently than command line Git on Linux or FreeBSD?
Benchmarks were run to compare fetch performance on several platforms.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Running git fetch operation for a 400 MiB sized repository on:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AMD64 Microsoft Winders&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AMD64 FreeBSD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IBM PowerPC 64 LE Ubuntu 18&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IBM System 390 Ubuntu 18&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The result of running this experiment is given below:&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/2020/07-git-plugin-performance-improvement/git-multiple-platforms.png&quot; alt=&quot;Performance on multiple platforms&quot; /&gt;&lt;/span&gt;
&lt;/p&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;
The difference in performance between &lt;code&gt;git&lt;/code&gt; and &lt;code&gt;JGit&lt;/code&gt; remains constant across all platforms.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Benchmark results on one platform are applicable to all platforms.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stage-3-performance-of-git-fetch-and-repository-structure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-3-performance-of-git-fetch-and-repository-structure&quot; /&gt;Stage 3: Performance of git fetch and repository structure&lt;/h3&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/2020/07-git-plugin-performance-improvement/git-repo-diagram.png&quot; alt=&quot;git repo diagram&quot; width=&quot;420&quot; title=&quot;Relationship of repository structure with performance&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The area of the circle enclosing each parameter signifies the strength of the positive correlation between the performance of a git fetch operation and that parameter. From the diagram:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Size of the aggregated objects is the &lt;strong&gt;dominant&lt;/strong&gt; player in determining the execution time for a git fetch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Number of branches and Number of tags play a similar role but are strongly overshadowed by size of repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Number of commits has a negligible effect on the performance of running git fetch&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;After running these experiments from Stage-1 to Stage-3, we developed a solution called the &lt;code&gt;GitToolChooser&lt;/code&gt; which is explained in the next stage&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stage-4-faster-checkout-with-git-tool-chooser&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-4-faster-checkout-with-git-tool-chooser&quot; /&gt;Stage 4: Faster checkout with Git tool chooser&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature takes the responsibility of choosing the optimal implementation from the &lt;strong&gt;user&lt;/strong&gt; and hands it to the &lt;strong&gt;plugin&lt;/strong&gt;. It takes the decision of recommending an implementation on the basis of the size of the repository. &lt;a href=&quot;https://www.jenkins.io/blog/2020/07/29/git-performance-improvement-phase2/&quot;&gt;Here is how it works&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/post-images/2020/07-git-plugin-performance-improvement/git-perf-improv.png&quot; alt=&quot;git perf improv&quot; width=&quot;938&quot; title=&quot;Faster checkouts with GitToolChooser&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The image above depicts the performance enhancements we have performed over the course of the GSoC project. These improvements have enabled the checkout step to be finished &lt;strong&gt;within half of what it used to take&lt;/strong&gt; earlier in some cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s talk about performance improvements in two parts.&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;major-performance-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#major-performance-improvements&quot; /&gt;Major performance improvements&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&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/07-git-plugin-performance-improvement/git-major-perf.png&quot; alt=&quot;Major performance enhancements&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building Tensorflow (~800 MiB) using a Jenkins pipeline, there is over 50% reduction in overall time spent in completing a job!
The result is consistent multiple platforms.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The reason for such a decrease is the fact that &lt;code&gt;JGit&lt;/code&gt; degrades in performance when we are talking about large sized repositories. Since the GitToolChooser is aware of this fact, it chooses to recommend &lt;code&gt;command line git&lt;/code&gt; instead which saves the user some time.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;minor-performance-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#minor-performance-improvements&quot; /&gt;Minor performance improvements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note: Enable JGit before using the new performance features to let GitToolChooser work with more options&lt;/strong&gt; → &lt;a href=&quot;https://plugins.jenkins.io/git-client/#enabling-jgit&quot;&gt;Here’s how&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/post-images/2020/07-git-plugin-performance-improvement/git-minor-perf.png&quot; alt=&quot;git minor perf&quot; width=&quot;400&quot; title=&quot;Minor performance enhancements&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building the git plugin (~ 20 MiB) using a Jenkins pipeline, there is a drop of a &lt;strong&gt;second&lt;/strong&gt; across all platforms when performance enhancement is enabled. Also, eliminating a redundant fetch reduces unnecessary load on git servers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The reason for this change is the fact that &lt;code&gt;JGit&lt;/code&gt; performs better than &lt;code&gt;command line git&lt;/code&gt; for small sized repositories (&amp;lt;50MiB) as an already warmed up JVM favors the native Java implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;releases&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#releases&quot; /&gt;Releases&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://github.com/jenkinsci/git-plugin/releases/tag/git-4.4.0&quot;&gt;Git Plugin 4.4.0&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add GitToolChooser&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove redundant fetch&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/git-client-plugin/releases/tag/git-client-3.4.0&quot;&gt;Git Client Plugin 3.4.0&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add support to communicate compatibility of JGit with certain additional SCM behaviors&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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-road-ahead&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-road-ahead&quot; /&gt;The road ahead&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;Support from other branch source plugins&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Plugins like the GitHub Branch Source Plugin or GitLab Branch Source Plugin need to extend an extension point provided by the git plugin to facilitate the exchange of information related to size of a remote repository hosted by the particular git provider&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/63519&quot;&gt;JENKINS-63519&lt;/a&gt;: GitToolChooser predicts the wrong implementation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Addition of this feature to GitSCMSource&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Detection of lock related delays accessing the cache directories present on the controller&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This issue was reported by the plugin maintainer Mark Waite, there is a need to reproduce the issue first and then find a possible solution.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;reaching-out&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reaching-out&quot; /&gt;Reaching out&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to reach out to us for any questions or feedback on the project’s
link:https://app.gitter.im/#/room/#jenkinsci_git-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter Channel&lt;/a&gt; or the
&lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins Developer Mailing list&lt;/a&gt;.
Report an issue at Jenkins &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;Jira&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;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/blog/2020/07/09/git-performance-improvement-phase1/&quot;&gt;Phase 1 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/2020/07/29/git-performance-improvement-phase2/&quot;&gt;Phase 2 Blog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/git-plugin-performance/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;demonstration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demonstration&quot; /&gt;Demonstration&lt;/h3&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/sEqK4dAFg4s?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&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/2020/08/27/winsw-yaml-support/</id>
<title>Jenkins Windows Services: YAML Configuration Support - GSoC Project Results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/27/winsw-yaml-support/" />
<author>
<name>buddhikac96</name>
</author>
<category term='winsw'></category>
<category term='windows'></category>
<category term='jenkins'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<category term='platform-sig'></category>
<summary>
Hello, world! GSoC 2020 Phase 3 has ended now and it was a great period for the Jenkins Windows Services - YAML Configuration Support project.
In this blog post, I will announce the updates during the GSoC 2020 - Phase 2 and Phase 3. If you are not already aware of this project,
I would recommend reading this blog post which was published after GSoC 2020 - Phase 1.


Project Scope




Windows Service Wrapper - YAML configuration support


YAML schema validation


New CLI


XML Schema validation




YAML Configuration Support

Under WinSW - YAML configurations support, these tasks will be done.


YAML to Object mapping

At the moment YAML object mapping is...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello, world! GSoC 2020 Phase 3 has ended now and it was a great period for the &lt;em&gt;Jenkins Windows Services - YAML Configuration Support&lt;/em&gt; project.
In this blog post, I will announce the updates during the GSoC 2020 - Phase 2 and Phase 3. If you are not already aware of this project,
I would recommend reading &lt;a href=&quot;https://www.jenkins.io/blog/2020/07/08/winsw-yaml-support/&quot;&gt;this blog post&lt;/a&gt; which was published after GSoC 2020 - Phase 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-scope&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-scope&quot; /&gt;Project Scope&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;Windows Service Wrapper - YAML configuration support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YAML schema validation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New CLI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;XML Schema validation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;yaml-configuration-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-configuration-support&quot; /&gt;YAML Configuration Support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under WinSW - YAML configurations support, these tasks will be done.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;yaml-to-object-mapping&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-to-object-mapping&quot; /&gt;YAML to Object mapping&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the moment YAML object mapping is finished and merged.
You can find all the implementations in this &lt;a href=&quot;https://github.com/winsw/winsw/pull/543&quot;&gt;Pull Request&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;extend-winsw-to-support-both-xml-and-yaml&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#extend-winsw-to-support-both-xml-and-yaml&quot; /&gt;Extend WinSW to support both XML and YAML&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This task is already done and merged. Find the implementation in this &lt;a href=&quot;https://github.com/winsw/winsw/pull/543&quot;&gt;Pull Request&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;yaml-configuration-support-for-extensions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-configuration-support-for-extensions&quot; /&gt;YAML Configuration support for Extensions&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the moment there are 2 internal plugins in WinSW. RunAwayProcessKiller and SharedDirectoryMapper.
We allow users to provide configurations for those plugins in the same XML and YAML configuration file which is used to configure WinSW. This task is merged as well.
&lt;a href=&quot;https://github.com/winsw/winsw/pull/638&quot;&gt;Pull Request&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;yaml-schema-validation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-schema-validation&quot; /&gt;YAML schema validation&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users can validate YAML configuration file against &lt;a href=&quot;https://github.com/winsw/winsw/blob/master/doc/yamlConfigurationSchema.json&quot;&gt;JSON schema file.&lt;/a&gt;
Users can use &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml&quot;&gt;YAML utility tool from Visual Studio market place&lt;/a&gt; to validate YAML config file against JSON schema.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;key-updates-in-phase-2-and-phase-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-updates-in-phase-2-and-phase-3&quot; /&gt;Key updates in Phase 2 and Phase 3&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;YAML Configuration structure&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Environment variables&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Now users can provide environment variables as a sequence of dictionaries that contains name and value for environment variables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TimeStamp values&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Users can specify timestamp values in the same manner used in XML (e.g. &lt;code&gt;10 ms&lt;/code&gt;, &lt;code&gt;5 sec&lt;/code&gt;, &lt;code&gt;3 min&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YAML configuration document was published. &lt;a href=&quot;https://github.com/winsw/winsw/blob/master/doc/YamlConfigFile.md&quot;&gt;YAML Configuration Specification&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extend the WinSW to support both XML and YAML&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/winsw/winsw/blob/master/doc/extensions/extensions.md&quot;&gt;YAML support for extensions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/winsw/winsw/blob/master/doc/yamlConfigurationSchema.json&quot;&gt;YAML schema validation against JSON schema&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;sample-yaml-configuration-file&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sample-yaml-configuration-file&quot; /&gt;Sample YAML Configuration File&lt;/h4&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;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkins&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Jenkins&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;This service runs Jenkins automation server.&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;env&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;JENKINS_HOME&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;%LocalAppData%\Jenkins.jenkins&#39;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;LM_LICENSE_FILE&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;host1;host2&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;executable&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;java&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;&amp;gt;-&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;-jar &quot;E:\Winsw Test\yml6\jenkins.war&quot; --httpPort=8081&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rotate&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;onFailure&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;action&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;restart&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;delay&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;10 sec&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;reboot&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;delay&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;1 hour&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;extensions&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;killOnStartup&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;yes&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;classname&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;WinSW.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;settings&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;pidfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;%BASE%\pid.txt&#39;&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;stopTimeOut&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;5000&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;StoprootFirst&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;mapNetworDirs&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;yes&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;classname&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;WinSW.Plugins.SharedDirectoryMapper.SharedDirectoryMapper&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;settings&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;mapping&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;enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
                  &lt;span class=&quot;na&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;N&lt;/span&gt;
                  &lt;span class=&quot;na&quot;&gt;uncpath&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;\\UNC&lt;/span&gt;
                &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
                  &lt;span class=&quot;na&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;M&lt;/span&gt;
                  &lt;span class=&quot;na&quot;&gt;uncpath&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;\\UNC2&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;sect2&quot;&gt;
&lt;h3 id=&quot;new-cli&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-cli&quot; /&gt;New CLI&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let me explain in brief, why we need a new CLI.
In WinSW, we will keep both XML and YAML configuration support.
But according to the current implementation, the user can’t specify the configurations file explicitly.
Also, we want to let the user skip the schema validation as well.
So We decided to move into new CLI which is more structured with commands and options.
Please read my &lt;a href=&quot;https://www.jenkins.io/blog/2020/07/08/winsw-yaml-support/&quot;&gt;previous blog post&lt;/a&gt; to learn more about commands and options in the new CLI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;key-updates-in-phase-2-and-phase-3-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-updates-in-phase-2-and-phase-3-2&quot; /&gt;Key updates in Phase 2 and Phase 3&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Remove the /redirect command&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;testwait&lt;/strong&gt; command was removed and add the &lt;strong&gt;wait&lt;/strong&gt; option to the &lt;strong&gt;test&lt;/strong&gt; command.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;stopwait&lt;/strong&gt; command was removed and add the &lt;strong&gt;wait&lt;/strong&gt; option to the &lt;strong&gt;stop&lt;/strong&gt; command.&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-to-try&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-try&quot; /&gt;How to try&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;User can configure the Windows Service Wrapper by both XML and YAML configuration files using the following steps.&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;Create the configuration file (XML or YAML).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save it with the same name as the Windows Service Wrapper executable name.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Place the configuration file inside the directory(or in a parent directory), where the Windows Service Wrapper executable is located.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If there are both XML and YAML configuration files, Windows Service Wrapper will be configured by the XML configuration file.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;gsoc-2020-phase-2-demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gsoc-2020-phase-2-demo&quot; /&gt;GSoC 2020 Phase 2 Demo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/9qyo1f2rKQw?rel=0&amp;amp;start=2736&amp;amp;end=4000&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;gsoc-2020-phase-3-demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gsoc-2020-phase-3-demo&quot; /&gt;GSoC 2020 Phase 3 Demo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/G05unV7aDrg?rel=0&amp;amp;start=2736&amp;amp;end=4000&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;future-works&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-works&quot; /&gt;Future Works&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;XML Schema validation&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;XML configuration file will be validated with the XSD file.
I have started working on this feature and you can find the implementation in this &lt;a href=&quot;https://github.com/winsw/winsw/pull/460&quot;&gt;Pull Request&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YAML Configuration validate on startup&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;how-to-contribute&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-contribute&quot; /&gt;How to contribute&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find the GitHub repository in this &lt;a href=&quot;https://github.com/winsw/winsw&quot;&gt;link&lt;/a&gt;.
Issues and Pull requests are always welcome. Also, you can communicate with us in the &lt;a href=&quot;https://app.gitter.im/#/room/#winsw_winsw:gitter.im&quot;&gt;WinSW Gitter&lt;/a&gt; channel,
which is a great way to get in touch and there are project sync up meetings every Tuesday at 13:30 UTC on the Gitter channel.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;some-useful-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-useful-links&quot; /&gt;Some 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://docs.google.com/presentation/d/1hMJwnI8nW33a-wb7JS3rmjelTPFCt4wEb0zVqGi5DiA/edit?usp=sharing&quot;&gt;Presentation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/winsw-yaml-configs&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/winsw/winsw&quot;&gt;Project Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/winsw/winsw/releases&quot;&gt;Feature preview&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#winsw_winsw:gitter.im&quot;&gt;Gitter Channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/aaubry/YamlDotNet&quot;&gt;YamlDotNet library&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/commandlineparser/commandline&quot;&gt;Command Line Parser library&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/08/27/machine-learning-plugin-coding-phase3/</id>
<title>Machine Learning Plugin project - Coding Phase 3 blog post</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/27/machine-learning-plugin-coding-phase3/" />
<author>
<name>loghijiaha</name>
</author>
<category term='machinelearning'></category>
<category term='datascience'></category>
<category term='jupyter'></category>
<category term='plugins'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
Good to see you all again !


This is my final blog post about coding phase 3 in Jenkins Machine Learning Plugin for GSoC 2020.
Being at the end of GSoC 2020, we had to finish all the pending issues and testing before a stable release in the main repository. Throughout this program, there were lots of learning and hard work will make this plugin valuable to the Data Science and Jenkins community.


Summary


With combining all of the work in phase 1, 2 and 3, initial version of Machine learning plugin( 1.0 ) was successfully released in Jenkins plugin repository.
An interesting feature which...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;jenkins gsoc logo small&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Good to see you all again !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is my final blog post about coding phase 3 in Jenkins &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/machine-learning/&quot;&gt;Machine Learning Plugin&lt;/a&gt; for GSoC 2020.
Being at the end of GSoC 2020, we had to finish all the pending issues and testing before a stable release in the main repository. Throughout this program, there were lots of learning and hard work will make this plugin valuable to the Data Science and Jenkins community.&lt;/p&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;With combining all of the work in phase 1, 2 and 3, initial version of Machine learning plugin( 1.0 ) was successfully released in Jenkins plugin repository.
An interesting feature which allows users to connect to their existing programming language kernels more than connecting to only IPython kernel was introduced in this phase. It can be selected in multiple steps with different kernel.
Images and graphs produced by Jupyter notebooks will be saved in user preferred folder in the workspace that can be used for reporting/analytic purposes later. Hoping this blog summarizes the Machine Learning’s features and future contributions. Thank you for your interest and support !!!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;main-features-of-machine-learning-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#main-features-of-machine-learning-plugin&quot; /&gt;Main features of Machine Learning plugin&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;Execute Jupyter notebooks directly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run different language scripts using multiple build steps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Convert Jupyter Notebooks to Python&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure Jupyter kernels( IPython, IRKernel, IJulia etc) properties&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support to execute Notebooks/scripts on Agent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extract graph/map/images from the code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Each build step can be associated with a machine learning task&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for Windows and Linux&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Future improvements&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Improving performance of the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Try to implement &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-63377&quot;&gt;JENKINS-63377&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support parameterized definitions in Notebooks &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-63478&quot;&gt;JENKINS-63478&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Increasing testing code coverage&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;multiple-language-kernel-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#multiple-language-kernel-support&quot; /&gt;Multiple language kernel support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If there are existing kernels in the system, user will be able to configure in the global configurations in order to apply in the builder/step configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some popular interactive kernels&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;IPython&lt;/code&gt; for &lt;code&gt;python&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;IRKernel&lt;/code&gt; for &lt;code&gt;R&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;IJulia&lt;/code&gt; for &lt;code&gt;Julia&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;IJavascript&lt;/code&gt; for &lt;code&gt;javascript&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;More kernels and installation guides are found here. &lt;a href=&quot;https://github.com/jupyter/jupyter/wiki/Jupyter-kernels&quot; class=&quot;bare&quot;&gt;https://github.com/jupyter/jupyter/wiki/Jupyter-kernels&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dump-images-and-graphs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dump-images-and-graphs&quot; /&gt;Dump images and graphs&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Text output will be displayed in the console log. At the same time images/graphs/heat maps and HTMLs will be saved in the workspace. An action is shown in the left panel to display images in realtime. Due to the Content Security Policy of jenkins, some HTMLs which contain harmful javascript may not render in jenkins UI.&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/gsoc/2020/machine_learning_plugin/action_image_view.png&quot; alt=&quot;action image view&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;fixed-bugs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fixed-bugs&quot; /&gt;Fixed bugs&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were more bugs identified and fixed with many interactive testings. Setting the working directory of kernels was a big issue while getting datasets/files by script. Zeppelin process launcher was bypassed to fix this &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/63465&quot;&gt;issue&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;patch-version-released&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#patch-version-released&quot; /&gt;Patch version released&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A major bug which was created while setting the process working directory had patched in the v1.0.1. The latest release is more stable now.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;acknowledgement&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgement&quot; /&gt;Acknowledgement&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Machine Learning plugin had been developed under GSoC 2020 program. A huge thanks to &lt;a href=&quot;https://github.com/kinow&quot;&gt;Bruno P. Kinoshita&lt;/a&gt;, &lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky Jackson&lt;/a&gt;, &lt;a href=&quot;https://github.com/shivaylamba&quot;&gt;Shivay Lamba&lt;/a&gt;, &lt;a href=&quot;https://github.com/imoutsatsos&quot;&gt;Ioannis Moutsatsos&lt;/a&gt; and Org admins for this wonderful experience.
I would be grateful for contributing this plugin continuously and more in Jenkins.&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;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&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/blog/2020/06/03/machine-learning-plugin-community-bonding/&quot;&gt;Community Bonding blog post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2020/06/30/machine-learning-plugin-coding-phase1/&quot;&gt;Phase 1 blog post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2020/07/27/machine-learning-plugin-coding-phase2/&quot;&gt;Phase 2 blog post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/machine-learning-plugin.git&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/machine-learning/&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/machine-learning/&quot;&gt;Plugin page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/10FjktNmWpdjgbGg3tEViadV_JNevn9W0sMOu-bF8m-o/edit?usp=sharing&quot;&gt;Design document&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/2020/08/25/external-fingerprint-storage-phase-3/</id>
<title>External Fingerprint Storage Phase-3 Update: Introducing the PostgreSQL Fingerprint Storage Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/25/external-fingerprint-storage-phase-3/" />
<author>
<name>stellargo</name>
</author>
<category term='plugins'></category>
<category term='fingerprint'></category>
<category term='cloud-native'></category>
<category term='external-storage'></category>
<category term='developer'></category>
<category term='PostgreSQL'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
The final phase for the External Fingerprint Storage
Project has come to an end and to finish off, we release one more fingerprint storage plugin:
the PostgreSQL Fingerprint Storage Plugin!


This post highlights the progress made during phase-3.
To understand what the project is about and the past progress, please refer to the
phase-1 post and the
phase-2 post.


Introducing the PostgreSQL Fingerprint Storage Plugin


Why PostgreSQL?

There were several reasons why it made sense to build another reference implementation, especially backed by PostgreSQL.


Redis is a key-value storage, and hence stores the fingerprints as blobs.
The PostgreSQL plugin defines a relational structure for fingerprints.
This offers a more powerful way to...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final phase for the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/external-fingerprint-storage/&quot;&gt;External Fingerprint Storage
Project&lt;/a&gt; has come to an end and to finish off, we release one more fingerprint storage plugin:
the &lt;a href=&quot;https://github.com/jenkinsci/postgresql-fingerprint-storage-plugin&quot;&gt;PostgreSQL Fingerprint Storage Plugin&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post highlights the progress made during phase-3.
To understand what the project is about and the past progress, please refer to the
&lt;a href=&quot;https://www.jenkins.io/blog/2020/06/27/external-fingerprint-storage/&quot;&gt;phase-1 post&lt;/a&gt; and the
&lt;a href=&quot;https://www.jenkins.io/blog/2020/06/27/external-fingerprint-storage/&quot;&gt;phase-2 post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introducing-the-postgresql-fingerprint-storage-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-the-postgresql-fingerprint-storage-plugin&quot; /&gt;Introducing the PostgreSQL Fingerprint Storage Plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-postgresql&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-postgresql&quot; /&gt;Why PostgreSQL?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were several reasons why it made sense to build another reference implementation, especially backed by PostgreSQL.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Redis is a key-value storage, and hence stores the fingerprints as blobs.
The PostgreSQL plugin defines a relational structure for fingerprints.
This offers a more powerful way to query the database for fingerprint information.
Fingerprint facets can store extra information inside the fingerprints, which cannot be queried in Redis directly.
PostgreSQL plugin allows powerful (indexing) and efficient querying strategies which can even query the facet metadata.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another reason for building this plugin was to provide a basis for other relational database plugins to be built.
It also validates the flexibility and design of our external fingerprint storage API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since PostgreSQL is a traditional disk storage database, it is more suitable for systems storing a massive number of
fingerprints.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Among relational databases, PostgreSQL is quite popular, has extensive support, and is open-source.
We expect the new implementation to drive more adoption, and prove to be beneficial to the community.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installation&quot; /&gt;Installation:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin can be installed using the
&lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/releasing-experimental-updates/&quot;&gt;experimental update center&lt;/a&gt;.
Follow along the following steps after running Jenkins to download and 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;Select &lt;code&gt;Manage Jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Manage Plugins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;code&gt;Advanced&lt;/code&gt; tab&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure the Update Site URL as: &lt;code&gt;&lt;a href=&quot;https://updates.jenkins.io/experimental/update-center.json&quot; class=&quot;bare&quot;&gt;https://updates.jenkins.io/experimental/update-center.json&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;code&gt;Submit&lt;/code&gt;, and then press the &lt;code&gt;Check Now&lt;/code&gt; button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;code&gt;Available&lt;/code&gt; tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for &lt;code&gt;PostgreSQL Fingerprint Storage Plugin&lt;/code&gt; and check the box along it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;code&gt;Install without restart&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin should now be installed on the system.&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;usage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#usage&quot; /&gt;Usage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the plugin has been installed, you can configure the PostgreSQL server details by following the steps below:&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;Select &lt;code&gt;Manage Jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Configure System&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scroll to the section &lt;code&gt;Fingerprints&lt;/code&gt; and choose &lt;code&gt;PostgreSQL Fingerprint Storage&lt;/code&gt; in the dropdown for
&lt;code&gt;Fingerprint Storage Engine&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure the following parameters to connect to your PostgreSQL instance:&lt;/p&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/2020/08-external-fingerprint-storage-phase-3/configure.png&quot; alt=&quot;Configure Redis&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;code&gt;Host&lt;/code&gt; - Enter hostname where PostgreSQL is running&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Port&lt;/code&gt; - Specify the port on which PostgreSQL is running&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;SSL&lt;/code&gt; - Click if SSL is enabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Database Name&lt;/code&gt; - Specify the database name inside the PostgreSQL instance to be used. Please note that the database
will not be created by the plugin, the user has to create the database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Connection Timeout&lt;/code&gt; - Set the connection timeout duration in seconds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Socket Timeout&lt;/code&gt; - Set the socket timeout duration in seconds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Credentials&lt;/code&gt; - Configure authentication using username and password to the PostgreSQL instance.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Use the &lt;code&gt;Test PostgreSQL Connection&lt;/code&gt; button to verify that the details are correct and Jenkins is able to connect to
the PostgreSQL instance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[IMPORTANT] When configuring the plugin for the first time, it is highly important to press the Perform PostgreSQL
Schema Initialization button. It will automatically perform schema initialization and create the necessary indexes.
The button can also be used in the case the database is wiped out and schema needs to be recreated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press the &lt;code&gt;Save&lt;/code&gt; button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now, all the fingerprints produced by this Jenkins instance should be saved in the configured PostgreSQL instance!&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;querying-the-fingerprint-database&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#querying-the-fingerprint-database&quot; /&gt;Querying the Fingerprint Database&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Due to the relational structure defined by PostgreSQL, it allows users/developers to query the fingerprint data which
was not possible using the Redis fingerprint storage plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The fingerprint storage can act as a consolidated storage for multiple Jenkins instances.
For example, to search for a fingerprint id across Jenkins instances using the file name, the following query could be
used:&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;SELECT fingerprint_id FROM fingerprint.fingerprint
WHERE filename = &#39;random_file&#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A sample query is provided which can be tweaked depending on the parameters to be searched:&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;SELECT * FROM fingerprint.fingerprint
WHERE fingerprint_id = &#39;random_id&#39;
        AND instance_id = &#39;random_jenkins_instance_id&#39;
        AND filename = &#39;random_file&#39;
        AND original_job_name = &#39;random_job&#39;
        AND original_job_build_number = &#39;random_build_number&#39;
        AND timestamp BETWEEN &#39;2019-12-01 23:59:59&#39;::timestamp AND now()::timestamp&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The facets are stored in the database as &lt;code&gt;jsonb&lt;/code&gt;.
PostgreSQL offers support to query &lt;code&gt;jsonb&lt;/code&gt;.
This is especially useful for querying the information stored inside fingerprint facets.
As an example, the &lt;a href=&quot;https://plugins.jenkins.io/docker-traceability&quot;&gt;Docker Traceability Plugin&lt;/a&gt; stores information like the name of Docker images inside these
facets.
These can be queried across Jenkins instances like so:&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;SELECT * FROM fingerprint.fingerprint_facet_relation
WHERE facet_entry-&amp;gt;&amp;gt;&#39;imageName&#39; = &#39;random_container&#39;;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the moment these queries require working knowledge of the database.
In future, these queries can be abstracted away by plugins and the features made available to users directly inside
Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demo&quot; /&gt;Demo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;External Fingerprint Storage Demo&lt;/div&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/HvbbsoljLyg?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1QL5m-7QGtep_G1ysEYKRauAHzDq8nTtOdcnE1t4aYE8/edit?usp=sharing&quot;&gt;Slide deck&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;releases&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#releases&quot; /&gt;Releases 🚀&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We released the &lt;code&gt;0.1-alpha-1&lt;/code&gt; version for the &lt;a href=&quot;https://github.com/jenkinsci/postgresql-fingerprint-storage-plugin&quot;&gt;
PostgreSQL Fingerprint Storage Plugin&lt;/a&gt;.
Please refer to the
&lt;a href=&quot;https://github.com/jenkinsci/postgresql-fingerprint-storage-plugin/releases/tag/postgresql-fingerprint-storage-0.1-alpha-1&quot;&gt;
changelog&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/redis-fingerprint-storage/&quot;&gt;Redis Fingerprint Storage Plugin&lt;/a&gt; &lt;code&gt;1.0-rc-3&lt;/code&gt; was also
released.
The
&lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/releases/tag/redis-fingerprint-storage-parent-1.0-rc-3&quot;&gt;
changelog&lt;/a&gt; provides more details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few API changes made in the Jenkins core were released in &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.253&quot;&gt;Jenkins-2.253&lt;/a&gt;.
It mainly includes exposing fingerprint range set serialization methods for plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-directions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-directions&quot; /&gt;Future Directions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The relational structure of the plugin allows some performance improvements that can be made when implementing
cleanup, as well as improving the performance of &lt;code&gt;Fingerprint#add(String job, int buildNumber)&lt;/code&gt;.
These designs were discussed and are a scope of future improvement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The current external fingerprint storage API supports configuring multiple Jenkins instances to a single storage.
This opens up the possibility of developing traceability plugins which can track fingerprints across Jenkins instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please consider reaching out to us if you feel any of the use cases would benefit you, or if you would like to share
some new use cases.&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;The PostgreSQL Fingerprint Storage Plugin and the Redis Fingerprint Storage plugin are maintained by the
Google Summer of Code (GSoC) Team for &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/external-fingerprint-storage/&quot;&gt;External
Fingerprint Storage for Jenkins&lt;/a&gt;.
Special thanks to &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;,
&lt;a href=&quot;https://github.com/afalko&quot;&gt;Andrey Falko&lt;/a&gt;, &lt;a href=&quot;https://github.com/mikecirioli&quot;&gt;Mike Cirioli&lt;/a&gt;,
&lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, and the entire Jenkins community for all the contribution to this project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we wrap up, we would like to point out that there are plenty of future directions and use cases for the externalized
fingerprint storage, as mentioned in the previous section, and we welcome everybody to contribute.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reaching-out&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reaching-out&quot; /&gt;Reaching Out&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to reach out to us for any questions, feedback, etc. on the project’s
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_external-fingerprint-storage:gitter.im&quot;&gt;Gitter Channel&lt;/a&gt; or the
&lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins Developer Mailing list&lt;/a&gt;.
We use Jenkins &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;Jira&lt;/a&gt; to track issues.
Feel free to file issues under either the &lt;code&gt;postgresql-fingerprint-storage-plugin&lt;/code&gt; or the
&lt;code&gt;redis-fingerprint-storage-plugin&lt;/code&gt; component depending on the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;other-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-links&quot; /&gt;Other 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/blog/2020/06/27/external-fingerprint-storage/&quot;&gt;Phase 1 Post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2020/06/27/external-fingerprint-storage/&quot;&gt;Phase 2 Post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/postgresql-fingerprint-storage-plugin&quot;&gt;PostgreSQL Fingerprint Storage Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;Redis Fingerprint Storage Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/226/README.adoc&quot;&gt;JEP-226&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_external-fingerprint-storage:gitter.im&quot;&gt;Gitter Channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/external-fingerprint-storage/&quot;&gt;Project Page&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/2020/08/12/windows-installers-upgrade/</id>
<title>Windows Installer Upgrades</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/12/windows-installers-upgrade/" />
<category term='windows'></category>
<category term='platform-sig'></category>
<category term='installers'></category>
<category term='announcement'></category>
<summary>
This article describes the transition from the old Jenkins Windows installer 2.235.2 (32 bit) to the new Jenkins Windows installer 2.235.3 (64 bit)


Let&#8217;s take a look how Jenkins installation on Windows happened before release of this upgrade.


Step 1





It&#8217;s evident that branding information is not present here.




Step 2





Jenkins would be installed into the 32 bit programs directory along with a 32 bit Java 8 runtime environment.




Step 3





There was no option to select the user that would run the Jenkins service or the network port that would be used.




Issues


The previous installer had issues that needed to be resolved:




Only supported 32-bit installations


Bundled an...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This article describes the transition from the old Jenkins Windows installer 2.235.2 (32 bit) to the new Jenkins Windows installer 2.235.3 (64 bit)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s take a look how Jenkins installation on Windows happened before release of this upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;step-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-1&quot; /&gt;Step 1&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/2020-08-12-win-installers-upgrade/old_installer_1.png&quot; alt=&quot;Installer Startup&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s evident that branding information is not present here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;step-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-2&quot; /&gt;Step 2&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/2020-08-12-win-installers-upgrade/old_installer_2.png&quot; alt=&quot;Installation Directory&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins would be installed into the 32 bit programs directory along with a 32 bit Java 8 runtime environment.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;step-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-3&quot; /&gt;Step 3&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/2020-08-12-win-installers-upgrade/old_installer_3.png&quot; alt=&quot;Install It&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was no option to select the user that would run the Jenkins service or the network port that would be used.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues&quot; /&gt;Issues&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The previous installer had issues that needed to be resolved:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Only supported 32-bit installations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bundled an outdated Java 8 runtime environment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No support for Java 11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No port selection during installation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No choice of account for the Jenkins service&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;Program Files (x86)&lt;/code&gt; directory was used for the Jenkins home directory&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;road-forward&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#road-forward&quot; /&gt;Road Forward&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new Jenkins Windows Installer resolves those issues&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Supports 64 bit installations and drops 32 bit support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supports 64 bit Java 8 and 64 bit Java 11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Port selection and validation from the installer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Service account selection and validation from the installer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Program is installed in &lt;code&gt;Program Files&lt;/code&gt; with Jenkins home directory in &lt;code&gt;%AppData%&lt;/code&gt; of the selected service account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The JENKINS_HOME directory is placed in the LocalAppData directory for the user that the service will run as, this aligns with modern Windows file system layouts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The installer has been updated with branding to make it look nicer and provide a better user experience&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;screenshots&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#screenshots&quot; /&gt;Screenshots&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You may see below the sequence of screenshots for the new installer:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-1-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-1-2&quot; /&gt;Step 1&lt;/h3&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/2020-08-12-win-installers-upgrade/new_installer_1.png&quot; alt=&quot;Installer Startup&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can see now the Jenkins logo as a prominent part of the installer UI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-2-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-2-2&quot; /&gt;Step 2&lt;/h3&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/2020-08-12-win-installers-upgrade/new_installer_2.png&quot; alt=&quot;Installation Directory&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins installs by default in the 64 bit programs folder rather than in the 32 bit folder.
Now the Jenkins logo and name are in the header during entire process of installation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-3-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-3-2&quot; /&gt;Step 3&lt;/h3&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/2020-08-12-win-installers-upgrade/new_installer_3.png&quot; alt=&quot;Account Selection&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now the installer allows both specifying and testing the credentials by validating that the account has LogonAsService rights.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-4&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-4&quot; /&gt;Step 4&lt;/h3&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/2020-08-12-win-installers-upgrade/new_installer_4.png&quot; alt=&quot;Port Selection&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now the installer also allows specifying the port that Jenkins should run on and will not continue until a valid port is entered and tested.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-5&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-5&quot; /&gt;Step 5&lt;/h3&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/2020-08-12-win-installers-upgrade/new_installer_5.png&quot; alt=&quot;JRE Selection&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now instead of bundling a JRE, the installer searches for a compatible JRE on the system (in the current search no JRE was installed).
In case you would like to use a different JRE from the one found by the installer, you can browse and specify it.
Only Java 8 and Java 11 runtimes are supported.
In case the selected JRE is found to be version 11 the installer will automatically add the necessary arguments and additional jar files for running under Java 11.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-6&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-6&quot; /&gt;Step 6&lt;/h3&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/2020-08-12-win-installers-upgrade/new_installer_6.png&quot; alt=&quot;Install It&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All of the items that users can enter in the installer should be overridable on the command line for automated deployment as well. The full list of properties that can be overridden will be available soon.&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;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;Windows users have alternatives for their existing Jenkins installations:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Upgrade from inside Jenkins&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The &quot;Manage Jenkins&quot; section of the running Jenkins will continue to include an &quot;Upgrade&quot; button for Windows users.
You may continue to use that &quot;Upgrade&quot; button to update the Jenkins installation on your Windows computer.
Upgrade from inside Jenkins will continue to use the current Java version.
Upgrade from inside Jenkins will continue to use the current installation location.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Upgrade with the new Jenkins MSI installer&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;If you run the new Jenkins MSI installer on your Jenkins that was installed with the old Jenkins MSI installer, it will prompt for a new port and a service account.&lt;/p&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Stop and disable the existing Jenkins service from the Windows Service Manager&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the new installer to create the new installation with desired settings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop the newly installed Jenkins service&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy existing Jenkins configuration files to the new Jenkins home directory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the newly installed Jenkins service&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the new Jenkins MSI installer has run, the &quot;Manage Jenkins&quot; section of the running Jenkins will continue to include an &quot;Upgrade&quot; button for Windows users.
You may continue to use that &quot;Upgrade&quot; button to update the Jenkins installation on your Windows computer.&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/08/09/custom-distribution-service-phase-2/</id>
<title>Custom Distribution Service : Phase 2 Blogpost</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/09/custom-distribution-service-phase-2/" />
<author>
<name>sladyn98</name>
</author>
<category term='service'></category>
<category term='distribution'></category>
<category term='cloud-native'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<category term='packaging'></category>
<category term='platform-sig'></category>
<summary>
Hello everyone,
It is time to wrap up another successful phase for the custom distribution service project,
and we have incorporated most of the features that we had planned at the start of the phase.
It has been an immense learning curve for me and the entire team.


To understand what the project is about and the past progress, please refer to the phase one blogpost
here.


Front-End


Filters for Plugins

In the previous phase we implemented the ability to add plugins to the configuration,
and the ability to search these plugins via a search bar.
Sometimes though we would like to filter these plugins based on their usage,
popularity, stars...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello everyone,
It is time to wrap up another successful phase for the &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service&quot;&gt;custom distribution service project&lt;/a&gt;,
and we have incorporated most of the features that we had planned at the start of the phase.
It has been an immense learning curve for me and the entire team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To understand what the project is about and the past progress, please refer to the phase one blogpost
&lt;a href=&quot;https://www.jenkins.io/blog/2020/07/27/custom-distribution-service/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;front-end&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#front-end&quot; /&gt;Front-End&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;filters-for-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#filters-for-plugins&quot; /&gt;Filters for Plugins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the previous phase we implemented the ability to add plugins to the configuration,
and the ability to search these plugins via a search bar.
Sometimes though we would like to filter these plugins based on their usage,
popularity, stars etc. Hence we have added a certain set of filters to these plugins.
We support only four major filters for now. They are:&lt;/p&gt;
&lt;/div&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;Title&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most installed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Relevance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trending&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;filter-implementation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#filter-implementation&quot; /&gt;Filter implementation&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The major heavy lifting is done by the plugin api which takes in the necessary parameters
and returns the relevant plugins in the form of a json object,
here is an example of the api call url: &lt;code&gt;const url = &lt;a href=&quot;https://plugins.jenkins.io/api/plugins?$params&quot; class=&quot;bare&quot;&gt;https://plugins.jenkins.io/api/plugins?$params&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For details, see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Feature request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/issues/9&quot;&gt;#9&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/76&quot;&gt;#76&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;sect2&quot;&gt;
&lt;h3 id=&quot;community-configurations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-configurations&quot; /&gt;Community Configurations&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One major deliverable for the project was the ability for users to share the configurations developed by them, so that they can be used widely within the community.
For example we see quite a lot of jenkins configurations involve being run on AWS and kubernetes and so on. Therefore it would be really good for the community to have a place to find and run
these configurations right out of the box.&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/gsoc-custom-jenkins-service-distribution/comm-config.png&quot; alt=&quot;community-config&quot; width=&quot;938&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;design-decision&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#design-decision&quot; /&gt;Design Decision&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The major design decision taken here was whether to include the configurations inside
the repository or to have them in a completely new repository.
Let us talk about both these approaches.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;having-the-configurations-in-the-current-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#having-the-configurations-in-the-current-repository&quot; /&gt;Having the configurations in the current repository:&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This allows us to have all of the relevant configurations inside the repository itself,
and so users would not have to go fetch this in different repositories.
We could have issues with the release cycle and dependencies since,
it would have to happen along with the custom distribution service project releases.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;having-the-configurations-in-a-different-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#having-the-configurations-in-a-different-repository&quot; /&gt;Having the configurations in a different repository:&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This allows us to manage all of the configurations and the relevant dependencies separately and easily,
thus avoiding any release conflict with the current repository.
However it would be a bit difficult if users were to not find this repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Decision&lt;/strong&gt; : We still cannot quite agree on what is the best method so for now,
I have included the url from which the community configurations are picked up as a
configuration variable in the &lt;strong&gt;.env&lt;/strong&gt; file which can be configured later and
therefore it can be up to the user to configure. Another advantage of having it configurable,
is that the user can decide to load configurations which are private to his organization as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For details, see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Issue &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/issues/6161&quot;&gt;#6161&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/73&quot;&gt;#73&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;back-end&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#back-end&quot; /&gt;Back-End&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;war-generation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#war-generation&quot; /&gt;War Generation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The ability to generate and download war files has finally been achieved,
the reason this feature took so long to complete is because we had some difficulty
in implementing the war generation and its tests. However this has been completed
and can now be tested successfully.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;things-to-take-care-while-generating-war-files&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#things-to-take-care-while-generating-war-files&quot; /&gt;Things to take care while generating war files&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In its current state the war generation cannot include &lt;strong&gt;casc.yml&lt;/strong&gt; or &lt;strong&gt;groovy&lt;/strong&gt; files
if they are included in the configuration they would have to be added externally.
There is an issue opened &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/issues/117&quot;&gt;here&lt;/a&gt;.
The war file generation would yell at you if you tried to build a war file with a jcasc file configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For details, see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Issue &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/issues/60&quot;&gt;#60&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/68&quot;&gt;#68&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;sect2&quot;&gt;
&lt;h3 id=&quot;pull-request-creation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pull-request-creation&quot; /&gt;Pull Request Creation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature was included in the design document that I created after my GSoC selection.
It involves the ability to create pull requests via the front-end of the service.
The User Story behind this feature was that &lt;strong&gt;If I want to share a configuration with the community and I do not quite know how to use github or I do not want to do it via the terminal&lt;/strong&gt;.
This feature includes creation of a bot that handles the creation of pull requests in the repository.
This bot would have to be installed by the jenkins organization in this repository and the bot would handle the rest.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For details, see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Issue &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/issues/59&quot;&gt;#59&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/72&quot;&gt;#72&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;disclaimer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#disclaimer&quot; /&gt;Disclaimer:&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature has however been put on the back-burner for now because
we are focusing on getting the project to be self hosted and therefore
would like to implement this once we have a clear path for the project to be hosted by the jenkins-infra team.If you would like to participate in the discussion here are the links for the pull requests,
&lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/72&quot;&gt;PR 1&lt;/a&gt; and link: &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/66&quot;&gt;PR 2&lt;/a&gt;, or you can even jump in our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jenkins-custom-distribution-service:gitter.im&quot;&gt;gitter channel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have been following my posts,
I mentioned in my second week blog post that pulling in the json file consisting of more than
1600 plugins took a bit more time that my liking.
We managed to solve that issue using a caching mechanism,
so now the files are pulled in the first time you start the service and downloaded in a temporary folder. The next time you want to view the plugin cards they are pulled in directly from the temp directory &lt;strong&gt;bam !&lt;/strong&gt; thereby reducing time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For details see Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/90&quot;&gt;#90&lt;/a&gt;&lt;/p&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;fixes-and-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fixes-and-improvements&quot; /&gt;Fixes and improvements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;port-8080&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#port-8080&quot; /&gt;Port 8080&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Port 8080 now does have a message instead of a whitelabel error message which is present
by default in the spring-boot tomcat server setup.
Turns out it requires overriding a particular class, and inserting a custom message&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For details, see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/92&quot;&gt;#92&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;war-generation-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#war-generation-2&quot; /&gt;War Generation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Till now while you were generating the war file,
if something went wrong during generation the service would not complain it would just swallow the error and throw back a corrupted &lt;strong&gt;war&lt;/strong&gt; file,
however now we have added an error support feature
that will alert you when something goes wrong, the error is not very informative as of now,
but we are working on making it more informative in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For details, see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;War generation error handling &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/91&quot;&gt;#91&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add Github controller and jwt helper &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/66&quot;&gt;#66&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;dockerfile&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dockerfile&quot; /&gt;Dockerfile&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the major milestones of this phase was to have a project that can be self hosted,
needless to say we needed the dockerfile i.e docker-compose.yml to spin the project with a few commands.
The major issue we faced here was that there was a bit of a problem making the two containers talk to each other. Let me give you a little bit of context here.
Our docker-compose is constructed using two separate dockerfiles one for the backend of the service and the other for the front-end.
The backend makes api calls to the front-end via the proxy url i.e localhost:8080.
We now had to change this since the network bridge between the two containers spoke to each other via the backend-server name i.e &lt;strong&gt;app-server&lt;/strong&gt;.
To bridge that gap we have this PR that ensured that the docker compose works flawlessly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For details, see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/82&quot;&gt;#82&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;However there is a minor draw-back of the above approach was now the entire
project just relied on the docker compose and could not run using the simple
combination of &lt;strong&gt;npm&lt;/strong&gt; and &lt;strong&gt;maven&lt;/strong&gt; since the proxy was different.
In order to fix this I decided to follow a multiple environment approach,
where we have multiple environment files that pick up the correct proxy and insert it at build time,
to elaborate further we have two environment files,
(using the env-cmd library ) &lt;strong&gt;.env&lt;/strong&gt; and the &lt;strong&gt;docker.env&lt;/strong&gt; and we insert,
the correct file depending on how you want to build the project.
For instance if you want to run it using the dockerfile the command that is run under the hood is something along these lines — &lt;strong&gt;npm --env-cmd -f docker.env start scripts&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For details, see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull Request &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service/pull/88&quot;&gt;#88&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;other-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-links&quot; /&gt;Other links&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jenkins-custom-distribution-service:gitter.im&quot;&gt;Gitter Channel Link&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://docs.google.com/document/d/1C7VQJ92Yhr0KRDcNVHYxn4ri7OL9IGZmgxY6UFON6-g/edit?usp=sharing&quot;&gt;GSoC Proposal&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://docs.google.com/document/d/1-ujWVJ2a5VYkUF6UA7m4bEpSDxmb3mJZhCbmoKO716U/edit?usp=sharing&quot;&gt;Design Document&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://docs.google.com/document/d/1DSCH-3wh6uV9Rm_j8PcBzq2lvQPhZ31AIwmWkEaLxvc/edit?usp=sharing&quot;&gt;Daily Notes&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://youtu.be/HQLhakpx5mk?t=547&quot;&gt;Demo&lt;/a&gt;&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&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/2020/08/04/cdf-graduation/</id>
<title>Jenkins graduates in the Continuous Delivery Foundation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/04/cdf-graduation/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='announcement'></category>
<category term='cdf'></category>
<category term='general'></category>
<category term='community'></category>
<summary>
We are happy to announce that the Jenkins project has achieved the graduated status in
the Continuous Delivery Foundation (CDF).
This status is officially effective Aug 03, 2020.
Jenkins is the first project to graduate in the CD Foundation.
Thanks to all contributors who made our graduation possible!


In this article, we will discuss what the CD Foundation membership and graduation mean to the Jenkins community.
We will also talk about what changed in Jenkins as a part of the graduation,
and what are the future steps for the project.








To know more about the Jenkins graduation,
see also the announcement on the CD Foundation website.
Also see the special...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to announce that the Jenkins project has achieved the &lt;strong&gt;graduated status&lt;/strong&gt; in
the &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation (CDF)&lt;/a&gt;.
This status is officially effective Aug 03, 2020.
Jenkins is the first project to graduate in the CD Foundation.
Thanks to all contributors who made our graduation possible!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this article, we will discuss what the CD Foundation membership and graduation mean to the Jenkins community.
We will also talk about what changed in Jenkins as a part of the graduation,
and what are the future steps for the project.&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;
To know more about the Jenkins graduation,
see also the &lt;a href=&quot;https://cd.foundation/announcement/2020/08/04/cd-foundation-announces-jenkins-graduation/&quot;&gt;announcement on the CD Foundation website&lt;/a&gt;.
Also see the special edition of the &lt;a href=&quot;https://cd.foundation/stay-connected/newsletter-archive/cdf-newsletter-august2020/&quot;&gt;CD Foundation Newsletter&lt;/a&gt; for Jenkins user success stories and some surprise content.
The press release is available &lt;a href=&quot;https://www.prnewswire.com/news-releases/cd-foundation-announces-jenkins-graduation-301105709.html&quot;&gt;here&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-does-cdf-membership-help-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-does-cdf-membership-help-us&quot; /&gt;How does CDF membership help us?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;About 18 months ago, Jenkins &lt;a href=&quot;https://www.jenkins.io/blog/2019/03/12/cdf-launch/&quot;&gt;became one of the CDF founding projects&lt;/a&gt;, along with Jenkins X, Spinnaker and Tekton.
A new foundation was formed to provide a vendor-neutral home for open source projects used for Continuous Delivery and Continuous Integration.
Special interest groups were started to foster collaboration between projects and end user companies,
most notably:
&lt;a href=&quot;https://github.com/cdfoundation/sig-interoperability&quot;&gt;Interoperability&lt;/a&gt;,
&lt;a href=&quot;https://github.com/cdfoundation/sig-mlops&quot;&gt;MLOps&lt;/a&gt; and
&lt;a href=&quot;https://github.com/cdfoundation/sig-security&quot;&gt;Security&lt;/a&gt; SIGs.
Also, a &lt;a href=&quot;https://cd.foundation/ambassador-program-overview-application/&quot;&gt;Community Ambassador&lt;/a&gt; role was created to organize local meetups and to provide public-facing community representatives.
Many former Jenkins Ambassadors and other contributors are now CDF Ambassadors, and they promote Jenkins and other projects there.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to this membership we addressed key &lt;a href=&quot;https://www.jenkins.io/projects/infrastructure/&quot;&gt;project infrastructure&lt;/a&gt; needs.
Starting from Jan 2020, CDF covers a significant part of the infrastructure costs
including our services and CI/CD instances running on Microsoft Azure.
The CD Foundation provided us with legal assistance required to get code signing keys for the Jenkins project.
Thanks to that, we were able to switch to a new &lt;a href=&quot;https://github.com/jenkins-infra/release&quot;&gt;Jenkins Release Infrastructure&lt;/a&gt;.
The foundation sponsors the Zoom account we use for &lt;a href=&quot;https://www.jenkins.io/events/online-meetup/&quot;&gt;Jenkins Online Meetups&lt;/a&gt; and community meetings.
In the future we will continue to review ways of reducing maintenance overhead by switching some of our self-hosted services to equivalents provided by the Linux Foundation to CDF members.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another important CDF membership benefit is community outreach and marketing.
It helped us to establish connections with other CI/CD projects and end user companies.
Through the foundation we have access to the &lt;a href=&quot;https://jenkins.devstats.cd.foundation/&quot;&gt;DevStats service&lt;/a&gt;
that provides community contribution statistics and helps us track trends and discover areas for improvement.
On the marketing side, the foundation organizes webinars, podcasts and newsletters.
Jenkins is regularly represented there.
The CD Foundation also runs the meetup.com professional account which is used by local Jenkins communities for
&lt;a href=&quot;https://www.jenkins.io/projects/jam/&quot;&gt;CI/CD and Jenkins Area Meetups&lt;/a&gt;.
Last but not least, the Jenkins community is also represented at virtual conferences where CDF has a booth.
All of that helps to grow Jenkins visibility and to highlight new features and initiatives in 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;why-did-we-graduate&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-did-we-graduate&quot; /&gt;Why did we graduate?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/logos/graduation/graduation.png&quot; alt=&quot;Jenkins Graduation Logo&quot; width=&quot;224px&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has a long history of open governance which is a key part of today’s project success.
Starting from &lt;strong&gt;2011&lt;/strong&gt;, the project has introduced &lt;a href=&quot;https://www.jenkins.io/project/governance-meeting/&quot;&gt;the governance meeting&lt;/a&gt; which are open to anyone.
Most of the discussions and decision making happen publicly in the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;mailing lists&lt;/a&gt;.
&lt;strong&gt;In 2015&lt;/strong&gt; we introduced teams, sub-projects and officer roles.
&lt;strong&gt;In 2017&lt;/strong&gt; we introduced the &lt;a href=&quot;https://github.com/jenkinsci/jep&quot;&gt;Jenkins Enhancement Proposal&lt;/a&gt; process which helped us to make the key architecture and governance decisions more open and transparent to the community and the Jenkins users.
&lt;strong&gt;In 2018&lt;/strong&gt; we introduced &lt;a href=&quot;https://www.jenkins.io/sigs&quot;&gt;special interest groups&lt;/a&gt; that focus on community needs.
&lt;strong&gt;In 2019&lt;/strong&gt; we have &lt;a href=&quot;https://www.jenkins.io/blog/2019/12/16/board-election-results/&quot;&gt;expanded the Jenkins governance board&lt;/a&gt;
so that it got more bandwidth to facilitate initiatives in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the Jenkins project inception 15 years ago, it has been steadily growing.
Now it has millions of users and thousands of contributors.
In 2019 it has seen &lt;strong&gt;5,433 contributors&lt;/strong&gt; from 111 countries and 272 companies,
67 core and 2,654 plugin releases,
45,484 commits, 7,000+ pull requests.
In 2020 Q2 the project has seen &lt;strong&gt;21% growth&lt;/strong&gt; in pull requests numbers compared to 2019 Q2, bots excluded.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One may say that the Jenkins project already has everything needed to succeed.
It is a result of continuous work by many community members,
and this work will never end as long as the project remains active.
Like in any other industry, the CI/CD ecosystem changes every day and sets new expectations from the automation tools in this domain.
Just as the tools evolve, open source communities need to evolve so that they can address expectations, and onboard more users and contributors.
The CDF graduation process helped us to discover opportunities for improvement,
and address them.
We reviewed the project processes and compared them with the Graduated Project criteria defined in the &lt;a href=&quot;https://github.com/cdfoundation/toc/blob/master/PROJECT_LIFECYCLE.md&quot;&gt;CDF project lifecycle&lt;/a&gt;.
Based on this review, we made changes in our processes and documentation.
It should improve the experience of Jenkins users,
and help to make the Jenkins community more welcoming to existing and newcomer contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-changed-for-the-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-changed-for-the-project&quot; /&gt;What changed for the project?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below you can find a few key changes we have applied during the graduation process:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Public roadmap&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;We introduced a new &lt;a href=&quot;https://www.jenkins.io/project/roadmap/&quot;&gt;public roadmap&lt;/a&gt; for the Jenkins project.
This roadmap aggregates key initiatives in all community areas: features, infrastructure, documentation, community, etc.
It makes the project more transparent to all Jenkins users and adopters,
and at the same time helps potential contributors find the hot areas and opportunities for contribution.
The roadmap is driven by the Jenkins community and it has a fully public process documented in &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/14/README.adoc&quot;&gt;JEP-14&lt;/a&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More details about the public roadmap are coming next week, stay tuned for a separate blogpost.
On July 10th we had an online contributor meetup about the roadmap
and you can find more information in its materials
(&lt;a href=&quot;https://docs.google.com/presentation/d/1_T2nZhP1WS2Fw0OLVAJV14Ke6nEsqBjLcdAHiygCmNs/edit?usp=sharing&quot;&gt;slides&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=ldWBY5BdQ5I&quot;&gt;video recording&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;User Documentation&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Weekly Release line is now documented on our website (&lt;a href=&quot;https://www.jenkins.io/download/weekly/&quot;&gt;here&lt;/a&gt;).
We have also reworked the downloads page and added guidelines explaining how to verify downloads.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new &lt;a href=&quot;https://www.jenkins.io/project/adopters&quot;&gt;list of Jenkins adopters&lt;/a&gt; was introduced on jenkins.io.
This list highlights Jenkins users and references their case studies and success stories,
including ones submitted through the &lt;a href=&quot;https://www.jenkins.io/blog/2020/04/30/jenkins-is-the-way/&quot;&gt;Jenkins Is The Way&lt;/a&gt; portal.
Please do not hesitate to add your company there!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Community&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We passed the &lt;a href=&quot;https://www.coreinfrastructure.org/&quot;&gt;Core Infrastructure Initiative (CII)&lt;/a&gt; certification.
This certification helps us to verify compliance with open source best practices
and to make adjustments in the project (see the bullets below).
It also provides Jenkins users and adopters with a public summary about compliance with each best practice.
Details are on the &lt;a href=&quot;https://bestpractices.coreinfrastructure.org/en/projects/3538&quot;&gt;Jenkins core page&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/project/conduct/&quot;&gt;Jenkins Code of Conduct was updated&lt;/a&gt;
to the new version of Contributor Covenant.
In particular, it sets best practices of behavior in the community, and expands definitions of unacceptable behavior.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The default &lt;a href=&quot;https://github.com/jenkinsci/.github/blob/master/CONTRIBUTING.md&quot;&gt;Jenkins contributing template&lt;/a&gt; was updated to cover more common cases for plugin contributors.
This page provides links to the &lt;a href=&quot;https://www.jenkins.io/participate&quot;&gt;Participate and Contribute&lt;/a&gt; guidelines hosted on our website,
and helps potential contributors to easily access the documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Jenkins Core &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/docs/MAINTAINERS.adoc&quot;&gt;maintainer guide&lt;/a&gt; was updated to include maintenance and issues triage guidelines.
It should help us to deliver quality releases and to timely triage and address issues reported by Jenkins users.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;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;It an honor to be the first project to reach the graduated stage in the Continuous Delivery Foundation,
but it is also a great responsibility for the project.
As a project, we plan to continue participating in the CDF activities and to work with other projects and end users to maintain the Jenkins&#39; leader role in the CI/CD space.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage everyone to join the project and &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;participate&lt;/a&gt; in evolving the Jenkins project and driving its roadmap.
It does not necessarily mean committing code or documentation patches;
user feedback is also very important to the project.
If you are interested to contribute or to share your feedback,
please contact us in the Jenkins community channels (&lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;mailing lists&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/chat&quot;&gt;chats&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;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;CDF graduation work was a major effort in the Jenkins community.
Congratulations and thanks to the dozens of contributors who made our graduation possible.
I would like to thank
&lt;a href=&quot;https://github.com/slide&quot;&gt;Alex Earl&lt;/a&gt;,
&lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;,
&lt;a href=&quot;https://github.com/dlorenc&quot;&gt;Dan Lorenc&lt;/a&gt;,
&lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jeffret-b&quot;&gt;Jeff Thompson&lt;/a&gt;,
&lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky Jackson&lt;/a&gt;,
&lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt;,
&lt;a href=&quot;https://github.com/olblak&quot;&gt;Olivier Vernin&lt;/a&gt;,
&lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt;,
&lt;a href=&quot;https://github.com/tracymiranda&quot;&gt;Tracy Miranda&lt;/a&gt;,
&lt;a href=&quot;https://github.com/uhafner&quot;&gt;Ullrich Hafner&lt;/a&gt;,
&lt;a href=&quot;https://github.com/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt;,
and all other contributors who helped with reviews and provided their feedback!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also thanks to the Continuous Delivery Foundation marketing team (Jacqueline Salinas, Jesse Casman and Roxanne Joncas) for their work on promoting the Jenkins project and, specifically, its graduation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-the-continuous-delivery-foundation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-continuous-delivery-foundation&quot; /&gt;About the Continuous Delivery Foundation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/sponsors/cdf.png&quot; alt=&quot;CDF Logo&quot; width=&quot;164px&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://cd.foundation&quot;&gt;Continuous Delivery Foundation (CDF)&lt;/a&gt; serves as the vendor-neutral home of many of the fastest-growing projects for continuous delivery, including Jenkins, Jenkins X, Tekton, and Spinnaker,
as well as fosters collaboration between the industry’s top developers, end users and vendors to further continuous delivery best practices.
The CDF is part of the Linux Foundation, a nonprofit organization.
For more information about the foundation, please visit &lt;a href=&quot;https://cd.foundation&quot;&gt;its website&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;more-information&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-information&quot; /&gt;More information&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To know more about the Jenkins graduation in the Continuous Delivery Foundation,
see the &lt;a href=&quot;https://cd.foundation/announcement/2020/08/04/cd-foundation-announces-jenkins-graduation/&quot;&gt;announcement on the CD Foundation website&lt;/a&gt;.
Also see the special edition of the &lt;a href=&quot;https://cd.foundation/stay-connected/newsletter-archive/cdf-newsletter-august2020/&quot;&gt;CD Foundation Newsletter&lt;/a&gt; for Jenkins user success stories and some surprise content.
The press release is available &lt;a href=&quot;https://www.prnewswire.com/news-releases/cd-foundation-announces-jenkins-graduation-301105709.html&quot;&gt;here&lt;/a&gt;.&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/2020/08/03/github-checks-api-plugin-coding-phase-2/</id>
<title>GitHub Checks API Plugin Project - Coding Phase 2</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-08-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/08/03/github-checks-api-plugin-coding-phase-2/" />
<author>
<name>XiongKezhi</name>
</author>
<category term='github'></category>
<category term='api'></category>
<category term='plugins'></category>
<category term='developer'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
Another great coding phase for GitHub Checks API Project ends!
In this phase, we focused on consuming the checks API in two widely used plugins:




Warnings NG Plugin


Code Coverage API Plugin




Besides the external usage, we have also split the general checks API from its GitHub implementation and released both of the plugins:




Checks API Plugin


GitHub Checks Plugin




Coding Phase 2 Demo [starts from 25:20]





Warning Checks


The newly released Warnings NG plugin 8.4.0 will use checks API to publish different check runs for different static analysis tools.
Without leaving GitHub, users are now able to see the analysis report they interested in.







On GitHub&#8217;s conversation tab for each...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another great coding phase for &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/github-checks/&quot;&gt;GitHub Checks API Project&lt;/a&gt; ends!
In this phase, we focused on consuming the checks API in two widely used plugins:&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/warnings-ng/&quot;&gt;Warnings NG Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/code-coverage-api/&quot;&gt;Code Coverage API 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;Besides the external usage, we have also split the general checks API from its GitHub implementation and released both of the plugins:&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/checks-api/&quot;&gt;Checks API Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/github-checks/&quot;&gt;GitHub Checks Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Coding Phase 2 Demo [starts from 25:20]&lt;/div&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/b67I6spBdTg?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;warning-checks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#warning-checks&quot; /&gt;Warning Checks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The newly released &lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin/releases/tag/warnings-ng-8.4.0&quot;&gt;Warnings NG plugin 8.4.0&lt;/a&gt; will use checks API to publish different check runs for different static analysis tools.
Without leaving GitHub, users are now able to see the analysis report they interested in.&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/2020/08-github-checks-api-plugin-coding-phase-2/warning-checks.png&quot; alt=&quot;Warning Checks Summary&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On GitHub’s conversation tab for each PR, users will see summaries for those checks like the screenshot above. The summaries will include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The status that indicates the quality gate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The name of the analysis tool used&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A short message that indicates statistics of new and total issues&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More fine-grained statistics can be found in the &lt;code&gt;Details&lt;/code&gt; page.&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/2020/08-github-checks-api-plugin-coding-phase-2/severity-statistics.png&quot; alt=&quot;Severity Status&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another practical feature is the annotation for specific lines of code. Users can now review the code alone with the annotations.&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/2020/08-github-checks-api-plugin-coding-phase-2/annotations.png&quot; alt=&quot;Warning Annotations&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;try-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#try-it&quot; /&gt;Try It&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin/releases/tag/warnings-ng-8.4.0&quot;&gt;Wanings NG plugin 8.4.0&lt;/a&gt;, the warning checks is set as a default feature only for GitHub.
For other SCM platforms, a &lt;code&gt;NullPublisher&lt;/code&gt; will be used which does nothing.
Therefore, you can get those checks for your own GitHub project just in a few steps:&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;Update Warnings NG plugin to 8.4.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;a href=&quot;https://plugins.jenkins.io/github-checks/&quot;&gt;GitHub Checks plugin&lt;/a&gt; on your Jenkins instance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Follow the &lt;a href=&quot;https://github.com/jenkinsci/github-branch-source-plugin/blob/master/docs/github-app.adoc&quot;&gt;GitHub app authentication guide&lt;/a&gt; to configure the credentials for the multi-branch project or GitHub organization project you are going to use&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use warnings-ng plugin in your Jenkinsfile for the project you configured in the last step, e.g.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;node&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;Checkout&#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;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&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;Build and Static Analysis&#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 -V -e clean verify -Dmaven.test.failure.ignore&#39;&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;recordIssues&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;n&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;javaDoc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()],&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;aggregatingResults:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;id:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;java&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Java&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;recordIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tool:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;errorProne&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;healthy:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unhealthy:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;recordIssues&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;n&quot;&gt;checkStyle&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/checkstyle-result.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;spotBugs&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/spotbugsXml.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;pmdParser&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/pmd.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;cpd&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/cpd.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)],&lt;/span&gt;
            &lt;span class=&quot;nl&quot;&gt;qualityGates:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;threshold:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;type:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;TOTAL&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unstable:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;&lt;em&gt;For more about the pipeline usage of warnings-ng plugin, please see &lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin/blob/master/doc/Documentation.md#pipeline-configuration&quot;&gt;the official documentation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, if you don’t want to publish the warnings to GitHub, you can either uninstall the GitHub Checks plugin or disable it by adding &lt;code&gt;skipPublishingChecks: true&lt;/code&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;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;recordIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;enabledForFailure:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;n&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;javaDoc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()],&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;skipPublishingChecks:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;coverage-checks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coverage-checks&quot; /&gt;Coverage Checks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The coverage checks are achieved by consuming the API in &lt;a href=&quot;https://plugins.jenkins.io/code-coverage-api/&quot;&gt;Code Coverage API plugin&lt;/a&gt;.
First, in the conversation tab of a PR, users will be able to see the summary about the coverage difference compared to previous builds.&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/2020/08-github-checks-api-plugin-coding-phase-2/coverage-summary.png&quot; alt=&quot;Coverage Summary&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;Details&lt;/code&gt; page will contain some other things:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Links to the reference build, including the target branch build from the master branch and the last successful build from this branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coverage healthy score (the default value is 100% if the threshold is not configured)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coverages and trends of different types in table format&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/2020/08-github-checks-api-plugin-coding-phase-2/coverage-details.png&quot; alt=&quot;Coverage Details&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/code-coverage-api-plugin/pull/169&quot;&gt;pull request&lt;/a&gt; for this feature will soon be merged and will be included in the next release of Coverage Checks API plugin. After that, you can use it by adding the below section to your pipeline script:&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;node&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;Checkout&#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;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&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;Line and Branch Coverage&#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;publishCoverage&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;adapters:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jacoco&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;**/*/jacoco.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)],&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;sourceFileResolver:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceFiles&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;STORE_ALL_BUILD&#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;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Like the warning checks, you can also disable the coverage checks by setting the field &lt;code&gt;skipPublishingChecks&lt;/code&gt;, e.g.&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;publishCoverage&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;adapters:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jacoco&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;**/*/jacoco.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)],&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;sourceFileResolver:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceFiles&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;STORE_ALL_BUILD&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;skipPublishingChecks:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;next-phase&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-phase&quot; /&gt;Next Phase&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the next phase, we will turn our attention back to &lt;a href=&quot;https://plugins.jenkins.io/checks-api/&quot;&gt;Checks API Plugin&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/github-checks/&quot;&gt;GitHub Checks Plugin&lt;/a&gt; and add the following features in future versions:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pipeline Support&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Users can publish checks directly in a pipeline script without requiring a consumer plugin that supports the checks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Re-run Request&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Users can re-run Jenkins build through Checks API.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, it is exciting to inform that we are currently making the checks feature available on &lt;a href=&quot;https://ci.jenkins.io&quot;&gt;ci.jenkins.io&lt;/a&gt; for all plugins hosted in the jenkinsci GitHub organization, please see &lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-2694&quot;&gt;INFRA-2694&lt;/a&gt; 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;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&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://github.com/jenkinsci/checks-api-plugin&quot;&gt;Checks API Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/github-checks-plugin&quot;&gt;GitHub Checks Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/github-checks/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_github-checks-api:gitter.im&quot;&gt;Gitter Channel&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/2020/07/29/git-performance-improvement-phase2/</id>
<title>Git Plugin Performance Improvement Phase-2 Progress</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/29/git-performance-improvement-phase2/" />
<author>
<name>rishabhbudhouliya</name>
</author>
<category term='plugins'></category>
<category term='git'></category>
<category term='platform-sig'></category>
<category term='developer'></category>
<category term='performance'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
The second phase of the Git Plugin Performance Improvement project has been great in terms of the progress we have achieved in implementing performance improvement insights
derived from the phase one JMH micro-benchmark experiments.


What we&#8217;ve learned so far in this project is that a git fetch is highly correlated to the size of the remote repository. In order to make fetch improvements in this plugin, our task was to find the difference in performance for the two available git implementations in the Git Plugin, git and JGit.


Our major finding was that git performs much better than JGit when it comes to...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second phase of the &lt;a href=&quot;https://www.jenkins.io/blog/2020/07/09/git-performance-improvement-phase1/&quot;&gt;Git Plugin Performance Improvement project&lt;/a&gt; has been great in terms of the progress we have achieved in implementing performance improvement insights
derived from the phase one &lt;a href=&quot;https://openjdk.java.net/projects/code-tools/jmh/&quot;&gt;JMH&lt;/a&gt; micro-benchmark experiments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What we’ve learned so far in this project is that a git fetch is highly correlated to the size of the remote repository. In order to make fetch improvements in this plugin, our task was to find the difference in performance for the two available git implementations in the &lt;a href=&quot;https://github.com/jenkinsci/git-plugin&quot;&gt;Git Plugin&lt;/a&gt;, &lt;code&gt;git&lt;/code&gt; and &lt;code&gt;JGit&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our major finding was that &lt;code&gt;git&lt;/code&gt; performs much better than &lt;code&gt;JGit&lt;/code&gt; when it comes to a large sized repository (&amp;gt;100 MiB). Interestingly, &lt;code&gt;JGit&lt;/code&gt; performs better than &lt;code&gt;git&lt;/code&gt; when size of the repository is less than 100 MiB.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this phase, we were successful in coding this derived knowledge from the benchmarks into a new functionality called the
GitToolChooser.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;gittoolchooser&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gittoolchooser&quot; /&gt;GitToolChooser&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This class aims to add the functionality of recommending a git implementation on the basis of the size of a repository which has a strong correlation to the performance of git fetch (from performance Benchmarks).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It utilizes two heuristics to calculate the size:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Using cached .git dir from multibranch projects to estimate the size of a repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Providing an extension point which, upon implementation, can use REST APIs exposed by git service providers like Github, GitLab, etc to fetch the size of the remote repository.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Will it optimize your Jenkins instance?
That requires one of the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;you have a multibranch project in your Jenkins instance, the plugin can use that to recommend the optimal git implementation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;you have a branch Source Plugin installed in the Jenkins instance, the particular branch source plugin will recommend a git implementation using REST APIs provided by &lt;a href=&quot;https://plugins.jenkins.io/github-branch-source/&quot;&gt;GitHub&lt;/a&gt; or &lt;a href=&quot;https://plugins.jenkins.io/gitlab-branch-source/&quot;&gt;GitLab&lt;/a&gt; respectively.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The architecture and code for this class is at: &lt;a href=&quot;https://github.com/jenkinsci/git-plugin/pull/931&quot;&gt;PR-931&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This functionality is an upcoming feature in the subsequent Git Plugin release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jmh-benchmarks-in-multiple-environments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jmh-benchmarks-in-multiple-environments&quot; /&gt;JMH benchmarks in multiple environments&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The benchmarks were being executed on Linux and macOS machines frequently but there was a need to check if the results gained from those benchmarks would hold true across more platforms to ensure that the solution (GitToolChooser) is generally platform-agnostic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To test this hypothesis, we performed an experiment:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Running git fetch operation for a 400 MiB sized repository on:&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;Windows&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;FreeBSD 12&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ppc64le&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;s390x&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 result of running this experiment is given below:&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/2020/07-git-plugin-performance-improvement/git-multiple-platforms.png&quot; alt=&quot;Performance on multiple platforms&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Observations:&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;ppc64le&lt;/code&gt; and &lt;code&gt;s390x&lt;/code&gt; are able to run the operation in almost half the time it takes for the &lt;code&gt;Windows&lt;/code&gt; or &lt;code&gt;FreeBSD 12&lt;/code&gt; machine. This behavior may be attributed to the increased computational power of those machines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The difference in performance between &lt;code&gt;git&lt;/code&gt; and &lt;code&gt;JGit&lt;/code&gt; remains constant across all platforms which is a positive sign for the GitToolChooser as its recommendation would be consistent across multiple devices and operating systems.&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;release-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#release-plan&quot; /&gt;Release Plan 🚀&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://issue-redirect.jenkins.io/issue/49757&quot;&gt;JENKINS-49757&lt;/a&gt; - Avoid double fetch from Git checkout step
This issue was fixed in phase one, avoids the second fetch in redundant cases.
It will be shipped with some benchmarks on the change in performance due to the removal of the second fetch.&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/git-client-plugin/pull/574&quot;&gt;PR-574&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/git-plugin/pull/904&quot;&gt;PR-904&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;&lt;strong&gt;GitToolChooser&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/git-plugin/pull/931&quot;&gt;PR-931&lt;/a&gt;
This pull request is under review, will be shipped in one of the subsequent Git Plugin releases.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Current Challenges with GitToolChooser&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Implement the extension point to support GitHub Branch Source Plugin, Gitlab Branch Source Plugin and Gitea Plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The current version of JGit doesn’t support LFS checkout and sparse checkout, need to make sure that the recommendation doesn’t break existing use cases.&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-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-work&quot; /&gt;Future Work&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In phase three, we wish to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Release a new version of the Git and Git Client Plugin with the features developed during the project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continue to explore more areas for performance improvement&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add a new git operation: git clone (Stretch Goal)&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;reaching-out&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reaching-out&quot; /&gt;Reaching Out&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to reach out to us for any questions or feedback on the project’s link:https://app.gitter.im/#/room/#jenkinsci_git-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter Channel&lt;/a&gt; or the &lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins
Developer Mailing list&lt;/a&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://www.jenkins.io/projects/gsoc/2020/projects/git-plugin-performance/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2020/07/09/git-performance-improvement-phase1/&quot;&gt;Phase 1 Blog Post&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/2020/07/27/repository-signing-keys-changing/</id>
<title>Jenkins 2.235.3: New Linux Repository Signing Keys</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/27/repository-signing-keys-changing/" />
<author>
<name>markewaite</name>
</author>
<category term='announcement'></category>
<category term='linux'></category>
<category term='platform'></category>
<summary>
The Jenkins core release automation project has been delivering Jenkins weekly releases since Jenkins 2.232, April 16, 2020.
The Linux repositories that deliver the weekly release were updated with new GPG keys with the release of Jenkins 2.232.


Beginning with Jenkins LTS release 2.235.3, stable repositories will be signed with the same GPG keys that sign the weekly repositories.
Administrators of Linux systems must install the new signing keys on their Linux servers before installing Jenkins 2.235.3.


Debian/Ubuntu


Update Debian compatible operating systems (Debian, Ubuntu, Linux Mint Debian Edition, etc.) with the command:


Debian/Ubuntu

# wget -qO - https://pkg.jenkins.io/debian-stable/jenkins.io.key | apt-key add -





Red Hat/CentOS


Update Red Hat compatible...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins core release automation project has been delivering Jenkins weekly releases since &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.232&quot;&gt;Jenkins 2.232&lt;/a&gt;, April 16, 2020.
The Linux repositories that deliver the weekly release were updated with new GPG keys with the release of Jenkins 2.232.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beginning with Jenkins LTS release &lt;a href=&quot;https://www.jenkins.io/changelog-stable/#v2.235.3&quot;&gt;2.235.3&lt;/a&gt;, stable repositories will be signed with the same GPG keys that sign the weekly repositories.
Administrators of Linux systems &lt;strong&gt;must&lt;/strong&gt; install the new signing keys on their Linux servers &lt;strong&gt;before&lt;/strong&gt; installing Jenkins 2.235.3.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;debianubuntu&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#debianubuntu&quot; /&gt;Debian/Ubuntu&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Update Debian compatible operating systems (Debian, Ubuntu, Linux Mint Debian Edition, etc.) with the command:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Debian/Ubuntu&lt;/div&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;# wget -qO - https://pkg.jenkins.io/debian-stable/jenkins.io.key | apt-key add -&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;red-hatcentos&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#red-hatcentos&quot; /&gt;Red Hat/CentOS&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Update Red Hat compatible operating systems (Red Hat Enterprise Linux, CentOS, Fedora, Oracle Linux, Scientific Linux, etc.) with the command:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Red Hat/CentOS&lt;/div&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;# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key&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;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;what-if-i-dont-update-the-repository-signing-key&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-if-i-dont-update-the-repository-signing-key&quot; /&gt;What if I don’t update the repository signing key?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Updates will be &lt;strong&gt;blocked&lt;/strong&gt; by the operating system package manager (apt, yum, dnf) on operating systems that have not installed the new repository signing key.
Sample messages from the operating system may look like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Debian/Ubuntu&lt;/div&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;Reading package lists... Done
W: GPG error: https://pkg.jenkins.io/debian-stable binary/ Release:
    The following signatures couldn&lt;span class=&quot;s1&quot;&gt;&#39;t be verified because the public key is not available:
        NO_PUBKEY FCEF32E745F2C3D5
E: The repository &#39;&lt;/span&gt;https://pkg.jenkins.io/debian-stable binary/ Release&lt;span class=&quot;s1&quot;&gt;&#39; is not signed.
N: Updating from such a repository can&#39;&lt;/span&gt;t be &lt;span class=&quot;k&quot;&gt;done &lt;/span&gt;securely, and is therefore disabled by default.
N: See apt-secure&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;8&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; manpage &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;repository creation and user configuration details.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Red Hat/CentOS&lt;/div&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;Downloading packages:
warning: /var/cache/yum/x86_64/7/jenkins/packages/jenkins-2.235.3-1.1.noarch.rpm:
    Header V4 RSA/SHA512 Signature, key ID 45f2c3d5: NOKEY
Public key &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;jenkins-2.235.3-1.1.noarch.rpm is not installed&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;why-is-the-repository-signing-key-being-updated&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-is-the-repository-signing-key-being-updated&quot; /&gt;Why is the repository signing key being updated?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The original repository GPG signing key is owned by Kohsuke Kawaguchi.
Rather than require that Kohsuke disclose his personal GPG signing key, the core release automation project has used a new repository signing key.
The updated GPG repository signing key is used in the weekly repositories and the stable repositories.&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;Operating systems that use Debian package management (apt) and operating systems that use Red Hat package management (yum and dnf) need the new repository signing key.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other operating systems like Windows, macOS, FreeBSD, OpenBSD, Solaris, and OpenIndiana are not affected.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;are-there-other-signing-changes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#are-there-other-signing-changes&quot; /&gt;Are there other signing changes?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, there are other signing changes, though they do not need specific action from users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;jenkins.war&lt;/code&gt; file is signed with a new code signing certificate.
The new code signing certificate has been used on weekly releases since April 2020.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/07/27/machine-learning-plugin-coding-phase2/</id>
<title>Machine Learning Plugin project - Coding Phase 2 blog post</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/27/machine-learning-plugin-coding-phase2/" />
<author>
<name>loghijiaha</name>
</author>
<category term='machinelearning'></category>
<category term='datascience'></category>
<category term='plugins'></category>
<category term='communitybonding'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
Welcome back folks!


This blog post is about my coding phase 2 in Jenkins Machine Learning Plugin for this GSoC 2020.
After successfully passing the evaluation and demo in the phase 1, our team went ahead for facing the challenges in phase 2.


Summary


This phase of coding was well spent by documentation and by fixing many bugs.
As the main feature of connecting to an IPython Kernel is done in phase 1, we were able to focus on fixing minor/major bugs and documenting for the users.
According to the JENKINS-62927 issue, a Docker agent was built to facilitate users without concerning plugin dependencies in python.
In...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;jenkins gsoc logo small&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome back folks!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post is about my coding phase 2 in Jenkins &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/machine-learning/&quot;&gt;Machine Learning Plugin&lt;/a&gt; for this GSoC 2020.
After successfully passing the evaluation and demo in the phase 1, our team went ahead for facing the challenges in phase 2.&lt;/p&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;This phase of coding was well spent by documentation and by fixing many bugs.
As the main feature of connecting to an IPython Kernel is done in phase 1, we were able to focus on fixing minor/major bugs and documenting for the users.
According to the &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62927&quot;&gt;JENKINS-62927&lt;/a&gt; issue, a Docker agent was built to facilitate users without concerning plugin dependencies in python.
In the act of deprecation of Python 2, we ported our plugin to support Python 3.
We have tested our plugin in Conda, venv and Windows environments.
Machine learning plugin has successfully passed the end to end test. A feature for a code editor is needed for further discussion/analysis as we have done a simple editor that may be useful in other ways in the future. &lt;a href=&quot;https://github.com/jenkinsci/machine-learning-plugin/pull/35&quot;&gt;PR#35&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;main-features-of-machine-learning-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#main-features-of-machine-learning-plugin&quot; /&gt;Main features of Machine Learning plugin&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;Run Jupyter notebook, (Zeppelin) JSON and Python files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run Python code directly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Convert Jupyter Notebooks to Python and JSON&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure IPython kernel properties&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support to execute Notebooks/Python on Agent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for Windows and Linux&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;upcoming-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upcoming-features&quot; /&gt;Upcoming features&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;Extract graph/map/images from the code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save artifacts according to the step name&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate reports for corresponding build&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-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-improvements&quot; /&gt;Future improvements&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;Usage of JupyterRestClient&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for multiple language kernels&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Note : There is no commitment on future improvements during GSoC period&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;docker-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-agent&quot; /&gt;Docker agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following Dockerfile can be used to build the Docker container as an agent for the Machine Learning plugin. This docker agent can be used to run  notebooks or python scripts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Dockerfile&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;FROM jenkins/agent:latest

MAINTAINER Loghi &amp;lt;loghijiaha@gmail.com&amp;gt;

USER root

RUN apt update &amp;amp;&amp;amp; apt install --no-install-recommends python3 -y \
    python3-pip \
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*

COPY requirements.txt /requirements.txt

RUN pip3 install --upgrade pip setuptools &amp;amp;&amp;amp; \
    pip3 install --no-cache-dir -r /requirements.txt &amp;amp;&amp;amp; \
    ln -sf /usr/bin/python3 /usr/bin/python &amp;amp;&amp;amp; \
    ln -sf /usr/bin/pip3 /usr/bin/pip

USER jenkins&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;ported-to-python-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ported-to-python-3&quot; /&gt;Ported to Python 3&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As discussed in the previous meeting, we concluded that the plugin should support Python 3 as Python 2.7+ has been deprecated since the beginning of 2020. Pull request for docker agent should be also ported to Python 3 support.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jupyter-rest-client-api&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jupyter-rest-client-api&quot; /&gt;Jupyter Rest Client API&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jupyter Notebook server API seemed to be promising that it can be also used to run notebooks and codes. There were 3 api implementations that were merged in the master. But we had to focus on what was proposed in the design document and had to finish all must-have issues/works. Jupyter REST client was left for future implementation. It is also a good start to contribute to the plugin from the community.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;fixed-bugs-for-running-in-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fixed-bugs-for-running-in-agent&quot; /&gt;Fixed bugs for running in agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were a few bugs related to the file path of notebooks while building a job. The major problem was caused by the python dependencies needed to connect to a IPython kernel. All issues/bugs were fixed before the timeline given.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;r-support-as-a-future-improvement&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#r-support-as-a-future-improvement&quot; /&gt;R support as a future improvement&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is what we tried to give a glimpse of knowledge that this plugin can be extended for multi language support in the future. There was a conclusion that the kernel should be selected dynamically using extension of the script file(like &lt;code&gt;eval_model.rb&lt;/code&gt; or &lt;code&gt;train_model.r&lt;/code&gt;), instead of scripting the same code for each kernel.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;documentation-and-end-to-end-testing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-and-end-to-end-testing&quot; /&gt;Documentation and End to End testing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A well explained documentation was published in the repository. A guided tutorial to run a notebook checked out from a git repo in an agent was included in the &lt;a href=&quot;https://github.com/jenkinsci/machine-learning-plugin/blob/master/docs/ML-docker-agent.adoc&quot;&gt;docs&lt;/a&gt; page. Mentors helped to test our plugin in both Linux and Windows.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;code-editor-with-rebuild-feature&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-editor-with-rebuild-feature&quot; /&gt;Code editor with rebuild feature&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Code editor was filtered as a nice to have feature in the design document. After grabbing the idea of Jenkinsfile replay editor, I could do the same for the code. At the same time, when we are getting the source code from git, it is not an elegant way of editing code in the original code. After the discussion, we had to leave the PR open that may have use cases in the future if needed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-lts-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-lts-update&quot; /&gt;Jenkins LTS update&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin has been updated to support Jenkins LTS 2.204.1 as 2.164.3 had some problems with installing pipeline supported API/plugin&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;installation-for-experimental-version&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installation-for-experimental-version&quot; /&gt;Installation for experimental version&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;Enable the &lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/releasing-experimental-updates/#using-the-experimental-update-center&quot;&gt;experimental update center&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for &lt;code&gt;Machine Learning Plugin&lt;/code&gt; and check the box along it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;code&gt;Install without restart&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin should now be installed on your system.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&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/blog/2020/06/03/machine-learning-plugin-community-bonding/&quot;&gt;Community Bonding blog post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2020/06/30/machine-learning-plugin-coding-phase1/&quot;&gt;Phase 1 blog post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/machine-learning-plugin.git&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/machine-learning/&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/10FjktNmWpdjgbGg3tEViadV_JNevn9W0sMOu-bF8m-o/edit?usp=sharing&quot;&gt;Design document&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/2020/07/27/custom-distribution-service/</id>
<title>Custom Distribution Service : Midterm Summary</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/27/custom-distribution-service/" />
<author>
<name>sladyn98</name>
</author>
<category term='service'></category>
<category term='distribution'></category>
<category term='cloud-native'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<category term='packaging'></category>
<category term='platform-sig'></category>
<summary>
Hello,
After an eventful community bonding period we finally entered into the coding phase. This blog post will summarize the work done till the midterm of the coding phases i.e. week 6. If some of the topics here require a more detailed explanation, I will write a separate blog post. These blogs posts will not have a very defined format but would cover all of the user stories or features implemented.


Project Summary

The main idea behind the project is to build a customizable jenkins distribution service that could be used to build tailor-made jenkins distributions. The service would provide users with a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello,
After an eventful community bonding period we finally entered into the coding phase. This blog post will summarize the work done till the midterm of the coding phases i.e. week 6. If some of the topics here require a more detailed explanation, I will write a separate blog post. These blogs posts will not have a very defined format but would cover all of the user stories or features implemented.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-summary&quot; /&gt;Project Summary&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main idea behind the project is to build a customizable jenkins distribution service that could be used to build tailor-made jenkins distributions. The service would provide users with a simple interface to select the configurations they want to build the instance with eg: plugins, authorization matrices etc. Furthermore it would include a section for sharing community created distros so that users can find and download already built jenkins war/configuration files to use out of the box.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;quick-review&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quick-review&quot; /&gt;Quick review&lt;/h3&gt;
&lt;table class=&quot;tableblock frame-all grid-all&quot; style=&quot;width: 25%;&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 83.3333%;&quot;&gt;
&lt;col style=&quot;width: 16.6667%;&quot;&gt;
&lt;/col&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;Pull Requests Opened&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;38&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;Github Issues completed&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;36&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#details&quot; /&gt;Details&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have written separate blog posts for every week in GSoC and the intricate details for each of them can be found at their respective blog pages. I am including a summary for every phase supported with the respective links.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;community-bonding&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-bonding&quot; /&gt;Community Bonding&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year GSoC had a longer community bonding than any of the previous editions due to the Coronavirus pandemic and therefore this gave me a lot of time to explore, so I spent it by building a prototype for my project. I realised some of the blockages I might face early on, and therefore it gave me more clarity in terms of how I can proceed. I also spent this time preparing a design document which you can find &lt;a href=&quot;https://docs.google.com/document/d/1-ujWVJ2a5VYkUF6UA7m4bEpSDxmb3mJZhCbmoKO716U/edit&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://sladyn98.netlify.app/blog/community_bonding/&quot;&gt;Community Bonding Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;week-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-1&quot; /&gt;Week 1&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In week one, I spent time getting used to the tech stack I would be using, I was pretty familiar with Spring Boot but React was something I was going to be using for the first time, so I spent time studying more about it. I also got the project page ready, the issues I was going to tackle and the milestones that I had to achieve before the evaluation. I also spent a bit of time setting up the home page and a bit of front-end components.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://sladyn98.netlify.app/blog/gsoc_week1/&quot;&gt;Week 1 Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;week-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-2&quot; /&gt;Week 2&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once we were done with the initial setup, it was time to work on the core of the project.
In the second week, I worked on generating the package configuration and the plugin list dummy display page setup.
I also ran into issues with the Jenkinsfile so the majority of time was spent fixing it.
Finally I managed to get around those problems.
You can read more about it in the &lt;a href=&quot;https://sladyn98.netlify.app/blog/gsoc_week2/&quot;&gt;Week 2 Blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://sladyn98.netlify.app/blog/gsoc_week2/&quot;&gt;Week 2 Blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;week-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-3&quot; /&gt;Week 3&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last week was spent cleaning up most of the code and getting the remaining milestones in. This was probably the hardest part of phase 1 because it involved connecting the front and back end of the project.You can read more about it here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://sladyn98.netlify.app/blog/gsoc_week3/&quot;&gt;Week 3&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;midterm-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#midterm-update&quot; /&gt;Midterm Update&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second phase has been going on for the past 3 weeks and we have already accomplished a majority of the deliverables including community configurations, war downloading and filtering of plugins. More details about the mid term report can be found here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://sladyn98.netlify.app/blog/gsoc_midterm/&quot;&gt;Midterm Update&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;getting-the-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-the-code&quot; /&gt;Getting the Code&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Custom Distribution Service was created from scratch during GSoC and can be found &lt;a href=&quot;https://github.com/jenkinsci/custom-distribution-service&quot;&gt;here on Github&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;other-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-links&quot; /&gt;Other links&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1C7VQJ92Yhr0KRDcNVHYxn4ri7OL9IGZmgxY6UFON6-g/edit?usp=sharing&quot;&gt;GSoC Proposal&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://docs.google.com/document/d/1-ujWVJ2a5VYkUF6UA7m4bEpSDxmb3mJZhCbmoKO716U/edit?usp=sharing&quot;&gt;Design Document&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://docs.google.com/document/d/1DSCH-3wh6uV9Rm_j8PcBzq2lvQPhZ31AIwmWkEaLxvc/edit?usp=sharing&quot;&gt;Daily Notes&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://youtu.be/HQLhakpx5mk&quot;&gt;Demo&lt;/a&gt;&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;feedback-channel&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feedback-channel&quot; /&gt;Feedback channel&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jenkins-custom-distribution-service:gitter.im&quot;&gt;Gitter Channel Link&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/table&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/07/24/external-fingerprint-storage-phase-2/</id>
<title>External Fingerprint Storage Phase-2 Updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/24/external-fingerprint-storage-phase-2/" />
<author>
<name>stellargo</name>
</author>
<category term='plugins'></category>
<category term='fingerprint'></category>
<category term='cloud-native'></category>
<category term='external-storage'></category>
<category term='developer'></category>
<category term='redis'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
As another great phase for the
External Fingerprint Storage Project
comes to an end, we summarise the work done during this phase in this blog post.
It was an exciting and fruitful journey, just like the previous phase, and offered some great learning experience.


To understand what the project is about and the past progress, please refer to the
phase 1 blog post.


New Stories Completed


We targeted four stories in this phase, namely fingerprint cleanup, fingerprint migration, refactoring the current
implementation to use descriptors, and improved testing of the Redis Fingerprint Storage Plugin.
We explain these stories in detail below.


Fingerprint Cleanup



https://github.com/jenkinsci/jenkins/pull/4817


https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/23




This story involved extending the FingerprintStorage API to...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As another great phase for the
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/external-fingerprint-storage/&quot;&gt;External Fingerprint Storage Project&lt;/a&gt;
comes to an end, we summarise the work done during this phase in this blog post.
It was an exciting and fruitful journey, just like the previous phase, and offered some great learning experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To understand what the project is about and the past progress, please refer to the
&lt;a href=&quot;https://www.jenkins.io/blog/2020/06/27/external-fingerprint-storage/&quot;&gt;phase 1 blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-stories-completed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-stories-completed&quot; /&gt;New Stories Completed&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We targeted four stories in this phase, namely fingerprint cleanup, fingerprint migration, refactoring the current
implementation to use descriptors, and improved testing of the Redis Fingerprint Storage Plugin.
We explain these stories in detail below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;fingerprint-cleanup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fingerprint-cleanup&quot; /&gt;Fingerprint Cleanup&lt;/h3&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/jenkins/pull/4817&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/4817&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/23&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/23&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;This story involved extending the &lt;code&gt;FingerprintStorage&lt;/code&gt; API to allow external storage plugins to perform and configure
their own fingerprint cleanup strategies.
We added the following functionalities to Jenkins core API:&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;FingerprintStorage#iterateAndCleanupFingerprints(TaskListener taskListener)&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This allows external fingerprint storage implementations to implement their own custom fingerprint cleanup.
The method is called periodically by Jenkins core.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;FingerprintStorage#cleanFingerprint(Fingerprint fingerprint, TaskListener taskListener)&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This is a reference implementation which can be called by external storage plugins to clean up a fingerprint.
It is upto the plugin implementation to decide whether to use this method.
They may choose to write a custom implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We consume these new API functionalities in the
&lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;Redis Fingerprint Storage plugin&lt;/a&gt;.
The plugin uses cursors to traverse the fingerprints, updating the build information, and deleting the build-less
fingerprints.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Earlier, fingerprint cleanup was always run periodically and there was no way to turn it off.
We also added an option to allow the user to turn off fingerprint cleanup.&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/2020/07-external-fingerprint-storage-phase-2/cleanup_disable.png&quot; alt=&quot;Fingerprint cleanup disable&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was done because it may be the case that keeping redundant fingerprints in memory might be cheaper than the
cleanup operation (especially in the case of external storages, which are cheaper these days).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;fingerprint-migration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fingerprint-migration&quot; /&gt;Fingerprint Migration&lt;/h3&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/jenkins/pull/4825&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/4825&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;Earlier, there was no support for fingerprints stored in the local storage.
In this phase, we introduce migration support for users.
The old fingerprints are now migrated to the new configured external storage whenever they are used (lazy migration).
This allows gradual migration of old fingerprints from local disk storage to the new external storage.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;refactor-fingerprintstorage-to-use-descriptors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#refactor-fingerprintstorage-to-use-descriptors&quot; /&gt;Refactor &lt;code&gt;FingerprintStorage&lt;/code&gt; to use descriptors&lt;/h3&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/jenkins/pull/4834&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/jenkins/pull/4834&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/36&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/36&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;Earlier, whenever an external fingerprint storage plugin was installed, it was enabled by default.
We refactored the implementation to make use of &lt;code&gt;Descriptor&lt;/code&gt; pattern so the fingerprint engine can now be selected
as a dropdown from the Jenkins configuration page.
The dropdown is shown only when multiple fingerprint storage engines are configured on the system.
&lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;Redis Fingerprint Storage Plugin&lt;/a&gt; was refactored
to use this new implementation.&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/2020/07-external-fingerprint-storage-phase-2/fingerprint_storage_engine_dropdown.png&quot; alt=&quot;Fingerprint Storage Engine Dropdown&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;strengthened-testing-for-the-redis-fingerprint-storage-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#strengthened-testing-for-the-redis-fingerprint-storage-plugin&quot; /&gt;Strengthened testing for the Redis Fingerprint Storage Plugin&lt;/h3&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/redis-fingerprint-storage-plugin/pull/33&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/33&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;We introduced new connection tests in the
&lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;Redis Fingerprint Storage Plugin&lt;/a&gt;.
These tests allow testing of cases like slow connection, breakage of connection to Redis, etc.
These were implemented using the Toxiproxy module inside Testcontainers.&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/redis-fingerprint-storage-plugin/pull/31&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/31&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;We introduced test for Configuration-as-code (JCasC) compatibility with the plugin.
The documentation for configuring the plugin using JCasC was also added.&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/redis-fingerprint-storage-plugin/pull/39&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/39&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;We introduced a suite of authentication tests, to verify the proper working of the Redis authentication system.
Authentication uses the credentials plugin.&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/redis-fingerprint-storage-plugin/pull/32&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/32&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/36&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/pull/36&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;We strengthened our web UI testing to ensure that the configuration page for the plugin works properly as planned.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;other-miscellaneous-tasks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-miscellaneous-tasks&quot; /&gt;Other miscellaneous tasks&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to the &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62754&quot;&gt;Jira Epic&lt;/a&gt; for this phase.&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;releases&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#releases&quot; /&gt;Releases 🚀&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Changes in the Jenkins core (except migration) were released in &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.248&quot;&gt;Jenkins 2.248&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We drafted &lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/releases/tag/redis-fingerprint-storage-parent-1.0-rc-1&quot;&gt;1.0-rc-1&lt;/a&gt;
release for the &lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;Redis Fingerprint Storage Plugin&lt;/a&gt;
to deliver the changes.
This was an increment from the &lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/releases/tag/redis-fingerprint-storage-parent-0.1-alpha-1&quot;&gt;alpha release&lt;/a&gt;
we had drafted at the end of the previous phase.
The plugin is now available at &lt;a href=&quot;https://plugins.jenkins.io/redis-fingerprint-storage/&quot; class=&quot;bare&quot;&gt;https://plugins.jenkins.io/redis-fingerprint-storage/&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;trying-out-the-new-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#trying-out-the-new-features&quot; /&gt;Trying out the new features!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latest release for the plugin can be downloaded from the update center, instructions for which can be
found in the &lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin/blob/master/README.adoc&quot;&gt;README&lt;/a&gt;
of the plugin.
We appreciate you trying out the plugin, and welcome any suggestions, feature requests, bug reports, etc.&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;The Redis Fingerprint Storage plugin is built and maintained by the Google Summer of Code (GSoC) Team for
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/external-fingerprint-storage/&quot;&gt;External Fingerprint Storage for
Jenkins&lt;/a&gt;. Special thanks to &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;,
&lt;a href=&quot;https://github.com/afalko&quot;&gt;Andrey Falko&lt;/a&gt;, &lt;a href=&quot;https://github.com/mikecirioli&quot;&gt;Mike Cirioli&lt;/a&gt;,
&lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, and the entire Jenkins community for all the contribution to this project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-work&quot; /&gt;Future Work&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of the topics we aim to tackle in the next phase include a new reference implementation (possibly backed
by PostgreSQL), tracing, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reaching-out&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reaching-out&quot; /&gt;Reaching Out&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to reach out to us for any questions, feedback, etc. on the project’s &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_external-fingerprint-storage:gitter.im&quot;&gt;Gitter Channel&lt;/a&gt; or the &lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins
Developer Mailing list&lt;/a&gt;.
We use Jenkins &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;Jira&lt;/a&gt; to track issues.
Feel free to file issues under &lt;code&gt;redis-fingerprint-storage-plugin&lt;/code&gt; component.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;other-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-links&quot; /&gt;Other 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://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;Redis Fingerprint Storage Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62754&quot;&gt;Issue Tracker for Phase 2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/226/README.adoc&quot;&gt;JEP-226&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_external-fingerprint-storage:gitter.im&quot;&gt;Gitter Channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/external-fingerprint-storage/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2020/06/27/external-fingerprint-storage/&quot;&gt;Phase 1 Blog Post&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/2020/07/23/windows-support-updates/</id>
<title>Jenkins 2.248: Windows Support Updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/23/windows-support-updates/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='announcement'></category>
<category term='windows'></category>
<category term='platform'></category>
<category term='winsw'></category>
<summary>
In this article, I would like to announce the new Windows support policy
which was introduced in the Jenkins project in June 2020.
This policy sets an expectation about how we handle issues and patches related to Windows support for the Jenkins server and agents, and how we organize testing of Windows support in the project.
We will also talk about .NET Framework 2.0 support removal in Jenkins 2.248,
and about new Windows service management features and fixes Jenkins users get with this release.





Figure 1. Jenkins on Windows


Why?


In theory, Jenkins can run everywhere where you can run Java 8 or Java 11, but, in...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this article, I would like to announce the new &lt;a href=&quot;https://www.jenkins.io/doc/administration/requirements/windows/&quot;&gt;Windows support policy&lt;/a&gt;
which was introduced in the Jenkins project in June 2020.
This policy sets an expectation about how we handle issues and patches related to Windows support for the Jenkins server and agents, and how we organize testing of Windows support in the project.
We will also talk about .NET Framework 2.0 support removal in &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.248&quot;&gt;Jenkins 2.248&lt;/a&gt;,
and about new Windows service management features and fixes Jenkins users get with this release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/07-windows-support-updates/header_image.png&quot; alt=&quot;header image&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Jenkins on Windows&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why&quot; /&gt;Why?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In theory, Jenkins can run everywhere where you can run Java 8 or Java 11, but, in practice, there are some limitations.
The Jenkins core and some plugins contain native code, and hence they rely on operating systems and platforms.
We use Java Native Access and Java Native Runtime libraries which provide wide platform support for low-level operations,
but there are platform-specific cases not covered by such generic libraries.
In the case of Windows platforms we use &lt;a href=&quot;https://github.com/winsw/winsw&quot;&gt;Windows Service Wrapper (WinSW)&lt;/a&gt; and
&lt;a href=&quot;https://github.com/kohsuke/winp&quot;&gt;Windows Process Management Library (WinP)&lt;/a&gt;.
These libraries depend on particular Windows API versions and, in the case of Windows services, on .NET Framework.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Historically Jenkins had no documented support policy for Windows,
and we were accepting patches for all versions which existed since the Hudson inception in 2004.
It became a serious obstacle for Windows component maintainers who had to be very conservative about incoming patches so that we could avoid breaking instances running on old platforms.
Lack of testing for older platforms did not help either.
And it is not just about maintenance overhead.
Users were impacted as well, because it blocked us from adopting some new Windows features and making Jenkins more stable/maintainable on modern platforms.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-policy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-policy&quot; /&gt;New policy&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To set proper expectations about Windows support,
in the new policy we defined four support levels.
See the &lt;a href=&quot;https://www.jenkins.io/doc/administration/requirements/windows/&quot;&gt;Windows support policy page&lt;/a&gt; for the actual information about the support levels and the supported platforms.
This blogpost captures the support state as of Jul 23, 2020:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Level 1 - Full Support&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;We run automated testing for these platforms, and we intend to timely fix the reported issues.
This support level includes 64-bit (amd-64) Windows Server versions with the latest GA update pack,
and versions used in the official Jenkins server and agent Docker images.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Level 2 - Supported&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;We do not actively test these platforms, but we intend to keep compatibility.
We are happy to accept patches.
This support level includes 64-bit (amd64) Windows Server and Windows 10 versions generally supported by Microsoft.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Level 3 - Patches considered&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The platforms are generally expected to work, but they may have limitations and extra requirements.
We do not test compatibility, and we may drop support if needed.
We will consider patches if they do not put Level 1/2 platforms at risk and if they do not create maintenance overhead.
This support level includes non-amd64 platforms like x86 (32-bit) and AArch64 (Arm).
It also applies to non-mainstream release lines like Windows Embedded, preview releases, and versions no longer supported by Microsoft.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Level 4 - Unsupported&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;These versions are known to be incompatible or to have severe limitations.
We do not support the listed platforms, and we will not accept patches.
At the moment this level applies to platforms released before 2008.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the policy was introduced, there were questions raised about platforms listed in the &lt;em&gt;Level 3&lt;/em&gt; support category.
First of all, these platforms are still supported.
Users are welcome to run Jenkins on these platforms.
We recognize the importance of the platforms listed there, and we intend to keep compatibility with them.
At the same time, particular functionality may break there due to the lack of testing when we update Jenkins or upstream dependencies.
It may take a while until a fix is submitted by a user or contributor,
because we do not maintain development environments for these platforms.
By setting a Level 3 support level, we want to set an explicit expectation about those limitations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested in expanding the official Windows support policy and adding more platforms there,
we invite you to participate in &lt;a href=&quot;https://www.jenkins.io/participate/test/&quot;&gt;quality assurance of Jenkins&lt;/a&gt;.
You may contribute by expanding test automation for Jenkins,
contributing test environments for your platforms,
or participating in the &lt;a href=&quot;https://www.jenkins.io/download/lts/&quot;&gt;LTS release candidate testing&lt;/a&gt; and reporting results.
Please contact us via &lt;a href=&quot;https://www.jenkins.io/sigs/platform/&quot;&gt;Platform SIG&lt;/a&gt; channels if you are interested.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;windows-service-management-changes-in-jenkins-2-248&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#windows-service-management-changes-in-jenkins-2-248&quot; /&gt;Windows Service Management changes in Jenkins 2.248&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/07-windows-support-updates/winsw-logo.png&quot; alt=&quot;winsw logo&quot; width=&quot;224px&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. WinSW Logo&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although the policy was introduced more than 1 month ago,
&lt;a href=&quot;https://www.jenkins.io/changelog/#v2.248&quot;&gt;Jenkins 2.248&lt;/a&gt; is the first release where the new policy is applied.
Starting from this release, we won’t support .NET Framework 2.0 for launching the Jenkins server or agents as Windows services.
 .NET Framework 4.0 or above is now required for using the default service management features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release also upgrades &lt;a href=&quot;https://github.com/winsw/winsw&quot;&gt;Windows Service Wrapper (WinSW)&lt;/a&gt; from 2.3.0 to 2.9.0 and replaces the bundled binary from .NET Framework 2.0 to 4.0.
There are many improvements and fixes in these versions,
big thanks to &lt;a href=&quot;https://github.com/NextTurn&quot;&gt;NextTurn&lt;/a&gt; and all other contributors.
You can find the full WinSW changelog &lt;a href=&quot;https://github.com/winsw/winsw/releases&quot;&gt;here&lt;/a&gt;,
just a few highlights important to Jenkins users:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Prompt for permission elevation when administrative access is required.
Now Jenkins users do not need to run the agent process as Administrator to install the agent as a service from GUI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable TLS 1.1/1.2 in .NET Framework 4.0 packages on Windows 7 and Windows Server 2008 R2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable strong cryptography when running .NET Framework 4.0 binaries on .NET 4.6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support security descriptor string in the Windows service definition.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support &#39;If-Modified-Since&#39; and proxy settings for automatic downloads.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix Runaway Process Killer extension so that it does not kill wrong processes with the same PID on startup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix the default domain name in the &lt;code&gt;serviceaccount&lt;/code&gt; parameter (&lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-12660&quot;&gt;JENKINS-12660&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix archiving of old logs in the &lt;code&gt;roll-by-size-time&lt;/code&gt; mode.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you may see, there are many improvements available with this version,
and we hope that it will make Windows service installation even more reliable.
Some of the changes in WinSW also replaced old workarounds in the Jenkins core,
making the code more maintainable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;use-cases-affected-by-net-framework-2-0-support-removal&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-cases-affected-by-net-framework-2-0-support-removal&quot; /&gt;Use-cases affected by .NET Framework 2.0 support removal&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you use .NET Framework 2.0 to run the Jenkins Windows services,
the following use-cases are likely to be affected:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installing the Jenkins server as a Windows service from Web UI.
The official MSI Installer supports .NET Framework 2.0 for the moment, but it will be changed in future versions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installing agents as Windows services from GUI.
This feature is provided by in &lt;a href=&quot;https://github.com/jenkinsci/windows-slave-installer-module&quot;&gt;Windows Agent Installer Module&lt;/a&gt; from the Jenkins core.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installing agents over Windows Management Instrumentation (WMI) via the &lt;a href=&quot;https://plugins.jenkins.io/windows-slaves&quot;&gt;WMI Windows Agents&lt;/a&gt; plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auto-updating of Windows service wrappers on agents installed from GUI.&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;upgrade-guidelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-guidelines&quot; /&gt;Upgrade guidelines&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If all of your Jenkins server and agent instances already use .NET Framework 4.0 or above,
there are no special upgrade steps required.
Please enjoy the new features!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you run the Jenkins server as a Windows Service with .NET Framework 2.0,
this instance will require an upgrade of .NET Framework to version 4.0 or above.
We recommend running with .NET Framework 4.6.1 or above,
because this .NET version provides many platform features by default
(e.g. TLS 1.2 encryption and strong cryptography),
and Windows Service Wrapper does not have to apply custom workarounds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to continue running some of your agents with .NET Framework 2.0,
the following extra upgrade steps are required:&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;Disable auto-upgrade of Windows Service Wrapper on agents by setting the
&lt;code&gt;-Dorg.jenkinsci.modules.windows_slave_installer.disableAutoUpdate=true&lt;/code&gt; flag on the Jenkins server side.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade agents with .NET Framework 4.0+ by downloading the recent Windows Service Wrapper 2.x
version from &lt;a href=&quot;https://github.com/winsw/winsw/releases&quot;&gt;WinSW GitHub Releases&lt;/a&gt;
and manually replacing the wrapper &quot;.exe&quot; files in the agent workspaces.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&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;We plan to continue expanding the Windows support in Jenkins,
including providing official Docker images for newer Windows versions.
For example, there is already a &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/pull/145&quot;&gt;pull request&lt;/a&gt; which will introduce official agent images for Windows Server Core LTSC 2019 and
for Windows Server Core and Nano Server 1909.
We are also interested to keep expanding test coverage for Windows platforms.
Any contributions and feedback will be appreciated!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also keep working on improving Windows Services.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/buddhikac96&quot;&gt;Buddhika Chathuranga&lt;/a&gt;, a Google Summer of Code 2020 student, is working on support for YAML Configurations in Windows Service Wrapper,
and on better verification of XML and YAML Configurations.
See the details on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/winsw-yaml-configs/&quot;&gt;project page&lt;/a&gt; and in the
&lt;a href=&quot;https://www.jenkins.io/blog/2020/07/08/winsw-yaml-support/&quot;&gt;Coding Phase 1 Report&lt;/a&gt;.
In addition to that, there is ongoing work on a new &lt;a href=&quot;https://github.com/winsw/winsw/tree/v3&quot;&gt;Windows Service Wrapper 3.0&lt;/a&gt; release which will redesign CLI and introduce a lot more improvements.
If you are interested in contributing to Windows Service Wrapper,
see the guidelines &lt;a href=&quot;https://github.com/winsw/winsw/blob/master/CONTRIBUTING.md&quot;&gt;here&lt;/a&gt;.
We will also appreciate your feedback on the &lt;a href=&quot;https://app.gitter.im/#/room/#winsw_winsw:gitter.im&quot;&gt;WinSW Gitter channel&lt;/a&gt;.&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/2020/07/15/xss-severity/</id>
<title>Severity of cross-site scripting vulnerabilities</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/15/xss-severity/" />
<author>
<name>daniel-beck</name>
</author>
<category term='security'></category>
<category term='announcement'></category>
<summary>
Eagle-eyed readers of today&#8217;s security advisory may already have noticed that we consider the cross-site scripting (XSS) vulnerabilities to be 'High' severity.
This is a change from previous security advisories, in which similar vulnerabilities got a 'Medium' score.


We follow the guidelines of CVSS version 3.0 for the severity we assign to these issues.
Their examples for XSS vulnerabilities, as well as XSS vulnerabilities in other software, consider the most severe, immediate impact to be a modification of the HTML output, possibly also the extraction of the session cookie (something Jenkins prevents by declaring it to be HttpOnly).


Unfortunately, this does not adequately model...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Eagle-eyed readers of today’s &lt;a href=&quot;https://www.jenkins.io/security/advisory/2020-07-15/&quot;&gt;security advisory&lt;/a&gt; may already have noticed that we consider the cross-site scripting (XSS) vulnerabilities to be &#39;High&#39; severity.
This is a change from previous security advisories, in which similar vulnerabilities got a &#39;Medium&#39; score.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We follow the guidelines of &lt;a href=&quot;https://www.first.org/cvss/calculator/3.0&quot;&gt;CVSS version 3.0&lt;/a&gt; for the severity we assign to these issues.
Their examples for XSS vulnerabilities, as well as XSS vulnerabilities in other software, consider the most severe, immediate impact to be a modification of the HTML output, possibly also the extraction of the session cookie (something Jenkins prevents by declaring it to be &lt;code&gt;HttpOnly&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, this does not adequately model the impact that a successful XSS exploitation in Jenkins can have:
Jenkins administrators can perform far more sensitive actions than e.g. the admins of most content management systems could, as it is designed to allow users to execute code to build, test, and deploy their software.
So this kind of vulnerability, that allows attackers to do &lt;em&gt;anything&lt;/em&gt; their victims have permission to do, in Jenkins can mean execution of arbitrary code, perhaps via the script console, if the victim has the Overall/Administer permission.
None of this requires chaining different actions in an attack, a well-chosen XSS payload will accomplish this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Therefore, starting today, we score XSS vulnerabilities by the highest immediate impact a successful attack can have, which is a complete system compromise if admins can be attacked.
For stored XSS requiring some permissions, like the ability to configure jobs, a typical score would be &lt;a href=&quot;https://www.first.org/cvss/calculator/3.0#CVSS:3.0/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H&quot;&gt;8.0&lt;/a&gt;.
Reflected XSS, which don’t require any permissions to exploit, will usually score &lt;a href=&quot;https://www.first.org/cvss/calculator/3.0#CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H&quot;&gt;8.8&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/07/09/github-checks-api-plugin-coding-phase-1/</id>
<title>GitHub Checks API Plugin Project - Coding Phase 1</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/09/github-checks-api-plugin-coding-phase-1/" />
<author>
<name>XiongKezhi</name>
</author>
<category term='github'></category>
<category term='api'></category>
<category term='plugins'></category>
<category term='developer'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
This blog post is about our coding phase 1 progress on GSoC project: GitHub Checks API Plugin.


The GitHub Checks API is a highly customized way to integrate CI tools to make reports for pull-requests (PRs).
It allows users to see CI reports on GitHub pages directly.





Figure 1. GitHub Check Run Screenshot from GitHub Docs


What&#8217;s more exciting is that it can leave annotations on specific lines of code, just as the comments people left while reviewing.





Figure 2. Check Run Annotation Screenshot from GitHub Docs


While on Jenkins' side, the source code view provided by Warnings Next Generation Plugin does pretty much the same...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post is about our coding phase 1 progress on GSoC project: &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/github-checks/&quot;&gt;GitHub Checks API Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The GitHub Checks API is a highly customized way to integrate CI tools to make reports for pull-requests (PRs).
It allows users to see CI reports on GitHub pages directly.&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/2020/07-github-checks-api-plugin-coding-phase-1/github-check-run.png&quot; alt=&quot;github check run&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. GitHub Check Run Screenshot from GitHub Docs&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What’s more exciting is that it can leave annotations on specific lines of code, just as the comments people left while reviewing.&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/2020/07-github-checks-api-plugin-coding-phase-1/github-check-annotations.png&quot; alt=&quot;github check annotations&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Check Run Annotation Screenshot from GitHub Docs&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While on Jenkins&#39; side, the source code view provided by &lt;a href=&quot;https://plugins.jenkins.io/warnings-ng/&quot;&gt;Warnings Next Generation Plugin&lt;/a&gt; does pretty much the same thing.&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/2020/07-github-checks-api-plugin-coding-phase-1/source-view.png&quot; alt=&quot;source view&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. Source Code View from Warnings Next Generation Plugin&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Utilizing such features through GitHub Checks API, it would make Jenkins more convenient to GitHub users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;features-from-coding-phase-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#features-from-coding-phase-1&quot; /&gt;Features from Coding Phase 1&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the past month, our team was mostly working on the general checks API and an implementation for GitHub checks API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;GitHub Checks API Plugin Demo [starts from 50:15]&lt;/div&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/HQLhakpx5mk?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;general-checks-api&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#general-checks-api&quot; /&gt;General Checks API&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although the general checks API is developed based on the semantic meaning of GitHub Checks API, we still want to prepare it for similar concepts on other platforms like &lt;a href=&quot;https://docs.gitlab.com/ee/api/commits.html#commit-status&quot;&gt;Commit Status API&lt;/a&gt; from GitLab.
Contributions for implementations on these platforms will be welcomed in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;github-checks-api-implementation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#github-checks-api-implementation&quot; /&gt;GitHub Checks API Implementation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our work on supporting GitHub Checks API is mostly done by now.
Besides, we implemented a consumer to automatically create a check run that simply indicates the current stage of a Jenkins build.
After the release, Jenkins developers (especially publisher plugin ones) can create their own GitHub checks for a GitHub branch source project by consuming our API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; To create a check run like:&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/2020/07-github-checks-api-plugin-coding-phase-1/created-check-run.png&quot; alt=&quot;Created Check Run&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Consumers need to use our API in this way:&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;java&quot;&gt;&lt;span class=&quot;nc&quot;&gt;ChecksDetails&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;details&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ChecksDetailsBuilder&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;na&quot;&gt;withName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Jenkins&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;na&quot;&gt;withStatus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ChecksStatus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;COMPLETED&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;na&quot;&gt;withDetailsURL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://ci.jenkins.io&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;na&quot;&gt;withStartedAt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;LocalDateTime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ZoneOffset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;UTC&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;na&quot;&gt;withCompletedAt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;LocalDateTime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ZoneOffset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;UTC&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;na&quot;&gt;withConclusion&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ChecksConclusion&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;SUCCESS&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;na&quot;&gt;withOutput&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ChecksOutputBuilder&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;na&quot;&gt;withTitle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Jenkins Check&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;na&quot;&gt;withSummary&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;# A Successful Build&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;na&quot;&gt;withText&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;## 0 Failures&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;na&quot;&gt;withAnnotations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Arrays&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;asList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ChecksAnnotationBuilder&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;na&quot;&gt;withPath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Jenkinsfile&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;na&quot;&gt;withLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&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;na&quot;&gt;withAnnotationLevel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ChecksAnnotationLevel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;NOTICE&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;na&quot;&gt;withMessage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;say hello to Jenkins&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;na&quot;&gt;withStartColumn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&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;na&quot;&gt;withEndColumn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&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;na&quot;&gt;withTitle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello Jenkins&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;na&quot;&gt;withRawDetails&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;a simple echo command&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;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ChecksAnnotationBuilder&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;na&quot;&gt;withPath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Jenkinsfile&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;na&quot;&gt;withLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&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;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withAnnotationLevel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ChecksAnnotationLevel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;WARNING&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;na&quot;&gt;withMessage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;say hello to GitHub Checks API&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;na&quot;&gt;withStartColumn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&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;na&quot;&gt;withEndColumn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;30&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;na&quot;&gt;withTitle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello GitHub Checks API&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;na&quot;&gt;withRawDetails&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;a simple echo command&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;na&quot;&gt;build&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;na&quot;&gt;build&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;na&quot;&gt;withActions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Collections&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;singletonList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ChecksAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;formatting&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;format code&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;#0&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;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;ChecksPublisher&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;publisher&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ChecksPublisherFactory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromRun&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;publisher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;publish&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;details&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;future-works&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-works&quot; /&gt;Future Works&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next step is integrating our API into &lt;a href=&quot;https://plugins.jenkins.io/warnings-ng/&quot;&gt;Warnings Next Generation Plugin&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/code-coverage-api/&quot;&gt;Code Coverage API Plugin&lt;/a&gt; consume our API.
After that, pipeline support will be added: users can publish checks directly in a pipeline script without requiring a consumer plugin that support the checks.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&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://github.com/jenkinsci/checks-api-plugin&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/github-checks/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_github-checks-api:gitter.im&quot;&gt;Gitter Channel&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;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&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://docs.github.com/en/developers/apps/creating-ci-tests-with-the-checks-api&quot;&gt;GitHub Doc: Creating CI tests with the Checks API&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin/blob/master/doc/Documentation.md#source-code-view&quot;&gt;Warnings Next Generation Plugin: Source Code View&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/07/09/git-performance-improvement-phase1/</id>
<title>Git Plugin Performance Improvement: Phase-1</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/09/git-performance-improvement-phase1/" />
<author>
<name>rishabhbudhouliya</name>
</author>
<category term='plugins'></category>
<category term='git'></category>
<category term='platform-sig'></category>
<category term='developer'></category>
<category term='performance'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
Git Plugin Performance Improvement is a Google Summer of Code 2020 project.
It aims to improve the performance of the git plugin, which provides fundamental git functionalities.


Internally, the plugin provides these functionalities using two implementations: command line git and JGit (pure java implementation).





CLI git is the default implementation for the plugin, a user can switch to JGit if needed


The project is divided into two parallel stages:




Stage 1: Create benchmarks which evaluate the execution time of a git operation provided by CLI git and JGit using JMH, a micro benchmarking test harness.


Stage 2: Implement the insights gained from the analysis into the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/git-plugin-performance/&quot;&gt;Git Plugin Performance Improvement&lt;/a&gt; is a &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#gsoc-2020&quot;&gt;Google Summer of Code 2020 project&lt;/a&gt;.
It aims to improve the performance of the git plugin, which provides fundamental git functionalities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Internally, the plugin provides these functionalities using two implementations: &lt;a href=&quot;https://www.git-scm.com/&quot;&gt;command line git&lt;/a&gt; and &lt;a href=&quot;https://www.eclipse.org/jgit/&quot;&gt;JGit (pure java implementation)&lt;/a&gt;.&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/2020/07-git-plugin-performance-improvement/git-intro.png&quot; alt=&quot;git-intro&quot; width=&quot;938&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;CLI git is the default implementation for the plugin, a user can switch to JGit if needed&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project is divided into two parallel stages:&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;Stage 1&lt;/strong&gt;: Create benchmarks which evaluate the execution time of a git operation provided by CLI git and JGit using JMH, a micro benchmarking test harness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stage 2&lt;/strong&gt;: Implement the insights gained from the analysis into the plugin to improve the overall performance of the plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project also aims to fix any existing performance bottlenecks within the plugin as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;benchmarks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#benchmarks&quot; /&gt;Benchmarks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The benchmarks are written using &lt;a href=&quot;https://openjdk.java.net/projects/code-tools/jmh/&quot;&gt;JMH&lt;/a&gt;. It was introduced in a &lt;a href=&quot;https://www.jenkins.io/blog/2019/06/21/performance-testing-jenkins/&quot;&gt;GSoC 2019 project&lt;/a&gt; to Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JMH is provided within the plugin through the Jenkins Unit Test Harness POM dependency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The JMH &lt;a href=&quot;https://github.com/jenkinsci/git-client-plugin/tree/master/src/test/java/jmh/benchmark&quot;&gt;benchmarks&lt;/a&gt; are created and run within the git client plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;During phase-1, we have created benchmarks for two operations: &quot;git fetch&quot; and &quot;git ls-remote&quot;&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;results-and-analysis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results-and-analysis&quot; /&gt;Results and Analysis&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The benchmark analysis for git fetch:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;git-fetch-results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#git-fetch-results&quot; /&gt;Git fetch results&lt;/h3&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/2020/07-git-plugin-performance-improvement/git-fetch-results.png&quot; alt=&quot;git-fetch-results&quot; width=&quot;938&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The performance of git fetch (average execution time/op) is strongly correlated to the size of a repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There exists an inflection point on the scale of repository size after which the nature of JGit performance changes (it starts to degrade)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After running multiple benchmarks, it is safe to say that for a large sized repository &lt;strong&gt;CLI-git&lt;/strong&gt; would be a better choice of implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We can use this insight to implement a feature which avoids JGit when it comes to large repositories.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to &lt;a href=&quot;https://github.com/jenkinsci/git-client-plugin/pull/521&quot;&gt;PR-521&lt;/a&gt; for an elaborate explanation on these results&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Repository size means &lt;code&gt;du -h .git&lt;/code&gt;&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;fixing-redundant-fetch-issue&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fixing-redundant-fetch-issue&quot; /&gt;Fixing redundant fetch issue&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The git plugin performs two fetch operations instead of one while performing a fresh checkout of a remote git repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To &lt;a href=&quot;https://github.com/jenkinsci/git-plugin/pull/904&quot;&gt;fix&lt;/a&gt; this issue, we had to safely remove the second fetch keeping multiple use-cases in mind. The fix itself was not difficult to code, but to do that safely without breaking any existing use-case was a challenging task.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;further-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#further-plan&quot; /&gt;Further Plan&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After consolidating a benchmarking strategy during Phase 1, the next steps will be:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Provide functionality to the git plugin, which enables it to estimate the size of the repository without cloning it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Broaden the scope of benchmarking strategy&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Consider parameters like number of branches, references and commit history to find a relation with the performance of a git operation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The git plugin depends on other plugins like Credentials which might require benchmarking the plugin itself and the effects of these external dependencies on the plugin’s performance&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Focus on other use-cases of the plugin&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For phase-1, I focused on the checkout step and the operations involved with it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the next phase, the focus will shift to other areas like Multibranch pipelines or Organisation Folders&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;how-can-you-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-you-help&quot; /&gt;How can you help?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have reached this far of the blog, you might be interested in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To help, you can&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Review the benchmarks in the &lt;a href=&quot;https://github.com/jenkinsci/git-client-plugin/tree/master/src/test/java/jmh/benchmark&quot;&gt;benchmarks module&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Analyse the benchmarks results available on &lt;a href=&quot;https://ci.jenkins.io/job/Plugins/job/git-client-plugin/job/master/&quot;&gt;ci.jenkins.io&lt;/a&gt; [soon]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come visit our Gitter channel: &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_git-plugin:gitter.im&quot; class=&quot;bare&quot;&gt;https://app.gitter.im/#/room/#jenkinsci_git-plugin:gitter.im&lt;/a&gt;&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/2020/07/08/winsw-yaml-support/</id>
<title>Windows Service Wrapper : YAML Configuration Support - GSoC Phase - 01 Updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-07-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/07/08/winsw-yaml-support/" />
<author>
<name>buddhikac96</name>
</author>
<category term='winsw'></category>
<category term='windows'></category>
<category term='jenkins'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
Hello all, I am Buddhika Chathuranga from Sri Lanka and I am a final year undergraduate at the Faculty of IT, University of Moratuwa. I am participating in GSoC 2020 with Jenkins.
I am working on the Windows Service Wrapper Project.
So the Coding Phase 01 of GSoC 2020 is now over and this blog post describes what I have done so far.


Windows Service Wrapper is an executable, which we can use to run applications as Windows Services on Windows machines, which has almost one million downloads.
In Jenkins, we use Windows service wrapper to run Jenkins server and agents as Windows services...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello all, I am Buddhika Chathuranga from Sri Lanka and I am a final year undergraduate at the Faculty of IT, University of Moratuwa. I am participating in GSoC 2020 with Jenkins.
I am working on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/winsw-yaml-configs/&quot;&gt;Windows Service Wrapper Project&lt;/a&gt;.
So the Coding Phase 01 of GSoC 2020 is now over and this blog post describes what I have done so far.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Windows Service Wrapper is an executable, which we can use to run applications as Windows Services on Windows machines, which has almost one million downloads.
In Jenkins, we use Windows service wrapper to run Jenkins server and agents as Windows services to gain more robustness.
This feature is bundled into Jenkins’s core. Currently, the Windows Service wrapper is configured by an XML file.
However, there is a limited number of configuration checks and there is no XML schema.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;XML is not such a human-friendly way to do that. It is quite verbose and not easy to identify the schema without some effort.
Usually, users misconfigure the service wrapper. This is a sample XML configuration file that we can use to provide configurations to Windows Service Wrapper.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;sample-xml-configuration-file&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sample-xml-configuration-file&quot; /&gt;Sample XML Configuration File&lt;/h3&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;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;service&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;jenkins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Jenkins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;description&amp;gt;&lt;/span&gt;This service runs Jenkins automation server.&lt;span class=&quot;nt&quot;&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;env&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;JENKINS_HOME&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%LocalAppData%\Jenkins.jenkins&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;executable&amp;gt;&lt;/span&gt;C:\Program Files\Java\jdk1.8.0_201\bin\java.exe&lt;span class=&quot;nt&quot;&gt;&amp;lt;/executable&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;arguments&amp;gt;&lt;/span&gt;-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle
    -jar &quot;C:\Program Files\Jenkins\jenkins.war&quot; --httpPort=8081 --webroot=&quot;%LocalAppData%\Jenkinswar&quot;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/arguments&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;logmode&amp;gt;&lt;/span&gt;rotate&lt;span class=&quot;nt&quot;&gt;&amp;lt;/logmode&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;onfailure&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;action=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;restart&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;extensions&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;extension&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;enabled=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;className=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;winsw.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;killOnStartup&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;pidfile&amp;gt;&lt;/span&gt;%LocalAppData%\Jenkinsjenkins.pid&lt;span class=&quot;nt&quot;&gt;&amp;lt;/pidfile&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;stopTimeout&amp;gt;&lt;/span&gt;10000&lt;span class=&quot;nt&quot;&gt;&amp;lt;/stopTimeout&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;stopParentFirst&amp;gt;&lt;/span&gt;false&lt;span class=&quot;nt&quot;&gt;&amp;lt;/stopParentFirst&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/extension&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/extensions&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/service&amp;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 usage of YAML could simplify configuration management in Jenkins, especially when automated and configuration management tools are used.
So what we are doing under GSoC - 2020 is to update the Windows Service Wrapper to support YAML configurations.
After finishing this project, users will be able to provide configurations to the Windows Service Wrapper as a YAML file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a sample YAML configuration file for Windows Service Wrapper and you can see it is less verbose than XML or JSON and much more human friendly.
Users can read and edit this without a big effort.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;sample-yaml-configuration-file&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sample-yaml-configuration-file&quot; /&gt;Sample YAML Configuration File&lt;/h3&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;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jenkins&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Jenkins&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;This service runs Jenkins automation server.&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;JENKINS_HOME&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;_value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;%LocalAppData%\Jenkins.jenkins&#39;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;executable&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;C:\Program&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Files\Java\jdk1.8.0_201\bin\java.exe&#39;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;&amp;gt;-&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;-jar &quot;C:\Program Files\Jenkins\jenkins.war&quot; --httpPort=8081 --webroot=&quot;%LocalAppData%\Jenkinswar&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;logmode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rotate&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;onfailure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;_action&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;restart&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;extensions&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;pidfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;%LocalAppData%\Jenkinsjenkins.pid&#39;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;stopTimeout&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;10000&#39;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;stopParentFirst&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;false&#39;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;_enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;true&#39;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;_className&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;winsw.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension&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;killOnStartup&lt;/span&gt;&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;advantages-of-yaml-as-a-configuration-file&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#advantages-of-yaml-as-a-configuration-file&quot; /&gt;Advantages of YAML as a configuration file&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It is less verbose and much more human friendly than XML.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Since YAML is not using extra delimiters, it is lightweight.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nowadays YAML has become more popular among configuration management tools.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-scope&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-scope&quot; /&gt;Project Scope&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this project, I will add the following features to Windows Service Wrapper.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;YAML Configuration support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YAML Schema validation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New CLI for the Windows Service Wrapper&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for XML Schema validation via XML Schema Definition (XSD)&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;phase-01-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-01-updates&quot; /&gt;Phase 01 Updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In GSoC - 2020 phase 01, I have done the following updates to the Windows Service Wrapper.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Project Structure overview document. &lt;a href=&quot;https://github.com/winsw/winsw/blob/master/doc/developer/projectStructure.md&quot;&gt;(Published)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YAML configurations support (Not released yet) - &lt;a href=&quot;https://github.com/winsw/winsw/pull/543&quot;&gt;Pull Request&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New CLI (Not released yet) - &lt;a href=&quot;https://github.com/winsw/winsw/pull/565&quot;&gt;Pull Request&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;XML Schema validation (Not released yet) - &lt;a href=&quot;https://github.com/winsw/winsw/pull/460&quot;&gt;Pull Request&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/9qyo1f2rKQw?rel=0&amp;amp;start=1620&amp;amp;end=3040&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find Phase 01 Demo slides in this &lt;a href=&quot;https://docs.google.com/presentation/d/1E_Y0OJJzNn3gAol-cM4jN6dWrD-EbP6Eatis8olRjzQ/edit?usp=sharing&quot;&gt;link&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below you can find more details about the deliverables listed above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-structure-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-structure-overview&quot; /&gt;Project Structure overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project structure overview document describes how files and directories are organized in the Windows Service Wrapper project.
It will help contributors as well as users, to understand the codebase easily.
Also, it helps me a lot to understand the codebase. You can find the document from the given link.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;yaml-configurations-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-configurations-support&quot; /&gt;YAML configurations support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I explained before, in this project, configurations will be provided as a YAML file.
I used YamlDotNet library which has more than 2.2k stars on GitHub, to deserialize the YAML file into an Object graph.
In this YAML file, users can specify configurations in a more structured way than in XML configuration files.
As an example, now users can specify all the log related configurations under the log config.
Users can specify all service account related configurations under serviceaccount config etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the moment, I am working on a design document for YAML configuration support. I will add it to the GitHub Issue once ready&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-cli&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-cli&quot; /&gt;New CLI&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before moving into Phase 01 updates, it’s better to explain why we needed a new CLI for Windows Service Wrapper.
In the early phases of Windows Service Wrapper, we will keep the XML configuration support as well.
So we should allow users to specify the configurations file separately.
The current approach is, configurations file should be in the same directory, where Windows Service Wrapper executable exists and the file name of the XML file should be the same as the Windows Service Wrapper executable file name.
Also, users should be able to redirect logs if they need to and they should be allowed to elevate command prompt using Windows Service Wrapper.
Also, we thought that it’s better to allow users to skip schema validation if they needed. So we decided to move into a new CLI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I explained, after releasing this, users will have options in addition to commands.
It will make the WinSW CLI more flexible so that we can easily extend it later. These are the options users are allowed to use.
These options are available with all the commands except help and version&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;--redirect / -r [string]&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Users can specify the redirect path for the logs if needed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not required | Default value is null&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;--elevated / -e [boolean]&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Elevate the command prompt before executing the command&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not required | Default value is false&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;--configFile / -c [string]&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Users can specify the configurations file as a path&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not Required | Default value is null&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;--skipConfigValidation / -s [boolean]&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Users can skip schema validation for configurations file if needed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not required | Default value is true&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;--help / -h&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;User can find what options are available with a particular command with this option&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This option is available with the install command&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;--profile / -f [boolean]&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If this option is true, then users can provide a service account for installation explicitly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not required | Default value is false&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We used commandlineparser/commandline library to parse the command line argument which has more than 2k stars in GitHub. At a glance, the library is compatible with .NET Framework 4.0+, Mono 2.1+ Profile, .NET Standard, and .NET Core.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;xml-schema-validation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#xml-schema-validation&quot; /&gt;XML Schema validation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I mentioned before, there was no schema validation for XML in Windows Service Wrapper.
Hence, I was working on schema validation for XML. I use XSD to validate XML files. The XSD file will be shipped as an embedded resource with the executable.
You can find the XSD file in my pull request.&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;future-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-updates&quot; /&gt;Future updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the next phase, for GSoC 2020 the listed deliverables features will be released and the YAML schema validation feature will be added.
Also, we hope to publish a design document for the new features, which will help contributors.&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-contribute&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-contribute&quot; /&gt;How to contribute&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find the GitHub repository in this link. Issues and Pull requests are always welcome.
Also, you can communicate with us in the WinSW Gitter channel, which is a great way to get in touch and there are project sync up meetings every Tuesday at 13:30 UTC on the Gitter channel.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;some-useful-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-useful-links&quot; /&gt;Some 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/2020/projects/winsw-yaml-configs&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/winsw/winsw&quot;&gt;Project Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#winsw_winsw:gitter.im&quot;&gt;Gitter Channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/aaubry/YamlDotNet&quot;&gt;YamlDotNet library&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/commandlineparser/commandline&quot;&gt;Command Line Parser library&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/06/30/machine-learning-plugin-coding-phase1/</id>
<title>Machine Learning Plugin project - coding phase 1 blog post</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-06-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/06/30/machine-learning-plugin-coding-phase1/" />
<author>
<name>loghijiaha</name>
</author>
<category term='machinelearning'></category>
<category term='datascience'></category>
<category term='plugins'></category>
<category term='communitybonding'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
Welcome back !


This blog post is briefing my coding phase 1 in Jenkins Machine Learning Plugin for this GSoC 2020.


After a fresh introduction of community bonding, On June 1st, coding of GSoC had started officially with phase 1. At this point, every GSoC student should be expected to have a rigid plan with their entire project. With the guidance of mentors I was able to complete a design document and timeline which can be slightly adjustable during the coding. The coding phase was more about coding and discussion.


Quick review







Pull Requests
21


Jira Issues
11


Major Tasks
3


Completed
3


In progress
0





Week 1

I have to ensure that I have...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;jenkins gsoc logo small&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Welcome back !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post is briefing my coding phase 1 in Jenkins &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/machine-learning/&quot;&gt;Machine Learning Plugin&lt;/a&gt; for this GSoC 2020.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a fresh introduction of community bonding, On June 1st, coding of GSoC had started officially with phase 1. At this point, every GSoC student should be expected to have a rigid plan with their entire project. With the guidance of mentors I was able to complete a design document and timeline which can be slightly adjustable during the coding. The coding phase was more about coding and discussion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;quick-review&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quick-review&quot; /&gt;Quick review&lt;/h3&gt;
&lt;table class=&quot;tableblock frame-all grid-all&quot; style=&quot;width: 25%;&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 83.3333%;&quot;&gt;
&lt;col style=&quot;width: 16.6667%;&quot;&gt;
&lt;/col&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;Pull Requests&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;21&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;Jira Issues&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;11&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;Major Tasks&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;3&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;Completed&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;3&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;In progress&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-center valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;week-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-1&quot; /&gt;Week 1&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have to ensure that I have a solid architecture for implementing the core of this plugin such that perhaps I or future community will be able to develop R and Julia kernels for this plugin. Factory method design patterns are suitable when users need different types of products ( Python, R and Julia) without knowing much about the internal infrastructure ( Manager of these interpreters ).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All the base classes were implemented this week.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Design the Kernel connectors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initiate the interpreter&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Close the connection&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add simple tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update pom.xml&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More than these changes, repo was updated with pull request template and licence header. Readme was extended a little at the end of the week.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;issues-and-challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues-and-challenges&quot; /&gt;Issues and Challenges&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Git rebase and squash&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tests invokes ipython client in the server failed during the CI build&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;week-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-2&quot; /&gt;Week 2&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the help of a design document, I had a plan to do the configurations globally and using the Abstract Folder property I could save the configuration and retrieve for the job configuration. I used to reference some other well developed plugin for the structure of code. That helped me a lot while I was coding. Our first official contributor has popped out his pull request.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Form validations and helper html will be a great help in the user point of view as well as developers. A minor bug was fixed with the guidance of mentors by writing tests with ‘Jenkins WebClient`. Until the end of the week, builder class of the plugin has been implemented with lots of research and discussion. Finally,  Test connection was added to the global configuration page to start the connection and test it. A single issue that blocked me using py4j authentication about zeppelin-python was reported in Jira.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Server Configuration&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jenkinsci/machine-learning-plugin/master/docs/images/global_config.png&quot; alt=&quot;global_config&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;issues-and-challenges-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues-and-challenges-2&quot; /&gt;Issues and challenges&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Backend depends on Apache zeppelin-python API to connect IPython&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find relevant extension points to extend the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;week-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-3&quot; /&gt;Week 3&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Earlier in this week, we were trying to merge our IPython builder PR without any memory leaks or bugs that will cause the system to be devastating while running this plugin. Later, this whole week I was implementing a file parser that could copy the necessary files and had the ability to accomplish the file conversion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;supported-file-types&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#supported-file-types&quot; /&gt;Supported file types&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Python (.py)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSON (Zeppelin notebooks format)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;IPython builder was able to run Jupyter Notebooks and Zeppelin formatted JSON files at the end of the 3rd week. Minor issues were fixed in the code. We used ANSI color plugin to fix the abnormal view of error messages produced by the ipython kernel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Copying and converting Jupyter Notebook&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://raw.githubusercontent.com/jenkinsci/machine-learning-plugin/master/docs/images/file_parser.png&quot; alt=&quot;file_convert&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;issues-and-challenges-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues-and-challenges-3&quot; /&gt;Issues and Challenges&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Python error messages could not be displayed in rich format
If a job is running at user level, but if the python code access file/file path which is not authorized to the user, it returns a permission denied message.
While running on agent, notebook has to be written/copied to agent workspace
Artifacts should be maintained/reachable from controller after build.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;week-4&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-4&quot; /&gt;Week 4&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As all the major tasks has done, the demo preparation and plan for a experimental release was carried during the last week. There were lots of research on how to connect to a existing kernel in remote. Demo and presentation were prepared along the week.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;issues-and-challenges-4&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues-and-challenges-4&quot; /&gt;Issues and Challenges&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Releasing the first version was bit late&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;knowledge-transfer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#knowledge-transfer&quot; /&gt;Knowledge transfer&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;how-to-debug-the-code-through-intellij&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-debug-the-code-through-intellij&quot; /&gt;How to debug the code through IntelliJ&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Edit configuration → Add new Configuration → Maven&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Command line → type &lt;code&gt;hpi:run&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click the debug icon on the toolbar or go to &lt;code&gt;Run&lt;/code&gt; menu then &lt;code&gt;Debug&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;how-to-setup-to-test-the-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-setup-to-test-the-plugin&quot; /&gt;How to setup to test the plugin&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Setup JDK 8 and Maven 3.5.*&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a directory &lt;code&gt;mkdir machine-learning-plugin&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a virtual environment &lt;code&gt;virtualenv venv&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activate your virtual environment source venv/bin/activate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;which python&lt;/code&gt; to ensure your python path&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;git clone &lt;a href=&quot;https://github.com/jenkinsci/machine-learning-plugin.git&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/machine-learning-plugin.git&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;mvn clean install&lt;/code&gt; from the machine-learning-plugin directory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run &lt;code&gt;mvn hpi:run&lt;/code&gt; to start Jenkins with the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set up the builder with localhost and other parameters&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a job&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write python code like print(“plugin works”)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build the job&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;issues-and-bugs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues-and-bugs&quot; /&gt;Issues and bugs&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62528&quot;&gt;JENKINS-62528&lt;/a&gt; Issues on Jenkins build in the plugin repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/&quot;&gt;JENKINS-62621&lt;/a&gt; Global configuration for IPython servers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62649&quot;&gt;JENKINS-62649&lt;/a&gt; Implementation of IPython Builder&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62711&quot;&gt;JENKINS-62711&lt;/a&gt; File parser to copy source files to workspace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62733&quot;&gt;JENKINS-62733&lt;/a&gt; Python errors are not displayed properly in console log&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62735&quot;&gt;JENKINS-62735&lt;/a&gt; Send/Receive necessary files from controller/agent to agent/controller&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62593&quot;&gt;JENKINS-62593&lt;/a&gt; Improve the documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62742&quot;&gt;JENKINS-62742&lt;/a&gt; Increase Test coverage&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;resources-and-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources-and-links&quot; /&gt;Resources and Links&lt;/h3&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/machine-learning-plugin.git&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/machine-learning/&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/10FjktNmWpdjgbGg3tEViadV_JNevn9W0sMOu-bF8m-o/edit?usp=sharing&quot;&gt;Design document&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;/table&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/06/27/external-fingerprint-storage/</id>
<title>External Fingerprint Storage Phase-1 Updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-06-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/06/27/external-fingerprint-storage/" />
<author>
<name>stellargo</name>
</author>
<category term='plugins'></category>
<category term='fingerprint'></category>
<category term='cloud-native'></category>
<category term='external-storage'></category>
<category term='developer'></category>
<category term='redis'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
Externalizing fingerprint storage for Jenkins is a  Google Summer of Code 2020 project.
We are working on building a pluggable storage engine for fingerprints (see JEP-226).


File fingerprinting is a way to track which version of a file is being used by a job/build, making dependency tracking easy. The fingerprint engine of Jenkins can track usages of artifacts, credentials, files, etc. within the system. Currently, it does this by maintaining a local XML-based database which leads to dependence on the physical disk of the Jenkins controller.


Allowing fingerprint storage to be moved to external storages decreases the dependence of Jenkins instances on...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Externalizing fingerprint storage for Jenkins is a  Google Summer of Code 2020 project.
We are working on building a pluggable storage engine for fingerprints (see &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/226/README.adoc&quot;&gt;JEP-226&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;File fingerprinting is a way to track which version of a file is being used by a job/build, making dependency tracking easy. The fingerprint engine of Jenkins can track usages of artifacts, credentials, files, etc. within the system. Currently, it does this by maintaining a local XML-based database which leads to dependence on the physical disk of the Jenkins controller.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Allowing fingerprint storage to be moved to external storages decreases the dependence of Jenkins instances on the physical disk space and also allows for tracking the flow of fingerprints across instances of Jenkins connected to the same external storage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Advantages of using external storage drivers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Remove dependence on Jenkins controller disk storage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can configure pay-as-you-use cloud storages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easy Backup Management&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Better Reliability and Availability&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fingerprints can be tracked across Jenkins instances&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Along with this API, we are also working on a &lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;reference implementation&lt;/a&gt; in the form of a plugin, powered by Redis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As phase 1 of this project comes to an end, this blog post serves as a summary of the progress we made to the entire Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;current-state&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-state&quot; /&gt;Current State&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;The &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/4731&quot;&gt;new API&lt;/a&gt; introduced in Jenkins core is under review. Once merged, it will offer developers to extend it to build external fingerprint storage plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;Redis Fingerprint Storage Plugin&lt;/a&gt; is alpha release ready. We would immensely appreciate any feedback.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;External Fingerprint Storage Demo&lt;/div&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/yzd-y5ByXg8?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 youtube com/watch?v=yzd-y5ByXg8&amp;amp;feature=youtu be[Demo]&quot;&gt;
&lt;h2 id=&quot;introducing-the-new-api-for-plugin-developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-the-new-api-for-plugin-developers&quot; /&gt;Introducing the new API for plugin developers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/4731&quot;&gt;PR-4731&lt;/a&gt;, we introduce a new fingerprint storage API, allowing configuring custom storage engines.
We exposed the following methods in the new &lt;code&gt;FingerprintStorage&lt;/code&gt; class:&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;void save()&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Saves the given Fingerprint in the storage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Fingerprint load(String id)&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Returns the Fingerprint with the given unique ID. The unique ID for a fingerprint is defined by Fingerprint#getHashString().&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;void delete(String id)&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Deletes the Fingerprint with the given unique ID.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;boolean isReady()&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Returns true if there is some data in the fingerprint database corresponding to the particular Jenkins instance.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;introducing-redis-fingerprint-storage-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-redis-fingerprint-storage-plugin&quot; /&gt;Introducing Redis Fingerprint Storage Plugin&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://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;Redis Fingerprint Storage Plugin&lt;/a&gt; uses the new External Fingerprint Storage API to store the fingerprints in a Redis instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installation&quot; /&gt;Installation:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The alpha release (version &lt;code&gt;0.1-alpha-1&lt;/code&gt;) for the plugin was drafted, and can be installed using the &lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/releasing-experimental-updates/&quot;&gt;experimental update center&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Follow along the following steps after running Jenkins to download and 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;Select &lt;code&gt;Manage Jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Manage Plugins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;code&gt;Advanced&lt;/code&gt; tab&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure the Update Site URL as: &lt;a href=&quot;https://updates.jenkins.io/experimental/update-center.json&quot; class=&quot;bare&quot;&gt;https://updates.jenkins.io/experimental/update-center.json&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;code&gt;Submit&lt;/code&gt;, and then press the &lt;code&gt;Check Now&lt;/code&gt; button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;code&gt;Available&lt;/code&gt; tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for &lt;code&gt;Redis Fingerprint Storage Plugin&lt;/code&gt; and check the box along it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;code&gt;Install without restart&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin should now be installed on your system.&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;usage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#usage&quot; /&gt;Usage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the plugin has been installed, you can configure the Redis server details by following the steps below:&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;Select &lt;code&gt;Manage Jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Configure System&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scroll to the section &lt;code&gt;Redis Fingerprint Storage Configuration&lt;/code&gt; and fill in the required details:&lt;/p&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/2020/06-external-fingerprint-storage/configure_redis.png&quot; alt=&quot;Configure Redis&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;code&gt;Host&lt;/code&gt; - Enter hostname where Redis is running&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Port&lt;/code&gt; - Specify the port on which Redis is running&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;SSL&lt;/code&gt; - Click if SSL is enabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Database&lt;/code&gt; - Redis supports integer indexed databases, which can be specified here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Connection Timeout&lt;/code&gt; - Set the connection timeout duration in milliseconds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Socked Timeout&lt;/code&gt; - Set the socket timeout duration in milliseconds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Credentials&lt;/code&gt; - Configure authentication using username and password to the Redis instance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Enabled&lt;/code&gt; - Check this to enable the plugin (Note: This is likely to be removed very soon, and will be enabled by default.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Use the &lt;code&gt;Test Redis Connection&lt;/code&gt; to verify that the details are correct and Jenkins is able to connect to the Redis instance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press the &lt;code&gt;Save&lt;/code&gt; button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now, all the fingerprints produced by this Jenkins instance should be saved in the configured Redis server!&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-work&quot; /&gt;Future Work&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of the topics we aim to tackle in the next phases include extending the API, fingerprint cleanup, migrations (internal→external, external→internal, external→external), tracing, ORM, implementing the saveable listener, etc.&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;The Redis Fingerprint Storage plugin is built and maintained by the Google Summer of Code (GSoC) Team for
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/external-fingerprint-storage/&quot;&gt;External Fingerprint Storage for Jenkins&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;, &lt;a href=&quot;https://github.com/afalko&quot;&gt;Andrey Falko&lt;/a&gt;, &lt;a href=&quot;https://github.com/mikecirioli&quot;&gt;Mike Cirioli&lt;/a&gt;, &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;, and the entire Jenkins community for all the contribution to this project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reaching-out&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reaching-out&quot; /&gt;Reaching Out&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to reach out to us for any questions, feedback, etc. on the project’s &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_external-fingerprint-storage:gitter.im&quot;&gt;Gitter Channel&lt;/a&gt; or the &lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins Developer Mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We use Jenkins &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;Jira&lt;/a&gt; to track issues.
Feel free to file issues under &lt;code&gt;redis-fingerprint-storage-plugin&lt;/code&gt; component.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;other-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-links&quot; /&gt;Other 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.youtube.com/watch?v=yzd-y5ByXg8&amp;amp;feature=youtu.be&quot;&gt;Phase 1 demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1hrdOYKXBWyQG-k53KUe6zFXJ3KWEK4t7smdtpNtp1Wo/edit#slide=id.g8061b508ca_0_149&quot;&gt;Presentation slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/redis-fingerprint-storage-plugin&quot;&gt;Redis Fingerprint Storage Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/62344&quot;&gt;Issue Tracker for Phase 1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/226/README.adoc&quot;&gt;JEP-226&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_external-fingerprint-storage:gitter.im&quot;&gt;Gitter Channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/external-fingerprint-storage/&quot;&gt;Project Page&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/2020/06/26/ui-ux-hackfest-ui-track/</id>
<title>UI/UX Hackfest: Jenkins User Interface track highlights</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-06-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/06/26/ui-ux-hackfest-ui-track/" />
<category term='community'></category>
<category term='event'></category>
<category term='ui'></category>
<category term='outreach-programs'></category>
<category term='jenkins-is-the-way'></category>
<summary>
In this article, I would like to share some highlights from the User Interface track of the
Jenkins UI/UX Hackfest we held on May 25..29.
This blog post has been slightly delayed by the infrastructure issues we had in the project,
but, as for improving the Jenkins UI, it is better late than never.
Key highlights from the event:




We delivered a preview of Jenkins read-only configuration.
During the hackfest we discovered and fixed many compatibility issues.


We created a new Dark Theme for Jenkins.
We also improved theming support in the core, and fixed compatibility in many plugins.


We contributed to the Jenkins UI accessibility, including UX testing...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this article, I would like to share some highlights from the User Interface track of the
&lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/&quot;&gt;Jenkins UI/UX Hackfest&lt;/a&gt; we held on May 25..29.
This blog post has been slightly delayed by the infrastructure issues we had in the project,
but, as for improving the Jenkins UI, it is better late than never.
Key highlights from the event:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We delivered a preview of &lt;a href=&quot;https://www.jenkins.io/blog/2020/05/25/read-only-jenkins-announcement/&quot;&gt;Jenkins read-only configuration&lt;/a&gt;.
During the hackfest we discovered and fixed many compatibility issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We created a new &lt;a href=&quot;https://github.com/jenkinsci/dark-theme-plugin&quot;&gt;Dark Theme&lt;/a&gt; for Jenkins.
We also improved theming support in the core, and fixed compatibility in many plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We contributed to the Jenkins UI accessibility, including UX testing and fixing the reported issues.
&lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-62437&quot;&gt;JENKINS-62437: Configuration UI: Tables to divs migration&lt;/a&gt; testing was the dominant story there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We worked on a New Script Security approvals management UI&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had &lt;a href=&quot;https://github.com/jenkinsci/ui-ux-hackfest-2020#contributors&quot;&gt;54 contributors&lt;/a&gt; at the hackfest.
22 of them have contributed to the user interface track as committers, testers and reviewers:
&lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt;,
&lt;a href=&quot;https://github.com/uhafner&quot;&gt;Ullrich Hafner&lt;/a&gt;,
&lt;a href=&quot;https://github.com/res0nance&quot;&gt;Raihaan Shouhell&lt;/a&gt;,
&lt;a href=&quot;https://github.com/stellargo&quot;&gt;Sumit Sarin&lt;/a&gt;,
&lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt;,
&lt;a href=&quot;https://github.com/romenrg&quot;&gt;Romén Rodríguez-Gil&lt;/a&gt;,
&lt;a href=&quot;https://github.com/wadeck&quot;&gt;wadeck Follonier&lt;/a&gt;,
&lt;a href=&quot;https://github.com/megathaum&quot;&gt;Runxia Ye&lt;/a&gt;,
&lt;a href=&quot;https://github.com/fqueiruga&quot;&gt;Félix Queiruga&lt;/a&gt;,
&lt;a href=&quot;https://github.com/aytuncbeken&quot;&gt;Aytunc Beken&lt;/a&gt;,
&lt;a href=&quot;https://github.com/95jonpet&quot;&gt;Peter Jonsson&lt;/a&gt;,
&lt;a href=&quot;https://github.com/amuniz&quot;&gt;Antonio Muniz&lt;/a&gt;,
&lt;a href=&quot;https://github.com/ksenia-nenasheva&quot;&gt;Kseniia Nenasheva&lt;/a&gt;,
&lt;a href=&quot;https://github.com/sladyn98&quot;&gt;Sladyn Nuner&lt;/a&gt;,
&lt;a href=&quot;https://github.com/AbhyudayaSharma&quot;&gt;Abhyudaya Sharma&lt;/a&gt;,
&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;,
&lt;a href=&quot;https://github.com/nimishbongale&quot;&gt;Nimish Bongale&lt;/a&gt;,
&lt;a href=&quot;https://github.com/EstherAF&quot;&gt;Esther Álvarez Feijoo&lt;/a&gt;,
&lt;a href=&quot;https://github.com/duemir&quot;&gt;Denys Digtiar&lt;/a&gt;,
&lt;a href=&quot;https://github.com/skundrik&quot;&gt;Slavo&lt;/a&gt;,
&lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt;.
Thanks to all contributors!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the blog post below to know more about these and other user interface improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;read-only-jenkins-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#read-only-jenkins-configuration&quot; /&gt;Read-only Jenkins Configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Quick access:&lt;/em&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=Wy8PdkS0kjQ&quot;&gt;demo&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/2020/05/25/read-only-jenkins-announcement/&quot;&gt;feature preview announcement&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/ui-ux-hackfest-2020/tree/master/presentations/05-system-read&quot;&gt;presentation materials&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A read-only view of Jenkins configurations, jobs and agents is important to &lt;a href=&quot;https://plugins.jenkins.io/configuration-as-code&quot;&gt;Jenkins Configuration-as-Code&lt;/a&gt; users.
It would allow them to access configuration and diagnostics information about their Jenkins instances while having no opportunity to occasionally change it.
This story is a part of the &lt;a href=&quot;https://www.jenkins.io/project/roadmap&quot;&gt;Jenkins roadmap&lt;/a&gt;,
and it was featured as an area for contribution during the UI/UX hackfest.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On May 25th we have released a preview for Read-only Jenkins Configuration.
Read the announcement by Tim Jacomb &lt;a href=&quot;https://www.jenkins.io/blog/2020/05/25/read-only-jenkins-announcement/&quot;&gt;in this blogpost&lt;/a&gt;.
During the hackfest we kept testing the change and fixing compatibility in the Jenkins plugins,
including the Cloud Stats Plugin, Role Strategy Plugin, Simple Disk Usage Plugin and others.&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/2020/05-read-only-jenkins-announcement/build-discarder-read.png&quot; alt=&quot;Read-only build discarder configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would appreciate feedback and testing from the Jenkins users!
See the &lt;a href=&quot;https://www.jenkins.io/blog/2020/05/25/read-only-jenkins-announcement/&quot;&gt;blogpost&lt;/a&gt; for the guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dark-theme&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dark-theme&quot; /&gt;Dark Theme&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Quick access:&lt;/em&gt;
&lt;a href=&quot;https://youtu.be/0ZLAOCs3XwU?t=958&quot;&gt;demo&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/dark-theme-plugin&quot;&gt;project repository&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dark user interface themes are very popular among developers: in IDE, communication tools, etc.
And there is an interest to have one for Jenkins.
There were a few of implementations before the hackfest, most notably &lt;a href=&quot;https://github.com/camalot/jenkins-dark-stylish&quot;&gt;camalot/jenkins-dark-stylish&lt;/a&gt; and a dark version of the &lt;a href=&quot;https://github.com/TobiX/jenkins-neo2-theme&quot;&gt;Neo2 Theme&lt;/a&gt;.
These themes were difficult to maintain, and finally they were either removed or abandoned.
What if Jenkins had an official theme?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the event a group of contributors focused on creating a new &lt;a href=&quot;https://github.com/jenkinsci/dark-theme-plugin&quot;&gt;Dark Theme&lt;/a&gt; for Jenkins.
This effort included:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Patches to the Jenkins core which simplified development and maintenance of UI themes.
Support for CSS variables was added, as well as PostCSS processing which helps to simplify browser compatibility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/dark-theme-plugin&quot;&gt;Dark Theme&lt;/a&gt; itself.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UI Testing and compatibility fixes in the core and multiple Jenkins plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/dark-theme-plugin/tree/master/demo&quot;&gt;Dark theme demo&lt;/a&gt; with support for the development mode.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can try out this theme starting from Jenkins 2.239.
It is available as a &lt;a href=&quot;https://plugins.jenkins.io/dark-theme&quot;&gt;plugin&lt;/a&gt; from the Jenkins Update Center.
An example screenshot of the main page:&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/jenkins-is-the-way/uiux-hackfest-results/dark-theme-main.png&quot; alt=&quot;Dark Theme - Main page&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you discover any Dark theme compatibility issues,
please report them &lt;a href=&quot;https://github.com/jenkinsci/dark-theme-plugin/issues&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-configuration-ui-accessibility&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-configuration-ui-accessibility&quot; /&gt;Jenkins Configuration UI Accessibility&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Quick access:&lt;/em&gt;
&lt;a href=&quot;https://youtu.be/0ZLAOCs3XwU?t=275&quot;&gt;demo&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/sigs/ux/#project-ui-accessibility&quot;&gt;project page&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Web UI accessibility was one of the suggested topics at the event.
We would like to make Jenkins usable by as many people as possible.
It includes multiple groups of users: people with disabilities, ones using mobile devices, or those with slow network connections.
In general, all Jenkins users would benefit from better navigation and layouts.
Some of the accessibility improvements we implemented during the event:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added aria-labels to username &amp;amp; password input fields&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Indicate the language of the page in the footer (not merged yet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove page generation timestamp from the footer&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the UI/UX hackfest the major focus was on migrating configuration pages from tables to divs
(&lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-62437&quot;&gt;JENKINS-62437&lt;/a&gt;).
It will make them more user-friendly on narrow and especially mobile screens.
The change will also help users to navigate complex forms with multiple levels of nesting.
Our progress:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;User Experience testing.
Thanks to the contributors, we discovered several compatibility issues in plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bug fixes in several plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new &lt;a href=&quot;https://github.com/oleg-nenashev/jenkins-tables-to-divs-config-migration-testenv&quot;&gt;Dockerized demo&lt;/a&gt; which allows to evaluate the change with a set of pre-configured plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is an example of a job configuration page using the new layout:&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/jenkins-is-the-way/uiux-hackfest-results/tables-to-divs-job-config.png&quot; alt=&quot;Tables to Divs - Job configuration example&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will keep working on this change in the coming weeks,
and we invite Jenkins users and Contributors to help us with testing the change!
Testing guidelines are available in the &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-62437&quot;&gt;JENKINS-62437&lt;/a&gt; ticket.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-script-security-approvals-management-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-script-security-approvals-management-ui&quot; /&gt;New Script Security approvals management UI&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Quick access:&lt;/em&gt;
&lt;a href=&quot;https://youtu.be/0ZLAOCs3XwU?t=2569&quot;&gt;demo&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/script-security-plugin/pull/300&quot;&gt;pull request&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the hackfest &lt;a href=&quot;https://github.com/wadeck&quot;&gt;Wadeck Follonier&lt;/a&gt; redesigned the script approval interface in the &lt;a href=&quot;https://plugins.jenkins.io/script-security&quot;&gt;Script Security Plugin&lt;/a&gt;.
The new UI allows viewing the list of approved scripts, shows the last access timestamp, and allows managing the approvals individually.
Before, it was not possible to do it from the Web interface.
Once &lt;a href=&quot;https://github.com/jenkinsci/script-security-plugin/pull/300&quot;&gt;the pull request&lt;/a&gt; is released,
the feature will become available to Jenkins users.&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/jenkins-is-the-way/uiux-hackfest-results/script-security-expanded.png&quot; alt=&quot;New Script Security approvals management UI&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;other-ui-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-ui-improvements&quot; /&gt;Other UI improvements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the major improvements listed above,
there were also many smaller patches in the Jenkins core and various plugins.
You can find a full list of contributions to the user interface &lt;a href=&quot;https://github.com/jenkinsci/ui-ux-hackfest-2020/issues?q=is%3Aissue+label%3Aui&quot;&gt;here&lt;/a&gt;,
some important improvements:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Improved navigation in the &lt;a href=&quot;https://plugins.jenkins.io/credentials&quot;&gt;Credentials plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for wide screens in the &lt;a href=&quot;https://plugins.jenkins.io/autograding&quot;&gt;Autograding plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UI Improvements in the &lt;a href=&quot;https://plugins.jenkins.io/folder-auth&quot;&gt;Folder-based Authorization Strategy&lt;/a&gt; plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved Fingerprint listing in the Jenkins core&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/jenkins-is-the-way/uiux-hackfest-results/auto-grading-xl-screens.png&quot; alt=&quot;Auto-grading plugin - XL Screens&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing&quot; /&gt;Contributing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We invite Jenkins users and contributors to join the effort and to improve the user interface together.
The Jenkins project gradually adopts modern frontend stacks (JavaScript, React, Gatsby, Vue.js, etc.) and design methodologies.
For example, see the presentation about &lt;a href=&quot;https://github.com/jenkinsci/ui-ux-hackfest-2020/tree/master/presentations/02-beautify-plugin-ui&quot;&gt;beautifying the UI of Jenkins reporter plugins&lt;/a&gt; by &lt;a href=&quot;https://github.com/uhafner&quot;&gt;Ullrich Hafner&lt;/a&gt;.
It is a great opportunity for frontend developers to join the project, share their experiences, experiment with new technologies, and improve the Jenkins user interface and user experience.
Join us!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.jenkins.io/participate/code/&quot;&gt;this page&lt;/a&gt; for more information about contributing to the Jenkins codebase.
If you want to know more, join us in the &lt;a href=&quot;https://www.jenkins.io/sigs/ux/&quot;&gt;Jenkins User Experience SIG&lt;/a&gt; channels.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find more information about the Hackfest 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://www.jenkins.io/events/online-hackfest/2020-uiux/&quot;&gt;Jenkins UI/UX Hackfest Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/ui-ux-hackfest-2020/tree/master/presentations/09-demo-sessions&quot;&gt;UI/UX Hackfest Closing Demos&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/ui-ux-hackfest-2020/tree/master/presentations&quot;&gt;All presentations and demos&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/ui-ux-hackfest-2020/issues?q=is%3Aissue+label%3Aui&quot;&gt;Full list of contributions to the user interface&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/06/18/terminology-update/</id>
<title>On Jenkins Terminology Updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-06-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/06/18/terminology-update/" />
<author>
<name>markyjackson-taulia</name>
</author>
<category term='community'></category>
<category term='opensource'></category>
<category term='governance'></category>
<category term='documentation'></category>
<summary>
In 2016, the Jenkins community decided to start removing offensive terminology within the project.
The "slave" term was deprecated in Jenkins 2.0 and replaced by the "agent" term.
Other terminology was slated for review after the cleanup of the "slave" term which was considered as most problematic one.
In 2017, the project began tracking areas for correction.
Work has been done on renaming the SSH build agent plugin as well as gradual removal of offensive naming in services and repositories.
This year, a group of core contributors continued addressing this critical work.


The Advocacy &amp; Outreach SIG met to discuss and prioritize the continued work. The...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2016, the Jenkins community decided to start removing offensive terminology within the project.
The &quot;slave&quot; term was deprecated in Jenkins 2.0 and replaced by the &quot;agent&quot; term.
Other terminology was slated for review after the cleanup of the &quot;slave&quot; term which was considered as most problematic one.
In 2017, the project began &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/42816&quot;&gt;tracking areas for correction&lt;/a&gt;.
Work has been done on renaming the SSH build agent plugin as well as gradual removal of offensive naming in services and repositories.
This year, a group of core contributors continued addressing this critical &lt;a href=&quot;https://www.jenkins.io/blog/2020/05/06/docker-agent-image-renaming/&quot;&gt;work&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Advocacy &amp;amp; Outreach SIG met to discuss and prioritize the continued work. The governance board has also met and there will be more information coming regarding removal of offensive terminology.
Last week we took another step towards removing offensive terminology within the project by updating previous blog posts and &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pull/3447&quot;&gt;removing offensive terminology in old blogs&lt;/a&gt;, cleaning up some references in Jenkins built-in documentation and localization, etc.
The meeting minutes are available &lt;a href=&quot;https://docs.google.com/document/d/1K5dTSqe56chFhDSGNfg_MCy-LmseUs_S3ys_tg60sTs/edit&quot;&gt;here&lt;/a&gt; and a recording of the meeting &lt;a href=&quot;https://www.youtube.com/watch?v=hGZ1CvkmZXU&quot;&gt;here&lt;/a&gt;
There is more &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/CLR55wMZwZ8&quot;&gt;work to do&lt;/a&gt;. The core team is working to address terms such as &quot;Master&quot;, &quot;whitelist&quot; and &quot;blacklist&quot; as well addressing git branching terminology.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We could use &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;your help&lt;/a&gt;
We continue to do this much needed work and would like to remind everyone that the Jenkins project is governed by the &lt;a href=&quot;https://www.jenkins.io/project/conduct/&quot;&gt;Code of Conduct.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sincerely,
Marky Jackson&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/06/17/infra-and-aws-donation/</id>
<title>Jenkins Infrastructure: Stats, Updates, and AWS sponsorship</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-06-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/06/17/infra-and-aws-donation/" />
<author>
<name>olblak</name>
</author>
<category term='aws'></category>
<category term='community'></category>
<category term='infrastructure'></category>
<summary>
The Jenkins project relies heavily on its infrastructure.
We use websites like www.jenkins.io and plugins.jenkins.io, ticketing systems like issues.jenkins.io  , CI/CD infrastructure like ci.jenkins.io , and many other services.
Just to provide some context about the Jenkins infrastructure scale, here are some stats from April 2020:




Over 600 000 people visited www.jenkins.io


Over 250 000 Jenkins servers regularly checked the
Jenkins package server and the
Jenkins update server


Over 43 000 continuous integration jobs ran on ci.jenkins.io


Over 950 plugins ran their continuous integration pipelines on ci.jenkins.io




Country by country visitors to jenkins.io



The Jenkins project, as an open source project, is built and maintained by its awesome community.
Like...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project relies heavily on its infrastructure.
We use websites like &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;www.jenkins.io&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/&quot;&gt;plugins.jenkins.io&lt;/a&gt;, ticketing systems like &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;issues.jenkins.io&lt;/a&gt;  , CI/CD infrastructure like &lt;a href=&quot;https://ci.jenkins.io/&quot;&gt;ci.jenkins.io&lt;/a&gt; , and many other services.
Just to provide some context about the Jenkins infrastructure scale, here are some stats from April 2020:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Over 600 000 people visited &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;www.jenkins.io&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 250 000 Jenkins servers regularly checked the
&lt;a href=&quot;https://pkg.jenkins.io/&quot;&gt;Jenkins package server&lt;/a&gt; and the
&lt;a href=&quot;https://updates.jenkins.io/&quot;&gt;Jenkins update server&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 43 000 continuous integration jobs ran on &lt;a href=&quot;https://ci.jenkins.io/&quot;&gt;ci.jenkins.io&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 950 plugins ran their continuous integration pipelines on &lt;a href=&quot;https://ci.jenkins.io/&quot;&gt;ci.jenkins.io&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Country by country visitors to jenkins.io&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020-06-17-infra-update/world-map.png&quot; alt=&quot;Country by country visitors to jenkins.io&quot; height=&quot;308&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project, as an open source project, is built and maintained by its awesome community.
Like in any organization, there are specific people who make sure that those services are always up and running.
Everyone is welcome to &lt;a href=&quot;https://www.jenkins.io/participate&quot;&gt;participate&lt;/a&gt;.
Infrastructure is no exception, we are always &lt;a href=&quot;https://www.jenkins.io/projects/infrastructure/#contributing&quot;&gt;looking for new contributors&lt;/a&gt; to the infrastructure!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we can’t share publicly everything like secrets and certificates,
we still try to be as transparent as possible so that everybody can understand and improve our infrastructure without having privileged access.
What better way than using Git to manage infrastructure work?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;who-said-gitops&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#who-said-gitops&quot; /&gt;Who said GitOps?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the creation of the &lt;a href=&quot;https://github.com/jenkins-infra&quot;&gt;Jenkins-infra organization&lt;/a&gt; on GitHub in March 2008, more than 650 people have contributed to over 80 git repositories.
Those contributions make the Jenkins community what it is today.
If you can’t find something there, it probably means that some help is welcomed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More recently, with help from &lt;a href=&quot;https://github.com/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt;, &lt;a href=&quot;https://github.com/timja&quot;&gt;Tim Jacomb&lt;/a&gt;, and &lt;a href=&quot;https://github.com/slide&quot;&gt;Alex Earl&lt;/a&gt;, big achievements have been possible on many fronts like automating Jenkins releases, refreshing &lt;a href=&quot;https://plugins.jenkins.io/&quot;&gt;plugins.jenkins.io&lt;/a&gt;, adding new agents to &lt;a href=&quot;https://ci.jenkins.io/computer/&quot;&gt;ci.jenkins.io&lt;/a&gt;, and maintaining our Kubernetes cluster.
We thank them for their help and for the infrastructure progress they have enabled.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;infrastructure-at-scale&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#infrastructure-at-scale&quot; /&gt;Infrastructure at Scale&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Running infrastructure at the scale the Jenkins project does is expensive and sometimes quite challenging.
We are fortunate enough to be supported by many leading companies that provide us their expertise, their products, and their support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently, Amazon Web Services donated $60 000 to run Jenkins infrastructure on the AWS cloud.
We’re so grateful for their donation and for the flexibility it provides.
We’re running Linux agents with AMD64 and ARM64 architectures on AWS.
We’re using AWS cloud for our Windows agents.
The generous infrastructure donation from Amazon Web Services has increased our continuous integration capacity and broadened our platform coverage.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;our-sponsors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#our-sponsors&quot; /&gt;Our Sponsors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Major sponsors of the Jenkins infrastructure include
&lt;a href=&quot;https://cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;,
&lt;a href=&quot;https://osuosl.org/&quot;&gt;Oregon State University Open Source Lab&lt;/a&gt;,
&lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation&lt;/a&gt;,
&lt;a href=&quot;https://redhat.com/&quot;&gt;Red Hat&lt;/a&gt;,
&lt;a href=&quot;https://aws.amazon.com/&quot;&gt;Amazon Web Services&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additional sponsors of Jenkins infrastructure services and software include
&lt;a href=&quot;https://www.atlassian.com/&quot;&gt;Atlassian&lt;/a&gt;,
&lt;a href=&quot;https://www.datadoghq.com/&quot;&gt;Datadog&lt;/a&gt;,
&lt;a href=&quot;https://www.fastly.com/&quot;&gt;Fastly&lt;/a&gt;,
&lt;a href=&quot;https://www.ibm.com/&quot;&gt;IBM&lt;/a&gt;.
&lt;a href=&quot;https://jfrog.com/&quot;&gt;JFrog&lt;/a&gt;,
&lt;a href=&quot;https://www.pagerduty.com/&quot;&gt;Pagerduty&lt;/a&gt;,
&lt;a href=&quot;https://www.rackspace.com/&quot;&gt;Rackspace&lt;/a&gt;,
&lt;a href=&quot;https://www.sentry.io/&quot;&gt;Sentry&lt;/a&gt;,
&lt;a href=&quot;https://www.serverion.com/&quot;&gt;Serverion&lt;/a&gt;,
&lt;a href=&quot;https://spinup.com/&quot;&gt;SpinUp&lt;/a&gt;,
&lt;a href=&quot;https://www.tsinghua.edu.cn/&quot;&gt;Tsinghua University&lt;/a&gt;, and
&lt;a href=&quot;https://xmission.com/&quot;&gt;XMission&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each of these organizations support the Jenkins project in their own way.
We thank them for their contributions, their support and for their willingness to help the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/infrastructure/&quot;&gt;Jenkins infrastructure project page&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/2020/06/08/hackfest-docs-results/</id>
<title>Jenkins User Experience Hackfest Documentation Results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-06-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/06/08/hackfest-docs-results/" />
<category term='ux'></category>
<category term='documentation'></category>
<category term='community'></category>
<category term='outreach-programs'></category>
<category term='jenkins-is-the-way'></category>
<summary>
Documentation is not glamorous, but it is goodness.



&#8212; Thomas Otter



Jenkins technical documentation is an important part of our project as it is key to using Jenkins well.
Good documentation guides users and encourages good implementation choices.
It is a crucial part of the user experience.


In the recent Jenkins UI/UX hackfest, documentation was a specific track to improve the Jenkins user experience.
We received many improvements from experienced Jenkins contributors and newcomers alike.
Contributors from all around the world submitted pull requests for documentation on installing, managing, administering, and operating Jenkins.





Documentation migration from Wiki


The Jenkins Wiki pages have collected 15 years of experience and wisdom...
</summary>
<content type='html'>
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Documentation is not glamorous, but it is goodness.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— &lt;a href=&quot;https://www.otteradvisory.com/2020/01/documentation-and-safety/&quot;&gt;Thomas Otter&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins technical documentation is an important part of our project as it is key to using Jenkins well.
Good documentation guides users and encourages good implementation choices.
It is a crucial part of the user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the recent Jenkins UI/UX hackfest, documentation was a specific track to improve the Jenkins user experience.
We received many improvements from experienced Jenkins contributors and newcomers alike.
Contributors from all around the world submitted pull requests for documentation on installing, managing, administering, and operating Jenkins.&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/2020-06-08-docs-from-hackfest/contributions-by-country.png&quot; alt=&quot;Contributors to Docs by country&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;documentation-migration-from-wiki&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-migration-from-wiki&quot; /&gt;Documentation migration from Wiki&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Wiki pages have collected 15 years of experience and wisdom for Jenkins users.
However, that experience and wisdom is intermixed with inaccurate, incomplete, and outdated information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Wiki migration project identified the 50 most accessed pages on the Jenkins wiki and created GitHub issues to track the migration of those pages to www.jenkins.io.
This was our first large scale experiment using GitHub issues for documentation.
The results have been overwhelmingly positive.
Hackfest contributors added new sections to many documentation chapters, including:&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/doc/book/using/&quot;&gt;Using Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/managing/&quot;&gt;Managing Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/system-administration/&quot;&gt;System Administration&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 Hackfest closed 19 of the wiki migration issues.
Work is in progress on an additional 25 wiki migration issues.
We’ve made great progress and look forward to even better results in the future.
New contributors used the &quot;good first issue&quot; label very effectively.
We started the Hackfest with most of the 25 &quot;good first issues&quot; unassigned and completed the Hackfest with 14 closed and 10 others in progress.
We’ll provide more &quot;good first issues&quot; as we use the Jenkins Wiki migration to welcome new documentation contributors.&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/2020-06-08-docs-from-hackfest/sample-pages.png&quot; alt=&quot;Sample Hackfest documentation pages&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;migrating-plugin-documentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#migrating-plugin-documentation&quot; /&gt;Migrating plugin documentation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugin documentation is also in transition.
Since November 2019, plugins have been moving their documentation into the GitHub repository that hosts the plugin source code.
This &lt;a href=&quot;https://www.jenkins.io/blog/2019/10/21/plugin-docs-on-github/&quot;&gt;&quot;documentation as code&quot;&lt;/a&gt; approach allows plugin maintainers to include documentation improvements in the same pull requests that implement new capabilities.
It assures that documentation changes are reviewed by the same maintainers who review and approve new capabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hackfest participants submitted pull requests to migrate plugin documentation to GitHub.
10 plugin pull requests are in progress from the Hackfest.
5 plugin pull requests from the Hackfest have been already merged and are awaiting the release of the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;chuck-norris-uses-documentation-as-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#chuck-norris-uses-documentation-as-code&quot; /&gt;Chuck Norris uses documentation as code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the spirit of fun and adventure, Oleg Nenashev migrated the &quot;Chuck Norris plugin&quot; to GitHub documentation as code in a &lt;a href=&quot;https://www.youtube.com/watch?v=BaEJ8v7INNQ&quot;&gt;live Hackfest presentation May 26, 2020&lt;/a&gt;.
Links to the recording, the plugin migration guide, and the export tool are available from &lt;a href=&quot;https://github.com/jenkinsci/ui-ux-hackfest-2020/tree/master/presentations/04-migrating-plugin-docs&quot;&gt;&quot;Migrating plugins to documentation-as-code&quot;&lt;/a&gt;.&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/2020-06-08-docs-from-hackfest/chuck-norris-docs-as-code.png&quot; alt=&quot;Chuck Norris plugin uses documentation-as-code&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;documentation-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-updates&quot; /&gt;Documentation updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins works with other technologies to solve automation challenges in many different environments.
We describe those environments in our &lt;a href=&quot;https://www.jenkins.io/solutions/&quot;&gt;&quot;Solution Pages&quot;&lt;/a&gt;.
As part of the Hackfest, we’ve started a series of improvements to the solution pages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/solutions/&quot;&gt;Docker solutions page&lt;/a&gt; now includes updated videos and a better page layout for easier reading and better navigation.
Other solution pages will receive similar improvements in the future.&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/2020-06-08-docs-from-hackfest/jenkins-and-docker.png&quot; alt=&quot;Jenkins and Docker&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;system-properties&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#system-properties&quot; /&gt;System properties&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The global configuration of Jenkins can be modified at startup by defining Java properties.
System properties can change system defaults and can provide compatibility &quot;escape hatches&quot; when a new default configuration might be incompatible with existing installations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Daniel Beck has improved the navigation and user experience of the system properties page as part of the Hackfest.
It is now much easier to read and to reference, with embeddable links available with a mouse-over to the right of every property and labels that categorize and classify each property.&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/2020-06-08-docs-from-hackfest/system-properties.png&quot; alt=&quot;System Properties&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;plugin-site-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-site-improvements&quot; /&gt;Plugin site improvements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the Hackfest, Gavin Mogan has continued his efforts to improve the &lt;a href=&quot;https://plugins.jenkins.io/&quot;&gt;Jenkins Plugins Site&lt;/a&gt; so that users can easily access plugin changelogs and reported issues.
Once this pull request is merged, it will greatly improve the experience of those Jenkins users who want to update plugins and look for documentation about what has changed in them and what are the possible issues they might experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Example of the incoming UI for the Jira plugin:&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/2020-06-08-docs-from-hackfest/plugins-site.png&quot; alt=&quot;Plugins Site&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;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;There is still much to do in Jenkins documentation and we need your help to do it.
There are many ways to &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;participate&lt;/a&gt; in the Jenkins project, including &lt;a href=&quot;https://www.jenkins.io/participate/document&quot;&gt;documentation&lt;/a&gt;.
See the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc&quot;&gt;contributing guidelines&lt;/a&gt; for detailed instructions.
Join the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkins/docs:matrix.org&quot;&gt;documentation chat&lt;/a&gt; for personalized help and encouragement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has been also accepted to &lt;a href=&quot;https://developers.google.com/season-of-docs&quot;&gt;Google Season of Docs&lt;/a&gt; this year.
This open-source mentorship program brings together open source and technical writers communities for the benefit of both.
We are looking for technical writers who are interested to contribute to the project in September-December 2020.
It is a great opportunity to study Documentation-as-code tools and to learn more about contributing to open-source projects.
You can find Jenkins project ideas and more information &lt;a href=&quot;https://www.jenkins.io/sigs/docs/gsod/&quot;&gt;here&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/2020/06/03/machine-learning-plugin-community-bonding/</id>
<title>Machine Learning Plugin project - community bonding blog post</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-06-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/06/03/machine-learning-plugin-community-bonding/" />
<author>
<name>loghijiaha</name>
</author>
<category term='machinelearning'></category>
<category term='datascience'></category>
<category term='plugins'></category>
<category term='communitybonding'></category>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<summary>
Hello everyone !


This is one of the Jenkins project in GSoC 2020. We are working this new Machine Learning Plugin for this GSoC 2020.
This is my story about the community bonding of GSoC 2020. I am happy to share my journey with you.


Introducing Myself and my Fantastic 4 Mentors

I am Loghi Perinpanayagam from University of Moratuwa. I was selected for GSoC 2020 for Machine Learning Plugin in Jenkins. I am glad to introduce my mentors to this project. I was assigned with four mentors who are really enthusiastic to help me on kicking off this summer of code.


Student




Loghi Perinpanayagam




Mentors




Bruno P....
</summary>
<content type='html'>
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;jenkins gsoc logo small&quot;&gt;
&lt;/img&gt;
&lt;/div&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 is one of the Jenkins project in GSoC 2020. We are working this new &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/projects/machine-learning/&quot;&gt;Machine Learning Plugin&lt;/a&gt; for this GSoC 2020.
This is my story about the community bonding of GSoC 2020. I am happy to share my journey with you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;introducing-myself-and-my-fantastic-4-mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-myself-and-my-fantastic-4-mentors&quot; /&gt;Introducing Myself and my Fantastic 4 Mentors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am Loghi Perinpanayagam from University of Moratuwa. I was selected for GSoC 2020 for Machine Learning Plugin in Jenkins. I am glad to introduce my mentors to this project. I was assigned with four mentors who are really enthusiastic to help me on kicking off this summer of code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Student&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/loghijiaha&quot;&gt;Loghi Perinpanayagam&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;Mentors&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/kinow&quot;&gt;Bruno P. Kinoshita&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/imoutsatsos&quot;&gt;Ioannis Moutsatsos&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/markyjackson-taulia&quot;&gt;Marky Jackson&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/shivaylamba&quot;&gt;Shivay Lamba&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-was-my-preparation-last-year&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-was-my-preparation-last-year&quot; /&gt;How was my preparation last year ?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I learned about this open source program in my second year. But atleast I tried last year on a different organization’s project that was related to Data Visualization Recommendation for Data Science. But the problem was I did not contribute as much as this year and was too late in the application process. As usual Machine learning related projects have a lot of competition compared to other projects. I prepared on learning Data visualization in Machine Learning and existing Models for the recommendation system. Finally I wrote a proposal with the SeqToSeq model without much knowledge on neural networks at that time. And I did not communicate much through the dedicated slack channel.  That may be one of the reasons for the failure. But the main reason was my latency for GSoC 2019.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-did-i-hurdle-gsoc-2020&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-did-i-hurdle-gsoc-2020&quot; /&gt;How did I hurdle GSoC 2020 ?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the time I realized how open source is needed and helpful for the community, I have been passionate about contributing to open source projects. At the instance, I finished my internship in Bangalore, India in 2019, I immediately focused on participating in GSoC. This is my last year (2020) as a student of my BSc Computer Science life, I wanted to get selected this year as a student.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was a guidance seminar organized by our department, I got to know that Jenkins had opened their project ideas. That was an extremely impressive beginning of my GSoC 2020 journey. I walked through all the draft and accepted projects in the Jenkins.io page. As I am already interested in Machine Learning and I am familiar with Java, I picked the most impressive idea for me that does not have an initial repo. That means I wanted to use my knowledge to think and research a lot with this project. But I had to contribute and want to know about the infrastructure of Jenkins codebase. Because that makes the selection panel easy to pick up the student for the project.  Then I repeatedly searched to contribute to Jenkins. I found issues that were easy for me to work from the git plugin and git client plugin. I started to contribute some test issues on git plugin and git client plugin. After I got a clear knowledge on how a plugin works in Jenkins, I started working on the POC with the hint provided in the project idea page. Actually, that was fun to code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentors have helped many students during the application process. I was able to do a working POC that had a minimum capability to do the task of the project. Finally mentors opened for proposal submission. I hurried to prepare a draft proposal. After I got reviews from mentors, I started to improve the proposal. At the end of the proposal submission, I was able to deliver a good proposal for this project. As I was curious about this plugin, I dug into more on how to integrate Jupyter notebook with this plugin. I published an medium article as a result of my research during the acceptance waiting period.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;results-released&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results-released&quot; /&gt;Results released&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The result was going to be announced on 4th May, I believed in my project proposal and POC and I got selected for this GSoC 2020. Whoa ! That was a goosebumping moment in my entire life. The feeling was like &lt;code&gt;Something I achieved&lt;/code&gt;. As a result of my hard work, I deserved that.
For example, I spent 7 days continuously making the POC work without any collision between maven artifacts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;community-bonding&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-bonding&quot; /&gt;Community Bonding&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the release of results, I was preparing myself for the community bonding. There are lots of interactions happening between me and mentors than before.I had to update my project page and my profile in Jenkins.io. We had our first meeting with lots of excitement and love on 10th of May. Mentors and I introduced ourselves even though we know each other. We discussed the high level view of GSoC and I asked some questions that I had in my mind. As my plugin was a new repository, most of the discussion was related to the repository and its name. I had  to find a name for the new plugin. We had regular conversations about the blogpost and presentations at the end.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the second meeting, We discussed the process for hosting a new plugin in Jenkins, tracking issues with JIRA, blog posts and high level road map for the project. And I suggested some interesting plugin names but they were not matching to the goal of the project, mentors told me to try other names which perfectly describe the project. I was advised to read all the research guidelines and plugin naming conventions. We discussed how code reviews will be done and source code management through the git. After this meeting, our meeting has shifted to the official Jenkins Zoom account.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our third meeting was quite serious about our project planning. I had been preparing my design document for the project with the help of mentors before the meeting day. Hence I got lots of reviews and useful examples for my future work on phase 1. At this point, we decided with the plugin name &lt;code&gt;Machine Learning Plugin&lt;/code&gt; which was accepted by all mentors and I created the repo and requested a Jira ticket for the plugin hosting request. We were planning to remind the Jira ticket within the next 3 days. Mentors want me to make sure I updated the Jenkins GSoC page before the community period ends. Lots of discussion carried about the design document that I had been preparing last week before the meeting. Some important points from the meeting notes follows :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Define features in the design document&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Diagrams for the operations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How plugin works in distributed environment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code editor library&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Requirements for the first Plugin release&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blog post draft document&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ToDo works for me for next week&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Therefore, I had to work hard after this meeting, this made me involved in the project more. I have to put my huge effort to make this opportunity golden. Our team has the willingness to complete this project and will definitely help the Data Science community with this plugin.
Kudos to my team for the amazing work so far!!!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was my entire journey until now. Hope you enjoyed it and hope you learned the mistakes I made last year and corrected in this summer.
Thanks for reading, and Stay tuned I will be uploading blog posts for those of you interested.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;resources-and-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources-and-links&quot; /&gt;Resources and Links&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/projects/gsoc/2020/projects/machine-learning/&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/10FjktNmWpdjgbGg3tEViadV_JNevn9W0sMOu-bF8m-o/edit?usp=sharing&quot;&gt;Design document&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/05/25/read-only-jenkins-announcement/</id>
<title>Read-only Jenkins Configuration</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-05-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/05/25/read-only-jenkins-announcement/" />
<author>
<name>timja</name>
</author>
<category term='system-read'></category>
<category term='extended-read'></category>
<category term='configuration-as-code'></category>
<category term='announcement'></category>
<summary>
I&#8217;m excited to announce that the 'read-only' Jenkins feature is now available for preview.
This feature allows restricting configuration UIs and APIs while providing access to essential Jenkins system configuration, diagnostics, and self-monitoring tools through Web UI.
Such mode is critical for instances managed as code, e.g. with Jenkins Configuration-as-Code plugin.
It is delivered as a part of the JEP-224: Readonly system configuration effort.


You will want to use at least Jenkins 2.238 to have all the features mentioned in this post.


Read-only Jenkins currently allows users to have access to:




job configuration


system configuration


plugin manager


system logs


cloud configuration


agent configuration


agent logs




For more planned integrations see the JENKINS-12548 epic.


Read-only...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m excited to announce that the &#39;read-only&#39; Jenkins feature is now available for preview.
This feature allows restricting configuration UIs and APIs while providing access to essential Jenkins system configuration, diagnostics, and self-monitoring tools through Web UI.
Such mode is critical for instances managed as code, e.g. with &lt;a href=&quot;https://plugins.jenkins.io/configuration-as-code&quot;&gt;Jenkins Configuration-as-Code&lt;/a&gt; plugin.
It is delivered as a part of the &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/224/README.adoc&quot;&gt;JEP-224: Readonly system configuration&lt;/a&gt; effort.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will want to use at least Jenkins 2.238 to have all the features mentioned in this post.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read-only Jenkins currently allows users to have access to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;job configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;system configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;plugin manager&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;system logs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cloud configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;agent configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;agent logs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more planned integrations see the &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-12548&quot;&gt;JENKINS-12548&lt;/a&gt; epic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read-only Jenkins is split into three permissions:&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;Job/ExtendedRead&lt;/strong&gt; - Read-only access to job configurations&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;existed since 2009 but the UI didn’t do anything to indicate to the users
that they couldn’t edit the job configuration page.
This has now been adapted to the new read-only engine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Agent/ExtendedRead&lt;/strong&gt; - Read-only access to agent configurations&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;existed since 2013 but it was undocumented and only allowed access to API and no UI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UI support added in Jenkins 2.238&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Overall/SystemRead&lt;/strong&gt; - Read-only access to Jenkins system configuration.
It is very useful for Jenkins instances managed as code, e.g. with help of the &lt;a href=&quot;https://plugins.jenkins.io/configuration-as-code&quot;&gt;Jenkins Configuration as Code Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Introduced in Jenkins 2.222 as a part of &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/224/README.adoc&quot;&gt;JEP-224: Readonly system configuration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can selectively grant the permission(s) as you wish.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-do-i-want-this&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-do-i-want-this&quot; /&gt;Why do I want this?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Given the rise of the configuration-as-code plugin a lot of Jenkins instances are fully managed as code,
which means that no changes are allowed through the UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The problem with this is you don’t know when new plugin versions are available and in order to see what other configuration options are available to a plugin you currently need the &#39;Administer&#39; permission.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read-only access to system administration information allows users who are not administrators to more easily debug build issues.
For example, given a &#39;Jenkins&#39; error message in a build the user can check:&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;which plugins are installed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the version of the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This can allow the user to solve their issue themselves and makes it easier for the user to report an issue with a plugin directly to the maintainers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-can-i-expect&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-can-i-expect&quot; /&gt;What can I expect&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All built in UI controls have been adapted to clearly distinguish between
an editable control and a control you don’t have permission to edit:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Editable:&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/2020/05-read-only-jenkins-announcement/build-discarder-edit.png&quot; alt=&quot;build discarder edit&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Non editable:&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/2020/05-read-only-jenkins-announcement/build-discarder-read.png&quot; alt=&quot;build discarder read&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Note: there are other controls such as in the credentials and pipeline plugins that have
not been updated yet.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Action buttons, (Such as &#39;Save&#39; and &#39;Apply&#39;) have been hidden in most cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Work will continue on read-only configuration.  Some plugins need support added and certain controls
could have some improvements done to render better.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-can-i-use-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-i-use-it&quot; /&gt;How can I use it?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These permissions are currently available in beta and for now disabled by default.
You can enable them by installing the &lt;a href=&quot;https://plugins.jenkins.io/extended-read-permission&quot;&gt;Extended read permission plugin&lt;/a&gt; v3.2 or above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then you will need to add the following permissions to a user / group depending on your use case:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Overall/SystemRead&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Job/ExtendedRead&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agent/ExtendedRead&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Note: You will need to set the Overall/Read and Job/Read permissions as well.  You might
want to consider creating a role containing the required permissions.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is an example using the &lt;a href=&quot;https://plugins.jenkins.io/configuration-as-code&quot;&gt;Configuration as Code plugin&lt;/a&gt; and the &lt;a href=&quot;https://plugins.jenkins.io/folder-auth&quot;&gt;Folder-based Authorization Strategy plugin&lt;/a&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;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;authorizationStrategy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;folderBased&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;globalRoles&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;name&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;admin&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;permissions&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Overall/Administer&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;sids&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;admin&quot;&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&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;global&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;read&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;permissions&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Agent/ExtendedRead&quot;&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Overall/SystemRead&quot;&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Overall/Read&quot;&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Job/Read&quot;&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Job/ExtendedRead&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;sids&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;reader&quot;&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;i-cant-see-a-configuration-that-i-think-should-be-allowed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-cant-see-a-configuration-that-i-think-should-be-allowed&quot; /&gt;I can’t see a configuration that I think should be allowed&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most of Jenkins itself has been updated to support read-only Jenkins, but not very many plugins.
Please create an enhancement issue on the plugins issue tracker.
If the plugin uses Jira to track issues, then you can add it to the &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-12548&quot;&gt;JENKINS-12548&lt;/a&gt; epic.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-do-i-update-my-plugin-to-support-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-update-my-plugin-to-support-it&quot; /&gt;How do I update my plugin to support it&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.jenkins.io/doc/developer/views/read-only/&quot;&gt;Read only view&lt;/a&gt; section of the developer documentation.&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;In this release we introduce a foundation feature which is already supported in all key Jenkins core controls and in some plugins.
There are many plugins which contribute to global configurations and diagnostics which still need to be adapted to support the new mode.
We will keep working on this feature and its adoption so that the next LTS baseline in September provides a full-fledged user experience for Jenkins admins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;System read permission is a featured project in the &lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/&quot;&gt;UI/UX Hackfest&lt;/a&gt;
happening May 25-29 2020. If you want to get involved please check it out!&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/2020/05/12/uiux-hackfest-announcement/</id>
<title>Join us for online UI/UX hackfest on May 25-29!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-05-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/05/12/uiux-hackfest-announcement/" />
<category term='announcement'></category>
<category term='event'></category>
<category term='ui'></category>
<category term='ux'></category>
<category term='documentation'></category>
<category term='outreach-programs'></category>
<category term='advocacy-and-outreach'></category>
<category term='jenkins-is-the-way'></category>
<category term='community'></category>
<summary>
This event is over, thanks a lot to all contributors!
Please the event page for results.








On behalf of the Jenkins User Experience, Documentation and Advocacy and Outreach special interest groups,
we are happy to announce the online UI/UX hackfest on May 25-29!
Everyone is welcome to participate, regardless of their Jenkins development experience.


The goal is to get together and work on improving Jenkins user experience,
including but not limited to user interface and user documentation.
We also invite you to share experiences about Jenkins and to participate in UX testing.
The event follows the Jenkins is the Way theme and the
most active contributors will get special...
</summary>
<content type='html'>
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;strong&gt;This event is over&lt;/strong&gt;, thanks a lot to all contributors!
Please the &lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/&quot;&gt;event page&lt;/a&gt; for results.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/post-images/jenkins-is-the-way/jenkins-is-the-way.png&quot; alt=&quot;Jenkins Is The Way&quot; height=&quot;284&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the Jenkins &lt;em&gt;User Experience&lt;/em&gt;, &lt;em&gt;Documentation&lt;/em&gt; and &lt;em&gt;Advocacy and Outreach&lt;/em&gt; special interest groups,
we are happy to announce the &lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/&quot;&gt;online UI/UX hackfest&lt;/a&gt; on May 25-29!
Everyone is welcome to participate, regardless of their Jenkins development experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal is to get together and work on improving Jenkins user experience,
including but not limited to user interface and user documentation.
We also invite you to share experiences about Jenkins and to participate in UX testing.
The event follows the &lt;a href=&quot;https://www.jenkins.io/blog/2020/04/30/jenkins-is-the-way/&quot;&gt;Jenkins is the Way&lt;/a&gt; theme and the
most active contributors will get special edition swag and prizes!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;event-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#event-plan&quot; /&gt;Event plan&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This hackfest is NOT a &lt;em&gt;hackathon&lt;/em&gt;.
We do not expect participants to dedicate all their time during the event timeframe, but hop-in/hop-out as their time allows.
Everybody can spend as much time as they are willing to dedicate.
Spending a few days or just a few hours is fine, any contributions matter regardless of their size.
Jenkins development experience is not required,
we have newcomer-friendly stories for those who want to start contributing to the project.
We will also have a 24/7 &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_hackfest:gitter.im&quot;&gt;jenkinsci/hackfest&lt;/a&gt; Gitter chat for Q&amp;amp;A and coordination between contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There will be &lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/#tracks-and-project-ideas&quot;&gt;3 main tracks&lt;/a&gt;:&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;User Interface&lt;/strong&gt; -
Improve look&amp;amp;feel and accessibility for Jenkins users,
work on new read-only interface for instances managed with configuration as code,
create and update Jenkins themes,
and many other topics.
This track is coordinated by the &lt;a href=&quot;https://www.jenkins.io/sigs/ux/&quot;&gt;UX SIG&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User Documentation&lt;/strong&gt; -
Improve and create new &lt;a href=&quot;https://www.jenkins.io/doc/book/&quot;&gt;user documentation&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/doc/tutorials/&quot;&gt;tutorials&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/solutions/&quot;&gt;solution pages&lt;/a&gt;.
Also, there is ongoing documentation migration from Wiki to jenkins.io and plugin repositories.
This track is coordinated by the &lt;a href=&quot;https://www.jenkins.io/sigs/docs/&quot;&gt;Documentation SIG&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Spread the word&lt;/strong&gt; -
Write user stories for &lt;a href=&quot;https://stories.jenkins.io/&quot;&gt;Jenkins Is The Way&lt;/a&gt; site and the &lt;a href=&quot;https://www.jenkins.io/blog&quot;&gt;Jenkins blog&lt;/a&gt;,
post about your Jenkins user experience and new features,
record overview and HOWTO videos, etc.
This track is coordinated by the &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/&quot;&gt;Advocacy and Outreach SIG&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;We are working on publishing project ideas and issues for the listed tracks.
The current list can be found on the &lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/#tracks-and-project-ideas&quot;&gt;UI / UX hackfest event page&lt;/a&gt;,
this list will be finalized by the beginning of the hackfest.
You are welcome to propose your own projects within the User Experience theme.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the event, we will organize &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;online meetups&lt;/a&gt; and ad-hoc training sessions in different timezones.
All these sessions will be recorded and shared on our &lt;a href=&quot;https://www.youtube.com/user/jenkinsci/playlists&quot;&gt;YouTube channel&lt;/a&gt;.
There are no mandatory sessions you must attend, you are welcome to join ones remotely or watch the recordings.
After the event we will invite participants to demo their projects at online meetings or recorded sessions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;registration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#registration&quot; /&gt;Registration&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;strong&gt;This event is over&lt;/strong&gt;, thanks a lot to all contributors!
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;P.S: Note that the registration form has a question top 3 things we could change in Jenkins to improve your user experience.
We would appreciate your response there!&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contacts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contacts&quot; /&gt;Contacts&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please use the following contacts to contact organizers:&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://app.gitter.im/#/room/#jenkinsci_hackfest:gitter.im&quot;&gt;Gitter chat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/g/jenkins-advocacy-and-outreach-sig&quot;&gt;Mailing list&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;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&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/events/online-hackfest/2020-uiux/&quot;&gt;Event Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://forms.gle/MrkASJagxNvdXBbdA&quot;&gt;Registration form&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/#tracks-and-project-ideas&quot;&gt;Project ideas&lt;/a&gt; (work-in-progress).
The full list will be published by the beginning of the event.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/faq/&quot;&gt;Frequently Asked Questions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Contributing to Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/conduct/&quot;&gt;Code of Conduct&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;swag-and-prizes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#swag-and-prizes&quot; /&gt;Swag and Prizes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to our sponsors (&lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees, Inc.&lt;/a&gt; and &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation&lt;/a&gt;),
we are happy to offer swag to active contributors!&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;50&lt;/strong&gt; most-active contributors will get an exclusive &quot;Jenkins Is The Way&quot; T-shirt and stickers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Active contributors will get Jenkins stickers and socks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We are working on special prizes for top contributors, to be announced later&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/jenkins-is-the-way/jenkins-is-the-way-t-shirt.png&quot; alt=&quot;Jenkins Is The Way T-shirt&quot; height=&quot;229&quot; /&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/hackfest-swag-socks.png&quot; alt=&quot;Jenkins Socks&quot; height=&quot;229&quot; /&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/hackfest-swag-sticker.png&quot; alt=&quot;Jenkins Stickers&quot; height=&quot;229&quot; /&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;/p&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;We thank all contributors who participate in this event as committers!
We especially thank all reviewers, organizers and those who participated in the initial program reviews and provided invaluable feedback.
In particular, we thank &lt;a href=&quot;https://www.jenkins.io/sigs/ux/&quot;&gt;User Experience&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/sigs/docs/&quot;&gt;Documentation&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/&quot;&gt;Advocacy and Outreach&lt;/a&gt; SIG members who heavily contributed to this event.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also thank sponsors of the event who make the swag and prizes possible:
&lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees, Inc.&lt;/a&gt; and
&lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation (CDF)&lt;/a&gt;.
In addition to swag, CloudBees donates working time for event hosts and reviewers.
CDF also sponsors our &lt;a href=&quot;https://www.jenkins.io/events/online-meetup&quot;&gt;online meetup platform&lt;/a&gt; which we will be using for the event.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://cloudbees.com/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/cloudbees.png&quot; alt=&quot;CloudBees&quot; /&gt;&lt;/a&gt;
&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://cd.foundation/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/cdf.png&quot; alt=&quot;Continuous Delivery Foundation&quot; /&gt;&lt;/a&gt;.&lt;/span&gt;
&lt;/span&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/05/11/docker-windows-agents/</id>
<title>Windows Docker Agent Images: General Availability</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-05-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/05/11/docker-windows-agents/" />
<author>
<name>slide_o_mix</name>
</author>
<category term='announcement'></category>
<category term='docker'></category>
<category term='platform-sig'></category>
<category term='windows'></category>
<summary>
We would like to announce the availability of official Windows agent images for Docker.
These images allow provisioning Jenkins agents with Windows OS on Docker and Kubernetes.





New images


All official Docker images for agents now provide nanoserver-1809 and windowsservercore-1809 tags which include Windows images and, at the moment, Java 8 (these are like the latest tag).
We also provide tags with explicit Java selection, e.g. jdk8-windowsservercore-1809 or jdk11-nanoserver-1809.
Version tags are also available, e.g. jenkins/agent:4.3-4-jdk8-nanoserver-1809.




jenkins/agent is a basic agent which bundles the agent.jar for agent &#8656; &#8658; controller communication. This is most useful as a base image for other images.
Windows images are available starting...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would like to announce the availability of official Windows agent images for Docker.
These images allow provisioning Jenkins agents with Windows OS on Docker and Kubernetes.&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/docker/dockerJenkins.png&quot; alt=&quot;Jenkins and Docker&quot; height=&quot;224&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-images&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-images&quot; /&gt;New images&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All official Docker images for agents now provide &lt;code&gt;nanoserver-1809&lt;/code&gt; and &lt;code&gt;windowsservercore-1809&lt;/code&gt; tags which include Windows images and, at the moment, Java 8 (these are like the &lt;code&gt;latest&lt;/code&gt; tag).
We also provide tags with explicit Java selection, e.g. &lt;code&gt;jdk8-windowsservercore-1809&lt;/code&gt; or &lt;code&gt;jdk11-nanoserver-1809&lt;/code&gt;.
Version tags are also available, e.g. &lt;code&gt;jenkins/agent:4.3-4-jdk8-nanoserver-1809&lt;/code&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://hub.docker.com/r/jenkins/agent&quot;&gt;jenkins/agent&lt;/a&gt; is a basic agent which bundles the agent.jar for agent ⇐ ⇒ controller communication. This is most useful as a base image for other images.
Windows images are available starting from version &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/releases/tag/4.3-4&quot;&gt;4.3-4&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkins/inbound-agent&quot;&gt;jenkins/inbound-agent&lt;/a&gt; is an agent that is based on the jenkins/agent image above. It provides a wrapper script written in PowerShell to help specify the parameters to agent.jar.
Windows images are available starting from version &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/releases/tag/4.3-4&quot;&gt;4.3-4&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkins/ssh-agent&quot;&gt;jenkins/ssh-agent&lt;/a&gt; is an image which has OpenSSH installed and should be used with the &lt;a href=&quot;https://plugins.jenkins.io/ssh-slaves&quot;&gt;SSH Build Agents Plugin&lt;/a&gt;.
Windows images are available starting from version &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/releases/tag/2.1.0&quot;&gt;2.1.0&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;using-windows-docker-images&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-windows-docker-images&quot; /&gt;Using Windows Docker images&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To use the new images, you will need a proper Docker or Kubernetes environment which supports running Windows containers.
For Windows desktop users, the easiest way is to use &lt;a href=&quot;https://docs.docker.com/docker-for-windows/&quot;&gt;Docker for Windows&lt;/a&gt;.
Windows support in Kubernetes is documented &lt;a href=&quot;https://kubernetes.io/docs/setup/production-environment/windows/intro-windows-in-kubernetes/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkinsagent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsagent&quot; /&gt;jenkins/agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The jenkins/agent image is a simple agent with the JDK and the agent.jar (Jenkins Remoting library).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are two main use cases for this image:&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;As a base image for other Docker images (e.g., &lt;code&gt;FROM jenkins/agent:jdk8-nanoserver-1809&lt;/code&gt; in your Dockerfile). The jenkins/inbound-agent is based on this image.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This image may also be used to launch an agent using the &lt;strong&gt;Launch method&lt;/strong&gt; of &lt;strong&gt;Launch agent via execution of command on the master&lt;/strong&gt;.  This allows the controller to launch the agent inside the docker container automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To run the agent for the second use case, you would specify the following command on the Jenkins controller after setting &lt;strong&gt;Remote root directory&lt;/strong&gt; to &lt;code&gt;C:\Users\jenkins\agent&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;docker run -i --rm --name agent --init jenkins/agent:jdk8-windowsservercore-1809 java -jar C:/ProgramData/Jenkins/agent.jar&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkinsinbound-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsinbound-agent&quot; /&gt;jenkins/inbound-agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The inbound-agent Docker image tries to provide a higher level interaction with the agent.jar executable. It provides a PowerShell wrapper script around agent.jar and it is specified as the entrypoint so that you just need to pass in some command line arguments to run the agent. A &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent&quot;&gt;pull request&lt;/a&gt; has been opened which documents these command line parameters and environment variables.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;docker run jenkins/inbound-agent:windowsservercore-1809 `
   -Url http://jenkins-server:port `
   -WorkDir=C:/Users/jenkins/Agent `
   -Secret &amp;lt;SECRET&amp;gt; `
   -Name &amp;lt;AGENTNAME&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Example using environment variables:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;docker run -e &quot;JENKINS_URL=http://jenkins-server:port&quot; -e &quot;JENKINS_AGENT_NAME=AGENTNAME&quot; `
   jenkins/inbound-agent:windowsservercore-1809 `
   -WorkDir=C:/Users/jenkins/Agent `
   -Secret &amp;lt;SECRET&amp;gt; `
   -Name &amp;lt;AGENTNAME&amp;gt;&lt;/pre&gt;
&lt;/div&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;
The &lt;code&gt;-Url&lt;/code&gt;, &lt;code&gt;-Name&lt;/code&gt; and &lt;code&gt;-Secret&lt;/code&gt; parameters are required, but can be specified as either command line parameters or environment variables.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkinsssh-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsssh-agent&quot; /&gt;jenkins/ssh-agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As mentioned above the jenkins/ssh-agent docker image is based on SSH communication with the controller, rather than the remoting TCP or WebSocket protocols. The image sets up a &lt;code&gt;jenkins&lt;/code&gt; user and the OpenSSH server so that the controller can connect to the agent via SSH. The image expects an SSH public key as a parameter and puts that key into the &lt;code&gt;authorized_keys&lt;/code&gt; file for the &lt;code&gt;jenkins&lt;/code&gt; user. The private key should be specified in the agent configuration on the controller to allow the controller to connect.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;docker run jenkins/ssh-agent:jdk8-windowsservercore-1809 &quot;&amp;lt;public key&amp;gt;&quot;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also pass the public key as an environment variable when using &lt;code&gt;docker run&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;docker run -e &quot;JENKINS_AGENT_SSH_PUBKEY=&amp;lt;public key&amp;gt;&quot; jenkins/ssh-agent:jdk8-windowsservercore-1809&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will then be able to connect this agent using the &lt;a href=&quot;https://plugins.jenkins.io/ssh-slaves&quot;&gt;SSH Build Agents Plugin&lt;/a&gt; as &quot;jenkins&quot; with the matching private key.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&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;We are considering providing versions based on &lt;em&gt;Windows Server 2019 build 1909&lt;/em&gt; so that Jenkins users can run these images on GKE clusters (see &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/issues/134&quot;&gt;this issue&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are also looking into providing multiarch manifests which would allow Windows images to be part of the &lt;code&gt;latest&lt;/code&gt; tag.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is also an &lt;a href=&quot;https://github.com/jenkinsci/docker/pull/924&quot;&gt;open pull-request&lt;/a&gt; to create a Windows based Docker image for a Jenkins controller. There hasn’t been a lot of requests for this, but to make the offerings complete for Windows users, the pull request was created.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For plans unrelated to Windows, please see the &lt;a href=&quot;https://www.jenkins.io/blog/2020/05/06/docker-agent-image-renaming/&quot;&gt;Docker images for agents: New names and What’s next&lt;/a&gt; blogpost.&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/2020/05/06/docker-agent-image-renaming/</id>
<title>Docker images for agents: New names and What&#39;s next</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-05-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/05/06/docker-agent-image-renaming/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='announcement'></category>
<category term='docker'></category>
<category term='platform-sig'></category>
<summary>
We would like to announce the renaming of the official Docker images for Jenkins agents.
It does not have any immediate impact on Jenkins users, but they are expected to gradually upgrade their instances.
This article provides information about the new official names, upgrade procedure, and the support policy for the old images.
We will also talk about what&#8217;s next for the Docker packaging in Jenkins.





New image names




jenkins/agent is the new name of the old jenkins/slave image,
starting from 4.3-2


jenkins/inbound-agent is the new name of the  jenkins/jnlp-slave image,
starting from 4.3-2


jenkins/ssh-agent is the new name of the old jenkins/ssh-slave image,
starting from 2.0.0




See the upgrade...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would like to announce the renaming of the official Docker images for Jenkins agents.
It does not have any immediate impact on Jenkins users, but they are expected to gradually upgrade their instances.
This article provides information about the new official names, upgrade procedure, and the support policy for the old images.
We will also talk about what’s next for the Docker packaging in Jenkins.&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/docker/dockerJenkins.png&quot; alt=&quot;Jenkins and Docker&quot; height=&quot;224&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-image-names&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-image-names&quot; /&gt;New image names&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://hub.docker.com/r/jenkins/agent&quot;&gt;jenkins/agent&lt;/a&gt; is the new name of the old &lt;a href=&quot;https://hub.docker.com/r/jenkins/slave&quot;&gt;jenkins/slave&lt;/a&gt; image,
starting from &lt;a href=&quot;https://github.com/jenkinsci/docker-agent/releases/tag/4.3-2&quot;&gt;4.3-2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkins/inbound-agent&quot;&gt;jenkins/inbound-agent&lt;/a&gt; is the new name of the  &lt;a href=&quot;https://hub.docker.com/r/jenkins/jnlp-slave&quot;&gt;jenkins/jnlp-slave&lt;/a&gt; image,
starting from &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent/releases/tag/4.3-2&quot;&gt;4.3-2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkins/ssh-agent&quot;&gt;jenkins/ssh-agent&lt;/a&gt; is the new name of the old &lt;a href=&quot;https://hub.docker.com/r/jenkins/ssh-slave&quot;&gt;jenkins/ssh-slave&lt;/a&gt; image,
starting from &lt;a href=&quot;https://github.com/jenkinsci/docker-ssh-agent/releases/tag/2.0.0&quot;&gt;2.0.0&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;See the upgrade guidelines below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why&quot; /&gt;Why?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &quot;slave&quot; term is widely considered inappropriate in open source communities.
It has been officially deprecated in Jenkins 2.0 in 2016, but there are remaining usages in some Jenkins components.
The &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-42816&quot;&gt;JENKINS-42816: Slave to Agent renaming leftovers&lt;/a&gt; EPIC tracks cleanup of such usages.
Official Docker agent images were a glaring case, it was not easy to fix that with the previous versions of the image release Pipelines on DockerHub.
It is great to have the image naming issue finally fixed by this update.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another notable change is replacing the &lt;em&gt;JNLP agent&lt;/em&gt; term with &lt;em&gt;inbound agent&lt;/em&gt;.
Historically &quot;JNLP&quot; has been used as a name of &lt;a href=&quot;https://github.com/jenkinsci/remoting/blob/master/docs/protocols.md&quot;&gt;Remoting protocols&lt;/a&gt;.
JNLP stands for &lt;a href=&quot;https://en.wikipedia.org/wiki/Java_Web_Start#Java_Network_Launching_Protocol_(JNLP)&quot;&gt;Java Network Launch Protocol&lt;/a&gt; which is a part of the Java Web Start.
Jenkins supports Java Web Start mode for agents when running agents on Java 1.8,
but our networking protocols are based on TCP and have nothing to do with Java Network Launch Protocol.
This name has been very confusing since the beginning
and became worse with the introduction of WebSocket support in Jenkins 2.217 (&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/222/README.adoc&quot;&gt;JEP-222&lt;/a&gt;).
Docker agent images support WebSockets, so we decided to change the image name to &lt;a href=&quot;https://hub.docker.com/r/jenkins/inbound-agent&quot;&gt;jenkins/inbound-agent&lt;/a&gt; so that it prevents further confusion.
&lt;em&gt;Inbound agent&lt;/em&gt; term refers to agent protocols in which the agent initiates the connection to the Jenkins controller through different protocols.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks a lot to &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://github.com/krufab&quot;&gt;krufab&lt;/a&gt; for the repository restructuring groundwork which made the renaming possible!
Also thanks to &lt;a href=&quot;https://www.jenkins.io/blog/authors/timja/&quot;&gt;Tim Jacomb&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/markyjackson-taulia/&quot;&gt;Marky Jackson&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/markewaite&quot;&gt;Mark Waite&lt;/a&gt;, &lt;a href=&quot;https://github.com/kuisathaverat&quot;&gt;Ivan Fernandez Calvo&lt;/a&gt; and other contributors for their reviews and testing.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;upgrading-and-compatibility-notes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrading-and-compatibility-notes&quot; /&gt;Upgrading and Compatibility Notes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Good news, there are no breaking changes caused by this renaming.
All images have been already modified to use the new terminology internally.
If you use the recent versions of the previous images,
you can just replace the old names with the new ones.
These names may be referenced in your Dockerfiles, scripts, and Jenkins configurations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will keep updating the old images on DockerHub for at least 3 months (until August 05, 2020).
There will be no new configurations and platforms added to the old images,
but all existing ones will remain available (Debian for Java 1.8 and 11, Alpine for Java 1.8, etc.).
After August 05, 2020, the old images will no longer receive updates, but previous versions will remain available to users on DockerHub.&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;We will continue renaming of the Docker images in Jenkins components which reference old image names.
There is also a set of &lt;a href=&quot;https://github.com/jenkinsci/jnlp-agents&quot;&gt;convenience Docker images&lt;/a&gt; which include build tools like Maven or Gradle which will be renamed later.
The &lt;code&gt;jenkins/ssh-agent&lt;/code&gt; image might be renamed again in the future as well;
see the ongoing discussion in this developer &lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/oxD-Hd_7l9k/WAbvqD-wEQAJ&quot;&gt;mailing list thread&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are rather interested in new features in Jenkins Docker packaging,
stay tuned for future announcements!
There are multiple ongoing initiatives which you can find on the &lt;a href=&quot;https://www.jenkins.io/project/roadmap/&quot;&gt;public Jenkins roadmap&lt;/a&gt;
(in the draft stage, see &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/14/README.adoc&quot;&gt;JEP-14&lt;/a&gt;).
Some stories:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;General availability of Windows images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for more platforms (AArch64, IBM s390x, PowerPC).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Switching to AdoptOpenJDK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Introducing multi-platform Docker images.&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 interested in any of these projects and would like to contribute,
please reach out to the &lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Platform Special Interest Group&lt;/a&gt; which coordinates initiatives related to Jenkins in Docker.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regarding the agent terminology cleanup outside Docker images,
we will keep working on this project in the &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach&quot;&gt;Advocacy &amp;amp; Outreach SIG&lt;/a&gt;.
If you see the usage of the obsolete &quot;slave&quot; term anywhere in the Jenkins organization (Web UI, documentation, etc.),
please feel free to submit a pull request or to report an issue in the &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-42816&quot;&gt;JENKINS-42816: Slave to Agent renaming leftovers&lt;/a&gt; EPIC.
There are &quot;just&quot; &lt;a href=&quot;https://github.com/search?q=org%3Ajenkinsci+slave&amp;amp;type=Code&quot;&gt;3000 occurrences&lt;/a&gt; left in the &lt;code&gt;jenkinsci&lt;/code&gt; GitHub organization, but we will get there.
Any contributions will be appreciated!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/04/30/jenkins-is-the-way/</id>
<title>Call for User Stories - Jenkins is the Way</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-04-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/04/30/jenkins-is-the-way/" />
<category term='announcement'></category>
<category term='outreach-programs'></category>
<category term='advocacy-and-outreach'></category>
<category term='jenkins-is-the-way'></category>
<summary>
One of the things we loved about going to developer conferences was meeting Jenkins users — newbies and old-timers alike — who are excited to talk about their projects and share tips on how to move forward using Jenkins.
Since the coronavirus pandemic, we&#8217;re learning to rely more on new ways to gather, and it&#8217;s happening via Jenkins online meetups, GitHub collaborations, and Twitter threads, to name a few.


It&#8217;s a significant change.
But what hasn&#8217;t changed is the need to share stories about the things users have built, the solutions they&#8217;ve developed, and the excellent results they&#8217;re getting from some really innovative...
</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/post-images/jenkins-is-the-way/jenkins-is-the-way.png&quot; alt=&quot;Jenkins Is The Way&quot; height=&quot;284&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the things we loved about going to developer conferences was meeting Jenkins users — newbies and old-timers alike — who are excited to talk about their projects and share tips on how to move forward using Jenkins.
Since the coronavirus pandemic, we’re learning to rely more on new ways to gather, and it’s happening via &lt;a href=&quot;https://www.jenkins.io/events/online-meetup/&quot;&gt;Jenkins online meetups&lt;/a&gt;, GitHub collaborations, and Twitter threads, to name a few.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s a significant change.
But what hasn’t changed is the need to share stories about the things users have built, the solutions they’ve developed, and the excellent results they’re getting from some really innovative Jenkins implementations.
Then we wondered, why isn’t anyone collecting these user stories and sharing them with the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introducing-jenkins-is-the-way&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-jenkins-is-the-way&quot; /&gt;Introducing Jenkins is the Way&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we took the first step to record and archive all the great stuff everyone in our community is building with Jenkins.
This way, Jenkins users old and new can come to an archive and search for Jenkins solutions for inspiration.
We foresee a vast library of solutions from all around the world, solving a wide array of challenges in every industry imaginable.
We decided to call this archive &quot;&lt;strong&gt;Jenkins Is The Way&lt;/strong&gt;&quot; and host it at &lt;a href=&quot;https://stories.jenkins.io&quot; class=&quot;bare&quot;&gt;https://stories.jenkins.io&lt;/a&gt; .&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To aggregate all these stories, we built a simple online questionnaire so that Jenkins users can submit their own experience using this leading open source automation server.
With so many plugins to support building, deploying, and automating your projects, we expect to see a vast collection of stories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve already received a handful, including stories that illustrate how &lt;strong&gt;Jenkins Is The Way&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;to &lt;a href=&quot;https://stories.jenkins.io/user-story/to-cast-magic-of-continuous-delivery/&quot;&gt;cast magic of continuous delivery&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;to &lt;a href=&quot;https://stories.jenkins.io/user-story/to-accelerate-automation-in-the-cloud/&quot;&gt;accelerate automation in the cloud&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;to &lt;a href=&quot;https://stories.jenkins.io/user-story/to-facilitate-day-to-day-work/&quot;&gt;facilitate day-to-day work&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;add-your-story-show-your-jenkins-pride-get-our-t-shirt&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#add-your-story-show-your-jenkins-pride-get-our-t-shirt&quot; /&gt;Add your story. Show your Jenkins pride. Get our T-shirt&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 left center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-is-the-way/jenkins-is-the-way-t-shirt.png&quot; alt=&quot;Jenkins Is The Way T-shirt&quot; height=&quot;229&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Be an inspiration to the Jenkins community by sharing your Jenkins story.
Just go to &lt;a href=&quot;https://www.surveymonkey.com/r/JenkinsIsTheWay&quot;&gt;this link and fill out the form&lt;/a&gt;.
We’ll ask you about your project’s goals, the technical challenges you overcame with Jenkins, and the solutions you created.
It should take no more than 20-30 minutes to complete.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll clean it up for clarity and publish it on &lt;a href=&quot;https://stories.jenkins.io&quot; class=&quot;bare&quot;&gt;https://stories.jenkins.io&lt;/a&gt; .&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once it’s part of our archive, we’ll send you our new 2020 &lt;strong&gt;Jenkins Is the Way&lt;/strong&gt; t-shirt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And since the more, the merrier, please share this blog post with peers and colleagues.
We want to hear everyone’s stories about the clever ways Jenkins is used to automate all that we need to do.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;thanks-and-acknowledgement&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thanks-and-acknowledgement&quot; /&gt;Thanks and Acknowledgement&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;http://abconsulting.agency/&quot;&gt;abConsulting&lt;/a&gt; for creating and managing the &lt;a href=&quot;https://stories.jenkins.io&quot;&gt;JenkinsIsTheWay site&lt;/a&gt; and for reviewing, editing, and publishing the submitted stories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the Jenkins Advocacy and Outreach SIG for their reviews and feedback.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks also to CloudBees for sponsoring the &quot;&lt;strong&gt;Jenkins is the Way&lt;/strong&gt;&quot; program.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://cloudbees.com&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/sponsors/cloudbees.png&quot; alt=&quot;CloudBees&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&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/2020/04/16/github-app-authentication/</id>
<title>GitHub App authentication support released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-04-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/04/16/github-app-authentication/" />
<author>
<name>timja</name>
</author>
<category term='github'></category>
<category term='github-branch-source'></category>
<category term='pipeline'></category>
<category term='announcement'></category>
<summary>
This blogpost was updated to reflect the general availability of the feature after the release of GitHub Branch Source 2.7.1 on April 26th, 2020.





I&#8217;m excited to announce support for authenticating as a GitHub app in Jenkins.
This has been a long awaited feature by many users.
It has been released in GitHub Branch Source 2.7.1 which is now available in the Jenkins update centers.


Authenticating as a GitHub app brings many benefits:




Larger rate limits - The rate limit for a GitHub app scales with your organization size,
whereas a user based token has a limit of 5000 regardless of how many repositories you have.


...
</summary>
<content type='html'>
&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;
This blogpost was updated to reflect the general availability of the feature after the release of GitHub Branch Source 2.7.1 on April 26th, 2020.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m excited to announce support for authenticating as a GitHub app in Jenkins.
This has been a long awaited feature by many users.
It has been released in &lt;a href=&quot;https://github.com/jenkinsci/github-branch-source-plugin/releases/tag/github-branch-source-2.7.1&quot;&gt;GitHub Branch Source 2.7.1&lt;/a&gt; which is now available in the Jenkins update centers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Authenticating as a GitHub app brings many benefits:&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;Larger rate limits&lt;/strong&gt; - The rate limit for a GitHub app scales with your organization size,
whereas a user based token has a limit of 5000 regardless of how many repositories you have.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt; User-independent authentication&lt;/strong&gt; - Each GitHub app has its own user-independent authentication. No more need for &#39;bot&#39; users or figuring out who should be the owner of 2FA or OAuth tokens.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Improved security and tighter permissions&lt;/strong&gt; - GitHub Apps offer much finer-grained permissions compared to a service user and its personal access tokens. This lets the Jenkins GitHub app require a much smaller set of privileges to run properly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access to GitHub Checks API&lt;/strong&gt; - GitHub Apps can access the &lt;a href=&quot;https://developer.github.com/v3/checks/&quot;&gt;GitHub Checks API&lt;/a&gt; to create check runs and check suites from Jenkins jobs and provide detailed feedback on commits as well as code annotation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;Install the &lt;a href=&quot;https://plugins.jenkins.io/github-branch-source/&quot;&gt;GitHub Branch Source plugin&lt;/a&gt;,
make sure the version is &lt;code&gt;2.7.1&lt;/code&gt; or above.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;configuring-the-github-organization-folder&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuring-the-github-organization-folder&quot; /&gt;Configuring the GitHub Organization Folder&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Follow the &lt;a href=&quot;https://github.com/jenkinsci/github-branch-source-plugin/blob/master/docs/github-app.adoc&quot;&gt;GitHub App Authentication setup guide&lt;/a&gt;.  These instructions are also linked from the plugin’s README on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you’ve finished setting it up, Jenkins will validate your credential and you should see your new rate limit.
Here’s an example on a large org:&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/github-app-rate-limit.png&quot; alt=&quot;GitHub app rate limit&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;how-do-i-get-an-api-token-in-my-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-get-an-api-token-in-my-pipeline&quot; /&gt;How do I get an API token in my pipeline?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to usage of GitHub App authentication for Multi-Branch Pipeline, you can also use app authentication directly in your Pipelines.
You can access the Bearer token for the GitHub API by just loading a &#39;Username/Password&#39; credential as usual,
the plugin will handle authenticating with GitHub in the background.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This could be used to call additional GitHub API endpoints from your pipeline, possibly the
&lt;a href=&quot;https://developer.github.com/v3/repos/deployments/&quot;&gt;deployments api&lt;/a&gt; or you may wish to implement your own
&lt;a href=&quot;https://developer.github.com/v3/checks/&quot;&gt;checks api&lt;/a&gt; integration until Jenkins supports this out of the box.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Note: the API token you get will only be valid for one hour, don’t get it at the start of the pipeline and assume it will be valid all the way through&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Let’s submit a check run to Jenkins from our Pipeline:&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;Check run&#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;githubapp-jenkins&#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;GITHUB_APP&#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;GITHUB_ACCESS_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;&#39;&#39;
            curl -H &quot;Content-Type: application/json&quot; \
                 -H &quot;Accept: application/vnd.github.antiope-preview+json&quot; \
                 -H &quot;authorization: Bearer ${GITHUB_ACCESS_TOKEN}&quot; \
                 -d &#39;{ &quot;name&quot;: &quot;check_run&quot;, \
                       &quot;head_sha&quot;: &quot;&#39;${GIT_COMMIT}&#39;&quot;, \
                       &quot;status&quot;: &quot;in_progress&quot;, \
                       &quot;external_id&quot;: &quot;42&quot;, \
                       &quot;started_at&quot;: &quot;2020-03-05T11:14:52Z&quot;, \
                       &quot;output&quot;: { &quot;title&quot;: &quot;Check run from Jenkins!&quot;, \
                                   &quot;summary&quot;: &quot;This is a check run which has been generated from Jenkins as GitHub App&quot;, \
                                   &quot;text&quot;: &quot;...and that is awesome&quot;}}&#39; https://api.github.com/repos/&amp;lt;org&amp;gt;/&amp;lt;repo&amp;gt;/check-runs
            &#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;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;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;GitHub Apps authentication in Jenkins is a huge improvement.  Many teams have already started using it and have helped improve it by giving pre-release feedback. There are more improvements on the way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s a proposed Google Summer of Code project: &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/project-ideas/github-checks/&quot;&gt;GitHub Checks API for Jenkins Plugins&lt;/a&gt;.
It will look at integrating with the &lt;a href=&quot;https://developer.github.com/v3/checks/&quot;&gt;Checks API&lt;/a&gt;,
with a focus on reporting issues found using the &lt;a href=&quot;https://plugins.jenkins.io/warnings-ng/&quot;&gt;warnings-ng plugin&lt;/a&gt;
directly onto the GitHub pull requests, along with test results summary on GitHub.
Hopefully it will make the Pipeline example below much simpler for Jenkins users :)
If you want to get involved with this, join the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;GSoC Gitter channel&lt;/a&gt;
and ask how you can help.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/03/30/azure-key-vault-cred-provider/</id>
<title>Introducing the Azure Key Vault Credentials Provider for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-03-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/03/30/azure-key-vault-cred-provider/" />
<author>
<name>timja</name>
</author>
<category term='jenkins'></category>
<category term='pipeline'></category>
<category term='security'></category>
<category term='azure'></category>
<category term='credentials'></category>
<category term='credential-provider'></category>
<category term='configuration-as-code'></category>
<summary>
Azure Key Vault is a product for securely managing keys, secrets and certificates.


I&#8217;m happy to announce two new features in the Azure Key Vault plugin:




a credential provider to tightly link Jenkins and Azure Key Vault.



huge thanks to Jie Shen for contributing this





integration with the configuration-as-code plugin.




These changes were released in v1.8 but make sure to run the latest version of the plugin, there has been some fixes since then.


Some advantages of using the credential provider rather than your own scripts:




your Jenkins jobs consume the credentials with no knowledge of Azure Key Vault, so they stay vendor-independent.


the provider integrates with the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph lead&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://azure.microsoft.com/en-gb/services/key-vault/&quot;&gt;Azure Key Vault&lt;/a&gt; is a product for securely managing keys, secrets and certificates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m happy to announce two new features in the &lt;a href=&quot;https://plugins.jenkins.io/azure-keyvault/&quot;&gt;Azure Key Vault&lt;/a&gt; plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a &lt;a href=&quot;https://github.com/jenkinsci/credentials-plugin/blob/master/docs/user.adoc#credentials-providers&quot;&gt;credential provider&lt;/a&gt; to tightly link Jenkins and Azure Key Vault.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;huge thanks to &lt;a href=&quot;https://github.com/gavinfish&quot;&gt;Jie Shen&lt;/a&gt; for contributing this&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;integration with the &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/blob/master/docs/features/secrets.adoc#secret-sources&quot;&gt;configuration-as-code&lt;/a&gt; plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;These changes were released in &lt;a href=&quot;https://github.com/jenkinsci/azure-keyvault-plugin/releases/tag/azure-keyvault-1.8&quot;&gt;v1.8&lt;/a&gt; but make sure to run the latest version of the plugin, there has been some fixes since then.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some advantages of using the credential provider rather than your own scripts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;your Jenkins jobs consume the credentials with no knowledge of Azure Key Vault, so they stay vendor-independent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the provider integrates with the ecosystem of existing Jenkins credential consumers, such as the Slack Notifications plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;credential usage is recorded in the central Jenkins credentials tracking log.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins can use multiple credentials providers concurrently, so you can incrementally migrate credentials to Azure Key Vault while consuming other credentials from your existing providers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Note: Currently only secret text credentials are supported via the credential provider, you can use the configuration-as-code integration to load the secret from Azure Key Vault into the System Credential Provider to work around this limitation.&lt;/em&gt;&lt;/p&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;Install the &lt;a href=&quot;https://plugins.jenkins.io/azure-keyvault/&quot;&gt;Azure Key Vault&lt;/a&gt; plugin&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then you will need to configure the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;azure-authentication&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#azure-authentication&quot; /&gt;Azure authentication&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s two types of authentication you can use &#39;Microsoft Azure Service Principal&#39; or &#39;Managed Identities for Azure Resources&#39;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The easiest one to set this up quickly with is the &#39;Microsoft Azure Service Principal&#39;,&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;az ad sp create-for-rbac &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; http://service-principal-name
Creating a role assignment under the scope of &lt;span class=&quot;s2&quot;&gt;&quot;/subscriptions/ff251390-d7c3-4d2f-8352-f9c6f0cc8f3b&quot;&lt;/span&gt;
  Retrying role assignment creation: 1/36
  Retrying role assignment creation: 2/36
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;s2&quot;&gt;&quot;appId&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;021b5050-9177-4268-a300-7880f2beede3&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;displayName&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;service-principal-name&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;name&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;http://service-principal-name&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;password&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;d9d0d1ba-d16f-4e85-9b48-81ea45a46448&quot;&lt;/span&gt;,
  &lt;span class=&quot;s2&quot;&gt;&quot;tenant&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;7e593e3e-9a1e-4c3d-a26a-b5f71de28463&quot;&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;If this doesn’t work then take a look at the &lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest&quot;&gt;Microsoft documentation&lt;/a&gt; for creating a service principal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Note: for production &#39;Managed Identities for Azure Resources&#39; is more secure as there’s no password involved and you don’t need to worry about the service principal’s password or certificate expiring.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;vault-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#vault-setup&quot; /&gt;Vault setup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You need to create a vault and give your service principal access 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;shell&quot;&gt;&lt;span class=&quot;nv&quot;&gt;RESOURCE_GROUP_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;my-resource-group
az group create &lt;span class=&quot;nt&quot;&gt;--location&lt;/span&gt; uksouth &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$RESOURCE_GROUP_NAME&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;VAULT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;my-vault &lt;span class=&quot;c&quot;&gt;# you will need a unique name for the vault&lt;/span&gt;
az keyvault create &lt;span class=&quot;nt&quot;&gt;--resource-group&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$RESOURCE_GROUP_NAME&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$VAULT&lt;/span&gt;
az keyvault set-policy &lt;span class=&quot;nt&quot;&gt;--resource-group&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$RESOURCE_GROUP_NAME&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$VAULT&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--secret-permissions&lt;/span&gt; get list &lt;span class=&quot;nt&quot;&gt;--spn&lt;/span&gt; http://service-principal-name&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;jenkins-credential&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-credential&quot; /&gt;Jenkins credential&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next step is to configure the credential in Jenkins:&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;click &#39;Credentials&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click &#39;System&#39; (it’ll appear below the Credentials link in the side bar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click &#39;Global credentials (unrestricted)&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click &#39;Add Credentials&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;select &#39;Microsoft Azure Service Principal&#39;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/azure-key-vault/azure-service-principal-drop-down.png&quot; alt=&quot;Microsoft Azure Service Principal dropdown&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;fill out the form from the credential created above, appId is &#39;Client ID&#39;, password is &#39;Client Secret&#39;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/azure-key-vault/azure-service-principal-configuration.png&quot; alt=&quot;Microsoft Azure Service Principal credential configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;click &#39;Verify Service Principal&#39;, you should see &#39;Successfully verified the Microsoft Azure Service Principal&#39;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click &#39;Save&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-azure-key-vault-plugin-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-azure-key-vault-plugin-configuration&quot; /&gt;Jenkins Azure Key Vault plugin configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You now have a credential you can use to interact with Azure resources from Jenkins, now you need to configure 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 back to the Jenkins home page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click &#39;Manage Jenkins&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click &#39;Configure System&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;search for &#39;Azure Key Vault Plugin&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;enter your vault url and select your credential
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/azure-key-vault/azure-key-vault-global-config.png&quot; alt=&quot;Azure Key Vault plugin configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;click &#39;Save&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;store-a-secret-in-azure-key-vault&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#store-a-secret-in-azure-key-vault&quot; /&gt;Store a secret in Azure Key Vault&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the step after this you will need a secret, so let’s create one now:&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;az keyvault secret &lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--vault-name&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$YOUR_VAULT&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; secret-key &lt;span class=&quot;nt&quot;&gt;--value&lt;/span&gt; my-super-secret&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;create-a-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#create-a-pipeline&quot; /&gt;Create a pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Install the &lt;a href=&quot;https://plugins.jenkins.io/workflow-aggregator/&quot;&gt;Pipeline&lt;/a&gt; plugin if you don’t already have it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the Jenkins home page, click &#39;New item&#39;, and then:&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;enter a name, i.e. &#39;key-vault-test&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click on &#39;Pipeline&#39;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;add the following to the pipeline definition:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
  agent any
  environment {
    SECRET_KEY = credentials(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;secret-key&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)
  }
  stages {
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Foo&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        echo SECRET_KEY
        echo SECRET_KEY.substring(&lt;span style=&quot;color:#00D&quot;&gt;0&lt;/span&gt;, SECRET_KEY.size() - &lt;span style=&quot;color:#00D&quot;&gt;1&lt;/span&gt;) &lt;span style=&quot;color:#777&quot;&gt;// shows the right secret was loaded, don&#39;t do this for real secrets unless you&#39;re debugging&lt;/span&gt;
      }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;withCredentials([string(&lt;span style=&quot;color:#606&quot;&gt;credentialsId&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;secret-key&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;variable&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;SECRET_KEY&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)]) {
    echo SECRET_KEY
    echo SECRET_KEY.substring(&lt;span style=&quot;color:#00D&quot;&gt;0&lt;/span&gt;, SECRET_KEY.size() - &lt;span style=&quot;color:#00D&quot;&gt;1&lt;/span&gt;) &lt;span style=&quot;color:#777&quot;&gt;// shows the right secret was loaded, don&#39;t do this for real secrets unless you&#39;re debugging&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You have now successfully retrieved a credential from Azure Key Vault using native Jenkins credentials integration.&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;configuration-as-code-integration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-as-code-integration&quot; /&gt;configuration-as-code integration&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph lead&quot;&gt;
&lt;p&gt;The Configuration as Code plugin has been designed as an opinionated way to configure Jenkins based on human-readable declarative configuration files. Writing such a file should be easy without being a Jenkins expert.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For many secrets the credential provider is enough,
but when integrating with other plugins you will likely need more than string credentials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use the &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;configuration-as-code plugin&lt;/a&gt; (aka JCasC) to allow integrating with other credential types.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configure-authentication&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-authentication&quot; /&gt;configure authentication&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the JCasC plugin runs during initial startup the Azure Key Vault credential provider needs to be configured before JCasC runs during startup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The easiest way to do that is via environment variables set before Jenkins starts up:&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;AZURE_KEYVAULT_URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;https://my.vault.azure.net
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AZURE_KEYVAULT_SP_CLIENT_ID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;...
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AZURE_KEYVAULT_SP_CLIENT_SECRET&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;...
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AZURE_KEYVAULT_SP_SUBSCRIPTION_ID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;...
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AZURE_KEYVAULT_SP_SUBSCRIPTION_ID&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;See the &lt;a href=&quot;https://github.com/jenkinsci/azure-keyvault-plugin#via-system-properties&quot;&gt;azure-keyvault documentation&lt;/a&gt; for other authentication options.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will now be able to refer to Azure Key Vault secret IDs in your jenkins.yaml 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;credentials&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;system&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;domainCredentials&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;credentials&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;usernamePassword&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;description&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;GitHub&quot;&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;jenkins-github&quot;&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;password&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;${jenkins-github-apikey}&quot;&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GLOBAL&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;username&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;jenkinsadmin&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;Thanks for reading, send feedback on twitter using the tweet button in the top right, any issues or feature requests use &lt;a href=&quot;https://github.com/jenkinsci/azure-keyvault-plugin/issues&quot;&gt;GitHub issues&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/03/17/ui-plugins/</id>
<title>Hands On: Beautify the user interface of Jenkins reporter plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-03-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/03/17/ui-plugins/" />
<author>
<name>uhafner</name>
</author>
<category term='ui'></category>
<category term='ux'></category>
<category term='plugins'></category>
<category term='developer'></category>
<summary>
This article has been presented in an recorded online session
during the Jenkins 2020 UI/UX Hackfest.


For Jenkins a large number of plugins are available that visualize the results of a wide variety of build steps. There
are plugins available to render the test results, the code coverage, the static analysis and so on. All of these plugins
typically pick up the build results of a given build step and show them in the user interface. In order to render these
details most of the plugins use static HTML pages, since this type of user interface is the standard visualization in
Jenkins since its inception in...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph lead&quot;&gt;
&lt;p&gt;This article has been presented in an &lt;a href=&quot;https://www.youtube.com/watch?v=GLLhi2UZlxI&quot;&gt;recorded online session&lt;/a&gt;
during the &lt;a href=&quot;https://www.jenkins.io/events/online-hackfest/2020-uiux/&quot;&gt;Jenkins 2020 UI/UX Hackfest&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For Jenkins a large number of plugins are available that visualize the results of a wide variety of build steps. There
are plugins available to render the test results, the code coverage, the static analysis and so on. All of these plugins
typically pick up the build results of a given build step and show them in the user interface. In order to render these
details most of the plugins use static HTML pages, since this type of user interface is the standard visualization in
Jenkins since its inception in 2007.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to improve the look and feel and the user experience of these plugins it makes sense to move forward and
incorporate some modern Java Script libraries and components. Since development of Blue Ocean has been stopped (see
&lt;a href=&quot;https://groups.google.com/forum/?utm_medium=email&amp;amp;utm_source=footer#!msg/jenkinsci-users/xngZrSsXIjc/btasuPpYCgAJ&quot;&gt;Jenkins mailing list post&lt;/a&gt;)
plugin authors need to decide on their own, which UI technologies are helpful for that task. However, the universe of
modern UI components is so overwhelming that it makes sense to pick up only a small set of components that are proven
to be useful and compatible with Jenkins underlying web technologies. Moreover, the initial setup of
incorporating such a new component is quite large so it would be helpful if that work needs to be done only once.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This guide introduces a few UI components
that make sense to be used by all plugin authors in the future to provide a rich user interface for reports in Jenkins.
In order to simplify the usage of these libraries in the context of Jenkins as a Java based web application, these
Java Script libraries and components have been packaged as ordinary Jenkins plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the following sections, these new components will be introduced step by step. In order to see how these components
can be used a plugin, I demonstrate the new features while enhancing the existing
&lt;a href=&quot;https://github.com/jenkinsci/forensics-api-plugin&quot;&gt;Forensics Plugin&lt;/a&gt; with a new user
interface. Since the Warnings Next Generation Plugin also uses these new components, you can see additional examples
in the &lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin/blob/master/doc/Documentation.md&quot;&gt;documentation of the warnings plugin&lt;/a&gt;
or in our public &lt;a href=&quot;https://ci.jenkins.io/job/Plugins/job/warnings-ng-plugin/job/master/pmd/&quot;&gt;ci.jenkins.io instance&lt;/a&gt;, that
already is using these components in the detail views of the warnings plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-user-interface-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-user-interface-plugins&quot; /&gt;1. New user interface plugins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following UI components are provided as new Jenkins plugins:&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/jquery3-api-plugin&quot;&gt;jquery3-api-plugin&lt;/a&gt;:
Provides &lt;a href=&quot;https://jquery.com&quot;&gt;jQuery 3&lt;/a&gt; for Jenkins Plugins.
jQuery is — as described on their home page — a fast, small, and feature-rich JavaScript library. It makes things
like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API
that works across a multitude of browsers. With a combination of versatility and extensibility, jQuery has changed the
way that millions of people write JavaScript.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/bootstrap4-api-plugin&quot;&gt;bootstrap4-api-plugin&lt;/a&gt;:
Provides &lt;a href=&quot;https://getbootstrap.com/&quot;&gt;Bootstrap 4&lt;/a&gt; for Jenkins Plugins. Bootstrap is — according to their self-perception — the world’s most popular front-end component library to build responsive, mobile-first projects on the web. It is
an open source toolkit for developing with HTML, CSS, and JS. Developers can quickly prototype their ideas or
build entire apps with their Sass variables and mixins, responsive grid system, extensive prebuilt components, and powerful plugins
built on jQuery.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/data-tables-api-plugin&quot;&gt;data-tables-api-plugin&lt;/a&gt;:
Provides &lt;a href=&quot;https://datatables.net&quot;&gt;DataTables&lt;/a&gt; for Jenkins Plugins.
DataTables is a plug-in for the jQuery Javascript library. It is a highly flexible tool, built upon the foundations
of progressive enhancement, that adds all of these advanced features to any HTML table:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Previous, next and page navigation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Filter results by text search&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sort data by multiple columns at once&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DOM, Javascript, Ajax and server-side processing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easily theme-able&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mobile friendly&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/echarts-api-plugin&quot;&gt;echarts-api-plugin&lt;/a&gt;:
Provides &lt;a href=&quot;https://echarts.apache.org/en/index.html&quot;&gt;ECharts&lt;/a&gt; for Jenkins Plugins. ECharts is an open-sourced
JavaScript visualization tool to create intuitive, interactive, and highly-customizable charts. It
can run fluently on PC and mobile devices and it is compatible with most modern
Web Browsers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/font-awesome-api-plugin&quot;&gt;font-awesome-api-plugin&lt;/a&gt;:
Provides &lt;a href=&quot;https://fontawesome.com&quot;&gt;Font Awesome&lt;/a&gt; for Jenkins Plugins. Font Awesome has vector icons and social logos,
according to their self-perception it is the web’s most popular icon set and toolkit. Currently, it contains more than
1,500 free icons.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/popper-api-plugin&quot;&gt;popper-api-plugin&lt;/a&gt;
Provides &lt;a href=&quot;https://popper.js.org&quot;&gt;Popper.js&lt;/a&gt; for Jenkins Plugins. Popper can
easily position tooltips, popovers or anything else with just a line of code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/plugin-util-api-plugin&quot;&gt;plugin-util-api-plugin&lt;/a&gt;: This small plugin provides
some helper and base classes to simplify the creation of reporters in Jenkins. This plugin also
provides a set of architecture rules that can be included in an architecture test suite of your 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;required-changes-for-a-plugin-pom&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#required-changes-for-a-plugin-pom&quot; /&gt;2. Required changes for a plugin POM&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to use these plugins you need to add them as dependencies in your plugin pom. You can use the following snippet
to add them all:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;pom.xml&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;project&amp;gt;&lt;/span&gt;

 [...]

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;plugin-util-api.version&amp;gt;&lt;/span&gt;1.0.2&lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugin-util-api.version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;font-awesome-api.version&amp;gt;&lt;/span&gt;5.12.0-7&lt;span class=&quot;nt&quot;&gt;&amp;lt;/font-awesome-api.version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;bootstrap4-api.version&amp;gt;&lt;/span&gt;4.4.1-10&lt;span class=&quot;nt&quot;&gt;&amp;lt;/bootstrap4-api.version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;echarts-api.version&amp;gt;&lt;/span&gt;4.6.0-8&lt;span class=&quot;nt&quot;&gt;&amp;lt;/echarts-api.version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;data-tables-api.version&amp;gt;&lt;/span&gt;1.10.20-13&lt;span class=&quot;nt&quot;&gt;&amp;lt;/data-tables-api.version&amp;gt;&lt;/span&gt;
    [...]
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.jenkins.plugins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;plugin-util-api&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${plugin-util-api.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.jenkins.plugins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;font-awesome-api&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${font-awesome-api.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.jenkins.plugins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;bootstrap4-api&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${bootstrap4-api.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.jenkins.plugins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;echarts-api&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${echarts-api.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.jenkins.plugins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;data-tables-api&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${data-tables-api.version}&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    [...]
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;

  [...]

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/project&amp;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;Alternatively, you have a look at the POM files of the
&lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin/blob/master/pom.xml#L249&quot;&gt;Warnings Next Generation Plugin&lt;/a&gt; or the
&lt;a href=&quot;https://github.com/jenkinsci/forensics-api-plugin/blob/master/pom.xml#L76&quot;&gt;Forensics API Plugin&lt;/a&gt; which already use these
plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reporter-structure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporter-structure&quot; /&gt;3. General structure of a reporter&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this section I will explain some fundamentals of the design of Jenkins, i.e. the Java model and the associated
user interface elements. If you are already familiar on how to implement the corresponding extension points of a
reporter plugin (see section &lt;a href=&quot;https://www.jenkins.io/doc/developer/extensibility/&quot;&gt;Extensibility&lt;/a&gt; in Jenkins&#39;
developer guide), then you can skip this section and head directly to &lt;a href=&quot;#extending-jenkins-model&quot;&gt;Section 3.1&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins organizes projects using the static object model structure shown in &lt;a href=&quot;#jenkins-model&quot;&gt;Figure 1&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;jenkins-model&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/jenkins-design.png&quot; alt=&quot;Jenkins design&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Jenkins design - high level view of the Java model&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The top level items in Jenkins user interface are jobs (at least the top level items
we are interested in). Jenkins contains several jobs of different types (Freestyle jobs, Maven Jobs, Pipelines, etc.).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each of these jobs contains an arbitrary number of builds (or more technically, runs). Each build is identified by its
unique build number. Jenkins plugins can attach results to these builds, e.g. build artifacts, test results,
analysis reports, etc. In order to attach such a result, a plugin technically needs to implement and create an action
that stores these results.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These Java objects are visualized in several different views, which are described in more detail in the following
sections. The top-level view that shows all available Jobs is shown in &lt;a href=&quot;#img-jobs&quot;&gt;Figure 2&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;img-jobs&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/jobs.png&quot; alt=&quot;Jobs&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Jenkins view showing all available jobs&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugins can also contribute UI elements in these views, but this is out of scope of this guide.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each job has a detail view, where plugins can extend corresponding extension points and provide summary boxes and
trend charts. Typically, summary boxes for reporters are not required on the job level, so I describe only trend charts
in more detail, see section &lt;a href=&quot;#trend-charts&quot;&gt;Section 5.5.2&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;img-job&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/job.png&quot; alt=&quot;Job details&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. Jenkins view showing details about a job&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each build has a detail view as well. Here plugins can provide summary boxes similar to the boxes for the job details
view. Typically, plugins show here only a short summary and provide a link to detailed results, see &lt;a href=&quot;#img-build&quot;&gt;Figure 4&lt;/a&gt; for
an example.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;img-build&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/build.png&quot; alt=&quot;Build details&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. Jenkins view showing details about a build&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last element in the view hierarchy actually is a dedicated view that shows the results of a specific plugin. E.g.,
there are views to show the test results, the analysis results, and so on. It is totally up to a given plugin what
elements should be shown there. In the next few sections I will introduce some new UI components that can be used
to show the corresponding results in a pleasant way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;extending-jenkins-model&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#extending-jenkins-model&quot; /&gt;3.1. Extending Jenkins object model&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since reporters typically are composed in a similar way, I extended Jenkins&#39; original object model
(see &lt;a href=&quot;#jenkins-model&quot;&gt;Figure 1&lt;/a&gt;) with some additional elements, so it will be much simpler to create or implement
a new reporter plugin. This new model is shown in &lt;a href=&quot;#jenkins-reporter-model&quot;&gt;Figure 5&lt;/a&gt;. The central element is a build action that
will store the results of a plugin reporter. This action will be attached to each build and will hold (and persist) the
results for a reporter. The detail data of each action will be automatically stored in an additional file, so the
memory footprint of Jenkins can be kept small if the details are never requested by users. Additionally, this
action is also used to simplify the creation of project actions and trend charts, see &lt;a href=&quot;#trend-charts&quot;&gt;Section 5.5.2&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;jenkins-reporter-model&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/reporter-design.png&quot; alt=&quot;Jenkins reporter design&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 5. Jenkins reporter design - high level view of the model for reporter plugins&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;forensics-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#forensics-plugin&quot; /&gt;4. Git Forensics plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The elements in this tutorial will be all used in the new
&lt;a href=&quot;https://github.com/jenkinsci/forensics-api-plugin&quot;&gt;Forensics API Plugin&lt;/a&gt; (actually the plugin is not new, it is a dependency of the
&lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin&quot;&gt;Warnings Next Generation Plugin&lt;/a&gt;). You can download the plugin content
and see in more detail how these new components can be used in practice. Or you can change this plugin just to see
how these new components can be parameterized.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are using Git as source code management system then this plugin will mine
the repository in the style of
&lt;a href=&quot;https://www.adamtornhill.com/articles/crimescene/codeascrimescene.htm&quot;&gt;Code as a Crime Scene&lt;/a&gt;
(Adam Tornhill, November 2013) to determine statistics of the contained source code files:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;total number of commits&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;total number of different authors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;creation time&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;last modification time&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin provides a new step (or post build publisher) that starts the repository mining and stores
the collected information in a Jenkins action (see &lt;a href=&quot;#jenkins-reporter-model&quot;&gt;Figure 5&lt;/a&gt;). Afterwards you get a new
build summary that shows the total number of scanned files (as trend and as build result). From
here you can navigate to the details view that shows the scanned files in a table that can be
simply sorted and filtered. You also will get some pie charts that show important aspects of the
commit history.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please note that this functionality of the plugin still is a proof of concept: the performance of this step heavily
depends on the size and the number of commits of your Git repository. Currently it scans the whole repository in each
build. In the near future I hope to find a volunteer who is interested in replacing this dumb algorithm with an incremental scanner.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reporter-detail&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporter-detail&quot; /&gt;5. Introducing the new  UI components&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As already mentioned in &lt;a href=&quot;#reporter-structure&quot;&gt;Section 3&lt;/a&gt;, a details view is plugin specific. What is shown and how these
elements are presented is up to the individual plugin author. So in the next sections I provide some examples
and new concepts that plugins can use as building blocks for their own content.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;font-awesome&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#font-awesome&quot; /&gt;5.1. Modern icons&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins plugins typically do not use icons very frequently. Most plugins provide an icon for the actions and that’s it.
If you intend to use icons in other places, plugin authors are left on their own: the recommended Tango icon set is more
than 10 years old and too limited nowadays. There are several options available, but the most popular is the
&lt;a href=&quot;https://fontawesome.com&quot;&gt;Font Awesome Icon Set&lt;/a&gt;. It provides more than 1500 free icons that follow the same
design guidelines:&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;img-font-awesome&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/font-awesome.png&quot; alt=&quot;Font Awesome icons&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 6. Font Awesome icons in Jenkins plugins&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to use Font Awesome icons in a plugin you simply need a dependency to the corresponding
&lt;a href=&quot;https://github.com/jenkinsci/font-awesome-api-plugin&quot;&gt;font-awesome-api-plugin&lt;/a&gt;. Then you can use any of the solid icons
by using the new tag &lt;code&gt;svg-icon&lt;/code&gt; in your jelly view:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;index.jelly&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;table class=&quot;linenotable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:st=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:stapler&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:l=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/lib/layout&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:fa=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/font-awesome&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

  [...]
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;fa:svg-icon&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;check-double&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;no-issues-banner&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  [...]

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are generating views using Java code, then you also can use the class &lt;code&gt;SvgTag&lt;/code&gt; to generate the
HTML markup for such an icon.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;bootstrap-grid&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bootstrap-grid&quot; /&gt;5.2. Grid layout&lt;/h3&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;:bulb:&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Jenkins currently includes in all views an old and patched version of Bootstrap’s grid system (with 24 columns). This version
is not compatible with Bootstrap 4 or any of the JS libraries that depend on Bootstrap4. In order to use Bootstrap 4
features we need to replace the Jenkins provided &lt;code&gt;layout.jelly&lt;/code&gt; file with a patched version, that does not load
the broken grid system. I’m planning to create a PR that fixes the grid in Jenkins core, but that will take some time.
Until then you will need to use the provided &lt;code&gt;layout.jelly&lt;/code&gt; of the Bootstrap4 plugin, see below.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first thing to decide is, which elements should be shown on a plugin page and how much space each element
should occupy. Typically, all visible components are mapped on the available space using a simple grid.
In a Jenkins view we have a fixed header and footer and a navigation bar on the left
(20 percent of the horizontal space). The rest of a screen can be used by
a details view. In order to simplify the distribution of elements in that remaining space we use
&lt;a href=&quot;https://getbootstrap.com/docs/4.4/layout/grid/&quot;&gt;Bootstrap’s grid system&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;img-grid&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/grid.png&quot; alt=&quot;Grid layout in Jenkins&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 7. Jenkins layout with a details view that contains a grid system&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That means, a view is split into 12 columns and and arbitrary number of rows. This grid system is simple to use
(but complex enough to also support fancy screen layouts) - I won’t go into
details here, please refer to the &lt;a href=&quot;https://getbootstrap.com/docs/4.4/layout/grid/&quot;&gt;Bootstrap documentation&lt;/a&gt;
for details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the forensics detail view we use a simple grid of two rows and two columns. Since the number of columns always is 12
we need to create two &quot;fat&quot; columns that fill 6 of the standard columns.
In order to create such a view in our
plugin we need to create a view given as a jelly file and a corresponding Java view model object. A view with this layout
is shown in the following snippet:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;index.jelly&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;table class=&quot;linenotable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:st=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:stapler&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:l=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/lib/layout&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:bs=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/bootstrap&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;bs:layout&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;title=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${it.displayName}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;norefresh=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;st:include&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;it=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${it.owner}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;page=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;sidepanel.jelly&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;l:main-panel&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;st:adjunct&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;includes=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;io.jenkins.plugins.bootstrap4&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;fluid-container&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;

        &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;row py-3&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;col-6&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;(5)&lt;/b&gt;
            Content of column 1 in row 1
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;col-6&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;6&quot; /&gt;&lt;b&gt;(6)&lt;/b&gt;
            Content of column 2 in row 1
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

        &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;row py-3&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;7&quot; /&gt;&lt;b&gt;(7)&lt;/b&gt;
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;col&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;8&quot; /&gt;&lt;b&gt;(8)&lt;/b&gt;
            Content of row 2
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/l:main-panel&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/bs:layout&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Use a custom layout based on Bootstrap: since Jenkins core contains an old version of Bootstrap,
we need to replace the standard layout.jelly file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Import Bootstrap 4: Importing of JS and CSS components is done using the adjunct concept,
which is the preferred way of referencing static resources within Jenkins&#39; Stapler Web framework.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The whole view will be placed into a fluid container that fills up the whole screen (100% width).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A new row of the view is specified with class &lt;code&gt;row&lt;/code&gt;. The additional class &lt;code&gt;py-3&lt;/code&gt; defines the padding to use for
this row, see &lt;a href=&quot;https://getbootstrap.com/docs/4.0/utilities/spacing/&quot;&gt;Bootstrap Spacing&lt;/a&gt; for more details.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Since Bootstrap automatically splits up a row into 12 equal sized columns we define here
that the first column should occupy 6 of these 12 columns. You can also leave off the detailed numbers, then Bootstrap will
automatically distribute the content in the available space. Just be aware that this not what you want in most of the times.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;6&quot; /&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The second column uses the remaining space, i.e. 6 of the 12 columns.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;7&quot; /&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The second row uses the same layout as row 1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;8&quot; /&gt;&lt;b&gt;8&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;There is only one column for row 1, it will fill the whole available space.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also specify different column layouts for one row, based on the actual visible size of the screen.
This helps to improve the layout for larger screens. In the warnings plugin you will find
an example: on small devices, there is one card visible that shows one pie chart in a carousel. If you are
opening the same page on a larger device, then two of the pie charts are shown side by side and the carousel is hidden.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cards&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cards&quot; /&gt;5.3. Cards&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When presenting information of a plugin as a block, typically plain text elements are shown. This will normally result
in some kind of boring web pages. In order to create a more appealing interface, it makes sense to present such information
in a card, that has a border, a header, an icon, and so on. In order to create such a
&lt;a href=&quot;https://getbootstrap.com/docs/4.4/components/card/&quot;&gt;Bootstrap card&lt;/a&gt; a small jelly tag has been provided by the new
&lt;a href=&quot;https://github.com/jenkinsci/bootstrap4-api-plugin&quot;&gt;Bootstrap plugin&lt;/a&gt; that simplifies this task for a plugin.
Such a card can be easily created in a jelly view in the following way:&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;xml&quot;&gt;&lt;table class=&quot;linenotable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;bs:card&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;title=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${%Card Title}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;fontAwesomeIcon=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;icon-name&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  Content of the card
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/bs:card&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;#img-card&quot;&gt;Figure 8&lt;/a&gt; examples of such cards are shown. The cards in the upper row contain pie charts that show the
distribution of the number of authors and commits in the whole repository. The card at the bottom shows the detail
information in a DataTable. The visualization is not limited to charts or tables, you can
show any kind of HTML content in there. You can show any icon of your
plugin in these cards, but it is recommended to use one of the existing &lt;a href=&quot;https://fontawesome.com&quot;&gt;Font Awesome&lt;/a&gt; icons
to get a consistent look and feel in Jenkins&#39; plugin ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;img-card&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/card.png&quot; alt=&quot;Card examples&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 8. Bootstraps cards in Jenkins plugins&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that the size of the cards is determined by the grid configuration, see &lt;a href=&quot;#bootstrap-grid&quot;&gt;Section 5.2&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tables&quot; /&gt;5.4. Tables&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A common UI element to show plugin details is a table control. Most plugins (and Jenkins core) typically use
plain HTML tables. However, if the table should show a large number of rows then using a more sophisticated control
like  &lt;a href=&quot;https://datatables.net&quot;&gt;DataTables&lt;/a&gt; makes more sense. Using this JS based table control provides additional
features at no cost:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;filter results by text search&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;provide pagination of the result set&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sort data by multiple columns at once&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;obtain table rows using Ajax calls&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;show and hide columns based on the screen resolution&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to use &lt;a href=&quot;https://datatables.net&quot;&gt;DataTables&lt;/a&gt; in a view there are two options, you can either decorate existing
static HTML tables (see &lt;a href=&quot;#tables-static&quot;&gt;Section 5.4.1&lt;/a&gt;) or populate the table content using Ajax (see &lt;a href=&quot;#tables-dynamic&quot;&gt;Section 5.4.2&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;tables-static&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tables-static&quot; /&gt;5.4.1. Tables with static HTML content&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The easiest way of using DataTables is by creating a static HTML table that will be decorated by simply calling the
constructor of the datatable. This approach involves no special handling on the Java and Jelly side, so I think it is
sufficient to follow the &lt;a href=&quot;https://datatables.net/examples/basic_init/zero_configuration.html&quot;&gt;example&lt;/a&gt; in the DataTables
documentation. Just make sure that after building the table in your Jelly file you need to decorate the table
with the following piece of code:&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;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:st=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:stapler&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;st:adjunct&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;includes=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;io.jenkins.plugins.jquery3&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;st:adjunct&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;includes=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;io.jenkins.plugins.data-tables&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

  [...]

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;table-responsive&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;table&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;table table-hover table-striped display&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
            [...]
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  [...]
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
     $(&#39;#id&#39;).DataTable(); &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;replace &lt;code&gt;id&lt;/code&gt; with the ID of your HTML table element&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Forensics plugin no such static table is used so far, but you can have a look at the
&lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin/blob/master/plugin/src/main/resources/io/jenkins/plugins/analysis/core/model/FixedWarningsDetail/index.jelly&quot;&gt;table that shows fixed warnings&lt;/a&gt;
in the warnings plugin to see how such a table can be decorated.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;tables-dynamic&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tables-dynamic&quot; /&gt;5.4.2. Tables with dynamic model based content&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While static HTML tables are easy to implement, they have several limitations. So it makes sense to follow a more
sophisticated approach. Typically, tables in user interfaces are defined by using a corresponding table (and row) model.
Java Swing successfully provides such a
&lt;a href=&quot;https://docs.oracle.com/javase/tutorial/uiswing/components/table.html&quot;&gt;table model&lt;/a&gt; concept since the early days of Java.
I adapted these concepts for Jenkins and DataTables as well. In order to create a table in a Jenkins view a plugin
needs to provide a table model class, that provides the following information:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;the ID of the table (since there might be several tables in the view)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the model of the columns (i.e., the number, type, and header labels of the columns)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the content of the table (i.e. the individual row objects)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will find an example of such a table in the Forensics plugin: here a table lists
the files in your Git repository combined with the corresponding commit statistics (number of authors,
number of commits, last modification, first commit). A screenshot of that table is shown in &lt;a href=&quot;#img-table&quot;&gt;Figure 9&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;img-table&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/table.png&quot; alt=&quot;Table example&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 9. Dynamic Table in the Forensics plugin&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to create such a table in Jenkins, you need to create a table model class that derives from &lt;code&gt;TableModel&lt;/code&gt;.
In &lt;a href=&quot;#forensics-table-model&quot;&gt;Figure 10&lt;/a&gt; a diagram of the corresponding classes in the Forensics plugin is shown.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;forensics-table-model&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/table-model.png&quot; alt=&quot;Table model&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 10. Table model of the Forensics plugin&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;table-column-model&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#table-column-model&quot; /&gt;Table column model&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This first thing a table model class defines is a model of the available columns by creating corresponding
 &lt;code&gt;TableColumn&lt;/code&gt; instances. For each column you need to specify a header label and the name of the bean property that
should be shown in the corresponding column (the row elements are actually Java beans: each column will
show one distinct property of such a bean, see next section). You can
use any of the &lt;a href=&quot;https://datatables.net/reference/option/columns.type&quot;&gt;supported column types&lt;/a&gt; by simply providing a
&lt;code&gt;String&lt;/code&gt; or &lt;code&gt;Integer&lt;/code&gt; based column.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;table-rows-content&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#table-rows-content&quot; /&gt;Table rows content&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, a table model class provides the content of the rows. This &lt;code&gt;getRows()&lt;/code&gt; method
will be invoked asynchronously using an Ajax call. Typically, this method simply returns a list of Java Bean instances,
that provide the properties of each column (see previous section). These objects will be converted automatically
to an array of JSON objects, the basic data structure required for the DataTables API.
You will find a fully working example table model
implementation in the Git repository of the forensics plugin in the class
&lt;a href=&quot;https://github.com/jenkinsci/forensics-api-plugin/blob/master/src/main/java/io/jenkins/plugins/forensics/miner/ForensicsTableModel.java&quot;&gt;ForensicsTableModel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to use such a table in your plugin view you need to create the table in the associated
Jelly file using the new &lt;code&gt;table&lt;/code&gt; tag:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;index.jelly&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:dt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/data-tables&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    [...]
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;st:adjunct&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;includes=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;io.jenkins.plugins.data-tables&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;nt&quot;&gt;&amp;lt;dt:table&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;model=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${it.getTableModel(&#39;id&#39;)}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
    [...]
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;replace &lt;code&gt;id&lt;/code&gt; with the id of your table&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The only parameter you need to provide for the table is the model — it is typically part of the corresponding
Jenkins view model class (this object is referenced with &lt;code&gt;${it}&lt;/code&gt; in the view).
In order to connect the corresponding Jenkins view model class with the table, the view model class needs to
implement the &lt;code&gt;AsyncTableContentProvider&lt;/code&gt; interface. Or even simpler, let your view model class derive from
&lt;code&gt;DefaultAsyncTableContentProvider&lt;/code&gt;. This relationship is required, so that Jenkins can automatically create
and bind a proxy for the Ajax calls that will automatically fill the table content after the HTML page has been created.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If we put all those pieces together, we are required to define a model similar to the model of the Forensics plugin,
that is shown in &lt;a href=&quot;#jenkins-view-model&quot;&gt;Figure 11&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;jenkins-view-model&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/forensics-view-model.png&quot; alt=&quot;Forensics view model&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 11. Jenkins reporter design - high level view of the model for reporter plugins&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As already described in &lt;a href=&quot;#jenkins-reporter-model&quot;&gt;Figure 5&lt;/a&gt; the plugin needs to attach a &lt;code&gt;BuildAction&lt;/code&gt; to each build. The
Forensics plugin attaches a &lt;code&gt;ForensicBuildAction&lt;/code&gt; to the build. This action stores a &lt;code&gt;RepositoryStatistics&lt;/code&gt; instance,
that contains the repository results for a given build. This action delegates all Stapler requests to a new
&lt;a href=&quot;https://javadoc.jenkins.io/component/stapler/org/kohsuke/stapler/StaplerProxy.html&quot; title=&quot;Javadoc for org.kohsuke.stapler.StaplerProxy&quot;&gt;Stapler proxy instance&lt;/a&gt; so we can keep the
action clean of user interface code. This &lt;code&gt;ForensicsViewModel&lt;/code&gt; class then acts as view model that provides the server
side model for the corresponding Jelly view given by the file &lt;code&gt;index.jelly&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While this approach looks quite complex at a first view, you will see that the actual implementation part
is quite small. Most of the boilerplate code is already provided by the base classes and you need to implement
only a few methods. Using this concept also provides some additional features, that are part of the DataTables plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ordering of columns is persisted automatically in the browser local storage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Paging size is persisted automatically in the browser local storage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Ajax calls are actually invoked only if a table will become visible. So if you have
several tables hidden in tabs then the content will be loaded on demand only, reducing the amount of data
to be transferred.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is an option available to provide an additional details row that can be expanded with a + symbol,
see &lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin/blob/master/doc/images/details.png&quot;&gt;warnings plugin table&lt;/a&gt; for details.&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;sect2&quot;&gt;
&lt;h3 id=&quot;charts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#charts&quot; /&gt;5.5. Charts&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A plugin reporter typically also reports some kind of trend from build to build. Up to now Jenkins core provides only a
quite limited concept of rendering such trends as trend charts. The
&lt;a href=&quot;http://www.jfree.org/jfreechart/&quot;&gt;JFreeChart framework&lt;/a&gt; offered by Jenkins core is a server
side rendering engine that creates charts as static PNG images that will be included on the job and details pages.
Nowadays, several powerful JS based charting libraries are available, that do the same job
(well actually an even better job) on the client side. That has the advantage that these charts can be customized
on each client without affecting the server performance. Moreover, you get a lot of additional
features (like zooming, animation, etc.) for free. Additionally, these charting libraries not only support the typical
build trend charts but also a lot of additional charts types that can be used to improve the user experience of
a plugin.
One of those charting libraries is &lt;a href=&quot;https://echarts.apache.org/en/index.html&quot;&gt;ECharts&lt;/a&gt;: this library has a powerful API
and supports literally every chart type one can image of. You can get some impressions of the features on the
&lt;a href=&quot;https://echarts.apache.org/examples/en/&quot;&gt;examples page&lt;/a&gt; of the library.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to use these charts one can embed charts that use this library by importing the corresponding JS files and by
defining the chart in the corresponding Jelly file. While that already works quite well it
will be still somewhat cumbersome to provide the corresponding model for these charts from Jenkins build results. So
I added a powerful Java API that helps to create the model for these charts on the Java side. This API provides the
following features:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create trend charts based on a collection of build results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Separate the chart type from the aggregation in order to simplify unit testing of the chart model.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Toggle the type of the X-Axis between build number or build date (with automatic aggregation of results that
have been recorded at the same day).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic conversion of the Java model to the required JSON model for the JS side.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for pie and line charts (more to come soon).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Those charts can be used as trend chart in the project page (see &lt;a href=&quot;#img-job&quot;&gt;Figure 3&lt;/a&gt;) or as information chart in the details
view of a plugin (see &lt;a href=&quot;#reporter-detail&quot;&gt;Section 5&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;pie-charts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pie-charts&quot; /&gt;5.5.1. Pie charts&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A simple but still informative chart is a pie chart that illustrates numerical proportions of plugin data. In the Forensics
plugin I am using this chart to show the numerical proportions of the number of authors or commits for the
source code files in the Git repository (see &lt;a href=&quot;#img-card&quot;&gt;Figure 8&lt;/a&gt;). In the warnings plugin I use this chart to show the
numerical proportions of the new, outstanding, or fixed warnings, see &lt;a href=&quot;#img-pie&quot;&gt;Figure 12&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;img-pie&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/pie.png&quot; alt=&quot;Pie chart example&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 12. Pie chart in the Warnings plugin&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to include such a chart in your details view, you can use the provided &lt;code&gt;pie-chart&lt;/code&gt; tag.
In the following snippet you see this tag in action (embedded in a Bootstrap card, see &lt;a href=&quot;#cards&quot;&gt;Section 5.3&lt;/a&gt;):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;index.jelly&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;table class=&quot;linenotable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt;  &lt;span class=&quot;na&quot;&gt;xmlns:c=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/charts&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:bs=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/bootstrap&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

    [...]
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;bs:card&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;title=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${%Number of authors}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;fontAwesomeIcon=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;users&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;c:pie-chart&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;authors&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;model=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${it.authorsModel}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;height=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;256&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/bs:card&amp;gt;&lt;/span&gt;
    [...]

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You need to provide a unique ID for this chart and the corresponding model value. The model must be the JSON
representation of a corresponding &lt;code&gt;PieChartModel&lt;/code&gt; instance. Such a model can be created with a couple of lines:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;ViewModel.java&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;java&quot;&gt;&lt;table class=&quot;linenotable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6
7
8
9&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;    &lt;span class=&quot;o&quot;&gt;[...]&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;PieChartModel&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PieChartModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Title&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PieData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Segment 1 name&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&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;nc&quot;&gt;Palette&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;RED&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PieData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Segment 2 name&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Palette&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;GREEN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PieData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Segment 3 name&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Palette&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;YELLOW&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JacksonFacade&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toJson&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;[...]&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;trend-charts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#trend-charts&quot; /&gt;5.5.2. Trend charts on the job level view&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to show a trend that renders a line chart on the job page (see &lt;a href=&quot;#img-job&quot;&gt;Figure 3&lt;/a&gt;) you need to provide a so called
floating box (stored in the file &lt;code&gt;floatingBox.jelly&lt;/code&gt; of your job action (see &lt;a href=&quot;#reporter-structure&quot;&gt;Section 3&lt;/a&gt;)).
The content of this file is quite simple and contains just a &lt;code&gt;trend-chart&lt;/code&gt; tag:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;floatingBox.jelly&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;&lt;table class=&quot;linenotable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:c=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/charts&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;c:trend-chart&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;it=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${from}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;title=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${%SCM Files Count Trend}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;enableLinks=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the Java side the model for the chart needs to be provided in the corresponding sub class of &lt;code&gt;JobAction&lt;/code&gt; (which is
the owner of the floating box). Since the computation of trend charts is quite expensive on the server side as well
(several builds need to be read from disk and the interesting data points need to be computed) this process has been
put into a separate background job. Once the computation is done the result is shown via an Ajax call. In order to
hide these details for plugin authors you should simply derive your &lt;code&gt;JobAction&lt;/code&gt; class from the corresponding
&lt;code&gt;AsyncTrendJobAction&lt;/code&gt; class, that already contains the boilerplate code. So your static plugin object model will actually
become a little bit more complex:&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;jenkins-chart-model&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/chart-model.png&quot; alt=&quot;Jenkins chart model&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 13. Jenkins chart model design&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Basically, you need to implement the method &lt;code&gt;LinesChartModel createChartModel()&lt;/code&gt; to create the line
chart. This method is quite simple to implement, since most of the hard work is provided by the library: you will
invoke with an iterator of your build actions, starting with the latest build. The iterator advances from build to build
until no more results are available (or the maximum number of builds to consider has been reached). The most important
thing to implement in your plugin is the way how data points are computed for a given &lt;code&gt;BuildAction&lt;/code&gt;. Here is an example of
such a &lt;code&gt;SeriesBuilder&lt;/code&gt; implementation in the Forensics Plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;FilesCountSeriesBuilder.java&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;java&quot;&gt;&lt;table class=&quot;linenotable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;io.jenkins.plugins.forensics.miner&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.util.HashMap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.util.Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;edu.hm.hafner.echarts.SeriesBuilder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/**
 * Builds one x-axis point for the series of a line chart showing the number of files in the repository.
 *
 * @author Ullrich Hafner
 */&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FilesCountSeriesBuilder&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SeriesBuilder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;ForensicsBuildAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;TOTALS_KEY&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;total&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Integer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;computeSeries&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ForensicsBuildAction&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;current&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;nc&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Integer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;series&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HashMap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;series&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;TOTALS_KEY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;current&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getNumberOfFiles&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;series&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;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You are not limited to a single line chart. You can show several lines in a single chart, you can show stacked values,
or even the delta between some values. You can also have a look at the
&lt;a href=&quot;https://github.com/jenkinsci/warnings-ng-plugin/tree/master/src/main/java/io/jenkins/plugins/analysis/core/charts&quot;&gt;charts of the warnings plugin&lt;/a&gt;
to see some of these features in detail.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;img-trend&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/trend-lines.png&quot; alt=&quot;Trend with several lines example&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 14. Trend chart with several lines in the Warnings plugin&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;img-stacked&quot; class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-ui-plugins/trend-stacked.png&quot; alt=&quot;Trend chart with stacked lines example&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 15. Trend chart with stacked lines in the Warnings plugin&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;&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/03/02/pipeline-authoring-sig-update/</id>
<title>Pipeline-Authoring SIG Update</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-03-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/03/02/pipeline-authoring-sig-update/" />
<author>
<name>markyjackson-taulia</name>
</author>
<category term='Pipeline-Authoring'></category>
<category term='SIG'></category>
<category term='community'></category>
<category term='opensource'></category>
<summary>
What is the Pipeline-Authoring Special Interest Group

This special interest group aims to improve and curate the experience of authoring Jenkins Pipelines. This includes the
syntax of `Jenkinsfile`s and shared libraries, code sharing and reuse, testing of Pipelines and shared libraries, IDE
integration and other development tools, documentation, best practices, and examples.



What Are The Focus Areas of the Pipeline-Authoring Special Interest Group



Syntax - How `Jenkinsfile`s and shared libraries are written.


Code sharing and reuse - Shared libraries and future improvements.


Testing - Unit and functional testing of `Jenkinsfile`s and shared libraries.


IDE integration, editors, and other development tools - IDE plugins, visual editors, etc.


Documentation - Reference...
</summary>
<content type='html'>
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;what-is-the-pipeline-authoring-special-interest-group&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-pipeline-authoring-special-interest-group&quot; /&gt;What is the Pipeline-Authoring Special Interest Group&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This special interest group aims to improve and curate the experience of authoring Jenkins Pipelines. This includes the
syntax of `Jenkinsfile`s and shared libraries, code sharing and reuse, testing of Pipelines and shared libraries, IDE
integration and other development tools, documentation, best practices, and examples.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-are-the-focus-areas-of-the-pipeline-authoring-special-interest-group&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-are-the-focus-areas-of-the-pipeline-authoring-special-interest-group&quot; /&gt;What Are The Focus Areas of the Pipeline-Authoring Special Interest Group&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Syntax - How `Jenkinsfile`s and shared libraries are written.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code sharing and reuse - Shared libraries and future improvements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Testing - Unit and functional testing of `Jenkinsfile`s and shared libraries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IDE integration, editors, and other development tools - IDE plugins, visual editors, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation - Reference documentation, tutorials, and more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Best practices - Defining, maintaining, and evangelizing best practices in Jenkins Pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Examples - Real-world `Jenkinsfile`s and shared libraries demonstrating how to utilize various features of Pipeline,
as well as basic or starter `Jenkinsfile`s for common patterns that can be used as jumping-off points by new users.&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;what-have-we-been-up-to&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-have-we-been-up-to&quot; /&gt;What Have We Been Up To&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the start of a new year, members got together to discuss the roadmap for 2020. During the initial discussions we
determined that it would be good to examine the goals of previous meetings and determine the best path forward.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A mutual decision was made that to better create a roadmap; we needed to understand better who we were aiming to help.
We decided that creating personas was very beneficial. Personas are fictional characters, which we are creating based
upon our research to represent the different user types that might use Jenkins pipelines.
Creating personas can help us step out of ourselves. It can help us to recognize that different people have different
needs and expectations, and it can also help us to identify with the user we are building the roadmap for. Personas make
the task at hand less complicated, they guide our ideation processes, and they can help us to achieve the goal of
creating a good user experience for our target user group.
A lot of that work can be found here:
&lt;a href=&quot;https://docs.google.com/document/d/1CdyzJwt50Wk3uUNsLMl2d4w2MGYss-phqet0s-KjbEs/edit&quot; class=&quot;bare&quot;&gt;https://docs.google.com/document/d/1CdyzJwt50Wk3uUNsLMl2d4w2MGYss-phqet0s-KjbEs/edit&lt;/a&gt;
The idea is to map the personas to a maturity model and then map the maturity model to the actual documentation. That
maturity model can be found here: &lt;a href=&quot;https://drive.google.com/file/d/1ByzWlPU0j1qM_gqspJppkNKkR5ZVLWlB/view&quot; class=&quot;bare&quot;&gt;https://drive.google.com/file/d/1ByzWlPU0j1qM_gqspJppkNKkR5ZVLWlB/view&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-can-i-get-involved&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-i-get-involved&quot; /&gt;How Can I Get Involved&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have been meeting regularly to define personas to help us better create the SIG roadmap. We meet twice a week,
once on Thursday for the EMEA timezone and once on Friday for the US timezone. Meeting notes can be found here:
&lt;a href=&quot;https://docs.google.com/document/d/1EhWoBplGl4M8bHz0uuP-iOynPGuONjcz4enQm8sDyUE/edit#&quot; class=&quot;bare&quot;&gt;https://docs.google.com/document/d/1EhWoBplGl4M8bHz0uuP-iOynPGuONjcz4enQm8sDyUE/edit#&lt;/a&gt; and the calendar, if you would
like to attend &lt;a href=&quot;https://www.jenkins.io/event-calendar&quot;&gt;here&lt;/a&gt;. The previous recording of the meetings are
located here: &lt;a href=&quot;https://www.youtube.com/watch?v=pz_kPpb9C1w&amp;amp;list=PLN7ajX_VdyaOKKLBXek6iG8wTS24Ac7Y3&quot; class=&quot;bare&quot;&gt;https://www.youtube.com/watch?v=pz_kPpb9C1w&amp;amp;list=PLN7ajX_VdyaOKKLBXek6iG8wTS24Ac7Y3&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;next-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-steps&quot; /&gt;Next Steps&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have a lot of work to do and could use your help. If you would love to join us, check out the meeting link. If you
would like to check out the personas and give feedback, also check out the link.
Once we have wrapped up the personas work, we will start to identify the available documentation and ensure we have
adequate documentation with the help of the Doc SIG.
We will finally then start working to build out tools to help the community with pipelines in Jenkins better.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contact-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contact-us&quot; /&gt;Contact Us&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you would like to get in touch with the Pipeline-Authoring SIG, you can by joining the
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_pipeline-authoring-sig:gitter.im&quot;&gt;Pipeline-Authoring SIG gitter channel&lt;/a&gt; or via the
&lt;a href=&quot;https://groups.google.com/g/jenkins-pipeline-authoring-sig/&quot;&gt;Pipeline-Authoring SIG mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/03/02/findsecbugs/</id>
<title>Findsecbugs for Developers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-03-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/03/02/findsecbugs/" />
<author>
<name>jeffret-b</name>
</author>
<category term='jenkins'></category>
<category term='security'></category>
<category term='developer'></category>
<summary>
Spotbugs is a utility used in Jenkins and many other Java projects to detect common Java coding mistakes and bugs. It is integrated into the build process to improve the code before it gets merged and released. Findsecbugs is a plugin for Spotbugs that adds 135 vulnerability types focused on the OWASP TOP 10 and the Common Weakness Enumeration (CWE). I&#8217;m working on integrating findsecbugs into our Jenkins ecosystem.


Background


Spotbugs traces its history through Findbugs, which started in 2006. As Findbugs it was widely adopted by many projects. About 2016, the Findbugs project ground to a halt. Like the mythical phoenix,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph lead&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://spotbugs.github.io/&quot;&gt;Spotbugs&lt;/a&gt; is a utility used in Jenkins and many other Java projects to detect common Java coding mistakes and bugs. It is integrated into the build process to improve the code before it gets merged and released. &lt;a href=&quot;https://find-sec-bugs.github.io/&quot;&gt;Findsecbugs&lt;/a&gt; is a plugin for Spotbugs that adds 135 vulnerability types focused on the &lt;a href=&quot;https://owasp.org/www-project-top-ten/&quot;&gt;OWASP TOP 10&lt;/a&gt; and the &lt;a href=&quot;https://cwe.mitre.org/&quot;&gt;Common Weakness Enumeration (CWE)&lt;/a&gt;. I’m working on integrating findsecbugs into our Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Spotbugs traces its history through Findbugs, which started in 2006. As Findbugs it was widely adopted by many projects. About 2016, the Findbugs project ground to a halt. Like the mythical phoenix, the Spotbugs project rose from the ashes to keep the capabilities alive. Most things are completely compatible between the two systems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has used Findbugs and now Spotbugs for years. This is integrated as a build step into parent Maven poms, including the &lt;a href=&quot;https://github.com/jenkinsci/plugin-pom/&quot;&gt;plugin parent pom&lt;/a&gt; and the &lt;a href=&quot;https://github.com/jenkinsci/pom&quot;&gt;parent pom for libraries and core components&lt;/a&gt;. There are various properties that can be set to control the detection threshold, the effort, and findings or categories to exclude. Take a look at the effective pom for a project to see the settings.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conundrums&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conundrums&quot; /&gt;Conundrums&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is a fundamental conundrum with introducing an analysis tool into a project. The best time to have done it is always in the past, particularly when the project first started. There are always difficulties in introducing it into an existing project. Putting it off for later just delays the useful results and makes later implementation more difficult. The best time to do it is now, as early as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All analysis tools are imperfect. They report some issues that don’t actually exist. They miss some important issues. This is worse in legacy code, making the adoption more difficult. Findings have to be examined and evaluated. Some are code weaknesses but don’t indicate necessary fixes. For example, MD5 has been known for years as a weak algorithm, unsuitable for security uses. It can be used for non-security purposes, such as fingerprinting, but even there other algorithms (SHA-2) are preferred. We should replace all usages of MD5, but in some cases that’s difficult and it’s not exactly a problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ultimately, the gain from these analysis tools isn’t so much from finding issues in existing code. The value comes more from catching new regressions that might be introduced or improving new code. This is one reason why it is valuable to add useful new analysis such as findsecbugs now, so that we can begin reaping the benefits.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With a security tool like findsecbugs, there is another paradox. Adding the tool makes it easier to find potential security issues. Attackers could take advantage of this information. However, security by obscurity is not a good design. Anyone can run findsecbugs now without the project integrating it. Integrating it makes it easier for legitimate developers to resolve issues and prevent future ones.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;implementation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementation&quot; /&gt;Implementation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been working on integrating findsecbugs into the Jenkins project for several months. It is working in several repos. There are several others where I have presented draft PRs to demonstrate what it will look like once it is enabled. As soon as we can disseminate the information enough, I propose to enable it in the parent poms for widespread use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;existing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#existing&quot; /&gt;Existing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started by enabling findsecbugs in two major components where I have a high degree of familiarity, Remoting, and Jenkins. Most of the work here involves examining each finding and figuring out what to do with it. In most cases this results in using one of the suppression mechanisms to ignore the finding. In some cases, the code can be removed or improved.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Findsecbugs reported a significant number of false positives in Remoting for a couple of notable reasons. (See the &lt;a href=&quot;https://github.com/jenkinsci/remoting/pull/361&quot;&gt;PR&lt;/a&gt;.) Remoting uses Spotbugs aggressively with a Low threshold setting. This produces more results. Findsecbugs targets Java web applications. As the communication layer between agents and controller, Remoting uses some mechanisms that would be a problem on the server side but are acceptable on the agent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even without all its plugins, Jenkins is a considerable collection of code. Findsecbugs reported a smaller number of false positives for Jenkins (See the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/4381&quot;&gt;PR&lt;/a&gt;.) It runs Spotbugs at a High threshold, so it only reports issues it deems more concerning. A number of these indicate code debt, deprecated code to remove, or areas that could be improved. I created Jira tickets for many of these.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;demonstrated&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demonstrated&quot; /&gt;Demonstrated&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have created draft PRs to demonstrate how findsecbugs will look in several plugins. The goal is not to use these PRs directly but instead integrate findsecbugs at the parent pom level. These PRs serve as reference documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://github.com/jenkinsci/credentials-plugin/pull/137&quot;&gt;Credentials&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;This one is particularly interesting because here findsecbugs correctly detects the remains of a valid security vulnerability (&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-05-21/&quot;&gt;CVE-2019-10320&lt;/a&gt;). Currently, this code is safely used only for migration of old data. If we had run findsecbugs on this plugin a year ago, it would have detected this valid vulnerability.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://github.com/jenkinsci/ssh-slaves-plugin/pull/177&quot;&gt;SSH Build Agents&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;This one is interesting because it flags MD5 as a concern. Since it is used for fingerprinting, it isn’t a valid vulnerability, but since the hash isn’t stored it is easy to improve the code here.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://github.com/jenkinsci/ec2-plugin/pull/432&quot;&gt;EC2&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;In this case, findsecbugs found some valid concerns, but the code isn’t used so it can be removed. Also, MD5 is harder to remove here but should be considered technical debt and removed when possible.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://github.com/jenkinsci/platformlabeler-plugin/pull/165&quot;&gt;Platform Labeler&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Findsecbugs didn’t find any concerns here. This means adapting to it requires no work. In this demonstration, I added a fake finding to prove that it was working.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://github.com/jenkinsci/file-leak-detector-plugin/pull/9&quot;&gt;File Leak Detector&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;There is one simple finding noted here. Because it is part of the configuration performed by an administrator we can ignore it.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://github.com/jenkinsci/credentials-binding-plugin/pull/88&quot;&gt;Credentials Binding&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Nothing was found here so integration requires no effort.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;proposed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#proposed&quot; /&gt;Proposed&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My proposal is to integrate findsecbugs configuration into the parent poms as soon as we can. The delay is currently mostly around sharing the information to prepare developers by blog post, email list discussion, and presentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even before I started working on this, &lt;a href=&quot;https://github.com/StefanSpieker&quot;&gt;StefanSpieker&lt;/a&gt; proposed a &lt;a href=&quot;https://github.com/jenkinsci/pom/pull/61&quot;&gt;PR&lt;/a&gt; to integrate into the parent Jenkins pom. This will apply to Jenkins libraries and core components. Once this is integrated, I will pull out the changes I made to the Jenkins and Remoting project poms.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I also plan on integrating findsecbugs into the plugin and Stapler parent poms. Once it is added to the plugin parent pom all plugins will automatically perform these checks when they upgrade their parent pom version. If there are any findings, developers will need to take care of them as described in the next section.&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-do-you-need-to-do&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-do-you-need-to-do&quot; /&gt;What do you need to do?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once developers upgrade to a parent pom version that integrates findsecbugs, they may have to deal with evaluating, fixing, or suppressing findings. The parent pom versions do not yet exist but are in process or proposed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;extraneous-build-message&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#extraneous-build-message&quot; /&gt;Extraneous build message&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In some cases, an extraneous message may show up in the build logs. It starts with a line like this &lt;code&gt;The following classes needed for analysis were missing:&lt;/code&gt; followed by lines listing some methods by name. Ignore this message. It results from SpotBugs printing some internal, debug information that isn’t helpful here.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;examine-findings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#examine-findings&quot; /&gt;Examine findings&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If findsecbugs reports any findings, then a developer needs to examine and determine what to do about each one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Excluding issues&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;You can exclude an issue, so that it is never reported in a project. This is done by configuring an exclusion file. If you encounter the findings CRLF_INJECTION_LOGS or INFORMATION_EXPOSURE_THROUGH_AN_ERROR_MESSAGE feel free to add these to an exclusion file. These are not considered a concern in Jenkins. See the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/4381/files#diff-a3a723b46e92f2a14061ff6b9a589d67R16&quot;&gt;Jenkins project exclusion file&lt;/a&gt; for an example. You should be cautious about including other issue types here.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;em&gt;Temporarily&lt;/em&gt; disable findsecbugs&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;You may disable findsecbugs by adding &lt;code&gt;&amp;lt;Bug category=&quot;SECURITY&quot;/&amp;gt;&lt;/code&gt; to the exclusion file. I strongly encourage you to only disable findsecbugs temporarily when genuinely needed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Suppress a finding&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;After determining that a finding is not important, you can suppress it by annotating a method or a class with &lt;code&gt;@SuppressFBWarnings(value = “…​”, justification=”…​”)&lt;/code&gt;. I encourage you to suppress narrowly. Never suppress at the class level when you can add it to a method. For a long method, extract the problematic part into a small method and add the suppression there. I also encourage you to always add a meaningful justification.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Improve code&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Whenever possible improve the code such that the problematic code no longer exists. This can include removing deprecated or unused code, using improved algorithms, or improving structure or implementation. This is where the significant gains come from with SpotBugs and findsecbugs. Also, as you make changes or add new features make sure to implement them so as not to introduce new issues.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Report security vulnerabilities&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;If you encounter a finding related to a valid security vulnerability, please report it via the &lt;a href=&quot;https://www.jenkins.io/security/reporting/&quot;&gt;Jenkins security reporting process&lt;/a&gt;. This is the responsible behavior that benefits the community. Try not to discuss or call attention to the issue before it can be disclosed in a Jenkins security advisory.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Create tasks&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;If you discover an improvement area that is too large to fit into your current work or release plan, I encourage you to record a task to get it done. You can do this in Jira, like I did for several issues in Jenkins core, or in whatever task management system you use.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&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;SpotBugs has long been used in Jenkins to catch bugs and improve code quality. Findsecbugs adds valuable security-related bug definitions. As we integrate it into the existing Jenkins code base it will require analysis and suppression for legacy code. This identifies areas we can improve and enhances quality as we move forward. Please responsibly &lt;a href=&quot;https://www.jenkins.io/security/reporting/&quot;&gt;report&lt;/a&gt; any security vulnerabilities you discover.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/02/25/vscode-caseStudy/</id>
<title>Validating JCasC configuration files using Visual Studio Code</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-02-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/02/25/vscode-caseStudy/" />
<author>
<name>sladyn98</name>
</author>
<category term='community-bridge'></category>
<category term='JCasC'></category>
<category term='VSCode'></category>
<category term='community'></category>
<summary>
Configuration-as-code plugin

Problem Statement: Convert the existing schema validation workflow from the current scripting language in the Jenkins Configuration as Code Plugin to a Java based rewrite thereby enhancing its readability and testability supported by a testing framework for the same. Enhance developer experience by developing a VSCode Plugin to facilitate autocompletion and validation which would help the developer write correct yaml files before application to a Jenkins Instance.


The Configuration as Code plugin has been designed as an opinionated way to configure Jenkins based on human-readable declarative configuration files. Writing such a file should be feasible without being a Jenkins expert,...
</summary>
<content type='html'>
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;configuration-as-code-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-as-code-plugin&quot; /&gt;Configuration-as-code plugin&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Problem Statement: Convert the existing schema validation workflow from the current scripting language in the &lt;a href=&quot;https://plugins.jenkins.io/configuration-as-code&quot;&gt;Jenkins Configuration as Code Plugin&lt;/a&gt; to a Java based rewrite thereby enhancing its readability and testability supported by a testing framework for the same. Enhance developer experience by developing a VSCode Plugin to facilitate autocompletion and validation which would help the developer write correct yaml files before application to a Jenkins Instance.&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/configuration-as-code&quot;&gt;Configuration as Code plugin&lt;/a&gt; has been designed as an opinionated way to configure Jenkins based on human-readable declarative configuration files. Writing such a file should be feasible without being a Jenkins expert, just translating into code a configuration process one is used to executing in the web UI. The plugin uses a schema to verify the files being applied to the Jenkins instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the new JSON Schema being enabled developers can now test their yaml file against it. The schema checks the &lt;code&gt;descriptors&lt;/code&gt; i.e. configuration that can be applied to a plugin or Jenkins core, the correct type is used and help text is provided in some cases. VSCode allows us to test out the schema right out of the box with some modifications. This project was built as part of the &lt;a href=&quot;https://communitybridge.org/&quot;&gt;Community Bridge&lt;/a&gt; initiative which is a platform created by the Linux Foundation to empower developers — and the individuals and companies who support them — to advance sustainability, security, and diversity in open source technology. You can take a look at the &lt;a href=&quot;https://people.communitybridge.org/project/bce45251-1ff4-4131-9699-0a0017b31495&quot;&gt;Jenkins Community Bridge Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;steps-to-enable-the-schema-validation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#steps-to-enable-the-schema-validation&quot; /&gt;Steps to Enable the Schema Validation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a) The first step includes installing the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=jcasc-developers.jcasc-plugin&quot;&gt;JCasC Plugin for Visual Studio Code&lt;/a&gt; and opening up the extension via the extension list. Shortcut for opening the extension list in VSCode editor using &lt;code&gt;Ctrl + Shift + X&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;b) In order to enable validation we need to include it in the workspace settings.
Navigate to &lt;code&gt;File&lt;/code&gt; and then &lt;code&gt;Preference&lt;/code&gt; and then &lt;code&gt;Settings&lt;/code&gt;. Inside settings search for &lt;code&gt;json&lt;/code&gt; and inside &lt;code&gt;settings.json&lt;/code&gt; include the following configuration.&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;json&quot;&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;yaml.schemas&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;schema.json&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;y[a]?ml&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&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;You can specify a glob pattern as the value for schema.json which is the file name for the schema. This would apply the schema to all yaml files. eg: &lt;code&gt;.[y[a]?ml]&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;c) The following tasks can be done using VSCode:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;a) Auto completion (Ctrl + Space):
  Auto completes on all commands.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;b) Document Outlining (Ctrl + Shift + O):
Provides the document outlining of all completed nodes in the file.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;d) Create a new file under the work directory called &lt;code&gt;jenkins.yml&lt;/code&gt;. For example consider the following contents for the 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;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;systemMessage&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;“Hello World”&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;numExecutors&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;olist lowerroman&quot;&gt;
&lt;ol class=&quot;lowerroman&quot;&gt;
&lt;li&gt;
&lt;p&gt;The above yaml file is valid according to the schema and vscode should provide you with validation and autocompletion for the same.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;screenshots&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#screenshots&quot; /&gt;Screenshots&lt;/h3&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/projects/jcasc/VSCode/vscode.png&quot; alt=&quot;vscode&quot; /&gt;&lt;/span&gt;
&lt;/p&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/projects/jcasc/VSCode/userDocs1.png&quot; alt=&quot;userDocs1&quot; /&gt;&lt;/span&gt;
&lt;/p&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/projects/jcasc/VSCode/userDocs2.png&quot; alt=&quot;userDocs2&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are holding an online &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/268823268&quot;&gt;meetup&lt;/a&gt; on the 26th February regarding this plugin and how you could use it to validate your YAML configuration files.
For any suggestions or discussions regarding the schema feel free to join our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jcasc-devtools-project:gitter.im&quot;&gt;gitter channel&lt;/a&gt;.
Issues can be created on &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/issues&quot;&gt;Github&lt;/a&gt;.&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/2020/02/19/jenkins-world-lisbon-with-love-from-india/</id>
<title>My DevOps World | Jenkins World Lisbon Experience</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-02-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/02/19/jenkins-world-lisbon-with-love-from-india/" />
<author>
<name>baymac</name>
</author>
<category term='gitlab'></category>
<category term='devopsworld'></category>
<category term='jenkinsworld'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
After an amazing three months of development period in the summer of 2019 with Jenkins Project, I was a better developer, loved open source, met
passionate people and had fun at work. Jenkins is not just a community, it is a family. When GSoC period was over, we received swags from Jenkins.
Natasha Stopa (one of the students in GSoC 2019) was invited to attend DevOps World | Jenkins World San Francisco.
It was nice to see her enjoy there. But guess what? Jenkins also invited three other students (Abhyudaya, Long and me) to DevOps World | Jenkins World Lisbon.
I was super psyched...
</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;After an amazing three months of development period in the summer of 2019 with Jenkins Project, I was a better developer, loved open source, met
passionate people and had fun at work. Jenkins is not just a community, it is a family. When GSoC period was over, we received swags from Jenkins.
&lt;a href=&quot;https://www.jenkins.io/blog/2019/08/22/devops-world/&quot;&gt;Natasha Stopa&lt;/a&gt; (one of the students in GSoC 2019) was invited to attend DevOps World | Jenkins World San Francisco.
It was nice to see her enjoy there. But guess what? Jenkins also invited three other students (Abhyudaya, Long and me) to DevOps World | Jenkins World Lisbon.
I was super psyched when Marky Jackson (one of my project mentors) broke the news to me.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The trip to Lisbon required to sort a few things like flight tickets, hotel booking, passport, visa etc. Oleg Nenashev had scheduled meetings to discuss
and help us with arranging everything for our travel. Thanks to him. :)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;from-india-to-lisbon-dec-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#from-india-to-lisbon-dec-1&quot; /&gt;From India to Lisbon (Dec 1)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Abhyudaya and I boarded our flight from Indira Gandhi Airport (New Delhi) to Lisbon on December 1, 2019 morning at 0500 hours (local time). It was a fine
trip with an hour layover in Istanbul Ataturk Airport. We arrived in Lisbon at 1500 hours (local time). The weather in Lisbon was terrific. A mild cold
but strong sea breeze was the starting point of me falling in love with the place. We arrived at our hotel (Novotel Lisboa) in an Uber. Oleg met us at
the lobby to help us with check-in. It was great to finally meet him in person after months of knowing and working together. We had a good chat about the
event, what to expect and other sightseeing areas. After a short time of refresh, Long who traveled from Berlin a day before met us at the restaurant. We
had a brief chat knowing each other, had our food and went to bed. The next day was Hackfest. We hit the bed after that as we had to reach Centro de
Congressos de Lisboa (CCL) where the event was organised by 0900 hours.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;day-0-dec-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-0-dec-2&quot; /&gt;Day 0 (Dec 2)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I woke up early for a short jog in the streets. Lisbon is a city made on hills. The streets have beautiful mosaic styled pavements. It was
nice to see around the city. Then Abhyudaya and me went for breakfast and reached CCL in an Uber at 0815 hours.&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/2020/01-gsoc-jenkins-world-parichay/with-oleg.jpg&quot; alt=&quot;A picture with Oleg Nenashev&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was a round table sitting arrangement in an auditorium. It was like a meet-and-greet event to interact with other developers (some known and some new).
Everybody had to figure out their problem statements and work on it. There was milk, juice, sandwiches which gave us energy throughout the day. I took a
small break to come out of the building to go to the other side of the road which was on the banks of Tagus River. From there you could have very close
view underneath the Ponte 25 de Abril (looks strikingly similar to Golden Gate Bridge). You can also see The Sanctuary of Christ the King on the other side
of the river (again looks similar to Christ the Redeemer in Rio, Brazil). It was great to kick off the event with Hackfest. At the end of Hackfest some of
us presented our work. Later, we went to a nearby restaurant to have burgers which apparently was the best burger I ever had (could be because I hadn’t
tried too many burgers before :P). We talked and interacted with people from other parts of the world for about an hour and a half then went back to our hotel
rooms.&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/2020/01-gsoc-jenkins-world-parichay/ponte-de-abril.jpg&quot; alt=&quot;Outside CCL&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;day-1-dec-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-1-dec-3&quot; /&gt;Day 1 (Dec 3)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The conference officially began on this day. Abyudaya and me had breakfast and took the shuttle to CCL. We collected our t-shirts and IDs. The event managing team
made an app for DevOps World | Jenkins World (DWJW) Lisbon with all schedules and other information which was incredibly convenient for all attendees.
There were multiple sessions/events on different topics related to Jenkins or DevOps in general. I attended the Jenkins and Jenkins X contributor summit.
Had a nice lunch and went around to explore Lisbon. I went to Padrao dos Descobrimentos and the beautiful Belem Palace. Had some Pasteis de Belem
(a popular Portuguese desert). Took a tram to Praça do Comércio. It is Lisbon’s most important square. You will find lots of tourists, street bands,
sea food restaurants, shops for every budget, the famous pink street and so much more. Later that evening we had a party hosted by EURODOG (European
DevOps Group) at Lisboa Marriott. It was a nice party to network with developers over casual wine and beer. We later head out to a nearby Indian restaurant
for Kebab and rice.&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/2020/01-gsoc-jenkins-world-parichay/jenkins-x-intro.jpg&quot; alt=&quot;Intro to Jenkins X 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;day-2-dec-4&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-2-dec-4&quot; /&gt;Day 2 (Dec 4)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second day began with the opening keynote. Later went to the Jenkins X Introduction, Deploying K8s with Jenkins on GCP, Build top mobile games
by King in that order. Also occasionally hitting the sponsors booth to have a chat and collect some swags. In the evening there was the superhero
themed party, sponsored by Sonatype. It was probably the most fun event in the entire conference. The expo hall had an entirely different look with the party lights on,
people wearing capes, fun events going around. There were artists dressed in a Bumblebee, a Batman, a Superman, a Supergirl, a Thor and more superhero
costumes! I was previously made aware of the interesting parties at Jenkins World but the experience was very different. People from all over the world had
come together to celebrate the 15 years of success of an open source software. After partying from 5 to 7 we went back to the hotel. I spent some time
to prepare the slides for the next day’s presentation and went to bed.&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/2020/01-gsoc-jenkins-world-parichay/superhero-party.jpg&quot; alt=&quot;A Bumblebee at Super Hero Party&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;day-3-dec-5&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-3-dec-5&quot; /&gt;Day 3 (Dec 5)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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/2020/01-gsoc-jenkins-world-parichay/fun-run.jpg&quot; alt=&quot;6K Jenkins World Fun Run&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The third and final day of conference began with Jenkins World Fun Run. I missed the keynote for being late and other setup required for the
presentation. My laptop was broken so had to do all the setup for demo on a friend’s laptop. The situation felt like a Jenkins admin under fire
for a production bug. After being under pressure for a while, took a break to admire the developer comics and had a chat with the graffiti painter.
During lunch it was time for the GSoC presentation at the Jenkins community booth. All our presentation went well and we also interacted with real users.
Then we had the GSoC Team pic at the Jenkins community booth. Later Abhyudaya and me gave our presentation at the lightning talks as well upon Mark Waite’s
request. The event concluded with emotional goodbyes.&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/2020/01-gsoc-jenkins-world-parichay/dev-comics.jpg&quot; alt=&quot;Developer Comics&quot;&gt;
&lt;/img&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/2020/01-gsoc-jenkins-world-parichay/graffiti-painter.jpg&quot; alt=&quot;Graffiti Wall&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All GSoC Students were invited for dinner at Corinthia Lisboa’s Soul Garden restaurant. The party comprised of Oleg, Mark and his lovely wife, Liam, Tracy,
Alyssa and Olivier. We had a very nice conversation and I had a very delicious Bacalhau (cod fish) dish. Then bid final goodbye to everybody.&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/2020/01-gsoc-jenkins-world-parichay/project-presentation.jpg&quot; alt=&quot;Presenting my GSoC project work&quot;&gt;
&lt;/img&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/2020/01-gsoc-jenkins-world-parichay/jenkins-gsoc-team.jpg&quot; alt=&quot;GSoC Team Picture&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was a wonderful experience in a wonderful country among wonderful people. Hats off to the management team lead by Alyssa Tong and co. An event this big was
carried out without any hiccups! Everybody contributed their part to the event which made it very interactive and fun. Checkout some of my swags:&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/2020/01-gsoc-jenkins-world-parichay/swags-dwjw.jpg&quot; alt=&quot;Swag from Jenkins World Lisbon&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A big shout out to the Jenkins project and CloudBees for sponsoring this trip. Also thank you Jenkins and Google Summer of Code for support. :)&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/02/07/trip-to-dwjw/</id>
<title>Trip to DevOps World | Jenkins World</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-02-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/02/07/trip-to-dwjw/" />
<author>
<name>abhyudayasharma</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<category term='devopsworld'></category>
<category term='jenkinsworld'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
I had the privilege of being invited to DevOps World | Jenkins World
2019 for presenting the work I did during Google Summer of Code 2019.
What follows is a day-by-day summary of an amazing trip to the
conference.


Day 0: December 1, 2019







I am an undergraduate student from New Delhi, India and had traveled to
Lisbon to attend the conference. I had an early morning flight to Lisbon
from Delhi via Istanbul. At the Airport, I met Parichay who had been
waiting there from his connecting flight. After flying 8000 km, we
reached Lisbon. We took a taxi to the hotel and were greeted there by
one of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I had the privilege of being invited to DevOps World | Jenkins World
2019 for presenting the work I did during Google Summer of Code 2019.
What follows is a day-by-day summary of an amazing trip to the
conference.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;day-0-december-1-2019&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-0-december-1-2019&quot; /&gt;Day 0: December 1, 2019&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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/role-strategy-performance/dwjw-01.png&quot; alt=&quot;Travelling to Lisbon&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am an undergraduate student from New Delhi, India and had traveled to
Lisbon to attend the conference. I had an early morning flight to Lisbon
from Delhi via Istanbul. At the Airport, I met Parichay who had been
waiting there from his connecting flight. After flying 8000 km, we
reached Lisbon. We took a taxi to the hotel and were greeted there by
one of my Google Summer of Code mentors, Oleg. After four months of
working with him on my GSoC project, meeting him was an amazing
experience. Later that day, after stretching our legs in the hotel, we
met Long for an early dinner, who came to the hotel after exploring much
of Lisbon.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;day-1-hackfest-december-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-1-hackfest-december-2&quot; /&gt;Day 1: Hackfest, December 2&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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/role-strategy-performance/dwjw-02.png&quot; alt=&quot;A photo from the HackFest&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next morning, we all met for breakfast where we all got to taste some
Pastel de Nata. We then took a cab to the Congress Centre for attending
the Jenkins and Jenkins X hackfest. At the Hackfest, I met Mark, Joseph,
Kasper, Andrey and other Jenkins contributors. I also met Oleg, this
time together with his son and his wife. After our introductions, and a
short presentation by Oleg, I started hacking on the Folder Auth plugin
and made it possible to delete user sids from roles. The best part of
hacking there was to get instant feedback on what I was working on. More
and more people kept coming throughout the day. It was great to see so
many people working hard to improve Jenkins. At the end, everyone
presented what they had achieved that day. Having skipped lunch for some
snacks, Oleg and others tried hard to get some pizza delivered without
much success. After the Hackfest, everyone was hungry and most attendees
including me went looking for nearby restaurants. Since it was early and
most restaurants were not open yet, we all decided to have burgers. It
was a great learning experience listening to and talking about Jenkins,
Elasticsearch, Jira, GitHub and a lot of other things. After that, we
took a taxi back to the hotel and I went to bed.&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/role-strategy-performance/dwjw-03.png&quot; alt=&quot;Sunset outside the conference center&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;day-2-contributor-summit-december-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-2-contributor-summit-december-3&quot; /&gt;Day 2: Contributor Summit, December 3&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had the Jenkins and Jenkins X contributor summit the next day. Me and
Parichay took the bus to the Congress Centre in the morning. After
registration, I got my ‘Speaker’ badge and the conference T-shirt. The
contributor summit took place in the same hall as the Hackfest, but the
seating arrangement was completely different and there were a lot more
people. The summit started with everyone introducing themselves. It
turned out that there were a lot of people from Munich. There were
presentations and talks about all things Jenkins, Jenkins X and the
Continuous Delivery Foundation by Kohsuke, Oleg, Joseph, Liam, Olivier,
Wadek and others. I had no experience with Jenkins X which made the
summit very interesting. After lunch, the talks were over, and everyone
was free to join any session discussing various things about Jenkins. I
attended the Cloud Native Jenkins and the Configuration-as-Code
sessions.&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/role-strategy-performance/dwjw-04.png&quot; alt=&quot;The Contributor Summit&quot;&gt;
&lt;/img&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/role-strategy-performance/dwjw-05.png&quot; alt=&quot;My badge&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While some of the conference attendees were in the Contributor summit,
the others were going through certifications and trainings. At around 5
o’clock in the evening, the summit and the trainings all got over and
the expo hall was thrown open. On the entrance, there was a large stack
of big DWJW bags. I did not realize why those bags were kept there.
Since everyone was taking one, I took one as well. As soon as I went
into the hall, I realized that those bags were for collecting swag. I
had never seen anything like this where sponsors were just giving away
T-shirts, stickers and other stuff. There were snacks and Kohsuke was
cutting the extremely tasty 15 years of Jenkins cake. After having the
cake, I went on a swag-collecting spree going from one sponsor booth to
the other. This was an amazing experience, not only was I able to get
cool stuff, I was also able to learn a lot about the software these
companies made and how it fits into the DevOps pipeline.&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/role-strategy-performance/dwjw-06.png&quot; alt=&quot;Photo with Oleg&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the conference got over, me, Long and Parichay went to the Lisbon
Mariott Hotel for the Eurodog party. After collecting another T-shirt, I
went to the nearest restaurant (McDonald’s) with Andrey who I had
earlier met at the Hackfest.&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/role-strategy-performance/dwjw-07.png&quot; alt=&quot;Kohsuke cutting cake&quot;&gt;
&lt;/img&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/role-strategy-performance/dwjw-08.png&quot; alt=&quot;Photo with Kohsuke&quot;&gt;
&lt;/img&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/role-strategy-performance/dwjw-09.png&quot; alt=&quot;Photo with Oleg and Joseph&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;day-3-december-4&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-3-december-4&quot; /&gt;Day 3: December 4&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was the first official day of the conference and it began with the
keynote. There were over 900 people in the keynote hall. It was amazing
to see so many people attending the conference. After the keynote got
over, I went to several sessions throughout the day learning about how
companies are using Jenkins and implementing DevOps tools.&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/role-strategy-performance/dwjw-14.jpg&quot; alt=&quot;15 years of Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the evening, we had the Sonatype Superparty which was a lot of fun.
There were neon lights, arcade machines, VR experiences, superheroes and
more swag. There was a lot of good food including pizzas and burgers and
hot dogs. Superhero inspired desserts were very interesting. I was able
to talk to Oleg and Wadek about the security challenges in Jenkins.
During the party, I also got a chance to meet the CEO of CloudBees,
Sacha Labourey.&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/role-strategy-performance/dwjw-10.png&quot; alt=&quot;Batman vs Superman&quot;&gt;
&lt;/img&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/role-strategy-performance/dwjw-11.png&quot; alt=&quot;A photo with Bumblebee&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;day-4-december-5&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-4-december-5&quot; /&gt;Day 4, December 5&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was the last day of the conference and it began with another
keynote. After the keynote, I attended a very interesting talk on how
the European Observatory built software for large telescopes using
Jenkins. After that, I prepared for my talk on the work I did during
Google Summer of Code 2019. I had my presentation in the community booth
during the lunch time. Presenting in front of real people was an amazing
experience and very different from the ones we had on Zoom chats for our
GSoC evaluations. In the evening, I got another chance to present my
project at the Jenkins Community Lightning Talks.&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/role-strategy-performance/dwjw-12.png&quot; alt=&quot;Me speaking at the community booth&quot;&gt;
&lt;/img&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/role-strategy-performance/dwjw-13.png&quot; alt=&quot;Me speaking at the community lightning talks&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After that, the conference came to an end and I went back to the hotel.
After relaxing for some time, me, Parichay and Long were invited by Oleg
to a dinner at Corinthia Hotel with Kohsuke, Mark and his wife, Tracy,
Alyssa, and Liam. Unfortunately, Long couldn’t attend the dinner because
he had the flight back earlier that evening. After the amazing dinner, I
thanked everyone for such an amazing trip and said goodbye.&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/role-strategy-performance/dwjw-16.jpg&quot; alt=&quot;GSoC Group Photo&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;DWJW was the best experience I’ve ever had. I was able to learn about a
lot of new things and talk to some amazing people. In the end, I would
like to especially thank Oleg for helping me throughout and making it
possible for me to attend such a wonderful conference. I would like to
thank my other mentors Runze Xia and Supun for their support in my
Google Summer of Code project. I would like to thank Google for
organizing Google Summer of Code, everyone at Jenkins project for
sponsoring my travel, and CloudBees for inviting me to the conference.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to seeing you all again soon!&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/role-strategy-performance/dwjw-15.jpg&quot; alt=&quot;CI. CD. Continuous Fun.&quot;&gt;
&lt;/img&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;&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/02/02/web-socket/</id>
<title>WebSocket</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-02-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/02/02/web-socket/" />
<author>
<name>jglick</name>
</author>
<category term='core'></category>
<category term='remoting'></category>
<category term='agents'></category>
<category term='cli'></category>
<summary>
I am happy to report that JEP-222 has landed in Jenkins weeklies,
starting in 2.217.
This improvement brings experimental WebSocket support to Jenkins,
available when connecting inbound agents or when running the CLI.
The WebSocket protocol allows bidirectional, streaming communication over an HTTP(S) port.


While many users of Jenkins could benefit,
implementing this system was particularly important for CloudBees
because of how CloudBees Core on modern cloud platforms
(i.e., running on Kubernetes) configures networking.
When an administrator wishes to connect an inbound (formerly known as “JNLP”) external agent to a Jenkins controller,
such as a Windows virtual machine running outside the cluster and using the agent service wrapper,
until now the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am happy to report that &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/222/README.adoc&quot;&gt;JEP-222&lt;/a&gt; has landed in Jenkins weeklies,
starting in &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.217&quot;&gt;2.217&lt;/a&gt;.
This improvement brings experimental WebSocket support to Jenkins,
available when connecting inbound agents or when running the CLI.
The WebSocket protocol allows bidirectional, streaming communication over an HTTP(S) port.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While many users of Jenkins could benefit,
implementing this system was particularly important for CloudBees
because of how &lt;a href=&quot;https://docs.cloudbees.com/docs/cloudbees-core/latest/&quot;&gt;CloudBees Core on modern cloud platforms&lt;/a&gt;
(i.e., running on Kubernetes) configures networking.
When an administrator wishes to connect an inbound (formerly known as “JNLP”) external agent to a Jenkins controller,
such as a Windows virtual machine running outside the cluster and using the agent service wrapper,
until now the only option was to use a special TCP port.
This port needed to be opened to external traffic using low-level network configuration.
For example, users of the nginx ingress controller
would need to proxy a separate external port for each Jenkins service in the cluster.
The instructions to do this are complex and hard to troubleshoot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using WebSocket, inbound agents can now be connected much more simply when a reverse proxy is present:
if the HTTP(S) port is already serving traffic,
most proxies will allow WebSocket connections with no additional configuration.
The WebSocket mode can be enabled in agent configuration,
and support for pod-based agents in the &lt;a href=&quot;https://plugins.jenkins.io/kubernetes&quot;&gt;Kubernetes plugin&lt;/a&gt; is coming soon.
You will need an agent &lt;a href=&quot;https://github.com/jenkinsci/remoting/releases/tag/remoting-4.0&quot;&gt;version 4.0&lt;/a&gt; or later,
which is bundled with Jenkins in the usual way (Docker images with this version are coming soon).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another part of Jenkins that was troublesome for reverse proxy users was the CLI.
Besides the SSH protocol on port 22, which again was a hassle to open from the outside,
the CLI already had the ability to &lt;a href=&quot;https://www.jenkins.io/blog/2017/04/11/new-cli/&quot;&gt;use HTTP(S) transport&lt;/a&gt;.
Unfortunately the trick used to implement that confused some proxies and was not very portable.
Jenkins 2.217 offers a new &lt;code&gt;-webSocket&lt;/code&gt; CLI mode which should avoid these issues;
again you will need to download a new version of &lt;code&gt;jenkins-cli.jar&lt;/code&gt; to use this mode.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The WebSocket code has been tested against a sample of Kubernetes implementations (including OpenShift),
but it is likely that some bugs and limitations remain,
and scalability of agents under heavy build loads has not yet been tested.
Treat this feature as beta quality for now and let us know how it works!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/01/29/gsoc-report/</id>
<title>Google Summer of Code 2019 Report</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-01-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/01/29/gsoc-report/" />
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<category term='jenkins'></category>
<category term='community'></category>
<category term='events'></category>
<summary>
Google Summer of Code is much more than a summer internship program, it is a year-round effort for the organization and some community members.
Now, after the DevOps World | Jenkins World conference in Lisbon and final retrospective meetings, we can say that GSoC 2019 is officially over.
We would like to start by thanking all participants: students, mentors, subject matter experts and all other contributors who proposed project ideas, participated in student selection, in community bonding and in further discussions and reviews.
Google Summer of Code is a major effort which would not be possible without the active participation of the Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Google Summer of Code is much more than a summer internship program, it is a year-round effort for the organization and some community members.
Now, after the DevOps World | Jenkins World conference in Lisbon and final retrospective meetings, we can say that GSoC 2019 is officially over.
We would like to start by thanking all participants: students, mentors, subject matter experts and all other contributors who proposed project ideas, participated in student selection, in community bonding and in further discussions and reviews.
Google Summer of Code is a major effort which would not be possible without the active participation of the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blogpost we would like to share the results and our experience from the previous year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#results&quot; /&gt;Results&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Five GSoC projects were successfully completed this year:
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/role-strategy-performance&quot;&gt;Role Strategy Plugin Performance Improvements&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/plugin-installation-manager-tool-cli&quot;&gt;Plugins Installation Manager CLI Tool/Library&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/working-hours-improvements&quot;&gt;Working Hours Plugin - UI Improvements&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/remoting-over-apache-kafka-docker-k8s-features&quot;&gt;Remoting over Apache Kafka with Kubernetes features&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/gitlab-support-for-multibranch-pipeline&quot;&gt;Multi-branch Pipeline support for Gitlab SCM&lt;/a&gt;.
We will talk about the projects a little later in the document.&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/2020/01-gsoc2019-report/gsoc2019-highlights.png&quot; alt=&quot;Highlights&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-details&quot; /&gt;Project details&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We held the final presentations as Jenkins Online Meetups in late August and Google published the results on Sept 3rd.
The final presentations can be found here:
&lt;a href=&quot;https://www.youtube.com/watch?v=g19o24uzy6c&quot;&gt;Part 1&lt;/a&gt;,
&lt;a href=&quot;https://www.youtube.com/watch?v=cMSbdGwGWp0&quot;&gt;Part 2&lt;/a&gt;,
&lt;a href=&quot;https://www.youtube.com/watch?v=41dhyFC5Iak&quot;&gt;Part 3&lt;/a&gt;.
We also presented the
&lt;a href=&quot;https://docs.google.com/presentation/d/e/2PACX-1vQf5RLIJXq8cPEKbCIaA4Bn3tMy5ITB4z2oGJKwLOJz_ne2AiNuSSvXi51nMDDDgA/pub?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot;&gt;2019 Jenkins GSoC report&lt;/a&gt;
at the &lt;a href=&quot;https://devopsworldjenkinsworld2019.sched.com/event/SQhG/jenkins-jenkins-x-demos-slides-available&quot;&gt;DevOps World | Jenkins World San Francisco&lt;/a&gt;
and at the
&lt;a href=&quot;https://devopsworldjenkinsworld2019lisbo.sched.com/event/WawJ/results-from-the-2019-jenkins-google-summer-of-code&quot;&gt;DevOps World | Jenkins World 2019 Lisbon&lt;/a&gt; conferences.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the following sections, we present a brief summary of each project, links to the coding phase 3 presentations, and to the final products.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;role-strategy-plugin-performance-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#role-strategy-plugin-performance-improvements&quot; /&gt;Role Strategy Plugin Performance Improvements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/role-strategy&quot;&gt;Role Strategy Plugin&lt;/a&gt; is one of the most widely used authorization plugins for Jenkins,
but it has never been famous for performance due to architecture issues and regular expression checks for project roles.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/abhyudayasharma&quot;&gt;Abhyudaya Sharma&lt;/a&gt; was working on this project together with hist mentors:
&lt;a href=&quot;https://www.jenkins.io/blog/authors/oleg_nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/runzexia&quot;&gt;Runze Xia&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/supun94&quot;&gt;Supun Wanniarachchi&lt;/a&gt;.
He started the project from creating a new Micro-benchmarking Framework for Jenkins Plugins based on &lt;a href=&quot;https://openjdk.java.net/projects/code-tools/jmh/&quot;&gt;JMH&lt;/a&gt;,
created benchmarks and achieved a 3501% improvement on some real-world scenarios.
Then he went further and created a new &lt;a href=&quot;https://plugins.jenkins.io/folder-auth&quot;&gt;Folder-based Authorization Strategy Plugin&lt;/a&gt; which offers even better performance for Jenkins instances where permissions are scoped to folders.
During his project Abhyudaya also fixed the Jenkins Configuration-as-Code support in Role Strategy and contributed several improvements and fixes to the &lt;a href=&quot;https://plugins.jenkins.io/folder-auth&quot;&gt;JCasC Plugin&lt;/a&gt; itself.&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/2019/role-strategy-performance&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blog posts: &lt;a href=&quot;https://www.jenkins.io/blog/2019/06/21/performance-testing-jenkins/&quot;&gt;Micro-benchmarking Framework for Jenkins Plugins&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/2019/08/16/folder-auth-plugin/&quot;&gt;Introducing new Folder Authorization Plugin&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/2019/08/26/role-strategy-performance/&quot;&gt;Performance Improvements to Role Strategy Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final evaluation:  &lt;a href=&quot;https://drive.google.com/file/d/1lAXDljWXypCq6noiqPHI-eZJqBqaSYue/view?usp=sharing&quot;&gt;slides&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/g19o24uzy6c?t=1234&quot;&gt;video&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/role-strategy-plugin&quot;&gt;Role Strategy Plugin&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/folder-auth-plugin&quot;&gt;Folder Authorization 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;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/role-strategy-performance/benchmarks2.png&quot; alt=&quot;Role strategy performance improvements&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;plugins-installation-manager-cli-toollibrary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugins-installation-manager-cli-toollibrary&quot; /&gt;Plugins Installation Manager CLI Tool/Library&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/stopalopa&quot;&gt;Natasha Stopa&lt;/a&gt; was working on a new &lt;a href=&quot;https://github.com/jenkinsci/plugin-installation-manager-tool&quot;&gt;CLI tool for plugin management&lt;/a&gt;,
which should unify features available in other tools like &lt;code&gt;install-plugins.sh&lt;/code&gt; in Docker images.
It also introduced many new features like YAML configuration format support, listing of available updates and security fixes.
The newly created tool should eventually replace the previous ones.
Natasha’s mentors: &lt;a href=&quot;https://www.jenkins.io/blog/authors/kwhetstone&quot;&gt;Kristin Whetstone&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/authors/jonbrohauge&quot;&gt;Jon Brohauge&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/arnab1896&quot;&gt;Arnab Banerjee&lt;/a&gt;.
Also, many contributors from &lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Platform SIG&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/projects/jcasc&quot;&gt;JCasC plugin team&lt;/a&gt; joined the project as a key stakeholders and subject-matter experts.&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/2019/plugin-installation-manager-tool-cli&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blog posts: &lt;a href=&quot;https://www.jenkins.io/blog/2019/07/02/plugin-management-tool-alpha-release/&quot;&gt;alpha release announcement&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/2019/07/30/plugin-management-tool-phase2-updates/&quot;&gt;coding phase 2 updates&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final evaluation: &lt;a href=&quot;https://docs.google.com/presentation/d/14yiudx6uJ_FEyoSnVMsRwYdSr5KqpgXcZKVenp1ebgM/&quot;&gt;slides&lt;/a&gt;,
&lt;a href=&quot;https://youtu.be/g19o24uzy6c?t=431&quot;&gt;video&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/plugin-installation-manager-tool&quot;&gt;Plugin installation manager tool&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/gsoc-plugin-management-tool/yamlexample.png&quot; alt=&quot;Plugin Manager Tool YAML file&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;working-hours-plugin-ui-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#working-hours-plugin-ui-improvements&quot; /&gt;Working Hours Plugin - UI Improvements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins UI and frontend framework are a common topic in the Jenkins project,
especially in recent months after the new &lt;a href=&quot;https://www.jenkins.io/sigs/ux&quot;&gt;UX SIG&lt;/a&gt; was established.
&lt;a href=&quot;https://www.jenkins.io/blog/authors/jshen&quot;&gt;Jack Shen&lt;/a&gt; was working on exploring new ways to build Jenkins Web UI together with his mentor  &lt;a href=&quot;https://www.jenkins.io/blog/authors/jeffpearce&quot;&gt;Jeff Pearce&lt;/a&gt;.
Jack updated the &lt;a href=&quot;https://plugins.jenkins.io/working-hours&quot;&gt;Working Hours Plugin&lt;/a&gt; to use UI controls provided by standard React libraries.
Then he documented his experienced and created &lt;a href=&quot;https://github.com/jenkinsci/react-plugin-template&quot;&gt;template for plugins with React-based UI&lt;/a&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://www.jenkins.io/projects/gsoc/2019/working-hours-improvements&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blog posts: &lt;a href=&quot;https://www.jenkins.io/blog/2019/07/09/Phase1-Updates-On-Working-Hours-Plugin/&quot;&gt;Updates on Working Hours Plugin UI&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/2019/08/23/introduce-react-plugin-template/&quot;&gt;React Plugin Template&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final evaluation: &lt;a href=&quot;https://docs.google.com/presentation/d/1txLbDliqsZhbKvKR7RBFLue0kvLIcoRpXpB1MthWonI/edit#slide=id.p1&quot;&gt;slides&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/g19o24uzy6c?t=2493&quot;&gt;video&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/working-hours-plugin&quot;&gt;Working Hours Plugin&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/react-plugin-template&quot;&gt;Template for Jenkins plugins with React-based UI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/working-hours/working-hours-example-time-range.png&quot; alt=&quot;Web UI controls in React&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;remoting-over-apache-kafka-with-kubernetes-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#remoting-over-apache-kafka-with-kubernetes-features&quot; /&gt;Remoting over Apache Kafka with Kubernetes features&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/longnguyen&quot;&gt;Long Le Vu Nguyen&lt;/a&gt; was working on extended Kubernetes support in the &lt;a href=&quot;https://plugins.jenkins.io/remoting-kafka&quot;&gt;Remoting over Apache Kafka Plugin&lt;/a&gt;.
His mentors were &lt;a href=&quot;https://www.jenkins.io/blog/authors/afalko&quot;&gt;Andrey Falco&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/authors/pvtuan10&quot;&gt;Pham vu Tuan&lt;/a&gt; who was our GSoC 2018 student and the plugin creator.
During this project Long has added a new agent launcher which provisions Jenkins agents in Kubernetes and connects them to the controller.
He also created a Cloud API implementation for it and a new Helm chart which can provision Jenkins as entire system in Kubernetes,
with Apache Kafka enabled by default.
All these features were released in &lt;a href=&quot;https://www.jenkins.io/blog/2019/08/19/remoting-kafka-kubernetes-release-2/&quot;&gt;Remoting over Apache Kafka Plugin 2.0&lt;/a&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://www.jenkins.io/projects/gsoc/2019/remoting-over-apache-kafka-docker-k8s-features&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2019/08/19/remoting-kafka-kubernetes-release-2/&quot;&gt;Blog post for [Remoting over Apache Kafka Plugin 2.0&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final evaluation: &lt;a href=&quot;https://docs.google.com/presentation/d/1QMjeAt6on3RPQdjlz4SiFg8YgpJ2xNOQhfzXDWgn2AY/&quot;&gt;slides&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/g19o24uzy6c?t=3685&quot;&gt;video&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;Plugin source code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/remoting-kafka/helm-chart.png&quot; alt=&quot;Jenkins in Kubernetes with Apache Kafka&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;multi-branch-pipeline-support-for-gitlab-scm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#multi-branch-pipeline-support-for-gitlab-scm&quot; /&gt;Multi-branch Pipeline support for Gitlab SCM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/authors/baymac&quot;&gt;Parichay Barpanda&lt;/a&gt; was working on the new &lt;a href=&quot;https://plugins.jenkins.io/gitlab-branch-source&quot;&gt;GitLab Branch Source Plugin&lt;/a&gt; with Multi-branch Pipeline Jobs and Folder Organisation support.
His mentors were
&lt;a href=&quot;https://www.jenkins.io/blog/authors/markyjackson-taulia&quot;&gt;Marky Jackson-Taulia&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/justinharringa&quot;&gt;Justin Harringa&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/blog/authors/linuxsuren&quot;&gt;Zhao Xiaojie&lt;/a&gt; and
&lt;a href=&quot;https://www.jenkins.io/blog/authors/jetersen&quot;&gt;Joseph Petersen&lt;/a&gt;.
The plugin scans the projects, importing the pipeline jobs it identifies based on the criteria provided.
After a project is imported, Jenkins immediately runs the jobs based on the Jenkinsfile pipeline script and notifies the status to GitLab Pipeline Status.
This plugin also provides GitLab server configuration which can be configured in Configure System or via Jenkins Configuration as Code (JCasC).
read more about this project in the &lt;a href=&quot;https://www.jenkins.io/blog/2019/08/23/introducing-gitlab-branch-source-plugin/&quot;&gt;GitLab Branch Source 1.0 announcement&lt;/a&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://www.jenkins.io/projects/gsoc/2019/gitlab-support-for-multibranch-pipeline&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1avMoEPMf5Ksc99106fv7bGikAh17GQZJZdwUWKOzYBY/&quot;&gt;Coding phase 3 presentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/gitlab-branch-source-plugin/&quot;&gt;Gitlab Branch Source Plugin&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/gitlab-api-plugin&quot;&gt;Gitlab API plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/gsoc-gitlab-branch-source-plugin/multibranch-folder.png&quot; alt=&quot;Gitlab Multi-branch Pipeline support&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;projects-which-were-not-completed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#projects-which-were-not-completed&quot; /&gt;Projects which were not completed&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not all projects have been completed this year.
We were also working on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/artifact-promotion-plugin-for-jenkins-pipeline&quot;&gt;Artifact Promotion plugin for Jenkins Pipeline&lt;/a&gt;
and on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/ext-workspace-manager-cloud-features&quot;&gt;Cloud Features for External Workspace Manager Plugin&lt;/a&gt;,
but unfortunately both projects were stopped after coding phase 1.
Anyway, we got a lot of experience and takeaways in these areas (see linked Jira tickets!.
We hope that these stories will be implemented by Jenkins contributors at some point.
&lt;a href=&quot;https://www.jenkins.io/blog/2019/12/20/call-for-mentors/&quot;&gt;Google Summer of Code 2020&lt;/a&gt; maybe?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;running-the-gsoc-program-at-our-organization-level&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-the-gsoc-program-at-our-organization-level&quot; /&gt;Running the GSoC program at our organization level&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are some of the things our organization did before and during GSoC behind the scenes.
To prepare for the influx of students, we updated all our GSoC pages and wrote down all the knowledge we accumulated over the years of running the program.
We started preparing in October 2018, long before the official start of the program.
The main objective was to address the feedback we got during GSoC 2018 retrospectives.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Project ideas&lt;/strong&gt;.
We started gathering project ideas in the last months of 2018.
We prepared a &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/project-ideas/&quot;&gt;list of project ideas&lt;/a&gt; in a Google doc, and we tracked ownership of each project in a table of that document.
Each project idea was further elaborated in its own Google doc.
We find that when projects get complicated during the definition phase, perhaps they are really too complicated and should not be done.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since we wanted all the project ideas to be documented the same way, we created a template to guide the contributors.
Most of the project idea documents were written by org admins or mentors, but occasionally a student proposed a genuine idea.
We also captured contact information in that document such as GitHub and Gitter handles, and a preliminary list of potential mentors for the project.
We embedded all the project documents on our website.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Mentor and student guidelines&lt;/strong&gt;.
We updated the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors/&quot;&gt;mentor information&lt;/a&gt; page with details on what we expect mentors to do during the program,
including the number of hours that are expected from mentors,
and we even have a section on preventing &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors/#conflict-of-interest-prevention&quot;&gt;conflict of interest&lt;/a&gt;.
When we recruit mentors, we point them to the mentor information page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also updated the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors/&quot;&gt;student information page&lt;/a&gt;.
We find this is a huge time saver as every student contacting us has the same questions about joining and participating in the program.
Instead of re-explaining the program each time, we send them a link to those pages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Application phase&lt;/strong&gt;.
Students started to reach out very early on as well, many weeks before GSoC officially started.
This was very motivating.
Some students even started to work on project ideas before the official start of the program.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Project selection&lt;/strong&gt;. This year the org admin team had some very difficult decisions to make.
With lots of students, lots of projects and lots of mentors, we had to request the right number of slots and try to match the projects with the most chances of success.
We were trying to form mentor teams at the same time as we were requesting the number of slots, and it was hard to get responses from all mentors in time for the deadline.
Finally we requested fewer slots than we could have filled.
When we request slots, we submit two numbers: a minimum and a maximum. The &lt;a href=&quot;https://google.github.io/gsocguides/mentor/selecting-a-student#googles-selection-process&quot;&gt;GSoC guide&lt;/a&gt; states that:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The minimum is based on the projects that are so amazing they really want to see these projects occur over the summer,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;and the maximum number should be the number of solid and amazing projects they wish to mentor over the summer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We were awarded minimum. So we had to make very hard decisions: we had to decide between &quot;amazing&quot; and &quot;solid&quot; proposals.
For some proposals, the very outstanding ones, it’s easy.
But for the others, it’s hard.
We know we cannot make the perfect decision, and by experience, we know that some students or some mentors will not be able to complete the program due to uncontrollable life events, even for the outstanding proposals.
So we have to make the best decision knowing that some of our choices won’t complete the program.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Community Bonding&lt;/strong&gt;.
We have found that the &lt;a href=&quot;https://developers.google.com/open-source/gsoc/resources/glossary#community_bonding_period&quot;&gt;community bonding phase&lt;/a&gt; was crucial to the success of each project.
Usually projects that don’t do well during community bonding have difficulties later on.
In order to get students involved in the community better, almost all projects were handled under the umbrella of &lt;a href=&quot;https://www.jenkins.io/sigs&quot;&gt;Special Interest Groups&lt;/a&gt; so that there were more stakeholders and communications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Communications&lt;/strong&gt;.
Every year we have students who contact mentors via personal messages.
Students, if you are reading this, please do &lt;strong&gt;NOT&lt;/strong&gt; send us personal messages about the projects, you will not receive any preferential treatment.
Obviously, in open source we want all discussions to be public, so students have to be reminded of that regularly.
In 2019 we are using Gitter chat for most communications, but from an admin point of view this is more fragmented than mailing lists.
It is also harder to search.
Chat rooms are very convenient because they are focused, but from an admin point of view, the lack of threads in Gitter makes it hard to get an overview.
Gitter threads were added recently (Nov 2019) but do not yet work well on Android and iOS.
We adopted Zoom Meetings towards the end of the program and we are finding it easier to work with than Google Hangouts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Status tracking&lt;/strong&gt;.
Another thing that was hard was to get an overview of how all the projects were doing once they were running.
We made extensive use of Google sheets to track lists of projects and participants during the program
to rank projects and to track statuses of project phases (community bonding, coding, etc.).
It is a challenge to keep these sheets up to date, as each project involves several people and several links.
We have found it time consuming and a bit hard to keep these sheets up to date, accurate and complete, especially up until the start of the coding phase.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Perhaps some kind of objective tracking tool would help.
We used Jenkins Jira for tracking projects, with each phase representing a separate sprint.
It helped a lot for successful projects.
In our organization, we try to get everyone to beat the deadlines by a couple of days, because we know that there might be events such as power outages,
bad weather (happens even in Seattle!), or other uncontrolled interruptions, that might interfere with submitting project data.
We also know that when deadlines coincide with weekends, there is a risk that people may forget.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Retrospective&lt;/strong&gt;.
At the end of our project, we also held a retrospective and captured some ideas for the future.
You can find the notes &lt;a href=&quot;https://docs.google.com/document/d/1qWeuQzMr1lGQUuirgorODwvqEXYH7RiyKkRByIed9co/edit?usp=sharing&quot;&gt;here&lt;/a&gt;.
We already addressed the most important comments in our documentation and project ideas for the next year.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;recognition&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#recognition&quot; /&gt;Recognition&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last year, we wanted to thank everyone who participated in the program by sending swag.
This year, we collected all the mailing addresses we could and sent to everyone we could the 15-year Jenkins special edition T-shirt, and some stickers.
This was a great feel good moment.
I want to personally thank Alyssa Tong her help on setting aside the t-shirt and stickers.&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/2020/01-gsoc2019-report/swag-before-shipping.jpg&quot; alt=&quot;swag before shipping&quot; width=&quot;400&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;mentor-summit&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mentor-summit&quot; /&gt;Mentor summit&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each year Google invites two or more mentors from each organization to the Google Summer of Code Mentor Summit.
At this event, hundreds of open-source project maintainers and mentors meet together and have unconference sessions targeting GSoC, community management and various tools.
This year the summit was held in Munich,
and we sent &lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky Jackson&lt;/a&gt; and &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; as representatives there.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Apart from discussing projects and sharing chocolate, we also presented Jenkins there, conducted a lightning talk and hosted the unconference session about automation bots for GitHub.
We did not make a team photo there, so try to find Oleg and Marky on this photo:&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/2020/01-gsoc2019-report/gsoc2019-mentor-summit.jpg&quot; alt=&quot;GSoC2019 Mentor summit&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;gsoc-team-at-devops-world-jenkins-world&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gsoc-team-at-devops-world-jenkins-world&quot; /&gt;GSoC Team at DevOps World | Jenkins World&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We traditionally use GSoC organization payments and travel grants to sponsor student trips to major Jenkins-related events.
This year four students traveled to the DevOps World | Jenkins World conferences in &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;San-Francisco&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;Lisbon&lt;/a&gt;.
Students presented their projects at the community booth and at the contributor summits,
and their presentations got a lot of traction in the community!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks a lot to Google and CloudBees who made these trips possible.
You can find a travel report from Natasha Stopa &lt;a href=&quot;https://www.jenkins.io/blog/2019/08/22/devops-world/&quot;&gt;here&lt;/a&gt;,
more travel reports are coming soon.&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/2020/01-gsoc2019-report/gsoc2019-team-jw-us.jpg&quot; alt=&quot;gsoc2019 team jw us&quot; width=&quot;500&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2020/01-gsoc2019-report/gsoc2019-team-jw-lisbon.jpg&quot; alt=&quot;gsoc2019 team jw lisbon&quot; width=&quot;500&quot; /&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&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;This year, five projects were successfully completed.
We find this to be normal and in line with what we hear from other participating organizations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Taking the time early to update our GSoC pages saved us a lot of time later because we did not have to repeat all the information every time someone contacted us.
We find that keeping track of all the mentors, the students, the projects, and the meta information is a necessary but time consuming task.
We wish we had a tool to help us do that.
Coordinating meetings and reminding participants of what needs to be accomplished for deadlines is part of the cheerleading aspect of GSoC, we need to keep doing this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, I want to thank again all participants, we could not do this without you.
Each year we are impressed by the students who do great work and bring great contributions to the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;gsoc-2020&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gsoc-2020&quot; /&gt;GSoC 2020?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, there will be Google Summer of Code 2020!
We plan to participate, and we are looking for project ideas, mentors and students.
Jenkins GSoC pages have been already updated towards the next year, and we invite everybody interested to join us next year!&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/&quot;&gt;Main page with all contacts&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/project-ideas/&quot;&gt;GSoC 2020 Project Ideas&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2019/12/20/call-for-mentors/&quot;&gt;GSoC 2020 Call for Mentors and Project Ideas&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Information for &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors/&quot;&gt;students&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors/&quot;&gt;mentors&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/01/23/a-new-chapter-for-kohsuke/</id>
<title>A new chapter for Kohsuke</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-01-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/01/23/a-new-chapter-for-kohsuke/" />
<author>
<name>kohsuke</name>
</author>
<category term='community'></category>
<category term='governance'></category>
<category term='announcement'></category>
<summary>
2020 is going to be a year of change for me.
By the end of January, I’ll be officially stepping back from Jenkins,
switching my role at CloudBees to an advisor,
and turning attention to my new startup.
The rest of this post is to contextualize this transition, because if you haven’t been working closely with me, this might come across as a surprise.







Jenkins has been an amazing journey that never stopped giving.
I have loved it all - especially meeting the users around the world who made Jenkins what it is today.
As the creator of the project, at some point I started wondering how...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2020 is going to be a year of change for me.
By the end of January, I’ll be officially stepping back from Jenkins,
switching my role at &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; to an advisor,
and turning attention to &lt;a href=&quot;https://launchableinc.com/&quot;&gt;my new startup&lt;/a&gt;.
The rest of this post is to contextualize this transition, because if you haven’t been working closely with me, this might come across as a surprise.&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/2020/01-a-new-chapter-for-kohsuke/thanks-kohsuke.png&quot; alt=&quot;ThanksKohsuke&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has been an amazing journey that never stopped giving.
I have loved it all - especially meeting the users around the world who made Jenkins what it is today.
As the creator of the project, at some point I started wondering how to pass the torch to the next leaders, how to get people to step up and drive it forward.
Today, thanks to CloudBees and the community, there is a new generation of talented and capable leaders who are passionately driving things forward - and it’s been great to see.
&lt;a href=&quot;https://www.jenkins.io/blog/2019/12/16/board-election-results/&quot;&gt;Newly elected board members&lt;/a&gt;, &lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt; folks, just to name a few.
These new people bring new culture and new code, and altogether it has created a positive jolt that pushed Jenkins out of  &lt;a href=&quot;https://www.jenkins.io/blog/2018/08/31/shifting-gears/&quot;&gt;a local optimum I talked about&lt;/a&gt;.
They have all my support and respect.
In reality, my involvement with Jenkins lately has already been largely symbolic, a little bit like an emperor of Japan or a queen of the UK.
That’s why this announcement has little practical impact on the forward motion of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several years ago, I used to feel like the sky would fall down if I stepped aside.
Somewhere in 2019, I suddenly noticed that I wasn’t feeling like that at all anymore.
The shift was gradual and steady, so I’m not sure exactly when I crossed the threshold, but in 2019 it was clear I was on the other side.
That’s how I knew I could finally end this chapter of my life.
15 years with Jenkins and 9 years with CloudBees.
That is a long time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope you will be wondering what is my new chapter.
I’m launching a new startup, &lt;a href=&quot;https://launchableinc.com/&quot;&gt;Launchable&lt;/a&gt;, with my old time buddy &lt;a href=&quot;https://www.linkedin.com/in/singhharpreet/&quot;&gt;Harpreet Singh&lt;/a&gt;.
I have known him since my days at Sun Microsystems and JavaEE, and he was my partner in crime at CloudBees to build the Jenkins business from scratch.
He went to Atlassian running its BitBucket business for a while, but now he and I are back sitting side by side again.
A number of CloudBees people invested, including &lt;a href=&quot;https://www.linkedin.com/in/sachalabourey/&quot;&gt;Sacha Labourey&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/bobbickel/&quot;&gt;Bob Bickel&lt;/a&gt;,
and &lt;a href=&quot;https://www.linkedin.com/in/johnvrionis/&quot;&gt;John Vrionis&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Through Jenkins and CloudBees, I was able to push the state of automation forward in software development.
Such automation is producing a lot of data, but we are not using that data to improve our lives.
It truly is a wasted gold mine.
Launchable is working on harnessing that information to improve developer productivity.
I wrote &lt;a href=&quot;https://launchableinc.com/2020/01/23/kohsuke-kawaguchi-launchable-smarter-testing-faster-devops/&quot;&gt;a separate blog post to discuss more about my thinking&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, even though I’m moving on from CloudBees as a full-time employee, I’m not completely going away.
I’ll be still in the CloudBees orbit, as an advisor.
I’m still very much invested both emotionally and financially in CloudBees.
I’m still a big fan, and I’ll continue to cheer for them, but from the sideline.
The same with Jenkins.
I’m still on the governance board, ensuring the continuity.
I’m also still on &lt;a href=&quot;https://github.com/cdfoundation/toc&quot;&gt;the Technical Oversight Committee&lt;/a&gt; of &lt;a href=&quot;https://cd.foundation/&quot;&gt;the Continuous Delivery Foundation&lt;/a&gt;,
though my chairperson term will expire in March.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m incredibly grateful for the undeserved opportunity and the privilege given to me during this chapter.
I was surrounded by wonderful, inspiring, and talented people, from whom I learned a lot.
I can only hope that I was able to make a positive impact, and give something back in return to them.
I won’t name names, but you know who you are, and we’ll stay in touch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year is going to be truly exciting for me. To infinity and beyond!!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/01/10/fosdem-is-coming/</id>
<title>FOSDEM 2020 is coming</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-01-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/01/10/fosdem-is-coming/" />
<author>
<name>olblak</name>
</author>
<category term='fosdem'></category>
<category term='events'></category>
<category term='community'></category>
<category term='outreach-programs'></category>
<summary>
FOSDEM 2020 is coming and with it, a lot of great folks come in town.
It’s always a great moment to meet Jenkins community members, share stories and get inspired.
I hope that this year will be as great as it always been and for that, we organize a few things


Things we&#8217;ll do


During the whole event, we&#8217;ll be virtually on the Gitter


On the Thursday 30 of January, there will be two workshops one about Jenkins Pipelines lead by Mark Waite, and a second one about JenkinsX by Viktor Farcic.


On the Friday 31 of January, the Jenkins project will hold a Contributor Summit...
</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/fosdem&quot; alt=&quot;FOSDEM&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2020/&quot;&gt;FOSDEM&lt;/a&gt; 2020 is coming and with it, a lot of great folks come in town.
It’s always a great moment to meet Jenkins community members, share stories and get inspired.
I hope that this year will be as great as it always been and for that, we organize a few things&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;things-well-do&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#things-well-do&quot; /&gt;Things we’ll do&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the whole event, we’ll be virtually on the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_fosdem:gitter.im&quot;&gt;Gitter&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the Thursday 30 of January, there will be two workshops one about &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-pipeline-fundamentals-training-tickets-87080214265&quot;&gt;Jenkins Pipelines&lt;/a&gt; lead by Mark Waite, and a second one about &lt;a href=&quot;https://www.eventbrite.com/e/workshop-cloud-native-kubernetes-first-serverless-continuous-delivery-with-jenkins-x-kubernetes-and-tickets-87082627483&quot;&gt;JenkinsX&lt;/a&gt; by Viktor Farcic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the Friday 31 of January, the Jenkins project will hold a &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/267684785/&quot;&gt;Contributor Summit&lt;/a&gt; where we invite active contributors and those who are interested in working on foundation projects, e.g. key architecture changes and projects (UX, JCasC, Cloud native Jenkins, etc.), governance, infrastructure. There will be no user-focused topics (no presentations, no trainings, etc.) but we will focus on defining key priorities for the project, building a roadmap and resolving issues we have in the project at the moment.
We’ll end up the day with our now traditional Orval and flemish beef stew at &lt;a href=&quot;http://roydespagne.be/fr/index.php&quot;&gt;Le Roy d’Espagne&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally the FOSDEM, the 01 and 02 of February, we’ll all be at FOSDEM. So come and say &quot;hi&quot; at the Jenkins/JenkinsX &lt;a href=&quot;https://fosdem.org/2020/stands/&quot;&gt;stand&lt;/a&gt;, inside the &lt;a href=&quot;https://fosdem.org/2020/schedule/track/continuous_integration_and_continuous_deployment/&quot;&gt;CICD Devroom&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or just come and share beers&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cheers&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/logos/atomium/256.png&quot; alt=&quot;Atomium&quot;&gt;
&lt;/img&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/2020/01/08/atlassians-new-bitbucket-server-integration-for-jenkins/</id>
<title>Atlassian&#39;s new Bitbucket Server integration for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-01-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/01/08/atlassians-new-bitbucket-server-integration-for-jenkins/" />
<author>
<name>dkjellin</name>
</author>
<category term='bitbucket'></category>
<category term='pipeline'></category>
<category term='plugins'></category>
<summary>
We know that for many of our customers Jenkins is incredibly important and its integration with Bitbucket Server is a key part of their development workflow.
Unfortunately, we also know that integrating Bitbucket Server with Jenkins wasn’t always easy – it may have required multiple plugins and considerable time.
That’s why earlier this year we set out to change this.
We began building our own integration, and we’re proud to announce that v1.0 is out.


The new Bitbucket Server integration for Jenkins plugin, which is built and supported by Atlassian, is the easiest way to link Jenkins with Bitbucket Server.
It streamlines the entire set-up...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We know that for many of our customers Jenkins is incredibly important and its integration with &lt;a href=&quot;https://www.atlassian.com/software/bitbucket/enterprise/data-center&quot;&gt;Bitbucket Server&lt;/a&gt; is a key part of their development workflow.
Unfortunately, we also know that integrating Bitbucket Server with Jenkins wasn’t always easy – it may have required multiple plugins and considerable time.
That’s why earlier this year we set out to change this.
We began building our own integration, and we’re proud to announce that v1.0 is out.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new &lt;a href=&quot;https://plugins.jenkins.io/atlassian-bitbucket-server-integration&quot;&gt;Bitbucket Server integration for Jenkins plugin&lt;/a&gt;, which is built and supported by Atlassian, is the easiest way to link Jenkins with Bitbucket Server.
It streamlines the entire set-up process, from creating a webhook to trigger builds in Jenkins, to posting build statuses back to Bitbucket Server.
It also supports &lt;a href=&quot;https://confluence.atlassian.com/bitbucketserver/smart-mirroring-776640046.html&quot;&gt;smart mirroring&lt;/a&gt; and lets Jenkins clone from mirrors to free up valuable resources on your primary server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our plugin is available to install through Jenkins now.
Watch this video to find out how, or read the &lt;a href=&quot;https://www.jenkins.io/solutions/bitbucketserver/&quot;&gt;BitBucket Server solution page&lt;/a&gt; to learn more about it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/0-FugzVYJQU?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you’ve tried it out we’d love to hear any feedback you have.
To share it with us, visit &lt;a href=&quot;https://issues.jenkins.io&quot; class=&quot;bare&quot;&gt;https://issues.jenkins.io&lt;/a&gt; and create an issue using the component &lt;strong&gt;atlassian-bitbucket-server-integration-plugin&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2020/01/07/happy-new-year/</id>
<title>Happy New Year! 2019/2020 edition</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2020-01-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2020/01/07/happy-new-year/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='community'></category>
<category term='new-year-blogpost'></category>
<category term='governance'></category>
<summary>
Jenkins project congratulates all users and contributors with the New Year!
Let&#8217;s take a look at some changes this year.





Highlights




We celebrated 15 years of Jenkins


We had first ever Governance Board and Officer elections


Jenkins project joined the Continuous Delivery Foundation (CDF)


We released Java 11 support in Jenkins


Jenkins X has graduated as a Jenkins sub-project and became a new project under umbrella of CDF


In October 2019 we reached the record high number of contributions: 915 unique contributors, 124 of them were first-timers


We started new special interest groups for Documentation and User Experience.


A new position of the Documentation officer was introduced to highlight an...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins project congratulates all users and contributors with the New Year!
Let’s take a look at some changes this year.&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/2017-12-31-new-year/card.png&quot; alt=&quot;NewYear&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#highlights&quot; /&gt;Highlights&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;We celebrated &lt;a href=&quot;https://cd.foundation/announcement/2019/08/14/jenkins-celebrates-15-years/&quot;&gt;15 years of Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had first ever &lt;a href=&quot;https://www.jenkins.io/blog/2019/12/16/board-election-results/&quot;&gt;Governance Board and Officer elections&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins project &lt;a href=&quot;https://www.jenkins.io/blog/2019/03/12/cdf-launch/&quot;&gt;joined the Continuous Delivery Foundation (CDF)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We released &lt;a href=&quot;https://www.jenkins.io/blog/2019/03/11/let-s-celebrate-java-11-support/&quot;&gt;Java 11 support in Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt; has graduated as a Jenkins sub-project and became a new project under umbrella of CDF&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In October 2019 we reached the record high number of contributions: &lt;strong&gt;915&lt;/strong&gt; unique contributors, &lt;strong&gt;124&lt;/strong&gt; of them were first-timers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We started new special interest groups for &lt;a href=&quot;https://www.jenkins.io/sigs/docs/&quot;&gt;Documentation&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/sigs/ux/&quot;&gt;User Experience&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new position of the &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation officer&lt;/a&gt; was introduced to highlight an important role of documentation in the project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We ran multiple mentorship programs with &lt;strong&gt;12&lt;/strong&gt; mentees in total: &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/&quot;&gt;Google Summer of Code&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/&quot;&gt;Hacktoberfest&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/2019/09/23/outreachy-audit-log-release/&quot;&gt;Outreachy&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;If you are interested to know more about Jenkins features introduced in 2019,
stay tuned for a separate blog post about it (coming soon!).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-updates&quot; /&gt;Project updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Highlights above do not cover all advancements we had in the project.
Below you can find slides from the &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/264795368/&quot;&gt;Jenkins contributor summit&lt;/a&gt; in Lisbon.
There we had project updates by officers, SIG and sub-project leaders.
See the slide deck to know about: Jenkins Core, Pipeline, Configuration-as-Code, Security, UX Overhaul, Jenkins Infrastructure, platform support and documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vTeUXM75UR8m_v5FbldYYNXeVW0CtXkpRydMRvQjBuew2vRyC4cjgLMSUEVNoonfYbKDSbOvasHPpxg/embed?start=false&amp;amp;loop=false&amp;amp;delayms=60000&quot; width=&quot;100%&quot; height=&quot;600px&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;some-stats-and-numbers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-stats-and-numbers&quot; /&gt;Some stats and numbers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If this section seems to be too long for you, here is some infographic prepared by &lt;a href=&quot;https://github.com/tracymiranda&quot;&gt;Tracy Miranda&lt;/a&gt;.
As you may see, Jenkins is pretty big :)&lt;/p&gt;
&lt;/div&gt;
&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/2020/01-new-year-blogpost/jenkins_stats_2019.png&quot; alt=&quot;Jenkins 2019 in numbers&quot; height=&quot;512&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Community&lt;/strong&gt;.
Over the past year we had &lt;strong&gt;5433&lt;/strong&gt; contributors in GitHub repositories (committers, reviewers, issue submitters, etc.).
We had &lt;strong&gt;1892&lt;/strong&gt; unique committers who created &lt;strong&gt;7122&lt;/strong&gt; pull requests and &lt;strong&gt;45484&lt;/strong&gt; commits, bots excluded.
Contributors represent &lt;strong&gt;273&lt;/strong&gt; companies and &lt;strong&gt;111&lt;/strong&gt; countries, 8% of contributors are recognized as independent.
The most active repositories were Jenkins Core and jenkins.io.
The most active month was October 2019 when we reached the record high number of contributions: &lt;strong&gt;915&lt;/strong&gt; unique contributors, &lt;strong&gt;124&lt;/strong&gt; of them were first-timers, thanks to &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/&quot;&gt;Hacktoberfest&lt;/a&gt;!.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Jenkins core&lt;/strong&gt;.
In 2019 Jenkins core had &lt;strong&gt;54&lt;/strong&gt; weekly and &lt;strong&gt;13&lt;/strong&gt; LTS releases with several hundreds of notable fixes/enhancements.
There was a login screen extensibility rework, many update manager and administrative monitors improvements.
We also introduced support for user timezones, not speaking of emojis support 🥳.
There was also a lot of housekeeping work: better APIs, codebase refresh, cleaning up static analysis warnings and removing deprecated features like Remoting CLI.
The core’s components also got major updates.
Only &lt;a href=&quot;https://www.jenkins.io/projects/remoting/&quot;&gt;Jenkins Remoting&lt;/a&gt; got &lt;strong&gt;11&lt;/strong&gt; releases with stability improvements and new features like support of inbound connections to headless Jenkins controllers.
There are also major incoming features like &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/222/README.adoc&quot;&gt;JEP-222: WebSocket Services support&lt;/a&gt;, UI look&amp;amp;feel updates, &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-12548&quot;&gt;JENKINS-12548: Readonly system configuration support&lt;/a&gt;, Docker images for new platforms like Arm.
To facilitate further changes we created a new &lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/0sdrcSOQW64/tD-IKDTsBQAJ&quot;&gt;Core pull request reviewers team&lt;/a&gt; and added &lt;strong&gt;9&lt;/strong&gt; contributors there.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Plugins&lt;/strong&gt;.
There were &lt;strong&gt;2654&lt;/strong&gt; plugin releases, and &lt;strong&gt;157&lt;/strong&gt; NEW plugins have been hosted in the Update Center.
Jenkins ecosystem got a lot of new integrations with Development and DevOps tools.
Also, warm welcome back to the &lt;a href=&quot;https://plugins.jenkins.io/scriptler&quot;&gt;Scriptler Plugin&lt;/a&gt; which was depublished in 2017 due to security issues.
If you are afraid about such plugin numbers and dependency management, there is a new &lt;a href=&quot;https://github.com/jenkinsci/plugin-installation-manager-tool&quot;&gt;Plugin Installation Manager CLI Tool&lt;/a&gt; which should help Jenkins users to manage plugins more efficiently.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;.
It was a hot year for the &lt;a href=&quot;https://www.jenkins.io/security/&quot;&gt;Jenkins Security Team&lt;/a&gt;.
There were &lt;strong&gt;5&lt;/strong&gt; &lt;a href=&quot;https://www.jenkins.io/security/advisories/&quot;&gt;security advisories&lt;/a&gt; for the core and &lt;strong&gt;20&lt;/strong&gt; - for plugins.
In total we disclosed &lt;strong&gt;288&lt;/strong&gt; vulnerabilities across the project, including some backlog cleaning for unmaintained plugins.
&lt;a href=&quot;https://plugins.jenkins.io/script-security&quot;&gt;Script Security Plugin&lt;/a&gt; was the hottest plugin with &lt;strong&gt;10&lt;/strong&gt; critical fixes addressing various sandbox bypass vulnerabilities.
Plain text storage and unprotected credentials were the most popular vulnerability type &lt;strong&gt;120&lt;/strong&gt; disclosures in 2019.
It was made possible by hundreds of reports submitted by contributors after code surveys,
special thanks to &lt;a href=&quot;https://github.com/woodspeed&quot;&gt;Viktor Gazdag&lt;/a&gt; who reported the most of the issues and became the Jenkins 2019 Security MVP (check out his story &lt;a href=&quot;https://www.jenkins.io/blog/2019/11/29/do-plugins-store-credentials-in-a-secure-way/&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;.
Got Jenkins? If so, you rely on Jenkins update centers, website and issue tracker.
All these and many other services are maintained by the &lt;a href=&quot;https://www.jenkins.io/projects/infrastructure/&quot;&gt;Jenkins Infrastructure Team&lt;/a&gt;.
This year the team handled &lt;strong&gt;more than 400&lt;/strong&gt; requests in the bugtracker, and many other informal requests.
In total, more than &lt;strong&gt;30&lt;/strong&gt; people contributed to Jenkins infrastructure this year (website content is excluded).
We also deployed &lt;strong&gt;4&lt;/strong&gt; new services, migrated &lt;strong&gt;7&lt;/strong&gt; services from Azure Container Service to Azure Kubernetes Service and updated many other services.
More changes will happen in the next months, and we are looking for &lt;a href=&quot;https://www.jenkins.io/projects/infrastructure/#team&quot;&gt;new INFRA team members&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;.
Only last quarter we had &lt;strong&gt;178&lt;/strong&gt; contributors to Jenkins documentation. It includes jenkins.io and other documentation hosted on GitHub, Wiki is not included.
There is also ongoing migration plugin documentation from Jenkins Wiki to GitHub (&lt;a href=&quot;https://www.jenkins.io/blog/2019/10/21/plugin-docs-on-github/&quot;&gt;announcement&lt;/a&gt;).
Since the beginning of the project in Sep 2019, more than &lt;strong&gt;150&lt;/strong&gt; plugin were migrated, and they got significant documentation revamp during the migration.
You can see the current status &lt;a href=&quot;https://jenkins-wiki-exporter.jenkins.io/progress&quot;&gt;here&lt;/a&gt;.
We also work on introducing changelog automation in the project.
&lt;strong&gt;123&lt;/strong&gt; plugins have already adopted the new &lt;a href=&quot;https://github.com/jenkinsci/.github/blob/master/.github/release-drafter.adoc&quot;&gt;changelog tools&lt;/a&gt;, powered by Release Drafter.
Also, we had more than &lt;strong&gt;60&lt;/strong&gt; technical &lt;a href=&quot;https://www.jenkins.io/blog&quot;&gt;blog posts&lt;/a&gt; published on jenkins.io.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Configuration as Code&lt;/strong&gt; was one of the most popular areas this year.
&lt;a href=&quot;https://plugins.jenkins.io/configuration-as-code&quot;&gt;Jenkins Configuration as Code Plugin&lt;/a&gt; had more than &lt;strong&gt;30&lt;/strong&gt; releases with new features and bug fixes.
More than &lt;strong&gt;50&lt;/strong&gt; plugins have been also updated in order to offer better configuration-as-code support.
As a result, the JCasC Plugin got massive adoption this year (from &lt;strong&gt;2000&lt;/strong&gt; to almost &lt;strong&gt;8000&lt;/strong&gt; installations),
and now it becomes a de-facto standard for managing Jenkins as code.
This year we also ran our very first &lt;a href=&quot;https://communitybridge.org/&quot;&gt;CommunityBridge&lt;/a&gt; project devoted to &lt;a href=&quot;https://www.jenkins.io/projects/jcasc/dev-tools/&quot;&gt;JCasC Schema validation and developer tools&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Events and outreach programs&lt;/strong&gt;.
In 2019 we participated in multiple conferences, including FOSDEM, DevOps World | Jenkins World, SCALE.
More than &lt;strong&gt;40&lt;/strong&gt; Jenkins Area Meetups were organized across the world, and there were many other meetups devoted to Jenkins.
We also kept expanding our &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/outreach-programs/&quot;&gt;outreach programs&lt;/a&gt;.
In total we had &lt;strong&gt;12&lt;/strong&gt; students who participated in &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/&quot;&gt;Google Summer of Code&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/blog/2019/09/23/outreachy-audit-log-release/&quot;&gt;Outreachy&lt;/a&gt; and newly introduced &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/outreach-programs/#community-bridge&quot;&gt;Community Bridge&lt;/a&gt;.
We also had the biggest ever &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/&quot;&gt;Hacktoberfest&lt;/a&gt; with &lt;strong&gt;664&lt;/strong&gt; pull requests and &lt;strong&gt;102&lt;/strong&gt; participants.
These outreach programs help us to deliver new features in Jenkins.
For example, this year we added &lt;a href=&quot;https://plugins.jenkins.io/github-branch-sourcep&quot;&gt;Multi-branch Pipeline support for Gitlab&lt;/a&gt; and a new &lt;a href=&quot;https://github.com/jenkinsci/plugin-installation-manager-tool&quot;&gt;Plugin Installation Manager Tool&lt;/a&gt; during GSoC,
and Outreachy resulted in a new &lt;a href=&quot;https://www.jenkins.io/blog/2019/09/23/outreachy-audit-log-release/&quot;&gt;Audit Log Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Where did we get those stats?
GitHub stats came from the &lt;a href=&quot;https://devstats.cd.foundation/&quot;&gt;CDF DevStats&lt;/a&gt; service.
These stats include all repositories in the &lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;jenkinsci organization&lt;/a&gt; and most popular repositories in &lt;a href=&quot;https://github.com/jenkins-infra&quot;&gt;jenkins-infra&lt;/a&gt;, Jenkins X and other organizations/repositories within the project are not included.
Other stats came from &lt;a href=&quot;https://docs.google.com/presentation/d/e/2PACX-1vTeUXM75UR8m_v5FbldYYNXeVW0CtXkpRydMRvQjBuew2vRyC4cjgLMSUEVNoonfYbKDSbOvasHPpxg&quot;&gt;project reports&lt;/a&gt;, component changelogs, &lt;a href=&quot;https://stats.jenkins.io/&quot;&gt;Jenkins usage statistics service&lt;/a&gt;, &lt;a href=&quot;https://updates.jenkins.io/current/release-history.json&quot;&gt;plugin releases history&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;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;Year 2020 will be pretty busy for the Jenkins project.
There are many long-overdue changes in the project, which need to happen if we want the project to succeed.
As it was written &lt;a href=&quot;https://www.jenkins.io/blog/2019/12/16/board-election-results/#whats-next-for-the-board&quot;&gt;Board elections blogpost&lt;/a&gt;,
there are many areas to consider: UX revamp, cloud native Jenkins, pluggable storage, etc.
In the coming months there will be a lot of discussions in &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;mailing lists&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/sigs/&quot;&gt;special interest groups&lt;/a&gt;,
and we invite all teams to work on their roadmaps and to communicate them in the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next month we will participate in &lt;a href=&quot;https://fosdem.org/2020/&quot;&gt;FOSDEM&lt;/a&gt;, and there will be a Jenkins stand there.
On January 31st we will also host a traditional &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/267684785/&quot;&gt;contributor summit in Brussels&lt;/a&gt;,
where we will talk about next steps for the project, in terms of technical roadmaps and the project governance.
If you are interested in Jenkins, stop by at our community booths and join us at the summit!
See &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/PUgV5xxHMwgp&quot;&gt;this thread&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also plan to continue all outreach programs.
At the moment we are looking for Google Summer of Code 2020 mentors and project ideas (&lt;a href=&quot;https://www.jenkins.io/blog/2019/12/20/call-for-mentors/&quot;&gt;announcement&lt;/a&gt;),
and we will be also interested to consider non-coding projects as a part of other programs like CommunityBridge.
We also work on improving &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;contribution guidelines&lt;/a&gt; for newcomers and expert contributors.
If you are interested, please contact the &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/&quot;&gt;Advocacy and Outreach SIG&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;and-even-more&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#and-even-more&quot; /&gt;And even more&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post does not provide a full overview of what changed in the project.
The Jenkins project consists of more than 2000 plugins and components which are developed by thousands of contributors.
Thanks to them, a lot of changes happen in the project every day.
We are cordially grateful to everybody who participates in the project, regardless of contribution size.
Everything matters: new features, bug fixes, documentation, blog posts, well reported issues, Stackoverflow responses, etc.
THANKS A LOT FOR ALL YOUR CONTRIBUTIONS!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, keep updating Jenkins and exploring new features.
And stay tuned, there is much more to come 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/2019/12/20/call-for-mentors/</id>
<title>Google Summer of Code 2020 call for Project ideas and Mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-12-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/12/20/call-for-mentors/" />
<author>
<name>martinda</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2020'></category>
<category term='community'></category>
<category term='events'></category>
<category term='developer'></category>
<summary>
Google Summer of Code (GSoC)
is as program where students are paid a stipend by Google to work on a free open source project.
Students work on the project full-time for four months (May to August).
Mentors are actively involved with students starting at the end of February when students start to work on and submit their applications.
(see the timeline)








We are looking for project ideas and mentors to participate in GSoC 2020.
GSoC project ideas are coding projects that university or college students can accomplish in about four months.
The coding projects can be new features, plugins, test frameworks, infrastructure, etc.
Anyone can submit a project...
</summary>
<content type='html'>
&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;a href=&quot;https://developers.google.com/open-source/gsoc/&quot;&gt;Google Summer of Code&lt;/a&gt; (GSoC)
is as program where students are paid a stipend by Google to work on a free open source project.
Students work on the project full-time for four months (May to August).
Mentors are actively involved with students starting at the end of February when students start to work on and submit their applications.
(see the &lt;a href=&quot;https://summerofcode.withgoogle.com/how-it-works/#timeline&quot;&gt;timeline&lt;/a&gt;)
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;paragraph&quot;&gt;
&lt;p&gt;We are looking for project ideas and mentors to participate in GSoC 2020.
GSoC project ideas are &lt;strong&gt;coding projects&lt;/strong&gt; that university or college students can accomplish in about four months.
The coding projects can be new features, plugins, test frameworks, infrastructure, etc.
Anyone can submit a project idea, but of course we like it even better if you offer to mentor your project idea.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We accept new project ideas at any time,
BUT we need a series of ideas READY before February 5th, 2020 at 7pm UTC,
which is the deadline for the Jenkins organization to apply to the GSoC program.
So send us your project ideas before the beginning of February so they can get a proper review by the GSoC committee and by the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 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;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For 2020, we have simplified the process.
Simply create a pull-request with your idea in a &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/2020/project-ideas&quot;&gt;idea folder&lt;/a&gt;.
It is no longer necessary to submit a Google Doc, but it will still work if you want to do that.
See the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas&quot;&gt;instructions&lt;/a&gt; on submitting ideas which include an &lt;code&gt;.adoc&lt;/code&gt; template and some examples.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-list-of-ideas&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-list-of-ideas&quot; /&gt;Current list of ideas&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We currently have a &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2020/project-ideas&quot;&gt;list of project ideas&lt;/a&gt; for students to browse,
copied from last year. Note that this list is subject to change.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 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;/h3&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;.
Note that being a GSoC mentor does not require expert knowledge of Jenkins.
Mentors do not work alone. We make sure that every project has at least two mentors.
GSoC org admins will help to find technical advisers, so you can study together with your students.&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 sometimes a bit of cheerleading.
They review student proposals, pull-requests and the students presentations
at the evaluation phase.
They fill in the Google provided evaluation report form at the end of coding periods.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-do-you-get-in-exchange&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-do-you-get-in-exchange&quot; /&gt;What do you get in exchange?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In return of mentoring, a student works on your project full time for four months.
Think about the projects that you’ve always wanted to do but never had the time…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Having a mentoring opportunity also means that you get to improve your management and people skills.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As well, up to two mentors per organization are eligible to participate in the Google Mentor Summit taking place each year.
The Jenkins Org Admins try to send different mentors each year.
It is also possible to win an additional seat at the summit in the &quot;last minute draw&quot;
(Google draws mentors at random to fill the cancellations and empty seats).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.jenkins.io/blog/2019/10/08/google-summer-of-code-mentor-and-org-admin-perspective/&quot;&gt;this post&lt;/a&gt; from one of the 2019 mentors
on the kind of experience this was.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC is a pretty good return on the investment!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For any question, 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 chat&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/12/16/board-election-results/</id>
<title>2019 Jenkins Board and Officer Elections Results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-12-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/12/16/board-election-results/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
The Jenkins community has recently completed the 2019 elections for Board and Officer positions.
The call for nominations concluded on Nov 25 and the election results were announced in the developer mailing list on Nov 28.


On behalf of the Jenkins community, we congratulate all elected board members and officers!
We also thank all contributors who participated this year: all nominees and hundreds of voters.
These are the first elections ever conducted by the Jenkins project, and it is a big milestone for the community.


Election results:




Ullrich Hafner, Alex Earl and Oleg Nenashev will join Kohsuke Kawaguchi and R. Tyler Croy on the Jenkins Governance...
</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/post-images/elections-2019/election-2019-opengraph.png&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 recently completed the 2019 elections for Board and Officer positions.
The call for nominations concluded on Nov 25 and the election results were &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/bX2qhzoEWXo&quot;&gt;announced in the developer mailing list&lt;/a&gt; on Nov 28.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the Jenkins community, we congratulate all elected board members and officers!
We also thank all contributors who participated this year: all nominees and hundreds of voters.
These are the first elections ever conducted by the Jenkins project, and it is a big milestone for the community.&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://github.com/uhafner&quot;&gt;Ullrich Hafner&lt;/a&gt;, &lt;a href=&quot;https://github.com/slide&quot;&gt;Alex Earl&lt;/a&gt; and &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; will join &lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; and &lt;a href=&quot;https://github.com/rtyler/&quot;&gt;R. Tyler Croy&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://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt; was elected as &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;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; was elected as &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;Nominations for Infrastructure, Release and Documentation officer positions were uncontested.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/olblak&quot;&gt;Olivier Vernin&lt;/a&gt; was elected 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://github.com/olivergondza&quot;&gt;Oliver Gondža&lt;/a&gt; was elected 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://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; was elected as &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation Officer&lt;/a&gt; (uncontested)&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 interested to learn more, please see the blog post below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;board-election-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#board-election-details&quot; /&gt;Board election details&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://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_570327cde7f6c9fc&quot;&gt;voting results&lt;/a&gt; are:&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;&lt;strong&gt;&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;&lt;/strong&gt; (Condorcet winner: wins contests with all other choices)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt;  loses to Oleg Nenashev by 181–127&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/uhafner&quot;&gt;Ullrich Hafner&lt;/a&gt;&lt;/strong&gt;  loses to Oleg Nenashev by 198–115, loses to Mark Waite by 171–133&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/slide&quot;&gt;Alex Earl&lt;/a&gt;&lt;/strong&gt;  loses to Oleg Nenashev by 225–82, loses to Ullrich Hafner by 168–128&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/olivergondza&quot;&gt;Oliver Gondža&lt;/a&gt;  loses to Oleg Nenashev by 227–76, loses to Alex Earl by 151–136&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/LinuxSuRen&quot;&gt;Zhao Xiaojie (aka Rick)&lt;/a&gt;  loses to Oleg Nenashev by 233–82, loses to Oliver Gondža by 160–131&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although Mark Waite came second in the voting results, being on the board would violate the &lt;a href=&quot;https://www.jenkins.io/project/board-election-process/#corporate-involvement&quot;&gt;Corporate Involvement clause&lt;/a&gt; which states that &quot;the number of board members affiliated with one company must be less than 50%&quot;.
Based on that rule, the third seat &lt;a href=&quot;https://github.com/slide&quot;&gt;Alex Earl&lt;/a&gt; will join the Jenkins board.
At the same time, &lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; will take the newly introduced role of &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;Documentation officer&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All new board members are elected for a 2-year term, unless they step down earlier.
The estimated end of term for them is December 02, 2021.
The actual date will depend on the election schedule in 2021.&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;We have reelected all 5 officers for the new 1-year term, with the estimated end of term on Dec 02, 2020.&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/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; won the biggest support as an Events officer (&lt;a href=&quot;https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_6267ca0d4a8e90c6&quot;&gt;voting results&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt; won the biggest support as a Security officer (&lt;a href=&quot;https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_9d72d0e7b04414c7&quot;&gt;voting results&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;When an officer position has only one candidate that is willing to accept the nomination, there is no reason to vote on that position.
This year some nominees declined the nominations before the election happened, and 3 officer nominations were finally uncontested:
&lt;a href=&quot;https://github.com/olblak&quot;&gt;Olivier Vernin&lt;/a&gt; - &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#infrastructure&quot;&gt;infrastructure officer&lt;/a&gt;,
&lt;a href=&quot;https://github.com/ogondza&quot;&gt;Oliver Gondža&lt;/a&gt; - &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#release&quot;&gt;release officer&lt;/a&gt;,
&lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; - &lt;a href=&quot;https://www.jenkins.io/project/team-leads/#documentation&quot;&gt;documentation officer&lt;/a&gt;.&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;Here are some voting stats from these elections:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Total number of eligible accounts: 91,015&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Total number of registered voters: 831&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Total number of votes: 343&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This election was hosted on the &lt;a href=&quot;https://civs.cs.cornell.edu/&quot;&gt;Condorcet Internet Voting Service (CIVS)&lt;/a&gt;.
While preparing for the elections, we discovered that CIVS is unable to support our large number of eligible voters.
We created a &lt;a href=&quot;https://www.jenkins.io/blog/2019/11/08/board-elections/&quot;&gt;voter registration system&lt;/a&gt; to identify voters and then registered those voters with CIVS.
The workaround required a slight voting delay.
Special thanks to &lt;a href=&quot;https://github.com/olblak&quot;&gt;Olivier Vernin&lt;/a&gt; and &lt;a href=&quot;https://github.com/tracymiranda&quot;&gt;Tracy Miranda&lt;/a&gt; who made it possible!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next-for-the-board&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next-for-the-board&quot; /&gt;What’s next for the board?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In short term, the renewed board will focus on running the Jenkins governance processes (meetings, budget approvals, funding, etc.) and defining next steps towards improving the project.
One of the priorities will be to organize knowledge and permission transfers to new board members so that they can be effective in their new roles.
There are also pending activities like Jenkins&#39; transition to &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation&lt;/a&gt; which require attention from board members.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For longer term, there are some ideas floating around:
  roadmap for key components,
  long-anticipated architecture changes (UX revamp, pluggable storage, cloud native Jenkins),
  adopting Linux Foundation best practices like &lt;a href=&quot;https://www.coreinfrastructure.org/&quot;&gt;Core Infrastructure Initiative&lt;/a&gt;,
  contributor onboarding,
  etc.
Such initiatives are instrumental for further evolvement of the Jenkins project,
and the board could help to facilitate them in the community.
The ideas will be discussed in &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;mailing lists&lt;/a&gt; and during governance meetings.
If you would like to share your vision and ideas about what’s needed in the project,
it is definitely a great time to do so!&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;We will also also plan to conduct a public retrospective at one of the next &lt;a href=&quot;https://www.jenkins.io/sigs/advocacy-and-outreach/&quot;&gt;Advocacy and Outreach SIG&lt;/a&gt; meetings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins project plans to conduct elections every year.
We appreciate and welcome any feedback regarding the election process.
Please use the following channels for feedback and suggestions:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;There is a &lt;a href=&quot;https://docs.google.com/document/d/1Htgjq2Gnojz6a-FE62kgjIq6AVR8ctPcARbd-m2KctQ/edit?usp=sharing&quot;&gt;Retrospective document&lt;/a&gt; in Google Docs.
Everyone can suggest changes in this document, and we will integrate them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For ideas about the project improvements and next steps for the board,
please use the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Jenkins Developers&lt;/a&gt; mailing list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For private feedback, please send an email to the &lt;a href=&quot;mailto:jenkinsci-board@googlegroups.com&quot;&gt;Jenkins Board&lt;/a&gt; or to &lt;a href=&quot;mailto:tmiranda@cloudbees.com&quot;&gt;Tracy Miranda&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&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/project/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/project/board-election-process&quot;&gt;Jenkins Board Election Process&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/project/team-leads&quot;&gt;Jenkins Officers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2019/09/25/board-elections/&quot;&gt;2019 election announcement&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2019/11/08/board-elections/&quot;&gt;2019 election updates on Nov 08&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1Htgjq2Gnojz6a-FE62kgjIq6AVR8ctPcARbd-m2KctQ/edit?usp=sharing&quot;&gt;Retrospective document&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/2019/12/14/generic-webhook-trigger-plugin/</id>
<title>Generic Webhook Trigger Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-12-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/12/14/generic-webhook-trigger-plugin/" />
<author>
<name>tomasbjerre</name>
</author>
<category term='webhooks'></category>
<category term='trigger'></category>
<category term='pipeline'></category>
<category term='security'></category>
<category term='scalability'></category>
<summary>
Table of Contents

The Problem

Code Duplication And Security
A Branch Is Not A Feature
Documentation


The Solution

Code Duplication And Security
A Branch Is Not A Feature
Documentation





This post will describe some common problems I&#8217;ve had with Jenkins and how I solved them by developing Generic Webhook Trigger Plugin.


The Problem


I was often struggling with the same issues when working with Jenkins:




Code duplication and security - Jenkinsfiles in every repository.


A branch is not a feature - Parameterized jobs on master branch often mix parameters relevant for different features.


Poorly documented trigger plugins - Proper documented services but poorly documented consuming plugins.




Code Duplication And Security

Having Jenkinsfiles in every Git repository...
</summary>
<content type='html'>
&lt;div id=&quot;toc&quot; class=&quot;toc&quot;&gt;
&lt;div id=&quot;toctitle&quot;&gt;Table of Contents&lt;/div&gt;
&lt;ul class=&quot;sectlevel1&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#the-problem&quot;&gt;The Problem&lt;/a&gt;
&lt;ul class=&quot;sectlevel2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#code-duplication-and-security&quot;&gt;Code Duplication And Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#a-branch-is-not-a-feature&quot;&gt;A Branch Is Not A Feature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#documentation&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#the-solution&quot;&gt;The Solution&lt;/a&gt;
&lt;ul class=&quot;sectlevel2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#code-duplication-and-security-2&quot;&gt;Code Duplication And Security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#a-branch-is-not-a-feature-2&quot;&gt;A Branch Is Not A Feature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#documentation-2&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post will describe some common problems I’ve had with Jenkins and how I solved them by developing &lt;a href=&quot;https://plugins.jenkins.io/generic-webhook-trigger&quot;&gt;Generic Webhook Trigger Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-problem&quot; /&gt;The Problem&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I was often struggling with the same issues when working with Jenkins:&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;Code duplication and security&lt;/strong&gt; - &lt;code&gt;Jenkinsfiles&lt;/code&gt; in every repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A branch is not a feature&lt;/strong&gt; - Parameterized jobs on &lt;code&gt;master&lt;/code&gt; branch often mix parameters relevant for different features.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Poorly documented trigger plugins&lt;/strong&gt; - Proper documented services but poorly documented consuming plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;code-duplication-and-security&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-duplication-and-security&quot; /&gt;Code Duplication And Security&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Having Jenkinsfiles in every Git repository allows developers to let those files diverge. Developers pushes forward with their projects and it is hard to maintain patterns to share code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have, almost, solved code duplication with &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;shared libraries&lt;/a&gt; but it does not allow me to setup a strict pattern that must be followed. Any developer can still decide to not invoke the features provided by the shared library.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is also the security aspect of letting developers run any code from the Jenkinsfiles. Developers might, for example, print passwords gathered from credentials. Letting developers execute any code on the Jenkins nodes just does not seem right to me.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-branch-is-not-a-feature&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-branch-is-not-a-feature&quot; /&gt;A Branch Is Not A Feature&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Bitbucket there are projects and each project has a collection of git repositories. Something like this:&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;PROJ_1&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;REPO_1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;REPO_2&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;PROJ_2&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;REPO_3&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lets think about some features we want to provide for these repositories:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pull request verification&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Building snapshot (or pre release if you will)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Building releases&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the developers are use to the repositories being organized like this in Bitbucket, should we not organize them the same way in Jenkins? And if they browse Jenkins should they not find one job per feature, like &lt;code&gt;pull-request&lt;/code&gt;, &lt;code&gt;snapshot&lt;/code&gt; and &lt;code&gt;release&lt;/code&gt;? Each job with parameters only relevant for that feature. I think so! Like this:&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;/&lt;/code&gt; - Jenkins root&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/PROJ_1&lt;/code&gt; - A folder, lists git repositories&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/PROJ_1/REPO_1&lt;/code&gt; - A folder, lists jobs relevant for that repo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/PROJ_1/REPO_1/release&lt;/code&gt; - A job, performs releases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/PROJ_1/REPO_1/snapshot&lt;/code&gt; - A job, performs snapshot releases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/PROJ_1/REPO_1/pull-request&lt;/code&gt; - A job, verifies pull requests.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;…​&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;In this example, both &lt;code&gt;snapshot&lt;/code&gt; and &lt;code&gt;release&lt;/code&gt; jobs might work with the same git branch. The difference is the feature they provide. Their parameters can be well documented as you don’t have to mix parameters relevant for releases and those relevant for snapshots. This cannot be done with &lt;a href=&quot;https://plugins.jenkins.io/workflow-multibranch&quot;&gt;Multibranch Pipeline Plugin&lt;/a&gt; where you specify parameters as &lt;code&gt;properties&lt;/code&gt; per 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;Webhooks are often well documented in the services providing them. See:&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://confluence.atlassian.com/bitbucket/manage-webhooks-735643732.html&quot;&gt;Bitbucket Cloud&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://confluence.atlassian.com/bitbucketserver/managing-webhooks-in-bitbucket-server-938025878.html&quot;&gt;Bitbucket Server&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.github.com/webhooks/&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.gitlab.com/ce/user/project/integrations/webhooks.html&quot;&gt;GitLab&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://gogs.io/docs/features/webhook&quot;&gt;Gogs&lt;/a&gt; and &lt;a href=&quot;https://docs.gitea.io/en-us/webhooks/&quot;&gt;Gitea&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://portal.assembla.com/hc/en-us/articles/226889127-Post-information-to-external-systems-using-Webhooks&quot;&gt;Assembla&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.atlassian.com/server/jira/platform/webhooks/&quot;&gt;Jira&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;It bothered me that, even if I understood these webhooks, I was unable to use them. Because I needed to perform development in the plugin I was using in order to provide whatever value from the webhook to the build. That process could take months from PR to actual release. Such a simple thing should really not be an issue.&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;the-solution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-solution&quot; /&gt;The Solution&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My solution is pretty much &lt;strong&gt;back to basics&lt;/strong&gt;: We have an automation server (Jenkins) and we want to trigger it on external webhooks. We want to gather information from that webhook and provide it to our build. In order to support it I have created the &lt;a href=&quot;https://plugins.jenkins.io/generic-webhook-trigger&quot;&gt;Generic Webhook Trigger Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latest docs are available in &lt;a href=&quot;https://github.com/jenkinsci/generic-webhook-trigger-plugin/&quot;&gt;the repo&lt;/a&gt; and I also have a fully working example with GitLab implemented using &lt;code&gt;configuration-as-code&lt;/code&gt;. See the repository &lt;a href=&quot;https://github.com/tomasbjerre/jenkins-configuration-as-code-sandbox&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;code-duplication-and-security-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-duplication-and-security-2&quot; /&gt;Code Duplication And Security&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I establish a convention that all developers must follow. Instead of letting the developers explicitly invoke the infrastructure from Jenkinsfiles. There are rules to follow, like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;All git repositories should be built from the root of the repo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If it contains a &lt;code&gt;gradlew&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Build is done with &lt;code&gt;./gradlew build&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release is done with &lt;code&gt;./gradlew release&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;…​ and so on&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If it contains a &lt;code&gt;package.json&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Build is done with &lt;code&gt;npm run build&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release is done with &lt;code&gt;npm run release&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;…​ and so on&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With these rules, pipelines can be totally generic and no Jenkinsfiles are needed in the repositories. Some git repositories may, for some reason, need to disable test cases. That can be solved by allowing repositories to add a special file, perhaps &lt;code&gt;jenkins-settings.json&lt;/code&gt;, let the infrastructure discover and &lt;a href=&quot;https://github.com/tomasbjerre/jenkins-configuration-as-code-sandbox/blob/master/vars/buildRepo.groovy#L52&quot;&gt;act on its content&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This also helps the developers even when not doing CI. When they clone a new, to them unknown, repository they will know what commands can be issued and their semantics.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-branch-is-not-a-feature-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-branch-is-not-a-feature-2&quot; /&gt;A Branch Is Not A Feature&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I implement:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins job configurations - With &lt;a href=&quot;https://github.com/jenkinsci/job-dsl-plugin/wiki&quot;&gt;Job DSL&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins build process - With &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;Pipelines&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;Shared Library&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;By integrating with the git service from &lt;a href=&quot;https://github.com/jenkinsci/job-dsl-plugin/wiki&quot;&gt;Job DSL&lt;/a&gt; I can automatically find the git repositories. I create jobs dynamically organized in folders. Also invoking the git service to setup webhooks triggering those jobs. The jobs are ordinary pipelines, not multibranch, and they don’t use Jenkinsfile from Git but instead Jenksinfile configured in the job using &lt;a href=&quot;https://github.com/jenkinsci/job-dsl-plugin/wiki&quot;&gt;Job DSL&lt;/a&gt;. So that all job configurations and pipelines are under version control. This is all happening &lt;a href=&quot;https://github.com/tomasbjerre/jenkins-configuration-as-code-sandbox/blob/master/jobs/applicationRepo.groovy&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;documentation-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#documentation-2&quot; /&gt;Documentation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin uses &lt;code&gt;JSONPath&lt;/code&gt;, and also &lt;code&gt;XPath&lt;/code&gt;, to extract values from JSON and provide them to the build. Letting the user pick whatever is needed from the webhook. It also has a regular expression filter to allow not triggering for some conditions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin is not very big, just being the glue between the webhook, &lt;code&gt;JSONPath&lt;/code&gt;/&lt;code&gt;XPath&lt;/code&gt; and regular expression. All these parts are very well documented already and I do my best supporting the plugin. That way this is a very well documented solution to use!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/12/10/introducing-aws-secrets-manager-credentials-provider-plugin/</id>
<title>Introducing the AWS Secrets Manager Credentials Provider for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-12-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/12/10/introducing-aws-secrets-manager-credentials-provider-plugin/" />
<author>
<name>chriskilding</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='aws'></category>
<category term='credentials'></category>
<category term='security'></category>
<summary>
API keys and secrets are difficult to handle safely, and probably something you avoid thinking about. In this post I&#8217;ll show how the new AWS Secrets Manager Credentials Provider plugin allows you to marshal your secrets into one place, and use them securely from Jenkins.


When CI/CD pipelines moved to the public cloud, credential management did not evolve with them. If you&#8217;re in this situation, you may have seen a number of tactical workarounds to keep Jenkins builds talking to the services they depend on. The workarounds range from bad (hardcoding plaintext secrets into Git) to merely painful (wrangling Hiera EYAML),...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;API keys and secrets are difficult to handle safely, and probably something you avoid thinking about. In this post I’ll show how the new &lt;a href=&quot;https://plugins.jenkins.io/aws-secrets-manager-credentials-provider&quot;&gt;AWS Secrets Manager Credentials Provider&lt;/a&gt; plugin allows you to marshal your secrets into one place, and use them securely from Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When CI/CD pipelines moved to the public cloud, credential management did not evolve with them. If you’re in this situation, you may have seen a number of tactical workarounds to keep Jenkins builds talking to the services they depend on. The workarounds range from bad (hardcoding plaintext secrets into Git) to merely painful (wrangling Hiera EYAML), but their common feature is that they tend to make copies of secrets beyond the reach of automation. This increases their attack surface, makes routine key rotation impractical, and makes remediation difficult after a breach.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The good news is that there is a better way!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AWS Secrets Manager is a comprehensive solution for secure secret storage. You define a secret just once for your whole AWS account, then you give your consumers permission to use the secrets. Secrets Manager lets you manage a secret entry (name and metadata) separately from its value, and it integrates with other AWS services that you already use:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Secret entry management: Manual (Web console, AWS CLI) or with an infrastructure management tool (&lt;a href=&quot;https://www.terraform.io/docs/providers/aws/r/secretsmanager_secret.html&quot;&gt;Terraform&lt;/a&gt;, CloudFormation etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Secret value management: Manual (Web console, AWS CLI) or automatic (secret rotation Lambda function).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Access control: AWS IAM policies (for both applications and human operators).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Secret encryption: Amazon KMS automatically encrypts the secret value. Use either the account’s default KMS key, or a customer-managed KMS key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Auditing: AWS CloudTrail and CloudWatch Events.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A couple of teams in my company started to use Secrets Manager from Jenkins jobs by calling the AWS CLI, but this remained a niche approach as it was quite unwieldy. There was clearly an appetite to integrate key developer apps with a centralised secrets store, but production-ready integrations were needed for wider adoption. So this year I created the &lt;a href=&quot;https://plugins.jenkins.io/aws-secrets-manager-credentials-provider&quot;&gt;AWS Secrets Manager Credentials Provider&lt;/a&gt; plugin for Jenkins, with help from friends in the Jenkins community, to do exactly that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is how you set it up…​&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;Install the plugin from the Jenkins update center.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Give Jenkins read-only access to Secrets Manager with an IAM policy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(Optional) Configure the plugin, either through the Global Configuration screen or Jenkins Configuration As Code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is how you use it…​&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;Create your build secrets in AWS Secrets Manager. (You can start by uploading secrets via the AWS CLI. More sophisticated methods of secret creation are also available.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;View the credentials in the Jenkins UI, to check that Jenkins can see them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bind the credentials by ID in your Jenkins job.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The provider supports the following standard Jenkins credential types:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Secret Text&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Username With Password&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSH User Private Key&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PKCS#12 Certificate&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And it has powerful advantages over quick-fix tactical solutions:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Your Jenkins jobs consume the credentials with no knowledge of Secrets Manager, so they stay vendor-independent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The provider caches relevant Secrets Manager API calls, for a quicker and more reliable experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The provider integrates with the ecosystem of existing Jenkins credential consumers, such as the Git and SSH Agent plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The provider records credential usage in the central Jenkins credentials tracking log.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins can use multiple credentials providers concurrently, so you can incrementally migrate credentials to Secrets Manager while consuming other credentials from your existing providers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the plugin’s first public release, developers at other companies adopted it too. It has had contributions so far from people at Elsevier, GoDaddy, and Northeastern University, as well as the fantastic Jenkins core team. We even got &lt;a href=&quot;https://github.com/jenkinsci/aws-secrets-manager-credentials-provider-plugin/pull/8#issuecomment-543721057&quot;&gt;fan mail&lt;/a&gt; for our work!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In enterprise security, &quot;The important things are always simple. The simple things are always hard. The easy way is always mined.&quot; (&lt;a href=&quot;https://medium.com/@thegrugq/equihax-fact-enabled-wild-speculation-21fd59aa39e2&quot;&gt;@thegrugq&lt;/a&gt;) It’s easy to buy a shiny ‘next generation&#39; security appliance and drop it into your network. But it’s hard to embed the security fundamentals (like secrets management, OS patching, secure development) across your organisation. This Jenkins plugin is part of the effort &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; to take one of the persistent hard problems in security, and make it easier for everyone.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. If you’re on Azure or you run most of your workload on Kubernetes, check out the &lt;a href=&quot;https://plugins.jenkins.io/azure-credentials&quot;&gt;Azure Credentials Plugin&lt;/a&gt; and the &lt;a href=&quot;https://plugins.jenkins.io/kubernetes-credentials-provider&quot;&gt;Kubernetes Credentials Provider Plugin&lt;/a&gt;.
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/12/02/matrix-building-with-scripted-pipeline/</id>
<title>Matrix building in scripted pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-12-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/12/02/matrix-building-with-scripted-pipeline/" />
<author>
<name>sgleske</name>
</author>
<category term='matrix'></category>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='scripted'></category>
<summary>
Table of Contents

Matrix building with scripted pipeline
Screenshot of matrix pipeline
Adding static choices
Adding dynamic choices
Full pipeline example with dynamic choices
Background: How does it work?
Exposing a shared library pipeline step
Summary



With the recent announcement about matrix building you can perform
Matrix builds
with declarative pipeline.  However, if you must use scripted pipeline, then
I&#8217;m going to cover how to matrix build platforms and tools using scripted
pipeline.  The examples in this post are modeled after the declarative pipeline
matrix examples.


Matrix building with scripted pipeline


The following Jenkins scripted pipeline will build combinations across two
matrix axes.  However, adding more axes to the matrix is just as easy...
</summary>
<content type='html'>
&lt;div id=&quot;toc&quot; class=&quot;toc&quot;&gt;
&lt;div id=&quot;toctitle&quot;&gt;Table of Contents&lt;/div&gt;
&lt;ul class=&quot;sectlevel1&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#matrix-building-with-scripted-pipeline&quot;&gt;Matrix building with scripted pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#screenshot-of-matrix-pipeline&quot;&gt;Screenshot of matrix pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#adding-static-choices&quot;&gt;Adding static choices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#adding-dynamic-choices&quot;&gt;Adding dynamic choices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#full-pipeline-example-with-dynamic-choices&quot;&gt;Full pipeline example with dynamic choices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#background-how-does-it-work&quot;&gt;Background: How does it work?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#exposing-a-shared-library-pipeline-step&quot;&gt;Exposing a shared library pipeline step&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#summary&quot;&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the recent announcement about matrix building you can perform
&lt;a href=&quot;https://www.jenkins.io/blog/2019/11/22/welcome-to-the-matrix/&quot;&gt;Matrix builds
with declarative pipeline&lt;/a&gt;.  However, if you must use scripted pipeline, then
I’m going to cover how to matrix build platforms and tools using scripted
pipeline.  The examples in this post are modeled after the declarative pipeline
matrix examples.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;matrix-building-with-scripted-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#matrix-building-with-scripted-pipeline&quot; /&gt;Matrix building with scripted pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following Jenkins scripted pipeline will build combinations across two
matrix axes.  However, adding more axes to the matrix is just as easy as adding
another entry to the &lt;code&gt;Map matrix_axes&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;c1&quot;&gt;// you can add more axes and this will still work&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&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;nl&quot;&gt;PLATFORM:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;BROWSER:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;nd&quot;&gt;@NonCPS&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getMatrixAxes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&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;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&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;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axisList&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;values&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;axisList&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&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;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axisList&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// calculate cartesian product&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;combinations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()*.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sum&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;c1&quot;&gt;// filter the matrix axes since&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Safari is not available on Linux and&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Edge is only available on Windows&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getMatrixAxes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;findAll&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;windows&#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;c1&quot;&gt;// parallel task map&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&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;nl&quot;&gt;failFast:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&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;c1&quot;&gt;// convert the Axis into valid values for withEnv step&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axisEnv&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;collect&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;s2&quot;&gt;&quot;${k}=${v}&quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// let&#39;s say you have diverse agents among Windows, Mac and Linux all of&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// which have proper labels for their platform and what browsers are&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// available on those agents.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeLabel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;os:${axis[&#39;PLATFORM&#39;]} &amp;amp;&amp;amp; browser:${axis[&#39;BROWSER&#39;]}&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axisEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#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;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nodeLabel&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;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axisEnv&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Build&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;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeLabel&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;echo Do Build for ${PLATFORM} - ${BROWSER}&#39;&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;s2&quot;&gt;&quot;Test&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;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeLabel&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;echo Do Build for ${PLATFORM} - ${BROWSER}&#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;span class=&quot;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Matrix builds&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;n&quot;&gt;parallel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tasks&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;Matrix axes contain the following combinations:&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;[PLATFORM=linux, BROWSER=firefox]
[PLATFORM=windows, BROWSER=firefox]
[PLATFORM=mac, BROWSER=firefox]
[PLATFORM=linux, BROWSER=chrome]
[PLATFORM=windows, BROWSER=chrome]
[PLATFORM=mac, BROWSER=chrome]
[PLATFORM=windows, BROWSER=safari]
[PLATFORM=mac, BROWSER=safari]
[PLATFORM=windows, BROWSER=edge]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is worth noting that Jenkins agent labels can contain a colon (&lt;code&gt;:&lt;/code&gt;).  So
&lt;code&gt;os:linux&lt;/code&gt; and &lt;code&gt;browser:firefox&lt;/code&gt; are both valid agent labels.  The node
expression &lt;code&gt;os:linux &amp;amp;&amp;amp; browser:firefox&lt;/code&gt; will search for Jenkins agents which
have &lt;strong&gt;both labels&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;screenshot-of-matrix-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#screenshot-of-matrix-pipeline&quot; /&gt;Screenshot of matrix pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following is a screenshot of the pipeline code above running in a sandbox
Jenkins environment.&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/matrix-scripted-pipeline-screenshots/pipeline-screenshot.png&quot; alt=&quot;Screenshot of matrix pipeline&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;adding-static-choices&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adding-static-choices&quot; /&gt;Adding static choices&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is useful for users to be able to customize building matrices when a build
is triggered.  Adding static choices requires only a few changes to the above
script.  Static choices as in we hard code the question and matrix filters.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Choose combinations&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;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;id:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Platform&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Customize your matrix build.&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;parameters:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;choices:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;all&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;description:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Choose a single platform or all platforms to run tests.&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;choices:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;all&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;description:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Choose a single browser or all browsers to run tests.&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;c1&quot;&gt;// filter the matrix axes since&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Safari is not available on Linux and&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Edge is only available on Windows&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getMatrixAxes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;findAll&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;all&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;all&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;windows&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The pipeline code then renders the following choice dialog.&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/matrix-scripted-pipeline-screenshots/static-choice-dialog.png&quot; alt=&quot;Screenshot of a dialog asking a question to customize matrix build&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When a user chooses the customized options, the pipeline reacts to the
requested options.&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/matrix-scripted-pipeline-screenshots/customized-pipeline-screenshot.png&quot; alt=&quot;Screenshot of pipeline running requested user customizations&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;adding-dynamic-choices&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adding-dynamic-choices&quot; /&gt;Adding dynamic choices&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dynamic choices means the choice dialog for users to customize the build is
generated from the &lt;code&gt;Map matrix_axes&lt;/code&gt; rather than being something a pipeline
developer hard codes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For user experience (UX), you’ll want your choices to automatically reflect the
matrix axis options you have available.  For example, let’s say you want to add
a new dimension for Java to the matrix.&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;c1&quot;&gt;// you can add more axes and this will still work&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&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;nl&quot;&gt;PLATFORM:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;JAVA:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;openjdk8&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;openjdk10&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;openjdk11&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;BROWSER:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To support dynamic choices, your choice and matrix axis filter needs to be
updated to the following.&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;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Choose combinations&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;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;id:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Platform&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Customize your matrix build.&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;parameters:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;collect&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&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;-&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;choices:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;all&#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;options&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;description:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Choose a single ${key.toLowerCase()} or all to run tests.&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&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;c1&quot;&gt;// filter the matrix axes since&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Safari is not available on Linux and&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Edge is only available on Windows&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getMatrixAxes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;findAll&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;every&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;all&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&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;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;windows&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It will dynamically generate choices based on available matrix axes and will
automatically filter if users customize it.  Here’s an example dialog and
rendered choice when the pipeline executes.&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/matrix-scripted-pipeline-screenshots/dynamic-choice-dialog.png&quot; alt=&quot;Screenshot of dynamically generated dialog for user to customize choices of matrix build&quot; /&gt;&lt;/span&gt;
&lt;/p&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/matrix-scripted-pipeline-screenshots/dynamic-customized-pipeline-screenshot.png&quot; alt=&quot;Screenshot of pipeline running user choices in a matrix&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;full-pipeline-example-with-dynamic-choices&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#full-pipeline-example-with-dynamic-choices&quot; /&gt;Full pipeline example with dynamic choices&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following script is the full pipeline example which contains dynamic
choices.&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;c1&quot;&gt;// you can add more axes and this will still work&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&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;nl&quot;&gt;PLATFORM:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;JAVA:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;openjdk8&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;openjdk10&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;openjdk11&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;BROWSER:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;nd&quot;&gt;@NonCPS&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getMatrixAxes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&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;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&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;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axisList&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;values&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;axisList&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&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;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axisList&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// calculate cartesian product&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;combinations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()*.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sum&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;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Choose combinations&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;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;id:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Platform&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Customize your matrix build.&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;parameters:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;collect&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&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;-&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;choices:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;all&#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;options&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;description:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Choose a single ${key.toLowerCase()} or all to run tests.&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&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;c1&quot;&gt;// filter the matrix axes since&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Safari is not available on Linux and&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Edge is only available on Windows&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getMatrixAxes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;findAll&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;every&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;all&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&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;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;windows&#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;c1&quot;&gt;// parallel task map&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&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;nl&quot;&gt;failFast:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&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;c1&quot;&gt;// convert the Axis into valid values for withEnv step&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axisEnv&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;collect&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;s2&quot;&gt;&quot;${k}=${v}&quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// let&#39;s say you have diverse agents among Windows, Mac and Linux all of&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// which have proper labels for their platform and what browsers are&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// available on those agents.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeLabel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;os:${axis[&#39;PLATFORM&#39;]} &amp;amp;&amp;amp; browser:${axis[&#39;BROWSER&#39;]}&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axisEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#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;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nodeLabel&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;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axisEnv&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Build&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;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeLabel&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;echo Do Build for ${PLATFORM} - ${BROWSER}&#39;&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;s2&quot;&gt;&quot;Test&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;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nodeLabel&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;echo Do Build for ${PLATFORM} - ${BROWSER}&#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;span class=&quot;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Matrix builds&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;n&quot;&gt;parallel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tasks&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;background-how-does-it-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background-how-does-it-work&quot; /&gt;Background: How does it work?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The trick is in &lt;code&gt;axes.combinations()*.sum()&lt;/code&gt;.  Groovy combinations are a quick
and easy way to perform a
&lt;a href=&quot;https://en.wikipedia.org/wiki/Cartesian_product&quot;&gt;cartesian product&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a simpler example of how cartesian product works.  Take two simple lists
and create combinations.&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;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&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;s1&quot;&gt;&#39;a&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;b&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;c&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&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;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&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;mi&quot;&gt;3&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;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;combinations&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 result of &lt;code&gt;[a, b].combinations()&lt;/code&gt; is the following.&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;[
    [&#39;a&#39;, 1],
    [&#39;b&#39;, 1],
    [&#39;c&#39;, 1],
    [&#39;a&#39;, 2],
    [&#39;b&#39;, 2],
    [&#39;c&#39;, 2],
    [&#39;a&#39;, 3],
    [&#39;b&#39;, 3],
    [&#39;c&#39;, 3]
]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of &lt;code&gt;a, b, c&lt;/code&gt; and &lt;code&gt;1, 2, 3&lt;/code&gt; let’s do the same example again but instead using matrix maps.&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;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;java&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;nl&quot;&gt;java:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&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;nl&quot;&gt;java:&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;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&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;nl&quot;&gt;os:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#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;nl&quot;&gt;os:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;freebsd&#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;java&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;combinations&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 result of &lt;code&gt;[java, os].combinations()&lt;/code&gt; is the following.&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;[
    [ [java:8],  [os:linux]   ],
    [ [java:10], [os:linux]   ],
    [ [java:8],  [os:freebsd] ],
    [ [java:10], [os:freebsd] ]
]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order for us to easily use this as a single map we must add the maps
together to create a single map.  For example, adding
&lt;code&gt;[java: 8] + [os: &#39;linux&#39;]&lt;/code&gt; will render a single hashmap
&lt;code&gt;[java: 8, os: &#39;linux&#39;]&lt;/code&gt;.  This means we need our list of lists of maps to
become a simple list of maps so that we can use them effectively in pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To accomplish this we make use of the
&lt;a href=&quot;https://www.groovy-lang.org/operators.html#_spread_operator&quot;&gt;Groovy spread
operator&lt;/a&gt; (&lt;code&gt;*.&lt;/code&gt; in &lt;code&gt;axes.combinations()*.sum()&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s see the same &lt;code&gt;java&lt;/code&gt;/&lt;code&gt;os&lt;/code&gt; example again but with the spread operator being
used.&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;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;java&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;nl&quot;&gt;java:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&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;nl&quot;&gt;java:&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;n&quot;&gt;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&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;nl&quot;&gt;os:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#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;nl&quot;&gt;os:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;freebsd&#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;java&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;combinations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()*.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sum&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 result is the following.&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;[
    [ java: 8,  os: &#39;linux&#39;],
    [ java: 10, os: &#39;linux&#39;],
    [ java: 8,  os: &#39;freebsd&#39;],
    [ java: 10, os: &#39;freebsd&#39;]
]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the spread operator the end result of a list of maps which we can
effectively use as matrix axes.  It also allows us to do neat matrix filtering
with the &lt;a href=&quot;http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/List.html#findAll(groovy.lang.Closure)&quot;&gt;&lt;code&gt;findAll {}&lt;/code&gt; Groovy &lt;code&gt;List&lt;/code&gt; method&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;exposing-a-shared-library-pipeline-step&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#exposing-a-shared-library-pipeline-step&quot; /&gt;Exposing a shared library pipeline step&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The best user experience is to expose the above code as a shared library
pipeline step.  As an example, I have added
&lt;a href=&quot;https://github.com/samrocketman/jervis/blob/8d6935e08437c1d9b9b3de1d8711cad6622fc631/vars/getMatrixAxes.groovy&quot;&gt;&lt;code&gt;vars/getMatrixAxes.groovy&lt;/code&gt;
to Jervis&lt;/a&gt;.  This provides a flexible shared library step which you can copy
into your own shared pipeline libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The step becomes easy to use in the following way with a simple one dimension matrix.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&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;nl&quot;&gt;PLATFORM:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#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;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getMatrixAxes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// alternately with a user prompt&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;//List axes = getMatrixAxes(matrix_axes, user_prompt: true)&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;Here’s a more complex example using a two dimensional matrix with filtering.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&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;nl&quot;&gt;PLATFORM:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;BROWSER:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getMatrixAxes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix_axes&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;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;windows&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And again with a three dimensional matrix with filtering and prompting for user
input.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;matrix_axes&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;nl&quot;&gt;PLATFORM:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;JAVA:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;openjdk8&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;openjdk10&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;openjdk11&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;BROWSER:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;List&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getMatrixAxes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matrix_axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;user_prompt:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;!(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#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;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#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;s1&quot;&gt;&#39;windows&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The script approval is not necessary for
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;Shared Libraries&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you don’t want to provide a shared step.  In order to expose matrix building
to end-users, you must allow the following method approval in the script
approval configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Script approval&lt;/div&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;staticMethod&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;org&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;codehaus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;groovy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;runtime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DefaultGroovyMethods&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;combinations&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;util&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;Collection&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;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;We covered how to perform matrix builds using scripted pipeline as well as how
to prompt users for customizing the matrix build.  Additionally, an example was
provided where we exposed getting buildable matrix axes to users as an easy to
use &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;Shared Library&lt;/a&gt;
step via &lt;code&gt;vars/getMatrixAxes.groovy&lt;/code&gt;.  Using a shared library step is
definitely the recommended way for admins to support users rather than trying
to whitelist groovy methods.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/samrocketman/jervis&quot;&gt;Jervis shared pipeline library&lt;/a&gt; has supported matrix building since 2017 in Jenkins scripted pipelines.
(&lt;a href=&quot;https://github.com/samrocketman/jervis/blob/db79f4d52b3aa23f1b19b59262156388b8193711/src/main/groovy/net/gleske/jervis/lang/pipelineGenerator.groovy#L275&quot;&gt;see here&lt;/a&gt; and
&lt;a href=&quot;https://github.com/samrocketman/jervis/blob/f09c709326175ff2e701677250cac007170cbd3a/vars/matrixBuildProjectStage.groovy#L25&quot;&gt;here&lt;/a&gt;
for an example).&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/2019/11/29/do-plugins-store-credentials-in-a-secure-way/</id>
<title>Do Plugins Store Credentials In A Secure Way? - DevOps World | Jenkins World 2019</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-11-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/11/29/do-plugins-store-credentials-in-a-secure-way/" />
<category term='jenkins world'></category>
<category term='jenkinsworld'></category>
<category term='devopsworld2019'></category>
<category term='security'></category>
<summary>
This is a speaker blog post for a DevOps World | Jenkins World 2019 talk in Lisbon, Portugal and has been posted in line with NCC Group responsible disclosure policy.
Related Jenkins security advisories:
2017-11-08,
2017-11-16,
2018-06-25,
2018-07-30,
2018-09-25,
2019-02-19,
2019-03-06,
2019-03-25,
2019-04-03,
2019-04-17,
2019-08-07,
2019-09-12,
2019-10-01,
2019-10-16,
2019-10-23.
Some of the vulnerabilities have been announced without a fix, see Jenkins Security Spring Cleaning 2019.
The most of the announced vulnerabilities are fixed at the moment of this blogpost publishing.





Come join us at DevOps World | Jenkins World 2019 for "The Story, the Findings and the Fixes Behind More than 100 Jenkins Plugins Vulnerabilities", a talk about the most common vulnerabilities found during research in more than 100...
</summary>
<content type='html'>
&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;
This is a speaker blog post for a DevOps World | Jenkins World 2019 talk in Lisbon, Portugal and has been posted in line with NCC Group responsible disclosure policy.
Related Jenkins security advisories:
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-11-08/&quot;&gt;2017-11-08&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-11-16/&quot;&gt;2017-11-16&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-06-25/&quot;&gt;2018-06-25&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-07-30/&quot;&gt;2018-07-30&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-09-25/&quot;&gt;2018-09-25&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-02-19/&quot;&gt;2019-02-19&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-03-06/&quot;&gt;2019-03-06&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-03-25/&quot;&gt;2019-03-25&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-04-03/&quot;&gt;2019-04-03&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-04-17/&quot;&gt;2019-04-17&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-08-07/&quot;&gt;2019-08-07&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-09-12/&quot;&gt;2019-09-12&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-10-01/&quot;&gt;2019-10-01&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-10-16/&quot;&gt;2019-10-16&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-10-23/&quot;&gt;2019-10-23&lt;/a&gt;.
Some of the vulnerabilities have been announced without a fix, see &lt;a href=&quot;https://www.jenkins.io/blog/2019/04/03/security-advisory/&quot;&gt;Jenkins Security Spring Cleaning 2019&lt;/a&gt;.
The most of the announced vulnerabilities are fixed at the moment of this blogpost publishing.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come join us at &lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;DevOps World | Jenkins World 2019&lt;/a&gt; for &quot;&lt;a href=&quot;https://sched.co/UVWB&quot;&gt;&lt;strong&gt;The Story, the Findings and the Fixes Behind More than 100 Jenkins Plugins Vulnerabilities&lt;/strong&gt;&lt;/a&gt;&quot;, a talk about the most common vulnerabilities found during research in more than 100 plugins.
We’ll review how to prevent these vulnerabilities during plugin development so that a more secure Jenkins CI and CD environment can be built.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I first began familiarising myself with Jenkins, I found myself almost overwhelmed by the amount of plugins to choose from. Most of these plugins are developed by third party developers or companies and can assist the user in a range of ways. They can extend the core functions, they can offer solutions to repetitive tasks or they can help with using a service. For example, they could help with publishing to an artifact store or spinning up cloud instances. However, before a plugin can use a network based service that requires credentials to connect, those credentials have to be typed in and saved somewhere. This raises the question, are those credentials stored securely? Or not?
When I started looking at different plugins this was one of the first areas I investigated. I found a Jenkins security advisory describing this issue and came to the conclusion that this could be a problem in some plugins, albeit one that could be fixed easily. I found an example of weakly stored credentials in the Publish Over Dropbox Plugin; this plugin used a simple web form with a textbox element to display the token in the plugin’s settings page. This token was stored in plaintext:&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/2019-11-plugin-creds-secure-store/PluginWebForm.png&quot; alt=&quot;PluginWebForm&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following Jelly code was behind the web form and shows that a password field wasn’t used:&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;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;f:entry&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;title=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${%Token}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;authorizationCode&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;f:textbox/&amp;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 related plugin .xml file contained the secret key in plaintext:&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;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;org.jenkinsci.plugins.publishoverdropbox.impl.DropboxTokenImpl&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;plugin=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;publish-
over-dropbox@1.2.2&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;GLOBAL&lt;span class=&quot;nt&quot;&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;woodspeed&lt;span class=&quot;nt&quot;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;description&amp;gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;authorizationCode&amp;gt;&lt;/span&gt;lYD2VnNz&lt;span class=&quot;nt&quot;&gt;&amp;lt;/authorizationCode&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;accessCode&amp;gt;&lt;/span&gt;lYD2VnNz&lt;span class=&quot;nt&quot;&gt;&amp;lt;/accessCode&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/org.jenkinsci.plugins.publishoverdropbox.impl.DropboxTokenImpl&amp;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;Jenkins offers at least two ways to store credentials in an encrypted format:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Using a Secret type offered by Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Third party plugin called Credentials Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first case is the easiest solution, because Jenkins will automatically handle the encryption and decryption.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers should also use the password field tag instead of the textbox field, as shown in the following Jelly control 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;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;f:entry&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;title=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${%Secret Access Key}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;help=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;f:password&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;field=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;secretKey&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/f:entry&amp;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;If you would like to know what other vulnerabilities I discovered and how to fix them, come and join us for the presentation in Lisbon!
In case you are unable to attend the conference, you can read more at &lt;a href=&quot;https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/may/story-of-a-hundred-vulnerable-jenkins-plugins/&quot;&gt;Story of a Hundred Vulnerable Jenkins Plugins&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/11/25/macos-native-installer-deprecation/</id>
<title>Jenkins macOS native installer deprecation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-11-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/11/25/macos-native-installer-deprecation/" />
<category term='announcement'></category>
<category term='deprecation'></category>
<category term='macos'></category>
<category term='platform-sig'></category>
<category term='platforms'></category>
<summary>
In addition to WAR files and Docker images, the Jenkins project provides native installers for each weekly and LTS release.
There are installers available for Linux distributions, Windows, macOS and other operating systems.
There are also installers provided by third parties.
You can find the list of these installers on the Downloads page.


In this blog post, we announce the upcoming deprecation of the macOS native installer.
We will review the replacement options and the rollout plan.


Why?

Maintaining installers is a significant maintenance effort for the project
because installers require testing and, sometimes, specific platforms and environments for packaging.
When installers lose relevance for the majority of the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to WAR files and Docker images, the Jenkins project provides native installers for each weekly and LTS release.
There are installers available for Linux distributions, Windows, macOS and other operating systems.
There are also installers provided by third parties.
You can find the list of these installers on the &lt;a href=&quot;https://www.jenkins.io/download&quot;&gt;Downloads&lt;/a&gt; page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post, we announce the upcoming deprecation of the macOS native installer.
We will review the replacement options and the rollout plan.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why&quot; /&gt;Why?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Maintaining installers is a significant maintenance effort for the project
because installers require testing and, sometimes, specific platforms and environments for packaging.
When installers lose relevance for the majority of the Jenkins audience, we remove them or handover maintenance to third parties on other areas.
For macOS, there are currently two types of packages: native installers with GUI for desktop versions and &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew packages&lt;/a&gt;.
Since Homebrew is now a defacto standard package manager for macOS users, from the Jenkins standpoint it made sense to deprecate the native installers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why now?
There is ongoing work on automating Jenkins Core releases within the Jenkins infrastructure.
Long story short, we are moving Jenkins release pipelines to Kubernetes on Microsoft Azure.
This environment does not offer macOS machines that are needed to produce native installers.
If you are interested to know more, there will be a &lt;a href=&quot;https://sched.co/Uara&quot;&gt;How Jenkins Builds and Delivers Jenkins in the Cloud&lt;/a&gt; talk presented by &lt;a href=&quot;https://github.com/olblak&quot;&gt;Olivier Vernin&lt;/a&gt; at &lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;DevOps World | Jenkins World 2019 Europe in Lisbon&lt;/a&gt; (use the &lt;code&gt;JWFOSS&lt;/code&gt; code for a 30% discount!).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We could have used an external service for building macOS installers,
but it would have added an additional point of failure and implementation/maintenance overhead.
So we discussed it in the &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/xc-lDVsr0bQ&quot;&gt;developer mailing list&lt;/a&gt; and agreed that it is better to just deprecate and then remove the packages.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;replacing-native-installers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#replacing-native-installers&quot; /&gt;Replacing native installers&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the case of macOS, there are two main alternatives available: managing the service manually or migrating to Homebrew packages.
Before doing a migration, we highly recommend backing up your instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;managing-jenkins-with-war-file-on-macos&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#managing-jenkins-with-war-file-on-macos&quot; /&gt;Managing Jenkins with WAR file on macOS&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your Jenkins instance was previously set up with a native installer,
to update Jenkins it will be enough to replace the &lt;code&gt;jenkins.war&lt;/code&gt; file in the installation directory and restart the instance.
The services will keep running as it was configured before the migration.
The default installation directory is &lt;code&gt;/Applications/Jenkins/jenkins.war&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;managing-jenkins-with-homebrew&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#managing-jenkins-with-homebrew&quot; /&gt;Managing Jenkins with Homebrew&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Installing Jenkins with &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt; is a way to go for those who want to install Jenkins using a package manager.
There are two Homebrew formulas for Jenkins: &lt;a href=&quot;https://formulae.brew.sh/formula/jenkins&quot;&gt;jenkins&lt;/a&gt; for Weekly releases and &lt;a href=&quot;https://formulae.brew.sh/formula/jenkins-lts&quot;&gt;jenkins-lts&lt;/a&gt; for LTS ones.
These packages are supported by a third party (Homebrew community),
and they may be not as frequently updated as packages supported by the Jenkins project directly.&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;
Before doing a migration from macOS Native installers to HomeBrew, please make sure to backup your Jenkins instance.
There are no automatic migration tools available, and the installation may corrupt your &lt;code&gt;JENKINS_HOME&lt;/code&gt; or service configuration files in edge cases.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you switch to Homebrew, you will need to properly migrate the &lt;code&gt;JENKINS_HOME&lt;/code&gt; data to the new location.
We do not provide an official migration guide, but it is possible to find some guidelines on the Web.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sample commands:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install the latest Weekly version: &lt;code&gt;brew install jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the Jenkins service: &lt;code&gt;brew services start jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart the Jenkins service: &lt;code&gt;brew services restart jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the Jenkins version: &lt;code&gt;brew upgrade jenkins&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;For more information see the documentation for Homebrew packages on the macOS &lt;a href=&quot;https://www.jenkins.io/download&quot;&gt;Download&lt;/a&gt; pages.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;rollout-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#rollout-plan&quot; /&gt;Rollout plan&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;macOS native packaging is considered as deprecated starting from Jenkins 2.206 and Jenkins LTS 2.204.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For Jenkins Weekly macOS native packaging will be removed with the switch to the new Jenkins release flow.
The exact date is to be determined.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After the change, there will be no macOS native installers produced for new Jenkins Weekly releases&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Releases for previous versions will be available &lt;a href=&quot;https://get.jenkins.io/osx/&quot;&gt;in this archive&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For Jenkins LTS macOS will be removed with the switch to the new Jenkins release flow in the LTS baseline.
This change will happen only after the deployment of the new release flow in Jenkins Weekly.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After the switch, there will be no macOS native installers produced for new Jenkins LTS releases&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Releases for previous versions will be available &lt;a href=&quot;https://get.jenkins.io/osx-stable/&quot;&gt;in this archive&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/xc-lDVsr0bQ&quot;&gt;discussion on the developer mailing list&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;questions-and-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#questions-and-feedback&quot; /&gt;Questions and feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any questions or want to provide feedback, please use the developer mailing list thread mentioned above &lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Platform SIG&lt;/a&gt; channels (chat, google group).
Any feedback will be much appreciated because we plan more installer/ and platform deprecations in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/11/22/welcome-to-the-matrix/</id>
<title>Welcome to the Matrix</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-11-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/11/22/welcome-to-the-matrix/" />
<author>
<name>lnewman</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='declarative'></category>
<category term='matrix'></category>
<summary>
I often find myself needing to run the same actions on a bunch of different configurations.
Up to now, that meant I had to make multiple copies of the same stages in my pipelines.
When I needed to make changes, I had to make the same changes in multiple places throughout my pipeline.
Maintaining even a small number of configuration was difficult for larger pipelines.


Declarative Pipeline 1.5.0-beta1 (now available from the
Jenkins Experimental Update site) adds a new matrix section that lets me specify a list stages once and then run that same list in parallel on multiple configurations.
Let&#8217;s take a look!


Single configuration pipeline


I&#8217;ll...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I often find myself needing to run the same actions on a bunch of different configurations.
Up to now, that meant I had to make multiple copies of the same stages in my pipelines.
When I needed to make changes, I had to make the same changes in multiple places throughout my pipeline.
Maintaining even a small number of configuration was difficult for larger pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Declarative Pipeline 1.5.0-beta1 (now available from the
&lt;a href=&quot;https://updates.jenkins.io/experimental/&quot;&gt;Jenkins Experimental Update site&lt;/a&gt;) adds a new &lt;code&gt;matrix&lt;/code&gt; section that lets me specify a list stages once and then run that same list in parallel on multiple configurations.
Let’s take a look!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;single-configuration-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#single-configuration-pipeline&quot; /&gt;Single configuration pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll start with a simple pipeline with build and test stages.
I’m using &lt;code&gt;echo&lt;/code&gt; steps as placeholders for my build and test actions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;none&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;BuildAndTest&#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;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;Build&#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;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Do Build&#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;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;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Do 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;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;pipeline-for-multiple-platforms-and-browsers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-for-multiple-platforms-and-browsers&quot; /&gt;Pipeline for multiple platforms and browsers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d like to run my build and tests on a combination of platforms and browsers.
The new &lt;code&gt;matrix&lt;/code&gt; directive lets me specify a set of &lt;code&gt;axes&lt;/code&gt;.
Each &lt;code&gt;axis&lt;/code&gt; has a &lt;code&gt;name&lt;/code&gt; and a list of one or more &lt;code&gt;values&lt;/code&gt;.
When the pipeline is run, Jenkins will take those and run my stages on all possible combinations of values from each axis.
All cells in a matrix run in parallel (limited only by the number of available agents).
Stages within each cell are run sequentially.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My matrix has two axes: &lt;code&gt;PLATFORM&lt;/code&gt; and &lt;code&gt;BROWSER&lt;/code&gt;.
I have three values for &lt;code&gt;PLATFORM&lt;/code&gt; and four values for &lt;code&gt;BROWSER&lt;/code&gt; resulting in my stages being run with twelve different combinations.
I’ve changed my &lt;code&gt;echo&lt;/code&gt; steps to use the axis values for each cell.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;none&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;BuildAndTest&#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;matrix&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;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;
                    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#39;&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;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;Build&#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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Do Build for ${PLATFORM} - ${BROWSER}&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;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;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Do Test for ${PLATFORM} - ${BROWSER}&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;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;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Log output (truncated)&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;...
[Pipeline] stage
[Pipeline] { (BuildAndTest)
[Pipeline] parallel
[Pipeline] { (Branch: Matrix - OS = &#39;linux&#39;, BROWSER = &#39;firefox&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;firefox&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;firefox&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;linux&#39;, BROWSER = &#39;chrome&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;chrome&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;chrome&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;linux&#39;, BROWSER = &#39;safari&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;safari&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;safari&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;linux&#39;, BROWSER = &#39;edge&#39;) (hide)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;edge&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;edge&#39;)
...
Do Build for linux - safari
Do Build for linux - firefox
Do Build for windows - firefox
Do Test for linux - firefox
Do Build for mac - firefox
Do Build for linux - chrome
Do Test for windows - firefox
...&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;excluding-invalid-combinations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#excluding-invalid-combinations&quot; /&gt;Excluding invalid combinations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that I have my basic matrix created, I’ve noticed that I have some invalid combinations.
Microsoft Edge only runs on Windows and there isn’t a Linux version of Safari.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I can remove invalid cells from my matrix using &lt;code&gt;exclude&lt;/code&gt; directives. Each &lt;code&gt;exclude&lt;/code&gt; has one or more &lt;code&gt;axis&lt;/code&gt; directives with &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;values&lt;/code&gt;.
The &lt;code&gt;axis&lt;/code&gt; directives inside an &lt;code&gt;exclude&lt;/code&gt; generate a set of combinations (similar to generating the matrix cells).
The matrix cells that match all the values from an &lt;code&gt;exclude&lt;/code&gt; combination are removed from the matrix.
If I have more than one &lt;code&gt;exclude&lt;/code&gt; directive, each are evaluated separately to remove cells.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When dealing with a long lists of values to exclude, I can use &lt;code&gt;notValues&lt;/code&gt; instead of &lt;code&gt;values&lt;/code&gt; to specify axis values we &lt;strong&gt;don’t&lt;/strong&gt; want excluded.
Yes, that’s a double negative, so it can get a little confusing.
I try to use it only when I really need it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my sample pipeline below, I specifically exclude the &lt;code&gt;linux, safari&lt;/code&gt; combination and I also exclude any platform that is &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;windows&lt;/code&gt; with the &lt;code&gt;edge&lt;/code&gt; browser.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This pipeline uses two axes but there is &lt;strong&gt;no limit&lt;/strong&gt; on the number of &lt;code&gt;axis&lt;/code&gt; directives.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, in this pipeline each &lt;code&gt;exclude&lt;/code&gt; specifies values for both axes, but that is not required.
If we wanted to run only &quot;linux&quot; cells, we could use the following &lt;code&gt;exclude&lt;/code&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;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;exclude&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;notValues&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;none&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;BuildAndTest&#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;matrix&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;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;
                    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#39;&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;excludes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;exclude&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;
                        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#39;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#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;exclude&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;notValues&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;
                        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#39;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;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;Build&#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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Do Build for ${PLATFORM} - ${BROWSER}&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;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;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Do Test for ${PLATFORM} - ${BROWSER}&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;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;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Log output (truncated)&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;...
[Pipeline] stage
[Pipeline] { (BuildAndTest)
[Pipeline] parallel
[Pipeline] { (Branch: Matrix - OS = &#39;linux&#39;, BROWSER = &#39;firefox&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;firefox&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;firefox&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;linux&#39;, BROWSER = &#39;chrome&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;chrome&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;chrome&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;safari&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;safari&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;edge&#39;)
...
Do Build for linux - firefox
...&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;controlling-cell-behavior-at-runtime&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#controlling-cell-behavior-at-runtime&quot; /&gt;Controlling cell behavior at runtime&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Inside the &lt;code&gt;matrix&lt;/code&gt; directive I can also add &quot;per-cell&quot; directives.
These are the same directives that I would add to a &lt;code&gt;stage&lt;/code&gt; and they let me control the behavior of each cell in the matrix.
These directives can use the axis values from their cell as part of their inputs, allowing me to customize the behavior of each cell to match its axis values.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On my Jenkins server I have configured agents with labels that match the OS for each agent (&quot;linux-agent&quot;, &quot;windows-agent&quot;, and &quot;mac-agent&quot;).
To run each cell in my matrix on the appropriate operating system, I configure the label for that cell using Groovy string templating.&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;matrix&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;axes&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;excludes&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;agent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${PLATFORM}-agent&quot;&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;o&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;c1&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;Occasionally I run my pipeline manually from the Jenkins Web UI.
When I do that, I’d like to be able to select just one platform to run.
The &lt;code&gt;axis&lt;/code&gt; and &lt;code&gt;exclude&lt;/code&gt; directives define the static set of cells that make up the matrix.
That set of combinations is generated before the start of the run, before any parameters are processed.
What this means is that I can’t add or remove cells from a matrix after the job has started.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &quot;per-cell&quot; directives, on the other hand, are evaluated at runtime.
I can use the &quot;per-cell&quot; &lt;code&gt;when&lt;/code&gt; directive inside &lt;code&gt;matrix&lt;/code&gt; to control which cells in the matrix are executed.
I’ll add a &lt;code&gt;choice&lt;/code&gt; parameter with the list of platforms, and add conditions to the &lt;code&gt;when&lt;/code&gt; directive, which will either let all platforms execute, or only execute cells that match my selected platform.&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;parameters&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM_FILTER&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;choices:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;all&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;description:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Run on specific platform&#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;agent&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;none&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;BuildAndTest&#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;matrix&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;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${PLATFORM}-agent&quot;&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;anyOf&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;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;PLATFORM_FILTER&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;all&#39;&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;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;PLATFORM_FILTER&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;PLATFORM&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;axes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mac&#39;&lt;/span&gt;
                    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#39;&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;excludes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;exclude&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;linux&#39;&lt;/span&gt;
                        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#39;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;safari&#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;exclude&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;PLATFORM&#39;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;notValues&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;windows&#39;&lt;/span&gt;
                        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;BROWSER&#39;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;edge&#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;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;Build&#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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Do Build for ${PLATFORM} - ${BROWSER}&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;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;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Do Test for ${PLATFORM} - ${BROWSER}&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;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;If I run this Pipeline from the Jenkins UI and set the &lt;code&gt;PLATFORM_FILTER&lt;/code&gt; parameter to &lt;code&gt;mac&lt;/code&gt;, I’ll get something like the output below:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Log output (truncated - PLATFORM_FILTER = &#39;mac&#39; )&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;...
[Pipeline] stage
[Pipeline] { (BuildAndTest)
[Pipeline] parallel
[Pipeline] { (Branch: Matrix - OS = &#39;linux&#39;, BROWSER = &#39;firefox&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;firefox&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;firefox&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;linux&#39;, BROWSER = &#39;chrome&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;chrome&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;chrome&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;safari&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;mac&#39;, BROWSER = &#39;safari&#39;)
[Pipeline] { (Branch: Matrix - OS = &#39;windows&#39;, BROWSER = &#39;edge&#39;)
...
Stage &quot;Matrix - OS = &#39;linux&#39;, BROWSER = &#39;chrome&#39;&quot; skipped due to when conditional
Stage &quot;Matrix - OS = &#39;linux&#39;, BROWSER = &#39;firefox&#39;&quot; skipped due to when conditional
...
Do Build for mac - firefox
Do Build for mac - chrome
Do Build for mac - safari
...
Stage &quot;Matrix - OS = &#39;windows&#39;, BROWSER = &#39;chrome&#39;&quot; skipped due to when conditional
Stage &quot;Matrix - OS = &#39;windows&#39;, BROWSER = &#39;edge&#39;&quot; skipped due to when conditional
...
Do Test for mac - safari
Do Test for mac - firefox
Do Test for mac - chrome&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Come join me at &lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;DevOps World | Jenkins World 2019&lt;/a&gt; for &quot;&lt;a href=&quot;https://sched.co/UeQe&quot;&gt;&lt;strong&gt;Declarative Pipeline 2019: Tips, Tricks and What’s Next&lt;/strong&gt;&lt;/a&gt;&quot;.
I’ll go over what’s been added to Pipeline in the last year (including matrix) and discuss ideas about where pipeline should go next.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;In this blog post, we’ve looked at how to use the &lt;code&gt;matrix&lt;/code&gt; directive to make concise but powerful declarative pipelines.
An equivalent pipeline created without &lt;code&gt;matrix&lt;/code&gt; would easily be several times larger, and much harder to understand and maintain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Matrix is now available from the experimental update center.
It will be released to the main update center as soon as we’re done putting the finishing touches on the documentation and online help.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://updates.jenkins.io/experimental/&quot;&gt;Jenkins Experimental Update Center&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/releasing-experimental-updates/#using-the-experimental-update-center&quot;&gt;Using the Jenkins Experimental Update Center&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/11/22/jenkins-health-advisor-by-cloudbees/</id>
<title>Jenkins Health Advisor by CloudBees is here!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-11-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/11/22/jenkins-health-advisor-by-cloudbees/" />
<author>
<name>aheritier</name>
</author>
<category term='jenkins'></category>
<category term='health'></category>
<category term='healthcheck'></category>
<category term='stability'></category>
<summary>
Managing any software presents its own unique challenges. Jenkins controllers are no exception. For example,




How do you keep a finger on the pulse of everything going on in your Jenkins environment? Are you looking at every new defect opened in the issue tracker?


How do you make sure that your controllers or agents don’t silently fail? Are you monitoring its logs? All of its internal components? If something does go wrong, how do you fix it??


How do you avoid the infamous “angry Jenkins” logo?




That’s why we created Jenkins Health Advisor by CloudBees.


Here at CloudBees, we have years of experience supporting our...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/angry-jenkins_128.png&quot; alt=&quot;Angry Jenkins logo&quot; width=&quot;128&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Managing any software presents its own unique challenges. Jenkins controllers are no exception. For example,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How do you keep a finger on the pulse of everything going on in your Jenkins environment? Are you looking at every new defect opened in the issue tracker?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you make sure that your controllers or agents don’t silently fail? Are you monitoring its logs? All of its internal components? If something does go wrong, how do you fix it??&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you avoid the infamous “angry Jenkins” logo?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s why we created Jenkins Health Advisor by CloudBees.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here at &lt;a href=&quot;https://www.cloudbees.com?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin&quot;&gt;CloudBees&lt;/a&gt;, we have years of experience &lt;a href=&quot;https://www.cloudbees.com/products/cloudbees-jenkins-support?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin&quot;&gt;supporting our customers who are using Jenkins&lt;/a&gt;, including our proprietary products build on top of Jenkins like &lt;a href=&quot;https://www.cloudbees.com/products/cloudbees-core?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin&quot;&gt;CloudBees Core&lt;/a&gt;.
As a result, our support team is made up of automation experts with Jenkins knowledge you can’t get anywhere else.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Automated health checks started when our support engineers created a platform so they could write rules to detect known issues on &lt;a href=&quot;https://plugins.jenkins.io/support-core&quot;&gt;support bundles&lt;/a&gt; provided by our customers, and redirect them to the required knowledge source to diagnose and resolve the issue.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After years of internal usage we decided to share this service with the community and we are pleased to introduce &lt;strong&gt;a new free  (as in beer) service available to every Jenkins user&lt;/strong&gt;: &lt;strong&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-health-advisor?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin&quot;&gt;Jenkins Health Advisor by CloudBees&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-health-advisor?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin&quot;&gt;Jenkins Health Advisor by CloudBees&lt;/a&gt; automatically analyzes your Jenkins environment, proactively identifies potential issues and advises you of solutions with detailed email reports.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph text-center&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://plugins.jenkins.io/cloudbees-jenkins-advisor&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-health-advisor-by-cloudbees/logo.svg&quot; alt=&quot;Jenkins Health Advisor by CloudBees logo&quot; width=&quot;256&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-health-advisor?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin&quot;&gt;Jenkins Health Advisor by CloudBees&lt;/a&gt; can detect a large range of issues from simple configuration issues to security and best practices concerns - all critical elements of Jenkins implementations.
Getting started is done in &lt;a href=&quot;https://www.cloudbees.com/jenkins-health-advisor?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin#download&quot;&gt;3 steps&lt;/a&gt;, and within 24 hours you will receive your first report.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph text-center&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://plugins.jenkins.io/cloudbees-jenkins-advisor&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-health-advisor-by-cloudbees/overview.png&quot; alt=&quot;Jenkins Health Advisor by CloudBees overview&quot; width=&quot;800&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We hope that you will appreciate this service and it will help you to keep your controllers healthy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Take a few minutes to read our &lt;a href=&quot;https://docs.cloudbees.com/docs/admin-resources/latest/plugins/cloudbees-jenkins-advisor?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin&quot;&gt;documentation&lt;/a&gt;, discover the service and don’t hesitate to contact us on the Jenkins community channels (&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jenkins:gitter.im&quot;&gt;Gitter&lt;/a&gt;, &lt;a href=&quot;https://groups.google.com/g/jenkinsci-users&quot;&gt;jenkinsci-users@googlegroups.com&lt;/a&gt;, …​).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t miss also the opportunity to meet our support team on the &quot;Ask the experts&quot; booth at &lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;DevOps World | Jenkins World 2019&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Useful links:&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://docs.cloudbees.com/docs/admin-resources/latest/plugins/cloudbees-jenkins-advisor?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin&quot;&gt;Plugin Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/cloudbees-jenkins-advisor&quot;&gt;Jenkins Plugin Site&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/products/cloudbees-jenkins-support?utm_medium=blog&amp;amp;utm_source=jenkins.io&amp;amp;utm_campaign=cloudbees-jenkins-advisor-plugin&quot;&gt;CloudBees Jenkins Support&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/2019/11/08/board-elections/</id>
<title>2019 Jenkins Board and Officer Elections Update</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-11-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/11/08/board-elections/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
The Jenkins community is conducting the 2019 elections for Board and Officer positions.
The call for nominations has concluded.
We received many nominations.
Based on the people who are willing to accept their nomination and the uncontested officer positions, we will have 3 votes:




A vote to elect 3 board members


A vote to elect the Jenkins security officer


A vote to elect the Jenkins events officer




Candidates


Each candidate has provided a statement to help guide voters on why they should vote for the candidate.
Refer to the candidate statements for more details.
The candidates running for a board position are:




Alex Earl


Oliver Gondza


Ullrich Hafner


Oleg Nenashev


Mark Waite


Zhao Xiaojie (a.k.a. Rick...
</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/post-images/elections-2019/election-2019-opengraph.png&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 is conducting the 2019 elections for Board and Officer positions.
The call for nominations has concluded.
We received many nominations.
Based on the people who are willing to accept their nomination and the uncontested officer positions, we will have 3 votes:&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;A vote to elect 3 &lt;a href=&quot;https://www.jenkins.io/project/governance/#governance-board&quot;&gt;board members&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A vote to elect the Jenkins &lt;a href=&quot;https://www.jenkins.io/project/board/#security&quot;&gt;security officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A vote to elect the Jenkins &lt;a href=&quot;https://www.jenkins.io/project/board/#events&quot;&gt;events officer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;candidates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#candidates&quot; /&gt;Candidates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each candidate has provided a statement to help guide voters on why they should vote for the candidate.
Refer to the &lt;a href=&quot;https://docs.google.com/document/d/15rJYkBjWLGZTL87xeJ4P2Y1LNn7C0EBb0wkDVUSfLmQ/edit#&quot;&gt;candidate statements&lt;/a&gt; for more details.
The candidates running for a board position are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Alex Earl&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oliver Gondza&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ullrich Hafner&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oleg Nenashev&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mark Waite&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zhao Xiaojie (a.k.a. Rick to many of you)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The candidates running for Security Officer are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Daniel Beck&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wadeck Follonier&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The candidates running for Events Officer are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Alyssa Tong&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zhao Xiaojie (a.k.a. Rick to many of you)&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;voter-registration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voter-registration&quot; /&gt;Voter Registration&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the first time in a while that we are running a Jenkins election; we are learning as we go.
Jenkins elections aim to be very inclusive.
We do not restrict elections to just code committers.
Anyone who has a Jenkins account registered before September 1, 2019 is eligible to vote.
Jenkins, being the successful project it is, has  approximately 100 000 accounts that meet that criteria.
As a result we are contacting eligible voters and requesting that they explicitly ‘opt-in’ to participate in the voting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you meet the criteria, you will receive an email at your registered jenkins.io email address.
It will be from elections@jenkins.io with the title ‘&lt;strong&gt;2019 Jenkins Election - Invitation to Participate&lt;/strong&gt;’.
The email will provide election details and will include an &quot;&lt;strong&gt;I want to participate&lt;/strong&gt;&quot; button.&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/elections-2019/election-invitation.png&quot; alt=&quot;Voter Registration&quot; width=&quot;665&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;voter-confirmation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voter-confirmation&quot; /&gt;Voter Confirmation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you click on the link, you should see a confirmation screen as follows:&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/elections-2019/election-acknowledged.png&quot; alt=&quot;Voter Registered&quot; width=&quot;330&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you do not receive the email by November 14, 2019 or if you have any problems voting, please comment on the &lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-2319&quot;&gt;Jenkins Election 2019 Jira issue&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;voting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voting&quot; /&gt;Voting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The voting will officially open on November 11, 2019.
Candidates will receive an email from the Condorcet internet voting sent by Kohsuke Kawaguchi.
One email will be sent for each vote (so 3 in total: 1 for board, 1 for event officer and 1 for security officer).
The vote will ask to rank the candidates using a screen like this:&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/elections-2019/election-ballot.png&quot; alt=&quot;Voter Ballot&quot; width=&quot;1022&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;election-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#election-dates&quot; /&gt;Election Dates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is a summary of the key election dates:&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;Date&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Event&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;&lt;strong&gt;Now&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Voter registration ongoing&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;&lt;strong&gt;Nov 11, 2019&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Voting begins&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;&lt;strong&gt;Nov 17, 2019&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Voter registration closes&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;&lt;strong&gt;Nov 24, 2019&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Voting closes a 5:00 PM Pacific Time&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;&lt;strong&gt;Dec 3, 2019&lt;/strong&gt;&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 representatives announced&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;Election results will be posted to the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Jenkins developer mailing list&lt;/a&gt;, followed by an announcement blog post on &lt;a href=&quot;https://www.jenkins.io/blog/&quot;&gt;jenkins.io&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If there are any delays to the proposed dates we will aim to communicate that as soon as we can.
Thank you very much for all the candidates showing the Jenkins spirit of service to their community.
We encourage everyone to register to vote and participate in the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;uncontested-officer-positions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#uncontested-officer-positions&quot; /&gt;Uncontested Officer Positions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When an officer position has only one candidate that is willing to accept the nomination, there is no reason to vote on that position.
The individual becomes an officer as the sole candidate for the position.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Uncontested officers include:&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;Name&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Role&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;&lt;strong&gt;Olivier Vernin&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Infrastructure Officer&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;&lt;strong&gt;Oliver Gondza&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Release Officer&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;&lt;strong&gt;Mark Waite&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Documentation Officer&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&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/project/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/project/board-election-process&quot;&gt;Jenkins Board Election Process&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/project/team-leads&quot;&gt;Jenkins Officers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/v8kmEQMT0ts/l8yQ43WNAwAJ&quot;&gt;Announcement in the developer mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/vKi9JpxTQxY/4O4lmqfdAgAJ&quot;&gt;2019 elections proposal in the developer mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/colgroup&gt;
&lt;/table&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/2019/11/04/speaker-blog-how-to-build-the-top-mobile-game/</id>
<title>How to build the top mobile game for every platform imaginable</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-11-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/11/04/speaker-blog-how-to-build-the-top-mobile-game/" />
<author>
<name>ignacio_fernandez</name>
</author>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2019'></category>
<category term='mobile-game'></category>
<summary>
Context

You have been tasked with managing the Jenkins instance for the highest grossing mobile
game in the world. You learn that this involves helping the game studio iterate their work
against eight different target platforms, each with their SDK, on four different main pipelines,
plus a lot of extra auxiliary jobs. And, of course, the studio wants all of this to go smoothly, in
order to maintain a good pace of features and bugfixes for every release - a release happening
every two weeks. Hitting hundreds of millions of players worldwide.


How are you going to make sure that the environment stays correctly configured, with the
right...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;context&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#context&quot; /&gt;Context&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You have been tasked with managing the Jenkins instance for the highest grossing mobile
game in the world. You learn that this involves helping the game studio iterate their work
against eight different target platforms, each with their SDK, on four different main pipelines,
plus a lot of extra auxiliary jobs. And, of course, the studio wants all of this to go smoothly, in
order to maintain a good pace of features and bugfixes for every release - a release happening
every two weeks. Hitting hundreds of millions of players worldwide.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How are you going to make sure that the environment stays correctly configured, with the
right versions of the required software; helping the studio maintain stability and scalability of
their pipelines; ensuring operability of the Jenkins instance; improving the speed of the builds
month after month?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s OK to sweat. You are going to need some help!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is just a regular day in the office for a build engineer working at King. Facing a very
broad problem, with high quality standards and even higher stakes. Thankfully, we are not
alone. We have access to a lot of tools - either open source tools, tools developed by the
studios or tools developed by our stellar build infrastructure team in Barcelona - to help carry
us all the way to the publish line. We put all of these tools together, and by their powers
combined, we provide fast, easily operable workflows for the studios, cutting minutes here
and there, ensuring the features a smooth sail from dev, to master, to release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I will explain all of the tricks we use at King to speed builds up, and to make Jenkins operation
easier for our studios on December 4, 2019, at &lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;DevOps World | Jenkins
World Lisbon&lt;/a&gt;.
Use &lt;strong&gt;JWFOSS&lt;/strong&gt; for 30% discount on registration!
For now, let’s take a look at some of them.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;where-do-we-start&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-do-we-start&quot; /&gt;Where do we start?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We use on-premises elastic infrastructure, spawning machines from certain templates
whenever they are needed. This means that for every build, we are getting a fresh
environment - no intermediate artifacts leftover or anything of the sort, which is good. That
also means that we need to clone our repositories and compile everything every time, which is
bad. However, we have solutions for these two problems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We make full use of linkclones/snapshots when spawning a VM. Every night we run a
bootstrapper that will power on the base image and perform whatever operations we decide on
it, before turning it back into a template and re-creating the snapshot. In the case of Candy
Crush, we update our caches, and this helps us cut some time off of git clone and compilation.
We call this bootstrapper “cacheo”. It looks more or less like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Cacheo&lt;/div&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;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Start&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;elastic&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;template&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&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;n&quot;&gt;Connect&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;it&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Jenkins&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Perform&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cleanup&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Trigger&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;reference&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cache&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jobs&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Trigger&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;all&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;builds&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;you&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;want&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cached&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Turn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;off&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;template&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;recreate&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linked&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clone&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;snapshot&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;Every studio can specify on which templates will cacheo run, and what will it do in each of them.
Maybe you want to make sure your Android license is on point. Or download some
packages from artifactory. Perhaps pre-load your gradle dependencies. Whatever it is, cacheo
does it for you and updates your base images every night.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most common uses is to pre-fill a local git cache, and when doing so, the
improvement is very visible, especially on Windows:&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: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Linux&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;MacOS&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Windows&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;NFS&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;2 min 11s&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;2min 34s&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;8min 32s&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;Local&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;1 min 20s&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;1min 35s&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;3min 49s&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;Difference&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;strong&gt;39% faster&lt;/strong&gt;&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;strong&gt;39% faster&lt;/strong&gt;&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;strong&gt;55% faster&lt;/strong&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;This means, speeding up source code fetching by 55% on Windows, on average. That is a LOT!!&lt;/p&gt;
&lt;/div&gt;
&lt;/col&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;but-what-about-actual-compilation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#but-what-about-actual-compilation&quot; /&gt;But what about actual compilation?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All of our major games use the same engine; we bring this code in by means of submodules. This means
there is a big bunch of shared code that needs to be compiled and linked whenever we build the game.
And it’s not rare that this shared code is bigger than the actual game code!
Thankfully, the engine team lent us a hand, and they developed a way to package the compiled shared code.
Normally, the game code lives alongside a specific version of the shared code, which doesn’t get updated too frequently.
Sometimes once a month, sometimes to grab a hotfix. This translates to us potentially compiling the
exact same shared code for quite some time, every time we build the game. Thanks to these
prebuilt artifacts, we are able to skip a huge part of the compilation, at the cost of a simple artifactory download.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Cacheo&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;cmake&quot;&gt;if generate_prebuilt_libs:
    &lt;span class=&quot;nf&quot;&gt;compile_project&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;nf&quot;&gt;generate_empty_cmakelists&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    for dependency in dependencies:
        &lt;span class=&quot;nf&quot;&gt;merge_compiled_dependency_into_metalib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;dependency&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;nf&quot;&gt;write_dependency_to_generated_cmakelists_as_alias_for_metalib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;dependency&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

elif use_prebuilt_libs:
    &lt;span class=&quot;nf&quot;&gt;add_generated_cmakelists_with_metalib_as_dependency&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;nf&quot;&gt;compile_project&lt;/span&gt;&lt;span class=&quot;p&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;Thanks to these prebuilt libraries, we are able to skip a big chunk of the compilation,
and it builds up really quickly! Iterative work on several branches, as long as they have
the same engine version, gets sped up in noticeable ways.
There are, however, specific cases when we do choose to build the shared code regardless, such as
when we build release candidates for instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just so you get an idea, times on this table are on average:&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: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3334%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;iOS&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Windows&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;No prebuilts&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;20min 17s&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;40min 30s&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;Prebuilts&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;10min 2s&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;23min 20s&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;Difference&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;strong&gt;51% faster&lt;/strong&gt;&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;strong&gt;43% faster&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/col&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;i-just-dont-want-to-have-to-deal-with-bureaucracy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-just-dont-want-to-have-to-deal-with-bureaucracy&quot; /&gt;I just don’t want to have to deal with bureaucracy&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Operating Jenkins can be quite complicated. Talk about “Tell me
something I don’t know”, right? And with so many moving pieces (elastic
infrastructure, plugins, dirty workspaces), it might not be easy for
everyone to run specific maintenance tasks. We have a lot of small
pipelines, created by the build infrastructure group, that we can use to
diagnose and work around certain errors, as well as gather useful
information that might be otherwise difficult to find. These pipelines
do things like printing all the installed plugins, deleting offline
on-demand agents, cleaning disconnected VMs from vSphere, or re-run
puppet in a specific Jenkins instance. And any user can run these jobs,
there is no need to be an admin. This allows the team to unblock
themselves if they need to by using these jobs. Here’s one that I
particularly like. How many times have you modified a pipeline and, when
trying to run it, the first thing that happens is that Jenkins says that
it needs approval?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Script Approval&lt;/div&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;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;org.jenkinsci.plugins.scriptsecurity.scripts.*&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@NonCPS&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Disclaimer - this can have serious security consequences&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Be mindful when you run this!&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&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;sa&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ScriptApproval&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;toApproveScripts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sa&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getPendingScripts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;collect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;toApproveScripts: &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;toApproveScripts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;toApproveScripts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pending&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sa&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;approveScript&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pending&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getHash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;())&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;approvedScripts: &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pending&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getHash&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;sa&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;save&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 best part? All our Jenkins instances include these jobs, by default, so
no one misses out on the fun.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/11/01/devops-world-jenkins-world-san-francisco-in-living-colors/</id>
<title>DevOps World | Jenkins World San Francisco in Living Colors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-11-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/11/01/devops-world-jenkins-world-san-francisco-in-living-colors/" />
<author>
<name>alyssat</name>
</author>
<category term='events'></category>
<category term='devopsworld2019'></category>
<category term='jenkinsworld'></category>
<summary>
DevOps World | Jenkins World San Francisco was August 12 - 15, 2019.
The event was delivered in vivid colors starting with flowing banners hung from street lamp posts to the big screens in breakout rooms, to the expo hall.
The energy and enthusiasm in the Moscone convention center made the colors even more vibrant, thanks to the people attending the conference.


Here&#8217;s a recap of the conference in pictures:


DevOps World | Jenkins World 2019 - San Francisco



Keynote - Evolution of the Continuous Delivery Foundation


Tracy Miranda opened the keynote explaining the evolution of the Continuous Delivery Foundation.


Keynote - Evolution of the Continuous Delivery...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;DevOps World | Jenkins World San Francisco&lt;/a&gt; was August 12 - 15, 2019.
The event was delivered in vivid colors starting with flowing banners hung from street lamp posts to the big screens in breakout rooms, to the expo hall.
The energy and enthusiasm in the Moscone convention center made the colors even more vibrant, thanks to the people attending the conference.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a recap of the conference in pictures:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;DevOps World | Jenkins World 2019 - San Francisco&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_2235.jpg&quot; alt=&quot;1D5 2235&quot; width=&quot;800&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;keynote-evolution-of-the-continuous-delivery-foundation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#keynote-evolution-of-the-continuous-delivery-foundation&quot; /&gt;Keynote - Evolution of the Continuous Delivery Foundation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tracy Miranda opened the keynote explaining the evolution of the Continuous Delivery Foundation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Keynote - Evolution of the Continuous Delivery Foundation&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_0437.jpg&quot; alt=&quot;1D5 0437&quot; width=&quot;800&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;influencers-creators-and-members&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#influencers-creators-and-members&quot; /&gt;Influencers, Creators, and Members&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The influencers, creators, and members of the CD Foundation: Tracy Miranda (far left),
Andy Glover (Netflix), Tara Hernandez (Google), Chris Aniszczyk (Linux Foundation), Dave Stanke (Google), Kohsuke Kawaguchi (Jenkins creator), Jayne Groll (DevOps Institute), James Strachan (Jenkins X creator).
“We want to help set Jenkins up for success, into the next decade”, Tyler Croy (not in picture).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Influencers, Creators, and Members of the Continuous Delivery Foundation&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_1310.jpg&quot; alt=&quot;1D5 1310&quot; width=&quot;800&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;contributor-summit&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributor-summit&quot; /&gt;Contributor Summit&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The inaugural Continuous Delivery Foundation Contributor Summit and it was a full house!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Continuous Delivery Foudnation Contributor Summit&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_8264.jpg&quot; alt=&quot;IMG 8264&quot; width=&quot;400&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;15-years-of-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#15-years-of-jenkins&quot; /&gt;15 Years of Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A remarkable milestone for the Jenkins project, a celebration of Jenkins turning 15…​cake included!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Fifteen Years of Jenkins&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_0614.jpg&quot; alt=&quot;1D5 0614&quot; width=&quot;400&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;bee-diverse-luncheon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bee-diverse-luncheon&quot; /&gt;Bee Diverse Luncheon&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Interactive and engaging luncheon celebrating diversity&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Bee Diverse Luncheon Entrance&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_5576.jpg&quot; alt=&quot;1D5 5576&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Bee Diverse Luncheon Leading Voices&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_5606.jpg&quot; alt=&quot;1D5 5606&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Bee Diverse Luncheon Group Discussions&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_5682.jpg&quot; alt=&quot;1D5 5682&quot; width=&quot;400&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;jenkins-contributors-and-experts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-contributors-and-experts&quot; /&gt;Jenkins Contributors and Experts&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins contributors and experts on hand to educate and share lightning talks and provide one on one Jenkins support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkins Lightning Talks&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_3207.jpg&quot; alt=&quot;1D5 3207&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkins Experts Answering Questions&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_2953.jpg&quot; alt=&quot;1D5 2953&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkins Experts Discussing and Helping&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_8278.jpg&quot; alt=&quot;IMG 8278&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkins Experts Gathered&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_3573.jpg&quot; alt=&quot;1D5 3573&quot; width=&quot;400&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;devops-superheroes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#devops-superheroes&quot; /&gt;DevOps Superheroes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even though the conference offered endless learning and networking possibilities, and major milestones worth celebrating,  I felt the true highlight of the conference was the celebration of each individual, “You”.
“You” are the super hero, the driving force behind the incredible innovations to advance technology to where it is today.
Here’s celebrating the super heroes in all of YOU!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;DevOps Superheroes&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_2286.jpg&quot; alt=&quot;1D5 2286&quot; width=&quot;800&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Superheroes and the Wookie&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_1643.jpg&quot; alt=&quot;1D5 1643&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Four Superheroes&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_2949.jpg&quot; alt=&quot;1D5 2949&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Kohsuke Kawaguchi - Founding Superhero&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_3034.jpg&quot; alt=&quot;1D5 3034&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;A DevOps League of Superheroes&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_4067.jpg&quot; alt=&quot;1D5 4067&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Crowd of Superheroes&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/1D5_4243.jpg&quot; alt=&quot;1D5 4243&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This party will be coming to Lisbon, Portugal on December 3-5, 2019.
We hope to see our EU Jenkins fans at &lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;DevOps World | Jenkins World Lisbon&lt;/a&gt;.
Use &lt;strong&gt;JWFOSS&lt;/strong&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hope to see you in Lisbon!&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;&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/10/24/jenkins-performance-avoiding-pitfalls/</id>
<title>Jenkins Performance: Avoiding Pitfalls, Diagnosing Issues, and Scaling for Growth - DevOps World | Jenkins World 2019</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-10-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/10/24/jenkins-performance-avoiding-pitfalls/" />
<category term='jenkins world'></category>
<category term='jenkinsworld'></category>
<category term='devopsworld2019'></category>
<category term='performance'></category>
<summary>
This is a speaker blogpost for a DevOps World | Jenkins World 2019 talk in Lisbon, Portugal





With Halloween upon us, there&#8217;s no better time to discuss Jenkinstein!
Are you suffering from Jenkins performance issues?
Are users complaining about a slow UI or even scarier, is Jenkins going down frequently?







Come join me at DevOps World | Jenkins World 2019 for "Jenkins Performance: Avoiding Pitfalls, Diagnosing Issues, and Scaling for Growth", a talk about JVM administration and best practices from the front lines of supporting thousands of Jenkins installations worldwide.
During this talk we&#8217;ll cover how to prevent your Jenkins instance from becoming a Jenkinstein!


Topics...
</summary>
<content type='html'>
&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;
This is a speaker blogpost for a DevOps World | Jenkins World 2019 talk in Lisbon, Portugal
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Halloween upon us, there’s no better time to discuss Jenkinstein!
Are you suffering from Jenkins performance issues?
Are users complaining about a slow UI or even scarier, is Jenkins going down frequently?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/logos/jenkinstein/256.png&quot; alt=&quot;Jenkinstein&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come join me at &lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;DevOps World | Jenkins World 2019&lt;/a&gt; for &quot;&lt;a href=&quot;https://sched.co/UVVp&quot;&gt;&lt;strong&gt;Jenkins Performance: Avoiding Pitfalls, Diagnosing Issues, and Scaling for Growth&lt;/strong&gt;&lt;/a&gt;&quot;, a talk about JVM administration and best practices from the front lines of supporting thousands of Jenkins installations worldwide.
During this talk we’ll cover how to prevent your Jenkins instance from becoming a Jenkinstein!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Topics we will be discussing:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JVM administration best practices&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Horizontal scaling&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Analyzing thread dumps, GC logs, and heap dumps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Real world data showing 3500% performance increases&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Garbage collection&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/performance/gc-unhealthy.png&quot; alt=&quot;gc unhealthy&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll be discussing how you can forecast for growth, and baseline using key performance indicators like application throughput and latency, by analyzing spooky data like Garbage Collection logs!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come join me for the presentation in Lisbon! There will be candy!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;slides&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#slides&quot; /&gt;Slides&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;iframe src=&quot;https://drive.google.com/file/d/1qNHGcDN5YQGPJ38vRRU-l1_TFMB3NmKo/preview&quot; width=&quot;800&quot; height=&quot;460&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/10/21/thinking-about-jenkins-security/</id>
<title>Thinking About Jenkins Security - DevOps World | Jenkins World 2019</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-10-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/10/21/thinking-about-jenkins-security/" />
<category term='jenkins world'></category>
<category term='jenkinsworld'></category>
<category term='devopsworld2019'></category>
<category term='security'></category>
<summary>
This is a speaker blogpost for a DevOps World | Jenkins World 2019 talk in Lisbon, Portugal





Come join us at DevOps World | Jenkins World 2019 for "Thinking about Jenkins Security", a talk about securing your Jenkins server.
We&#8217;ll review the layers that secure Jenkins and describe techniques that you can use to protect your Jenkins server.


Topics will include:




The secure by default configuration that Jenkins provides


Risks associated with reducing default security settings


Authentication and authorization alternatives


Using "least privilege" principles


Jenkins credentials and trusted access to resources


Software updates and Jenkins project security notices









We&#8217;ll intermix descriptions of good practices with some security horror stories.
The horror...
</summary>
<content type='html'>
&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;
This is a speaker blogpost for a DevOps World | Jenkins World 2019 talk in Lisbon, Portugal
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come join us at &lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;DevOps World | Jenkins World 2019&lt;/a&gt; for &quot;&lt;a href=&quot;https://sched.co/UXWy&quot;&gt;&lt;strong&gt;Thinking about Jenkins Security&lt;/strong&gt;&lt;/a&gt;&quot;, a talk about securing your Jenkins server.
We’ll review the layers that secure Jenkins and describe techniques that you can use to protect your Jenkins server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Topics will include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;secure by default&lt;/strong&gt; configuration that Jenkins provides&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Risks associated with reducing default security settings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Authentication and authorization alternatives&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using &quot;&lt;strong&gt;least privilege&lt;/strong&gt;&quot; principles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins &lt;strong&gt;credentials&lt;/strong&gt; and trusted access to resources&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Software updates and Jenkins project security notices&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/security/do-not-run-malicious-code.png&quot; alt=&quot;do not run malicious code&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll intermix descriptions of good practices with some security horror stories.
The horror stories remind us of our mistakes; we will discuss how to detect them and how to prevent them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come join us for the presentation in Lisbon!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;slides&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#slides&quot; /&gt;Slides&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;iframe src=&quot;https://drive.google.com/file/d/1RisjNUfu-3_VOyTIvY0cdWWzM8HKDtY9/preview&quot; width=&quot;800&quot; height=&quot;460&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/10/21/plugin-docs-on-github/</id>
<title>Plugin Documentation-as-Code: Moving docs to GitHub</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-10-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/10/21/plugin-docs-on-github/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='hacktoberfest'></category>
<category term='developer'></category>
<category term='documentation'></category>
<category term='wiki'></category>
<category term='contributors'></category>
<summary>
In September 2019 we announced
support of GitHub as a source of documentation for the Jenkins Plugin Site.
Thanks to Zbynek Konecny and Olivier Vernin and other contributors,
now it is possible to store plugin documentation right inside plugin repositories instead of Jenkins Wiki which was historically difficult to maintain for plugin maintainers and for the Jenkins infrastructure team.


This blogpost may be interesting to plugin maintainers and to those who want to contribute to the Jenkins documentation.
I will describe how to migrate plugin documentation to GitHub and to get pages like this one:





Why?


By using plugin GitHub repositories for documentation,
plugin maintainers can follow the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In September 2019 we &lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/VSdfVMDIW-A/vqXxJiI7AQAJ&quot;&gt;announced&lt;/a&gt;
support of GitHub as a source of documentation for the &lt;a href=&quot;https://plugins.jenkins.io&quot;&gt;Jenkins Plugin Site&lt;/a&gt;.
Thanks to &lt;a href=&quot;https://github.com/zbynek&quot;&gt;Zbynek Konecny&lt;/a&gt; and &lt;a href=&quot;https://github.com/olblak&quot;&gt;Olivier Vernin&lt;/a&gt; and other contributors,
now it is possible to store plugin documentation right inside plugin repositories instead of &lt;a href=&quot;https://wiki.jenkins.io&quot;&gt;Jenkins Wiki&lt;/a&gt; which was historically difficult to maintain for plugin maintainers and for the Jenkins infrastructure team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blogpost may be interesting to plugin maintainers and to those who want to contribute to the Jenkins documentation.
I will describe how to migrate plugin documentation to GitHub and to get pages like this one:&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/2019-github-documentation/thumbnail.png&quot; alt=&quot;GitHub Documentation example&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why&quot; /&gt;Why?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By using plugin GitHub repositories for documentation,
plugin maintainers can follow the &lt;em&gt;Documentation-as-code&lt;/em&gt; approach and make documentation changes a part of the pull requests so that documentation follow-ups do not get forgotten.
It also gives an opportunity to review the documentation changes and to add documentation contributor recognition, especially if the story is combined with &lt;a href=&quot;https://github.com/jenkinsci/.github/blob/master/.github/release-drafter.adoc&quot;&gt;Release Drafter&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, before September 2019 usage of GitHub documentation was causing some issues.
First of all, many plugin maintainers have already moved their documentation to GitHub, and it caused fragmentation of the documentation (Wiki, GitHub, jenkins.io).
To address it, plugin maintainers still had to maintain stub Wiki pages with redirects,
and users had to spend some time to find out where the real documentation is located.
By supporting GitHub as a documentation source, we allow maintainers to phase out the plugin Wiki pages while improving the user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And there are even more pressing reasons to do the migration now…​
If you are subscribed to the &lt;a href=&quot;https://groups.google.com/d/forum/jenkinsci-dev&quot;&gt;developer mailing list&lt;/a&gt;,
you may have also seen an announcement by &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt; about Jenkins Wiki stability issues
and making it read-only as a temporary measure to stabilize the instance
(&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/lNmas8aBRrI&quot;&gt;mailing list thread&lt;/a&gt;).
Although the functionality has been partially restored afterwards,
there is a consensus in the Infrastructure team that we should gradually move to alternate solutions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;examples&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#examples&quot; /&gt;Examples&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the announcement in September, more than 50 plugins were moved from Wiki to GitHub.
Few examples:&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/configuration-as-code&quot;&gt;Configuration as Code Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/mailer&quot;&gt;Mailer Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/gradle&quot;&gt;Gradle Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/role-strategy&quot;&gt;Role Strategy 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;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2019-github-documentation/role-strategy-screenshot.png&quot; alt=&quot;Role Strategy example&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;how-to-enable-github-documentation-for-your-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-enable-github-documentation-for-your-plugin&quot; /&gt;How to enable GitHub documentation for your plugin?&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;Convert documentation from Wiki to GitHub Asciidoc or Markdown format if you have not done it yet.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It can be easily done in a semi-automatic way using &lt;a href=&quot;https://jenkins-wiki-exporter.jenkins.io/&quot;&gt;Jenkins Wiki Exporter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See the guidelines
&lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/wiki-page/#migrating-from-wiki-to-github&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Change the &lt;code&gt;&amp;lt;url&amp;gt;&lt;/code&gt; field in pom.xml so that it points to GitHub
(&lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/documentation/#referencing-the-documentation-page-from-the-project-file&quot;&gt;guide&lt;/a&gt;).
 Examples of valid links:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&lt;a href=&quot;https://github.com/jenkinsci/mailer-plugin&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/mailer-plugin&lt;/a&gt;&lt;/code&gt; - plugin site will use GitHub REST API to extract README&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&lt;a href=&quot;https://github.com/jenkinsci/ssh-credentials-plugin/blob/master/doc/README.md&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/ssh-credentials-plugin/blob/master/doc/README.md&lt;/a&gt;&lt;/code&gt; - extraction of a plugin page from a custom location&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optional: Add badges to the page to improve look&amp;amp;feel and to provide quick links for users.
There are standard badges for changelogs, chats, plugin site, and installation numbers.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/jenkinsci/role-strategy-plugin/master/README.md&quot;&gt;Example for Markdown&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/jenkinsci/mailer-plugin/master/README.adoc&quot;&gt;Example for Asciidoc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release the new plugin version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait a few hours till the change propagates.
After that, the &lt;a href=&quot;https://plugins.jenkins.io&quot;&gt;Jenkins Plugin Site&lt;/a&gt; will show the new documentation from GitHub.&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;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 story is tracked as &lt;a href=&quot;https://issues.jenkins.io/browse/WEBSITE-406&quot;&gt;WEBSITE-406&lt;/a&gt; which is a part of the wider subproject for using GitHub as a source of data for the Jenkins plugin site and update managers (&lt;a href=&quot;https://issues.jenkins.io/browse/WEBSITE-637&quot;&gt;WEBSITE-637&lt;/a&gt;).
Later steps include support showing changelogs from GitHub releases, pulling plugin tags from GitHub, showing plugin logos, and using &lt;a href=&quot;https://github.com/jenkins-infra/repository-permissions-updater&quot;&gt;Repository Permission Updater&lt;/a&gt; as a source of the maintainer information.&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-contribute&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-contribute&quot; /&gt;How to contribute?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;October is a great time to contribute!
Plugin documentation is one of the featured projects for &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest&quot;&gt;Hacktoberfest&lt;/a&gt;,
and we will welcome all contributions to the documentation and to the codebase.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributing-to-documentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing-to-documentation&quot; /&gt;Contributing to Documentation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are looking for contributors who are interested to improve plugin documentation and to help us with migration from Wiki to GitHub.
For dozens of plugins the documentation is already in GitHub,
and you are welcome to submit pull requests against any repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Migrating documentation:&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/doc/developer/publishing/wiki-page/#migrating-from-wiki-to-github&quot;&gt;Migrating plugin documentation from Wiki to GitHub&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/blob/master/CONTRIBUTING.adoc#moving-documentation-from-jenkins-wiki&quot;&gt;Moving documentation from Jenkins Wiki to jenkins.io&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-59467&quot;&gt;JENKINS-59467: Template issue for plugin docs migration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/issues/?filter=18650&amp;amp;jql=project%20%3D%20WEBSITE%20AND%20labels%20%3D%20newbie-friendly%20and%20status%20in%20(Open%2C%20Reopened%2C%20%22To%20Do%22)&quot;&gt;Newbie-friendly documentation tasks&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;If you have any questions about contributing to the documentation,
please see &lt;a href=&quot;https://www.jenkins.io/participate/#document&quot;&gt;this page&lt;/a&gt; or reach out to us in the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkins/docs:matrix.org&quot;&gt;Docs SIG Gitter chat&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;code-contributions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-contributions&quot; /&gt;Code contributions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Would you like to write some code in Java or JavaScript?
Or would you like to work on CSS styles and improve Jenkins design?
In such case you are welcome to contribute to the &lt;a href=&quot;https://plugins.jenkins.io&quot;&gt;Jenkins Plugin Site&lt;/a&gt;.
It is our own plugin marketplace implementation, and we invite contributions to this area.
The plugin site is really easy to develop.&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://issues.jenkins.io/browse/WEBSITE-637&quot;&gt;WEBSITE-637&lt;/a&gt; - EPIC for Plugin site and GitHub integrations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-site&quot;&gt;jenkins-infra/plugin-site&lt;/a&gt; - Frontend (JavaScript, React, XSS, YARN)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/plugin-site-api&quot;&gt;jenkins-infra/plugin-site-api&lt;/a&gt; - Plugin site API and Docker packaging (Java, Maven, Docker)&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;useful-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#useful-links&quot; /&gt;Useful links&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/doc/developer/publishing/documentation/&quot;&gt;Plugin Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io&quot;&gt;Jenkins Plugin Site&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-wiki-exporter.jenkins.io/&quot;&gt;Jenkins Wiki Exporter tool&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/2019/10/08/jcasc-phase1-blog/</id>
<title>JCasC Community Bridge Dev Tools - Phase 1</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-10-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/10/08/jcasc-phase1-blog/" />
<author>
<name>sladyn98</name>
</author>
<category term='community-bridge'></category>
<category term='JCasC'></category>
<category term='VSCode'></category>
<category term='community'></category>
<summary>
Community Bridge Introduction

Community Bridge is an initiative by the Linux Foundation to accelerate the adoption, innovation and sustainability of open source projects. I came across this initiative in a blog post. I had been contributing to Jenkins at the time and decided to have a chat with Oleg Nenashev and Tracy Miranda regarding the possibility of a project under the Community Bridge initiative. Fortunately for me JCasC ( Jenkins Configuration as Code) had the mentors as well as the project idea in place to start a project. After a few regular meetings we ironed out the details of the programme...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;community-bridge-introduction&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-bridge-introduction&quot; /&gt;Community Bridge Introduction&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://communitybridge.org/&quot;&gt;Community Bridge&lt;/a&gt; is an initiative by the Linux Foundation to accelerate the adoption, innovation and sustainability of open source projects. I came across this initiative in a blog post. I had been contributing to Jenkins at the time and decided to have a chat with Oleg Nenashev and Tracy Miranda regarding the possibility of a project under the Community Bridge initiative. Fortunately for me JCasC ( Jenkins Configuration as Code) had the mentors as well as the project idea in place to start a project. After a few regular meetings we ironed out the details of the programme and on August 7th I began with my journey!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jcasc-developer-tools-json-schema&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jcasc-developer-tools-json-schema&quot; /&gt;JCasC Developer Tools — JSON Schema&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JSON files when submitted to a server undergo a validation to determine whether the values and the format are correct and that they conform to a well defined schema, this schema is known as a JSON Schema. A YAML file can also be validated using a JSON Schema.
The main premise of JCasC is to load YAML files written by developers into the Jenkins instance. An example of a JCasC YAML file is:&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;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
 &lt;span class=&quot;na&quot;&gt;systemMessage&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;“Hello World”&lt;/span&gt;
 &lt;span class=&quot;s&quot;&gt;numExecutors:2&lt;/span&gt;
 &lt;span class=&quot;s&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 above YAML configuration will configure Jenkins to display a message &lt;code&gt;Hello world&lt;/code&gt; with the number of executors set to two. In order to validate the YAML we have a schema. This schema is written using jelly files (Executable XML files) and currently it is not a valid schema. The first phase of the project is based around rewriting the schema generation to java and developing a better test framework for it, because currently the schema is not testable.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-1-jcasc-dev-tools&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-1-jcasc-dev-tools&quot; /&gt;Phase 1 — JCasC Dev Tools&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first week I got into studying how the schema was generated.With the support of two of my awesome mentors Tim Jacomb and Joseph Peterson
I finally got an understanding of the current schema.
So JCasC has a set of configurators for describing a YAML file.
They are:
a) Base Configurators
b) Hetero Describable Configurators
c) Data Bound Configurators
These configurators together successfully describe a YAML file.
We proceeded to generate the schema with the help of individual description of each of these configurators.
The JSON Schema has a set of components, consider the above yaml file as an 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;json&quot;&gt;&lt;span class=&quot;err&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;jenkins&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;systemMessage&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;numExecutors&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;integer&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;err&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;So here Jenkins is the base configurator and it has a set of attributes viz systemMessage and numExecutors, so our schema needs to be able to describe a set of attributes for every field in the schema. Some of the fields that our JSON Schema uses to describe the YAML are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;1) type : String, int, Boolean etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2) properties : A set of fields describing the part field.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3) id: Unique Identifier for the field
Thus the above schema successfully verifies the YAML configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java-rewrite&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-rewrite&quot; /&gt;JAVA Rewrite&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We used JSON Objects to build components of the schema.The basic flow that is followed to generate the schema is as follows:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a) Iterate through the Base Configurators.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;b) Iterate over the list of Base Configurator.Attributes and add each attribute to the schema.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;c) Iterate over the HeteroDescribable Configurators and add each configurator to the schema along with its required properties.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The set of PR’s Resolved during Phase 1 are as follows:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a)&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/pull/980&quot;&gt;Basic Schema&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;b)&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/pull/1030&quot;&gt;Schema Doc Page&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;c)&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/pull/1078&quot;&gt;Test Framework&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;d)&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/pull/1027&quot;&gt;Nested Schema&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That is all from me guys, I am currently preparing for phase 2 and working towards fixing any pending issues of Phase 1. Thanks for reading.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-2-goals&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2-goals&quot; /&gt;Phase 2 Goals:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would primarily target VSCode integration in phase 2 with the aim of:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a)Validation of JCasC YAML files with the schema&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;b)Autocompletion&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;c)Integration with a live Jenkins instance.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributions&quot; /&gt;Contributions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would love to get feedback from you on the stuff we are working on. Contributions to the project would be highly appreciated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a)&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jcasc-devtools-project:gitter.im&quot;&gt;Gitter Chat&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;b)&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Github Repository&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;c)&lt;a href=&quot;https://www.jenkins.io/projects/jcasc/dev-tools/&quot;&gt;Project Introduction&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/10/08/google-summer-of-code-mentor-and-org-admin-perspective/</id>
<title>Google Summer of Code Mentor and Org Admin Perspective</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-10-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/10/08/google-summer-of-code-mentor-and-org-admin-perspective/" />
<author>
<name>markyjackson-taulia</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<category term='jenkins'></category>
<category term='community'></category>
<category term='events'></category>
<category term='mentor'></category>
<summary>
I was fortunate enough to participate in the Google Summer of Code 2019 as a mentor and org admin. This was great
and I wanted to share in hopes of encouraging more people to join.
You can learn more about the Google Summer of Code here


Community Bonding


The first phase of the project is the community bonding phase. This is where the student and other mentors come together
to lay out the plan for the project. It is important to set expectations and ensure that the student is well aware of
what will take place and also made to feel welcome.


Parichay Barpanda was the student...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I was fortunate enough to participate in the Google Summer of Code 2019 as a mentor and org admin. This was great
and I wanted to share in hopes of encouraging more people to join.
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;You can learn more about the Google Summer of Code here&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;community-bonding&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#community-bonding&quot; /&gt;Community Bonding&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first phase of the project is the community bonding phase. This is where the student and other mentors come together
to lay out the plan for the project. It is important to set expectations and ensure that the student is well aware of
what will take place and also made to feel welcome.&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/authors/baymac&quot;&gt;Parichay Barpanda&lt;/a&gt; was the student and he was super awesome from the get go. The project he was working on was the Gitlab
Branch Source Plugin. More can be found here: &lt;a href=&quot;https://github.com/jenkinsci/gitlab-branch-source-plugin&quot;&gt;jenkinsci/gitlab-branch-source-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the mentor side it was myself and Justin Harringa. Justin was just amazing throughout this project and I seriously
could not have done this without him. He was encouraging, empathetic and just all around great. I would gladly serve
with him again.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We laid out our plan and guidance and got to work.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;first-evaluations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#first-evaluations&quot; /&gt;First Evaluations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first evaluation was quickly upon us and Parichay was ready!
The work he put in was nothing shy of amazing. We did our 1st demo and he really rocked it. A video of that demo can be
found on : &lt;a href=&quot;https://www.youtube.com/watch?v=ij6ByZqI67o&quot;&gt;Youtube&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;second-evaluations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#second-evaluations&quot; /&gt;Second Evaluations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was not much time to rest before we realized that phase II end was upon us but Parichay was ready. Again, he
nailed it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That demo can be found &lt;a href=&quot;https://www.youtube.com/watch?v=tnoObQqGhyM&amp;amp;t=2380s&quot;&gt;here&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;mentors-submit-final-evaluations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mentors-submit-final-evaluations&quot; /&gt;Mentors Submit Final Evaluations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had our final evaluation and at this point Parichay was seasoned. He was getting issues assigned to him, working on
little bug fixes and setting his roadmap for features. He absolutely blew Justin and I away.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Parichay’s final evaluation demo can be seen &lt;a href=&quot;https://www.youtube.com/watch?v=cMSbdGwGWp0&amp;amp;t=905s&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the conclusion of the final demo’s, Justin and I met and went over Parichay’s final evaluation. At this point we had
met twice a week for several months, we have reviewed code daily, we had community involvement and most of all we had
seen Parichay grow into a seasoned software developer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Justin and I were without a doubt passing Parichay on his entire body of work. I am actually tearing up typing this
because I am so proud of Parichay.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;org-admin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#org-admin&quot; /&gt;Org Admin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Being an org admin for the 2019 Google Summer of Code project for the Jenkins organization was truly rewarding and couldn’t
have been accomplished without the help from Oleg Nenashev, Martin d’Anjou, Jeff Pearce and Lloyd Chang.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As an org admin we handled issues with mentors, community members and disagreements involving work. These items were only
a few and as a team we handled them accordingly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We regularly met to discuss and plan. Coordinating and dealing with a project like Google Summer of Code is no small feat
but this team made it super easy and I am so thankful for them and all that I learned.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;closing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#closing&quot; /&gt;Closing&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In looking back at this experience I am so grateful for the opportunity I was given. This was such a rewarding experience
to not only be able to mentor but also be an org admin. Not only will I be back next year (we are already in the
planning stages) but I highly encourage people reading this to consider joining. You will not be disappointed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am so thankful for all the students, mentors and fellow org admins. Your dedication to open source is so valued. You
showed and continue to show what this project is all about, and that is being welcoming, open and transparent. Helping
people grow as individuals while learning skills is what I love about this community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to everyone and I hope your futures are bright!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/10/01/hacktoberfest/</id>
<title>Hacktoberfest 2019. Contribute to Jenkins!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-10-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/10/01/hacktoberfest/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<category term='newcomer'></category>
<category term='outreach-programs'></category>
<summary>
Once again, Hacktoberfest is back!
During this October event, everyone can support open-source by contributing changes, and can earn limited edition swag.
We invite you to contribute to Jenkins, regardless of your experience and background.
You can write code, improve documentation and design, localize Jenkins or create new artwork.
Any GitHub pull request counts!


Quick start




Sign-up to Hacktoberfest on the event website.


Join our Gitter channel.


Everything is set, just start creating pull-requests!



This year Hacktoberfest does not require labeling pull requests,
but please mention Hacktoberfest in your pull requests for faster reviews
(see FAQ: Marking Pull requests)







See the details below.







How to contribute?


There are many ways to
contribute to Jenkins.
It is...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once again, &lt;a href=&quot;https://hacktoberfest.digitalocean.com&quot;&gt;Hacktoberfest&lt;/a&gt; is back!
During this October event, everyone can support open-source by contributing changes, and can earn limited edition swag.
We invite you to contribute to Jenkins, regardless of your experience and background.
You can write code, improve documentation and design, localize Jenkins or create new artwork.
Any GitHub pull request counts!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;quick-start&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quick-start&quot; /&gt;Quick start&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;Sign-up to Hacktoberfest on &lt;a href=&quot;https://hacktoberfest.digitalocean.com&quot;&gt;the event website&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Join &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_hacktoberfest:gitter.im&quot;&gt;our Gitter channel&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Everything is set, just start creating pull-requests!&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This year Hacktoberfest does not require labeling pull requests,
but please mention Hacktoberfest in your pull requests for faster reviews
(see &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/faq/#how-do-i-mark-my-pull-requests&quot;&gt;FAQ: Marking Pull requests&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the details below.&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/hacktoberfest/2019_social.png&quot; alt=&quot;Hacktoberfest&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;how-to-contribute&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-contribute&quot; /&gt;How to contribute?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are many ways to
&lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;contribute&lt;/a&gt; to Jenkins.
It is not just about code, any pull request in GitHub counts towards the Hacktoberfest goal.&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;Code&lt;/strong&gt; - Contribute to the code or automated tests.
We have components written in Java, JavasScript, Groovy, Go, Ruby and other languages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Write&lt;/strong&gt; - Improve documentation, write blogposts, create tutorials or solution pages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Localize&lt;/strong&gt; - Help us to &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Internationalization&quot;&gt;Localize&lt;/a&gt; Jenkins to other languages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Design&lt;/strong&gt; - &lt;a href=&quot;https://www.jenkins.io/artwork&quot;&gt;artwork&lt;/a&gt; and UI improvements also count!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organize&lt;/strong&gt; - Organize a local meetup for Jenkins &amp;amp; Hacktoberfest (see &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/event-kit&quot;&gt;our event kit&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Spread the word&lt;/strong&gt; - Share your accomplishments in social media using the &lt;code&gt;#hacktoberfest&lt;/code&gt; and &lt;code&gt;#jenkinsci&lt;/code&gt; hashtags
(or CC &lt;code&gt;@jenkinsci&lt;/code&gt; in Twitter).&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;where-to-contribute&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-to-contribute&quot; /&gt;Where to contribute?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project is spread across multiple organizations on GitHub (jenkinsci, jenkins-infra, jenkins-zh).
You are welcome to contribute to &lt;strong&gt;any&lt;/strong&gt; repository in &lt;strong&gt;any&lt;/strong&gt; of these organizations,
or to any other Jenkins-related repository on GitHub.
If you adopt Jenkins in your own open-source projects (e.g. Jenkins Pipeline or Configuration as Code),
it counts as well! Some useful queries:&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://issues.jenkins.io/issues/?jql=labels%20%3D%20hacktoberfest%20and%20status%20in%20(Open%2C%20%22To%20Do%22%2C%20Reopened)&quot;&gt;Jenkins JIRA issues suggested for Hacktoberfest&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/search?q=org%3Ajenkinsci+org%3Ajenkins-infra+org%3Ajenkins-zh+is%3Aissue+is%3Aopen+label%3Ahacktoberfest&quot;&gt;GitHub issues suggested for Hacktoberfest&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=labels%20%3D%20newbie-friendly%20and%20status%20in%20(Open%2C%20%22To%20Do%22%2C%20Reopened)&quot;&gt;Newbie-friendly issues in Jenkins JIRA&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/search?q=org%3Ajenkinsci+org%3Ajenkins-infra+org%3Ajenkins-zh+is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22&quot;&gt;Good first issues on GitHub&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;&lt;strong&gt;Featured projects&lt;/strong&gt;. If you are a newcomer contributor, we have prepared a &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/#featured-projects&quot;&gt;list of projects/components&lt;/a&gt; where you will get a warm welcome.
All these projects have newbie-friendly tasks, contributing guidelines, and active maintainers
who have committed to assist contributors and to quickly review pull requests.
The list of featured projects will be updated during the event,
and we will make sure to create more newbie-friendly tasks if needed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you wonder about &lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt;, it also part of Hacktoberfest this year!
They offer various topics, including hacking Jenkins X or improving its documentation.
See &lt;a href=&quot;https://jenkins-x.io/blog/2019/09/27/hacktoberfest2019/&quot;&gt;this blogpost&lt;/a&gt; for the announcement and links.&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-get-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-get-help&quot; /&gt;How to get help?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are stuck or have any question,
see our &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/faq&quot;&gt;Hacktoberfest FAQ&lt;/a&gt; page for the common questions.
If it does not help, please reach out to us in &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_hacktoberfest:gitter.im&quot;&gt;our Gitter chat&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;any-meetups-this-year&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#any-meetups-this-year&quot; /&gt;Any meetups this year?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are many events being organized by open-source communities.
You can join one of &lt;a href=&quot;https://hacktoberfest.digitalocean.com/#events&quot;&gt;these events&lt;/a&gt;.
We invite to join the Jenkins Online Meetups on Oct 03
 (&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/265130355/&quot;&gt;APAC/EMEA&lt;/a&gt; - 7AM UTC,
  &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/265130441/&quot;&gt;EMEA/Americas&lt;/a&gt; - 2PM UTC).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There will be also area meetups in Munich, Beijing, St. Petersburg and other cities.
You can find the full list &lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/#local-events&quot;&gt;here&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;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://hacktoberfest.digitalocean.com&quot;&gt;Hacktoberfest website&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/&quot;&gt;Hacktoberfest in Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_hacktoberfest:gitter.im&quot;&gt;Our Gitter channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/events/hacktoberfest/faq&quot;&gt;Frequently asked questions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Contributing to Jenkins&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;Have a great hacking time!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/09/25/board-elections/</id>
<title>2019 Jenkins Board and Officer elections. Nominations are open!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-09-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/09/25/board-elections/" />
<category term='community'></category>
<category term='governance'></category>
<category term='governance-board'></category>
<category term='elections'></category>
<summary>
This is a repost of the original announcement made by Kohsuke Kawaguchi in the Jenkins Developer mailing list.
Minor changes were applied to reflect the posting date and to provide more links.





Nominations for the 2019 Jenkins Board elections open for three governing board positions and five officer positions, namely: Security, Events, Release, Infrastructure and Documentation.


The terms of office for these positions are:




Officer positions (1 year): November 4, 2019 to November 3, 2020


Governing board members (2 years): November 4, 2019 to November 3, 2021




To nominate someone, simply send an email to jenkinsci-board@googlegroups.com with their name and position you nominate them for.
Please share...
</summary>
<content type='html'>
&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;
This is a repost of the &lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/v8kmEQMT0ts/l8yQ43WNAwAJ&quot;&gt;original announcement&lt;/a&gt; made by &lt;a href=&quot;https://github.com/kohsuke/&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; in the Jenkins Developer mailing list.
Minor changes were applied to reflect the posting date and to provide more links.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominations for the 2019 Jenkins Board elections open for three governing board positions and five officer positions, namely: Security, Events, Release, Infrastructure and Documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The terms of office for these positions are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Officer positions (1 year): November 4, 2019 to November 3, 2020&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Governing board members (2 years): November 4, 2019 to November 3, 2021&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To nominate someone, simply send an email to &lt;a href=&quot;mailto:jenkinsci-board@googlegroups.com&quot;&gt;jenkinsci-board@googlegroups.com&lt;/a&gt; with their name and position you nominate them for.
Please share any information on why you are making the nomination.
Self nominations are also welcome.&lt;/p&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 Jenkins&#39; community governance and well-being.
I highly encourage everyone to consider participating.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;key-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#key-dates&quot; /&gt;Key dates&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Oct 04, 2019: Nominations close&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oct 08, 2019: List of nominees posted to mailing list&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oct 11, 2019: Nominees’ personal statements made available&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oct 14, 2019: Voting begins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oct 27, 2019: Voting closes at 5pm Pacific Time&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nov 04, 2019: New representatives announced&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;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&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/project/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/project/board-election-process&quot;&gt;Jenkins Board Election Process&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Team+Leads&quot;&gt;Jenkins Officers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/v8kmEQMT0ts/l8yQ43WNAwAJ&quot;&gt;Announcement in the developer mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/vKi9JpxTQxY/4O4lmqfdAgAJ&quot;&gt;2019 elections proposal in the developer mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/09/23/outreachy-audit-log-release/</id>
<title>Audit Log Plugin for Jenkins Releases 1.0</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-09-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/09/23/outreachy-audit-log-release/" />
<author>
<name>jvz</name>
</author>
<category term='outreachy'></category>
<category term='logging'></category>
<category term='security'></category>
<category term='plugin'></category>
<category term='community'></category>
<summary>
Thanks to our Outreachy interns over the past year, I&#8217;m proud to announce the initial release of the Audit Log plugin for Jenkins.
This plugin is the first major project completed related to Outreachy, and I&#8217;d like to give a brief overview of the functionality that was developed for this release.
The primary goal of this plugin is to introduce an audit trail of various Jenkins events using structured logging and related audit logging standards.
Initially, this plugin covers audit events related to core Jenkins concepts like user accounts, jobs, builds, nodes, and credentials usage.
More specifically, this tracks:




User login and logout events


Credentials usage


User...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to our Outreachy interns over the past year, I’m proud to announce the initial release of the &lt;a href=&quot;https://plugins.jenkins.io/audit-log&quot;&gt;Audit Log plugin for Jenkins&lt;/a&gt;.
This plugin is the first major project completed related to &lt;a href=&quot;https://www.outreachy.org/&quot;&gt;Outreachy&lt;/a&gt;, and I’d like to give a brief overview of the functionality that was developed for this release.
The primary goal of this plugin is to introduce an audit trail of various Jenkins events using structured logging and related &lt;a href=&quot;https://tools.ietf.org/html/rfc5424&quot;&gt;audit logging standards&lt;/a&gt;.
Initially, this plugin covers audit events related to core Jenkins concepts like user accounts, jobs, builds, nodes, and credentials usage.
More specifically, this tracks:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;User login and logout events&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Credentials usage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User creation (when using the Jenkins user database as a security realm)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User password updates (ditto)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Starts and ends of builds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creation/modification/deletion/copying of items (which correspond to projects, pipelines, folders, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creation/modification/deletion of nodes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin defines and exports standardized log event classes and schemas corresponding to these events.
Other plugins can add &lt;code&gt;audit-log&lt;/code&gt; as a dependency to define their own audit events using &lt;a href=&quot;https://logging.apache.org/log4j-audit/latest/&quot;&gt;Apache Log4j Audit&lt;/a&gt; and its &lt;a href=&quot;https://logging.apache.org/log4j-audit/latest/catalog.html&quot;&gt;catalog editor&lt;/a&gt;; then they can use the &lt;a href=&quot;https://logging.apache.org/log4j-audit/latest/log4j-audit/log4j-audit-maven-plugin/index.html&quot;&gt;Maven plugin&lt;/a&gt; for generating the audit event classes for use in the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The other major feature of this plugin is configuring where to output these audit logs.
By default, audit logs will be written in HTML files (rotated once per day) to &lt;code&gt;$JENKINS_HOME/logs/html/audit.html&lt;/code&gt; which are viewable through the &quot;Audit Logs&quot; root action link.
In the system settings, a section for audit logging is added where the main audit log output can be configured.
This can initially be configured to output via either a JSON log file in &lt;code&gt;$JENKINS_HOME/logs/audit.log&lt;/code&gt; by default or to a syslog server using RFC5424 encoding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overall, this experience has been rather interesting.
Besides having an opportunity to mentor new contributors, Outreachy has helped open my eyes to the struggles that developers from around the world are dealing with which can be improved upon to help expand our communities.
For example, many countries do not have reliable internet or electricity, so the use of synchronous videoconferencing and other heavyweight, synchronous processes common to more corporate-style development are inadequate in this international context.
This doesn’t even begin to account for the difference in timezones which is not always an issue, though both problems are addressable by using asynchronous communication methods like chat and email.
This notion of asynchronous communication is an important aspect of the &lt;a href=&quot;https://www.apache.org/theapacheway/&quot;&gt;Apache Way&lt;/a&gt;, for example, which emphasises processes that allow for vendor neutral communities to form and thrive around a project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This mentoring project was valuable to myself as well.
As a software engineer myself, project management is not my specialty, so this gave me a great opportunity to develop my own PM skills and technical leadership.
My own typical discovery process for feature development involves experimenting directly with the code to see what features make sense to prioritize and which would take a vast effort to implement.
Changing my own discovery process to avoid implementing the features myself was difficult to adjust to, though I did defer any of my own feature contributions to this plugin until after the initial release.
In order to appropriately scope the project, I still had to spend a bit of time reading through the Jenkins codebase to determine which tasks could be implemented simply (e.g., good newbie-friendly issues), which tasks might require changes to Jenkins itself (previously discovered to take too long for these relatively short Outreachy rounds), and which tasks would require intimate familiarity with Jenkins and would likely be infeasible for new developers to Jenkins.
Thanks to the work done in discovery and delivery, I’ve also identified potential features for Log4j itself which could be used in future versions of this plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overall, I think we did a good job of balancing the scope of this project without spending too much time in any specific area.
The first release of this plugin is now available in the Jenkins Update Center.
In the future, I hope to learn more about developing Jenkins UI components so that we can create a more dynamic and Jenkins-like configuration page for choosing where logs are output.
While I don’t intend on using this plugin for further Outreachy rounds, I do hope to see more interest in it over time as the more security-conscious users out there discover this new plugin.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/09/10/introducing-the-jira-software-plugin-for-jenkins/</id>
<title>Introducing the Jira Software plugin for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-09-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/09/10/introducing-the-jira-software-plugin-for-jenkins/" />
<author>
<name>rafalmyslek</name>
</author>
<category term='jira'></category>
<category term='plugin'></category>
<category term='pipeline'></category>
<summary>
According to a recent survey we conducted, software &amp; IT teams on average use 4+ tools to move code from development to customer-facing production. As a result, teams struggle with keeping the status of work updated and understanding the overall health of their delivery pipeline.


To solve this problem, I am excited to announce that we built an official Jenkins plugin for Jira Software Cloud. The plugin automatically associates build and deployment information from Jenkins with relevant Jira issues and exposes key information about your pipeline across Jira issues, boards and via JQL. This means you can use Jira Software to...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;According to a &lt;a href=&quot;https://www.atlassian.com/blog/software-teams/modern-software-development-trends&quot;&gt;recent survey&lt;/a&gt; we conducted, software &amp;amp; IT teams on average use 4+ tools to move code from development to customer-facing production. As a result, teams struggle with keeping the status of work updated and understanding the overall health of their delivery pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To solve this problem, I am excited to announce that we built &lt;a href=&quot;https://plugins.jenkins.io/atlassian-jira-software-cloud&quot;&gt;an official Jenkins plugin for Jira Software Cloud&lt;/a&gt;. The plugin automatically associates build and deployment information from Jenkins with relevant Jira issues and exposes key information about your pipeline across Jira issues, boards and via JQL. This means you can use Jira Software to automatically update and track issues through your complete development pipeline, from backlog to release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope this plugin adds value to you and your team. If you are interested in contributing or forking this plug-in you can head over to our project on the &lt;a href=&quot;https://github.com/jenkinsci/atlassian-jira-software-cloud-plugin&quot;&gt;Jenkins GitHub repo to get started&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;better-collaboration-between-teams&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#better-collaboration-between-teams&quot; /&gt;Better collaboration between teams&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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/introducing-the-jira-software-plugin-for-jenkins/dev-tools-ticketview.png&quot; alt=&quot;Use Jenkins build information in Jira Software to create a workflow between QA and developers and create a rapid feedback loop for testing at any point in your development process.&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This new information view is so powerful because historically it was dispersed across multiple tools only accessible to a few members of your team. Now anyone involved in the software delivery process can self-serve this information. For example, product managers, QA, and support teams can view which features have been deployed to customers and which are still waiting in staging environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With better information sharing between tools in your delivery stack, you can also improve cross-collaboration between teams. Teams such as QA and operations can collaborate in the software teams next sprint. For example, you can use build information in Jira Software to create a workflow between QA and developers and create a rapid feedback loop for testing at any point in your development process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;use-jiras-querying-language-for-advanced-views&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-jiras-querying-language-for-advanced-views&quot; /&gt;Use Jira’s Querying Language for advanced views&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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/introducing-the-jira-software-plugin-for-jenkins/jql.png&quot; alt=&quot;Build powerful views into your development pipeline with support for JQL.&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to building better ways to collaborate, these integrations also give your team deeper insight into the development pipeline from within Jira Software. You can now create powerful views into your delivery pipeline &lt;a href=&quot;https://confluence.atlassian.com/jirasoftwarecloud/advanced-searching-developer-reference-967312910.html&quot;&gt;with JQL queries across multiple connected tools&lt;/a&gt;. For example, you can write a custom JQL query to report all Jira issues that have been deployed to production but still have an open PR.&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;deploymentEnvironmentType ~ “production“ AND development[pullrequests].open&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;get-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-started&quot; /&gt;Get started&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;In Jira Software Cloud&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Create OAuth credentials in Jira for Jenkins&lt;/strong&gt;&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 &lt;strong&gt;Jira home &amp;gt; Jira settings &amp;gt; Apps&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;OAuth credentials&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Create credentials&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter the following details:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;App name&lt;/em&gt; - Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;App logo&lt;/em&gt; - A URL to the Jenkins logo, which will be used as an icon in the list of credentials. Eg: &lt;a href=&quot;https://jenkins.yourcompany.com/logo.png&quot; class=&quot;bare&quot;&gt;https://jenkins.yourcompany.com/logo.png&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Server base URL - The URL to your Jenkins server. Eg: &lt;a href=&quot;https://jenkins.yourcompany.com&quot; class=&quot;bare&quot;&gt;https://jenkins.yourcompany.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;In Jenkins&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Install the Jenkins plugin&lt;/strong&gt;&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;Login to your Jenkins server and navigate to the Plugin Manager.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select the &#39;Available&#39; tab and search for &#39;Atlassian Jira Software Cloud&#39; as the plugin name then install it.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The open-source plugin is hosted in the Jenkins GitHub account. &lt;a href=&quot;https://github.com/jenkinsci/atlassian-jira-software-cloud-plugin&quot;&gt;You can check it out here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Set up Jenkins credentials&lt;/strong&gt;&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;In Jenkins, go to &lt;strong&gt;Manage Jenkins &amp;gt; Configure System&lt;/strong&gt; screen and scroll to the Jira Software Cloud integration section.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Add Jira Cloud Site &amp;gt; Jira Cloud Site&lt;/strong&gt;. The &lt;em&gt;Site name&lt;/em&gt;, &lt;em&gt;ClientID&lt;/em&gt;, and &lt;em&gt;Secret&lt;/em&gt; fields display.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter the following details:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Site name: The URL for your Jira Cloud site, for example yourcompany.atlassian.net.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Client ID: Copy from &lt;strong&gt;OAuth credentials&lt;/strong&gt; screen (Client ID column).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Secret: Select Add &amp;gt; Jenkins.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For &lt;em&gt;Kind&lt;/em&gt;, select &lt;strong&gt;Secret text&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For &lt;em&gt;Secret&lt;/em&gt;, copy from &lt;strong&gt;OAuth credentials&lt;/strong&gt; screen (Secret column).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For &lt;em&gt;Description&lt;/em&gt;, provide a helpful description&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select Test settings to make sure your credentials are valid for your Jira site.&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;how-to-use-the-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-use-the-plugin&quot; /&gt;How to use the plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;To start using the integration:&lt;/strong&gt;&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 into a specific pipeline in Jenkins ( Note: Your pipeline must be a &#39;Multibranch Pipeline&#39; ).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From the left-hand menu, select &lt;strong&gt;Pipeline Syntax&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the Snippet Generator, select &lt;strong&gt;jiraSendDeploymentInfo&lt;/strong&gt; or &lt;strong&gt;jiraSendBuildInfo&lt;/strong&gt; from the dropdown list of Sample Steps and fill in the relevant details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Generate Pipeline Script&lt;/strong&gt; and copy/paste the output into your &lt;em&gt;Jenkinsfile&lt;/em&gt; on the relevant Repository you are using. This will be used to notify Jira when you run that pipeline on that repo.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;For sending build information&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is an example snippet of a very simple ‘build’ stage set up in a &lt;em&gt;Jenkinsfile&lt;/em&gt;. After the pipeline is run, it will post the build information to your Jira Cloud site by looking at the branch name. If there is a Jira issue key (e.g. “TEST-123”) in the branch name, it will send the data over to Jira.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Jenkinsfile example&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;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;Build&#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;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Building...&#39;&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;n&quot;&gt;jiraSendBuildInfo&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;site:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;example.atlassian.net&#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;&lt;strong&gt;For sending deployment information&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is an example snippet of two stages that run on any change to the staging or master branch. Again, we use a post step to send deployment data to Jira and the relevant issues. Here, the &lt;strong&gt;environmentId&lt;/strong&gt;, &lt;strong&gt;environmentName&lt;/strong&gt;, and &lt;strong&gt;environmentType&lt;/strong&gt; need to be set to whatever you want to appear in Jira.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Jenkinsfile example&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;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;Deploy - Staging&#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;branch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;master&#39;&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;Deploying to Staging from master...&#39;&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;n&quot;&gt;jiraSendDeploymentInfo&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;site:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;example.atlassian.net&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;us-stg-1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;us-stg-1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentType:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;staging&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Deploy - Production&#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;branch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;master&#39;&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;Deploying to Production from master...&#39;&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;n&quot;&gt;jiraSendDeploymentInfo&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;site:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;example.atlassian.net&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;us-prod-1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;us-prod-1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentType:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;production&#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;The entire &lt;em&gt;Jenkinsfile&lt;/em&gt; may look something like this. This is only meant to represent an example of what the Jira snippets could look like within a stage or step.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Jenkinsfile example&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;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;Build&#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;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Building...&#39;&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;n&quot;&gt;jiraSendBuildInfo&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;site:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;example.atlassian.net&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Deploy - Staging&#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;branch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;master&#39;&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;Deploying to Staging from master...&#39;&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;n&quot;&gt;jiraSendDeploymentInfo&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;site:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;example.atlassian.net&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;us-stg-1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;us-stg-1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentType:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;staging&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Deploy - Production&#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;branch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;master&#39;&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;Deploying to Production from master...&#39;&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;n&quot;&gt;jiraSendDeploymentInfo&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;site:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;example.atlassian.net&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;us-prod-1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;us-prod-1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;environmentType:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;production&#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;questions-or-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#questions-or-feedback&quot; /&gt;Questions or feedback?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any questions, please contact &lt;a href=&quot;https://support.atlassian.com/contact/&quot;&gt;Atlassian support&lt;/a&gt; and they will route it to the correct team to help you.&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/2019/08/30/jenkins-cli/</id>
<title>Managing Jenkins with jcli</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-08-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/08/30/jenkins-cli/" />
<author>
<name>linuxsuren</name>
</author>
<category term='general'></category>
<category term='jcli'></category>
<category term='cli'></category>
<category term='tools'></category>
<summary>
As a developer, I usually use Jenkins like this:




Find a job which is related with my current work


Trigger that job


Check the output of the build log




Sometimes, I might need to check the update center. Maybe a new plugin is needed, or I need to update an existing plugin.
Or, I want to upload a plugin from my computer. For all these cases, I just don&#8217;t need a UI or even a browser.
I like to use a CLI to complete most of my tasks. For example, I use kubectl to manage my Kubernetes cluster,
to create or modify the kubernetes resources. So, I...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a developer, I usually use Jenkins like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Find a job which is related with my current work&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trigger that job&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the output of the build log&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes, I might need to check the update center. Maybe a new plugin is needed, or I need to update an existing plugin.
Or, I want to upload a plugin from my computer. For all these cases, I just don’t need a UI or even a browser.
I like to use a CLI to complete most of my tasks. For example, I use &lt;code&gt;kubectl&lt;/code&gt; to manage my Kubernetes cluster,
to create or modify the kubernetes resources. So, I start to think, &#39;Why not use a CLI to manage my Jenkins?&#39;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-create-a-new-one&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-create-a-new-one&quot; /&gt;Why create a new one?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, I almost forgot about the existing &lt;a href=&quot;https://www.jenkins.io/doc/book/managing/cli/&quot;&gt;Jenkins CLI&lt;/a&gt;, written in Java. Let me introduce how to use that one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Visit Jenkins page from &lt;code&gt;&lt;a href=&quot;http://localhost:8080/jenkins/cli/&quot; class=&quot;bare&quot;&gt;http://localhost:8080/jenkins/cli/&lt;/a&gt;&lt;/code&gt;. You’ll see a command like &lt;code&gt;java -jar jenkins-cli.jar -s &lt;a href=&quot;http://localhost:8080/jenkins/&quot; class=&quot;bare&quot;&gt;http://localhost:8080/jenkins/&lt;/a&gt; help&lt;/code&gt;. So, a jar file needs to be download.
We can use this command to complete this task &lt;code&gt;wget &lt;a href=&quot;http://localhost:8080/jenkins/jnlpJars/jenkins-cli.jar&quot; class=&quot;bare&quot;&gt;http://localhost:8080/jenkins/jnlpJars/jenkins-cli.jar&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now you can see that this is not a Linux-style CLI. Please consider some points below:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The users must have a JRE. This is not convenient for developers who don’t use Java.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The CLI is too wordy. We always need to type &lt;code&gt;java -jar jenkins-cli.jar -s &lt;a href=&quot;http://localhost:8080/jenkins/&quot; class=&quot;bare&quot;&gt;http://localhost:8080/jenkins/&lt;/a&gt;&lt;/code&gt; as the initial command.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cannot install it by some popular package manager, like &lt;code&gt;brew&lt;/code&gt; or &lt;code&gt;yum&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;Of course, the Java CLI client is more native with Jenkins. But I’d like to use this more easily.
So I decided to create a new CLI tool which would be written in Go and which would natively run on modern platforms.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s the story of creating &lt;code&gt;jcli&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#features&quot; /&gt;Features&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;Easy to maintain config file for jcli&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multiple Jenkins support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugins management (list, search, install, upload)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Job management (search, build, log)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your Jenkins with a browser&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart your Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Connection with proxy support&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;how-to-get-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-get-it&quot; /&gt;How to get it?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can clone &lt;code&gt;jcli&lt;/code&gt; from &lt;a href=&quot;https://github.com/jenkins-zh/jenkins-cli/&quot;&gt;the jenkins-cli repo&lt;/a&gt;. For now, we support
these three most popular OS platforms: MacOS, Linux, and Windows.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;macos&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#macos&quot; /&gt;MacOS&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use brew to install jcli.&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;brew tap jenkins-zh/jcli
brew install jcli&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;linux&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#linux&quot; /&gt;Linux&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s very simple to install jcli into your Linux OS. Just need to execute a command line at below:&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;curl -L https://github.com/jenkins-zh/jenkins-cli/releases/latest/download/jcli-linux-amd64.tar.gz|tar xzv
sudo mv jcli /usr/local/bin/&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;windows&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#windows&quot; /&gt;Windows&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find the latest version by clicking &lt;a href=&quot;https://github.com/jenkins-zh/jenkins-cli/releases/latest/download/jcli-windows-386.tar.gz&quot;&gt;here&lt;/a&gt;. Then download the tar file, cp the uncompressed &lt;code&gt;jcli&lt;/code&gt; directory into your system path.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-get-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-get-started&quot; /&gt;How to get started?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s very simple to use this. Once you get &lt;code&gt;jcli&lt;/code&gt; on your computer, use this command to generate a sample configuration:&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;jcli config generate
current: yourServer
jenkins_servers:
- name: yourServer
  url: http://localhost:8080/jenkins
  username: admin
  token: 111e3a2f0231198855dceaff96f20540a9
  proxy: &quot;&quot;
  proxyAuth: &quot;&quot;
# Goto &#39;http://localhost:8080/jenkins/me/configure&#39;, then you can generate your token.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In most cases, you should modify three fields which are &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;username&lt;/code&gt; and &lt;code&gt;token&lt;/code&gt;. OK, I believe you’re ready. Please check whether you install the &lt;code&gt;github&lt;/code&gt; plugin in your Jenkins:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jcli plugin list --filter name=github&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s the end. It’s still in very early development stage. Any contribution is 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/2019/08/26/role-strategy-performance/</id>
<title>Performance Improvements to Role Strategy Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-08-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/08/26/role-strategy-performance/" />
<author>
<name>abhyudayasharma</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<category term='performance'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
The task for my Google Summer of Code program was to improve the performance
of the Role Strategy Plugin. The performance issues for Role Strategy Plugin
had been reported multiple times on Jenkins JIRA. With a large number of roles
and with complex regular expressions, a large slow-down was visible on the Web UI.
Even before GSoC started, there were a number of patches which tried to improve
performance of the plugin (by Deepansh Nagaria
and others).


At the time, there was no way to reliably measure improvements in performance.
Therefore, we started by creating a
framework
for running micro-benchmarks on Jenkins Plugins. Benchmarks using the framework
were added to the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The task for my Google Summer of Code program was to improve the performance
of the Role Strategy Plugin. The performance issues for Role Strategy Plugin
had been reported multiple times on Jenkins JIRA. With a large number of roles
and with complex regular expressions, a large slow-down was visible on the Web UI.
Even before GSoC started, there were a number of patches which tried to improve
performance of the plugin (by &lt;a href=&quot;https://github.com/deepanshnagaria&quot;&gt;Deepansh Nagaria&lt;/a&gt;
and others).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the time, there was no way to reliably measure improvements in performance.
Therefore, we started by creating a
&lt;a href=&quot;https://www.jenkins.io/blog/2019/06/21/performance-testing-jenkins/&quot;&gt;framework&lt;/a&gt;
for running micro-benchmarks on Jenkins Plugins. Benchmarks using the framework
were added to the &lt;a href=&quot;https://plugins.jenkins.io/role-strategy&quot;&gt;Role Strategy Plugin&lt;/a&gt; find performance
critical parts of the plugins and to measure the improvements of a change.
This blog post summarizes the changes that were made and performance improvements
measured.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;caching-matching-roles&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#caching-matching-roles&quot; /&gt;Caching matching roles&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A couple of major changes were made to the Role Strategy Plugin to improve its
performance. First, we started collection of roles that matched a given
project name. The Role Strategy plugin before version 2.12 used to run over
regular expressions for every role that it had for every permission checking
request it got. Storing this produced set of roles in the memory provides us
large improvements in performance and avoids repeated matching of project names
with regular expressions. For keeping the plugin working securely, we invalidate
the cache whenever any update is made to the roles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After this change, we were able to observe performance improvements of up to
3300%. These improvements were visualized using
&lt;a href=&quot;https://jmh.morethan.io/&quot;&gt;JMH Visualizer&lt;/a&gt;.&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/role-strategy-performance/benchmarks1.png&quot; alt=&quot;Benchmarks results after caching matching roles&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More information is available at pull request on GitHub:
&lt;a href=&quot;https://github.com/jenkinsci/role-strategy-plugin/pull/81&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/role-strategy-plugin/pull/81&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;calculating-implying-permissions-when-plugin-is-loaded&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#calculating-implying-permissions-when-plugin-is-loaded&quot; /&gt;Calculating Implying Permissions when plugin is loaded&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins&#39; permission model allows one permissions to imply other permissions.
When a permission check is made, we need to check if the user has any of
permissions that would imply this permissions. For every permission checking
request that that the Role Strategy, it used to calculate all the implying
permissions. To avoid this, we now calculate and store implying permissions
for every permission in the Jenkins system when the plugin gets loaded.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After both of these changes, we were able to experience improvements of up to
10000%. The benchmark results show it better:&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/role-strategy-performance/benchmarks2.png&quot; alt=&quot;Benchmarks results after both changes&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More information about this change can be found at the GitHub pull request:
&lt;a href=&quot;https://github.com/jenkinsci/role-strategy-plugin/pull/83&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci/role-strategy-plugin/pull/83&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both of these changes were integrated into the Role Strategy Plugin and the
improvements can be experienced starting with version
&lt;a href=&quot;https://github.com/jenkinsci/role-strategy-plugin/releases/tag/role-strategy-2.13&quot;&gt;2.13&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;bonus-configuration-as-code-export-now-works-for-role-strategy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bonus-configuration-as-code-export-now-works-for-role-strategy&quot; /&gt;Bonus: Configuration-as-Code export now works for Role Strategy&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With &lt;a href=&quot;https://plugins.jenkins.io/configuration-as-code&quot;&gt;Configuration-as-Code plugin&lt;/a&gt; version
&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/releases/tag/configuration-as-code-1.24&quot;&gt;1.24&lt;/a&gt;
and above, export of your configuration as YAML now works!&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/role-strategy-performance/jcasc-export.png&quot; alt=&quot;Role Strategy configuration export working with JCasC 1.24&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As an alternative to
Role Strategy Plugin, I also created the brand new &lt;a href=&quot;https://plugins.jenkins.io/folder-auth&quot;&gt;Folder Authorization Plugin&lt;/a&gt;.
You can check out the &lt;a href=&quot;https://www.jenkins.io/blog/2019/08/16/folder-auth-plugin/&quot;&gt;blog post&lt;/a&gt; for
more information about the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;links-and-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links-and-feedback&quot; /&gt;Links and Feedback&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would love to hear your comments and suggestions. Please feel free to reach
out to me through either the
link:https://app.gitter.im/#/room/#jenkinsci_role-strategy-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Role Strategy Plugin Gitter chat&lt;/a&gt; or through
&lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins Developer Mailing list&lt;/a&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://drive.google.com/file/d/1lAXDljWXypCq6noiqPHI-eZJqBqaSYue/view?usp=sharing&quot;&gt;Presentation slides for final evaluation of GSoC&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/folder-auth-plugin&quot;&gt;The Folder Authorization Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/g19o24uzy6c?t=1234&quot;&gt;Demo for the final evaluations&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/2019/08/25/jenkinsworld-contrib-summit-ask-the-expert-booth/</id>
<title>Jenkins World Contributor Summit and Ask the Expert booth</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-08-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/08/25/jenkinsworld-contrib-summit-ask-the-expert-booth/" />
<author>
<name>markyjackson-taulia</name>
</author>
<category term='jenkinsworld'></category>
<category term='devopsworld2019'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<category term='community'></category>
<category term='opensource'></category>
<category term='events'></category>
<category term='contributorsummit'></category>
<category term='asktheexpert'></category>
<summary>
Jenkins turns 15 years old!
Jenkins World brings together DevOps thought leaders, IT executives, continuous delivery practitioners and the Jenkins
community and ecosystem in one global event, providing attendees with the opportunity to learn, explore, network
face-to-face and help shape the next evolution of Jenkins development and solutions for DevOps.


There is also the Jenkins Contributor Summit in San Francisco. The Jenkins Contributor Summit is the place where
current and future contributors get together to discuss, learn and collaborate on the latest and greatest efforts within
Jenkins project. The morning portion of the summit is a mix of presentations by the core contributors. The
presentations highlight what...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins turns 15 years old!
Jenkins World brings together DevOps thought leaders, IT executives, continuous delivery practitioners and the Jenkins
community and ecosystem in one global event, providing attendees with the opportunity to learn, explore, network
face-to-face and help shape the next evolution of Jenkins development and solutions for DevOps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is also the Jenkins Contributor Summit in San Francisco. The Jenkins Contributor Summit is the place where
current and future contributors get together to discuss, learn and collaborate on the latest and greatest efforts within
Jenkins project. The morning portion of the summit is a mix of presentations by the core contributors. The
presentations highlight what each effort is about and what community members can do to help. In the
afternoon breakout sessions with  Birds of a Feather tables for in-depth discussion, and collaboration with sub-project
contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I feel very honored to have been a part of this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0439.jpg&quot; alt=&quot;Jenkins World 2019&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;day-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-1&quot; /&gt;Day 1&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Day one started with the contributor summit. This was a chance for everyone to get together and talk about
contributions and put faces to names. Most people I had only met via video chat or on gitter so I was super excited.
We gathered to hear about the start of the Jenkins open source landscape.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0440.jpg&quot; alt=&quot;Contributor Summit Agenda&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next up was the BoF/Unconference. I was leading these sessions and I felt they went really well.
We had fellow org admins Martin d’Anjou and Jeff Pearce give a talk about Google Summer of Code projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0446.jpg&quot; alt=&quot;Unconference&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Google Summer of Code student Natasha Stopa presented her project, Plugin Installation Manager Library/CLI Tool. This is
a super cool project and very well received in the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0449.jpg&quot; alt=&quot;GSOC Student&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We closed out the session with a presentation from Steven Terrana from Booz Allen Hamilton and the awesome Jenkins
Templating Engine. If you have not had a chance to try this, please make sure you do at &lt;a href=&quot;https://github.com/boozallen/jenkins-templating-engine&quot; class=&quot;bare&quot;&gt;https://github.com/boozallen/jenkins-templating-engine&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0451.jpg&quot; alt=&quot;Community Plugin&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;main-expo-hall&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#main-expo-hall&quot; /&gt;Main Expo Hall&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Day two and onward saw me and other Jenkins org admins in the Ask the Expert booth for the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0465.jpg&quot; alt=&quot;Jenkins World 2019&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was a really cool experience and gave me a chance to hear about things the community is working on and help with
issues they are facing.
There were a range of questions from Jenkins X to many of the plugins I maintain such and the Jenkins Prometheus and the
Sysdig Secure Scanning plugins.
There were also a lot of Kubernetes questions. There is a lot of marketing data regarding the increased usage of
Kubernetes but I was seriously surprised by the massive interest in Jenkins on Kubernetes.
Of course there were opportunities for selfie requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0472.jpg&quot; alt=&quot;Community Booth&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lunch time demos got underway and we had a busy schedule.
First up was the awesome Mark Waite to talk about the
&lt;a href=&quot;https://www.slideshare.net/markewaite/git-for-jenkins-faster-and-better&quot;&gt;Git plugin&lt;/a&gt;. A lot of people use git in
Jenkins.
Thank you so much for all that you do Mark.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0480.jpg&quot; alt=&quot;Lunch Time Demo - Mark Waite&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins org admin Martin d’Anjou was next on deck to talk about the Google Summer of Code. So amazing to think that the
Google Summer of Code is also in its 15th year like Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0489.jpg&quot; alt=&quot;Lunch Time Demo - Martin d’Anjou&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Natasha Stopa is a Google Summer of Code student and she presented her project Plugin Installation Manager Library/CLI Tool.
Natasha really put a lot of hard work in to this plugin and it was really awesome to see the turn out and support during
her presentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0494.jpg&quot; alt=&quot;Lunch Time Demo - Natasha Stopa&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally there was me. I presented the Sysdig Secure Scanning Jenkins plugin which I am a maintainer of. I thank everyone who attended&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0499.jpg&quot; alt=&quot;Lunch Time Demo - Marky Jackson&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Right after the lunch time demos I also oversaw the Jenkins open space. This was an opportunity for the community to talk
about items and let them flow organically. I really enjoyed this session and felt it was also well received.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0501.jpg&quot; alt=&quot;Jenkins Open Space&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We closed out the day and the event with a picture of some of the Jenkins org admins and Google Summer of Code students.
Missing from this photos are fellow org admins, Lloyd Chang and Oleg Nenashev&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0500.jpg&quot; alt=&quot;Closing Day&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;closing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#closing&quot; /&gt;Closing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was an amazing experience. Huge thanks to CloudBees, the Jenkins community, Google Summer of Code, Tracy Miranda,
Alyssa Tong and my employer Sysdig.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To think Jenkins is 15 years old is amazing! There has been so much accomplished and the future is so bright. I am so
thankful for the opportunity to serve and be a part of the open source community.
Here’s to 15 more years all!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://www.jenkins.io/sigs/&quot;&gt;special interest group page&lt;/a&gt; if you are interested in joining any one of the Jenkins open source special interest groups. We can use your help.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested in joining the Summer of Code, &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;take a look the project page&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/chat/&quot;&gt;chat with us&lt;/a&gt; to get in touch.
Or if you want to email us, reach out at the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;mailing lists&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some photos outtakes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0483.jpg&quot; alt=&quot;Outtakes&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0486.jpg&quot; alt=&quot;Outtakes&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0461.jpg&quot; alt=&quot;Outtakes&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2019/IMG_0462.jpg&quot; alt=&quot;Outtakes&quot; height=&quot;500&quot;&gt;
&lt;/img&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;&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/08/23/introducing-gitlab-branch-source-plugin/</id>
<title>Introducing new GitLab Branch Source Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-08-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/08/23/introducing-gitlab-branch-source-plugin/" />
<author>
<name>baymac</name>
</author>
<category term='gitlab'></category>
<category term='plugins'></category>
<category term='pipeline'></category>
<category term='multibranch'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
The GitLab Branch Source Plugin has come out of its beta stage and has been released to the Jenkins update center. It allows you to create job based on GitLab user or group or subgroup project(s). You can either:




Import a single project&#8217;s branches as jobs from a GitLab user/group/subgroup (Multibranch Pipeline Job)


Import all or a subset of projects as jobs from a GitLab user/group/subgroup (GitLab Group Job or GitLab Folder Organization)




The GitLab Group project scans the projects, importing the pipeline jobs it identifies based on the criteria provided. After a project is imported, Jenkins immediately runs the jobs based on...
</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;The GitLab Branch Source Plugin has come out of its beta stage and has been released to the Jenkins update center. It allows you to create job based on GitLab &lt;code&gt;user&lt;/code&gt; or &lt;code&gt;group&lt;/code&gt; or &lt;code&gt;subgroup&lt;/code&gt; project(s). You can either:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Import a single project’s branches as jobs from a GitLab user/group/subgroup (Multibranch Pipeline Job)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Import all or a subset of projects as jobs from a GitLab user/group/subgroup (GitLab Group Job or GitLab Folder Organization)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The GitLab Group project scans the projects, importing the pipeline jobs it identifies based on the criteria provided. After a project is imported, Jenkins immediately runs the jobs based on the &lt;code&gt;Jenkinsfile&lt;/code&gt; pipeline script and notifies the status to GitLab Pipeline Status. This plugin unlike other Branch Source Plugins provides GitLab server configuration which can be configured in Configure System. Jenkins Configuration as Code (JCasC) can also be used to configure the server. To learn more about server configuration see my &lt;a href=&quot;https://www.jenkins.io/blog/2019/06/29/phase-1-multibranch-pipeline-support-for-gitlab/&quot;&gt;previous blog post&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;requirements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#requirements&quot; /&gt;Requirements&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;Jenkins - 2.176.2 (LTS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitLab - v11.0+&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;creating-a-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-a-job&quot; /&gt;Creating a Job&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To create a Multibranch Pipeline Job (with GitLab branch source) or GitLab Group Job, you must have GitLab Personal Access Token added to the server configuration. The credentials is used to fetch meta data of the project(s) and to set up hooks on GitLab Server. If the token has admin access you can also set up &lt;code&gt;System Hooks&lt;/code&gt; while &lt;code&gt;Web Hooks&lt;/code&gt; can be set up from any user token.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;create-a-multibranch-pipeline-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#create-a-multibranch-pipeline-job&quot; /&gt;Create a Multibranch Pipeline Job&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Go to Jenkins &amp;gt; New Item &amp;gt; Multibranch Pipeline &amp;gt; Add Source &amp;gt; GitLab Project&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/gsoc-gitlab-branch-source-plugin/branch-source.png&quot; alt=&quot;GitLab Project Branch Source&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;code&gt;Server&lt;/code&gt; - Select your desired GitLab server from the dropdown, needs to be configured before creating this job.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Checkout Credentials&lt;/code&gt; - Add credentials of type &lt;code&gt;SSHPrivateKey&lt;/code&gt; or &lt;code&gt;Username/Password&lt;/code&gt; if there are any private projects to be built by the plugin. If all projects are public then no checkout credentials required. Checkout credential is different from the credential (of type &lt;code&gt;GitLab Personal Access Token&lt;/code&gt;) setup in GitLab server config.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Owner&lt;/code&gt; - Can be a &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;group&lt;/code&gt; or &lt;code&gt;subgroup&lt;/code&gt;. Depending on this the &lt;code&gt;Projects&lt;/code&gt; field is populated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Projects&lt;/code&gt; - Select the project you want to build from the dropdown.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Behaviours&lt;/code&gt; - These traits are very powerful tool to configure the build logic and post build logic. We have defined new traits. You can see all the information in repository documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Save and wait for the branches indexing. You are free to navigate from here, the job progress is displayed to the left hand side.&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/gsoc-gitlab-branch-source-plugin/multibranch-indexing.png&quot; alt=&quot;Multibranch Pipeline Job Indexing&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the indexing, the imported project listed all the branches, merge requests and tags as jobs.&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/gsoc-gitlab-branch-source-plugin/multibranch-folder.png&quot; alt=&quot;Multibranch Pipeline Job Folder&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On visiting each job, you will find some action items on the left hand side:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can trigger the job manually by selecting &lt;code&gt;Build Now&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can visiting the particular branch/merge request/tag on your GitLab Server by selecting the corresponding button.&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/gsoc-gitlab-branch-source-plugin/icon-tag.png&quot; alt=&quot;Build Actions&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;create-a-gitlab-group-job-type&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#create-a-gitlab-group-job-type&quot; /&gt;Create a GitLab Group Job Type&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Go to Jenkins &amp;gt; New Item &amp;gt; GitLab Group&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/gsoc-gitlab-branch-source-plugin/gitlab-group.png&quot; alt=&quot;GitLab Folder Organization&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can notice the configuration is very similar to Multibranch Pipeline Job with only &lt;code&gt;Projects&lt;/code&gt; field missing. You can add all the projects inside your Owner i.e. User/Group/Subgroup. The form validation will check with your GitLab server if the owner is valid. You can add &lt;code&gt;Discover subgroup project&lt;/code&gt; trait which allows you to discover this child projects of all subgroups inside a Group or Subgroup but this trait is not applicable to User. While indexing, web hook is created in each project. GitLab Api doesn’t support creation of Group web hooks so this plugin doesn’t support that feature which is only available in GitLab EE.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can now explore your imported projects, configuring different settings on each of those folders if needed.&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/gsoc-gitlab-branch-source-plugin/gitlab-group-folder.png&quot; alt=&quot;GitLab Group Folder&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;gitlab-pipeline-status-notification&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gitlab-pipeline-status-notification&quot; /&gt;GitLab Pipeline Status Notification&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GitLab is notified about build status from the point of queuing of jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Success - the job was successful&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Failure - the job failed and the merge request is not ready to be merged&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Error - something unexpected happened; example: the job was aborted in Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pending - the job is waiting in the build queue&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/gsoc-gitlab-branch-source-plugin/pipeline-status.png&quot; alt=&quot;GitLab Pipeline Status&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On GitLab Pipeline status are hyperlinks to the corresponding Jenkins job build. To see the Pipeline Stages and the console output you will be required to visit your Jenkins server. We also planned to notify the pipeline stages to GitLab but it came with some drawbacks which has been addressed so far but there is future plan to add it as trait.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also skip notifying GitLab about the pipeline status by selecting &lt;code&gt;Skip pipeline status notifications&lt;/code&gt; from the traits list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;merge-requests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#merge-requests&quot; /&gt;Merge Requests&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Implementing support for Merge Requests for the projects was challenging. First, MRs are of 2 types i.e. Origin branches and Forked Project branches so there had to be different implementation for each head. Second, MRs from forks can be from untrusted sources, so a new strategy &lt;code&gt;Trust Members&lt;/code&gt; was implemented which allows CI to build MRs only from trusted users who have accesslevel of &lt;code&gt;Developer&lt;/code&gt;/&lt;code&gt;Maintainer&lt;/code&gt;/&lt;code&gt;Owner&lt;/code&gt;.&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/gsoc-gitlab-branch-source-plugin/trusted-members.png&quot; alt=&quot;Trusted Member Strategy&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Third, MRs from forks do not support pipeline status notification due to GitLab issue, see &lt;a href=&quot;https://docs.gitlab.com/ee/ci/merge_request_pipelines/#important-notes-about-merge-requests-from-forked-projects&quot;&gt;this&lt;/a&gt;. You can add a trait &lt;code&gt;Log Build Status as Comment on GitLab&lt;/code&gt; that allows you to add a sudo user (leave empty if you want owner user) to comment on the commit/tag/mrs the build result. To add a sudo user your token must have admin access. By default only failure/error are logged as comment but you can also enable logging of success build by ticking the checkbox.&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/gsoc-gitlab-branch-source-plugin/log-comment-trait.png&quot; alt=&quot;Build Status Comment Trait&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes, Merge Requests fail due to external errors so you want to trigger rebuild of mr by commenting &lt;code&gt;jenkins rebuild&lt;/code&gt;. To enable this trigger add the trait &lt;code&gt;Trigger build on merge request comment&lt;/code&gt;. The comment body can be changed in the trait. For security reasons, commentor should have &lt;code&gt;Developer&lt;/code&gt;/&lt;code&gt;Maintainer&lt;/code&gt;/&lt;code&gt;Owner&lt;/code&gt; accesslevel in the project.&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/gsoc-gitlab-branch-source-plugin/build-trigger-trait.png&quot; alt=&quot;Merge request build trigger&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;hooks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hooks&quot; /&gt;Hooks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Web hooks are automatically created on your projects if configured to do so in server configuration. Web hooks are ensured to pass through a CSRF filter. Jenkins listens to web hooks on the path &lt;code&gt;/gitlab-webhook/post&lt;/code&gt;. On GitLab web hooks are triggered on the following events:&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;Push Event&lt;/code&gt; - when a commit or branch is pushed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Tag Event&lt;/code&gt; - when a new tag is created&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Merge Request Event&lt;/code&gt; - when a merge request is created/updated&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Note Event&lt;/code&gt; - when a comment is made on a merge request&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also set up System Hooks on your GitLab server if your token has admin access. System hooks are triggered when new projects are created, Jenkins triggers a rescan of the new project based on the configuration and sets up web hook on it. Jenkins listens to system hooks on the path &lt;code&gt;/gitlab-systemhook/post&lt;/code&gt;. On GitLab system hooks are triigered on &lt;code&gt;Repository Update Events&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also use &lt;code&gt;Override Hook Management mode&lt;/code&gt; trait to override the default hook management and choose if you want to use a different context (say Item) or disable it altogether.&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/gsoc-gitlab-branch-source-plugin/override-hook.png&quot; alt=&quot;Override Hook Management&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;job-dsl-and-jcasc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#job-dsl-and-jcasc&quot; /&gt;Job DSL and JCasC&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use &lt;code&gt;Job DSL&lt;/code&gt; to create jobs. Here’s an example of Job DSL script:&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;organizationFolder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;GitLab Organization Folder&#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;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;GitLab org folder created with Job DSL&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;displayName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;My Project&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// &quot;Projects&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;organizations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;gitLabSCMNavigator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;projectOwner&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;baymac&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;credentialsId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;i&amp;lt;3GitLab&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;serverName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;gitlab-3214&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// &quot;Traits&quot; (&quot;Behaviours&quot; in the GUI) that are &quot;declarative-compatible&quot;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;traits&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;subGroupProjectDiscoveryTrait&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// discover projects inside subgroups&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;gitLabBranchDiscovery&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;strategyId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// discover all branches&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;originMergeRequestDiscoveryTrait&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;strategyId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// discover MRs and merge them with target branch&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;gitLabTagDiscovery&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// discover tags&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;c1&quot;&gt;// &quot;Traits&quot; (&quot;Behaviours&quot; in the GUI) that are NOT &quot;declarative-compatible&quot;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// For some &#39;traits, we need to configure this stuff by hand until JobDSL handles it&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// https://issue-redirect.jenkins.io/issue/45504&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;configure&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;traits&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;it&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/ navigators /&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;io.jenkins.plugins.gitlabbranchsource.GitLabSCMNavigator&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;traits&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;traits&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;io.jenkins.plugins.gitlabbranchsource.ForkMergeRequestDiscoveryTrait&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;strategyId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&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;n&quot;&gt;trust&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;jenkins&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;gitlabbranchsource&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;ForkMergeRequestDiscoveryTrait&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$TrustPermission&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&#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;c1&quot;&gt;// &quot;Project Recognizers&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;projectFactories&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;workflowMultiBranchProjectFactory&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;scriptPath&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Jenkinsfile&#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;c1&quot;&gt;// &quot;Orphaned Item Strategy&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;orphanedItemStrategy&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;discardOldItems&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;daysToKeep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&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;n&quot;&gt;numToKeep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&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;c1&quot;&gt;// &quot;Scan Organization Folder Triggers&quot; : 1 day&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// We need to configure this stuff by hand because JobDSL only allow &#39;periodic(int min)&#39; for now&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;triggers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;periodicFolderTrigger&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;interval&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;1d&#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 class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also use &lt;code&gt;JCasC&lt;/code&gt; to directly create job from a Job DSL script. For example see the plugin &lt;a href=&quot;https://github.com/jenkinsci/gitlab-branch-source-plugin/blob/master/README.md&quot;&gt;repository&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;how-to-talk-to-us-about-bugs-or-new-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-talk-to-us-about-bugs-or-new-features&quot; /&gt;How to talk to us about bugs or new features?&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;This project uses &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;Jenkins JIRA&lt;/a&gt; to track issues. You can file issues under &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project+%3D+JENKINS+AND+component+%3D+gitlab-branch-source-plugin&quot;&gt;&lt;code&gt;gitlab-branch-source-plugin&lt;/code&gt;&lt;/a&gt; component.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Send your mail in the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Developer Mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Join our link:https://app.gitter.im/#/room/#jenkinsci_gitlab-branch-source-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter channel&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;future-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-work&quot; /&gt;Future work&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;Actively maintain &lt;code&gt;GitLab Branch Source Plugin&lt;/code&gt; and take feedbacks from users to improve the plugin’s user experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extend support for GitLab Pipeline to Blueocean.&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;resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#resources&quot; /&gt;Resources&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://github.com/jenkinsci/gitlab-api-plugin&quot;&gt;GitLab API Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/GitLab+API+Plugin&quot;&gt;GitLab API Plugin Wiki&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/gitlab-branch-source-plugin&quot;&gt;GitLab Branch Source Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/gitlab-support-for-multibranch-pipeline/&quot;&gt;Project Summary&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://go.cloudbees.com/docs/plugins/github-branch-source/&quot;&gt;GitHub Branch Source Plugin Release&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;Thank you Jenkins and Google Summer of Code :)&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/08/23/introduce-react-plugin-template/</id>
<title>Introduce React Plugin Template</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-08-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/08/23/introduce-react-plugin-template/" />
<author>
<name>jackshen</name>
</author>
<category term='react'></category>
<category term='plugins'></category>
<category term='template'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
The template&#8217;s main repo is at
React Plugin Template


This template is part of the project Working Hours UI Improvement during
Google Summer of Code 2019, which improved the UI of Working Hours Plugin using this pattern to develop Jenkins plugins with React. The Working Hours Plugin repository can be found at Working Hours Plugin.


Overview


Developing plugin for Jenkins has always been easy to do with its Jelly based UI render system, but Jelly seems to be pretty heavy when we want to use more modernized frameworks like React, or if we need to make the plugin UI more customized. This is what this...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The template’s main repo is at
&lt;a href=&quot;https://github.com/jenkinsci/react-plugin-template&quot;&gt;React Plugin Template&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This template is part of the project &lt;a href=&quot;https://summerofcode.withgoogle.com/projects/#6112735123734528&quot;&gt;Working Hours UI Improvement&lt;/a&gt; during
&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code 2019&lt;/a&gt;, which improved the UI of &lt;code&gt;Working Hours Plugin&lt;/code&gt; using this pattern to develop Jenkins plugins with React. The &lt;code&gt;Working Hours Plugin&lt;/code&gt; repository can be found at &lt;a href=&quot;https://github.com/jenkinsci/working-hours-plugin&quot;&gt;Working Hours Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developing plugin for Jenkins has always been easy to do with its Jelly based UI render system, but Jelly seems to be pretty heavy when we want to use more modernized frameworks like React, or if we need to make the plugin UI more customized. This is what this template is built for.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And with React integrated, development of Jenkins plugin is more modernized, developer can now use tons of React libraries, the way to use libraries is now tinier and safer with webpack, in short, coding with Jenkins plugin can be much easier.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#features&quot; /&gt;Features&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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: 80%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Feature&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Summary&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;React Integrated&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;React is integrated, you can take full control of the UI&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;Using Iframe&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Using iframe can create a new javascript env, we can get rid of some side effects of some polyfills which was added globally.(such as Prototype.js)&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;Maven Lifecycle&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;npm commands are integrated into Maven lifecycle with help of &lt;a href=&quot;https://github.com/eirslett/frontend-maven-plugin/&quot;&gt;Frontend Maven Plugin&lt;/a&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;Webpack&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Webpack helps us reduce the size of the bundle, also avoids pollution on the global namespace.&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;Jenkins Crumb attached&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Crumb is attached to Axios client, now you can send requests in the way you used to do in React.&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;Express as devserver&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;You can run your react app in a standalone page so you can develop in webpack hot reload mode, also with webpack proxy, the standalone app is still accessible to the jenkins dev server.&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;Axios as http client&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Axios hugely simplify the way to make requests.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;screenshots&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#screenshots&quot; /&gt;Screenshots&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Example Plugin UI&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/react-plugin-template/plugin-ui.jpg&quot; alt=&quot;plugin ui&quot; /&gt;
Management Link&lt;/span&gt;
&lt;/p&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/react-plugin-template/management-link.jpg&quot; alt=&quot;management link&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;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;Clone the repo:&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;git clone https://github.com/jenkinsci/react-plugin-template.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;react-plugin-template&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Install the Maven dependencies and node modules.&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;mvn &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-DskipTests&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;Run standalone React app with hot reload&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;npm run start&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Run plugin&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;mvn hpi:run &lt;span class=&quot;nt&quot;&gt;-Dskip&lt;/span&gt;.npm &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; pom.xml&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;send-http-requests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#send-http-requests&quot; /&gt;Send HTTP requests&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Crumb Issuer is default enabled in Jenkins and each ajax request is required to contain a &lt;code&gt;Jenkins Crumb&lt;/code&gt; in request header, so be sure to use the &lt;code&gt;axiosInstance&lt;/code&gt; which is already set up with &lt;code&gt;Jenkins Crumb&lt;/code&gt; and exported at &lt;code&gt;src/main/react/app/api.js&lt;/code&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;javascript&quot;&gt;&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;apiGetData&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;axiosInstance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/data&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&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 if you want to use your own http client, remember to add the &lt;code&gt;Jenkins Crumb&lt;/code&gt; to your request’s header, the Crumb’s key and content could be found at &lt;code&gt;src/main/react/app/utils/urlConfig.js&lt;/code&gt;, then you can set the header like below.&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;javascript&quot;&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{};&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;crumbHeaderName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UrlConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getCrumbHeaderName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;crumbHeaderName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;headers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;crumbHeaderName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UrlConfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;getCrumbToken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;write-your-own-request-handler&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#write-your-own-request-handler&quot; /&gt;Write your own request handler&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now you can customize your request pattern as you want, also we need to write a handler.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is using stapler to preprocess the requests, so if you need a request handler. For example and also in this template, you can use an &lt;code&gt;Action&lt;/code&gt; class to create a sub-url, and then a &lt;code&gt;StaplerProxy&lt;/code&gt; to proxy the request like a router. More info about handlers can be found in the &lt;a href=&quot;https://github.com/stapler/stapler/blob/master/README.md&quot;&gt;Stapler Reference&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;example-handler&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#example-handler&quot; /&gt;Example handler&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ManagementLink would get the request and then hand it off to the &lt;code&gt;PluginUI&lt;/code&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;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@Extension&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PluginManagementLink&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ManagementLink&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;StaplerProxy&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;nc&quot;&gt;PluginUI&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;webapp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getTarget&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;webapp&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;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getUrlName&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;react-plugin-template&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;PluginUI&lt;/code&gt;, stapler would then find methods in the target class, in this case, it finds &lt;code&gt;doDynamic&lt;/code&gt;, then we can choose the next handler by return the methods result, in this case, &lt;code&gt;getTodos&lt;/code&gt; or &lt;code&gt;setTodos&lt;/code&gt;, and &lt;code&gt;PluginUI&lt;/code&gt; just function like a url router.&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;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PluginUI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HttpResponse&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;doDynamic&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;StaplerRequest&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;request&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;nc&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getRequestParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&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;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;get-todos&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getTodos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;set-todos&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setTodos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&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&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;data-persistence&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#data-persistence&quot; /&gt;Data Persistence&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can save your data with a descriptor&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;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@Extension&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PluginConfig&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Descriptor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;PluginConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Describable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;PluginConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;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;And after each time you change data, call &lt;code&gt;save()&lt;/code&gt; to persist them.&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;java&quot;&gt;    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setTodos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;nd&quot;&gt;@CheckForNull&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Todo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&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;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;todos&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;save&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;And in your handler, you can get the config class by calling&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;java&quot;&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ExtensionList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;lookup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;PluginConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&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;customize-your-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#customize-your-plugin&quot; /&gt;Customize your plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;be-sure-to-modify-all-the-occurrence-of-react-template&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#be-sure-to-modify-all-the-occurrence-of-react-template&quot; /&gt;Be sure to modify all the occurrence of &lt;code&gt;react-template&lt;/code&gt;&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;At &lt;code&gt;org/jenkinsci/plugins/reactplugintemplate/PluginUI/index.jelly&lt;/code&gt; , change the iframe’s id and its source url.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At &lt;code&gt;src/main/react/app/utils/urlConfig.js&lt;/code&gt; change&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At &lt;code&gt;src/main/react/server/config.js&lt;/code&gt; , change the proxy route.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At &lt;code&gt;src/main/react/package.json&lt;/code&gt; , change the start script’s BASE_URL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At &lt;code&gt;pom.xml&lt;/code&gt; , change the artifactId&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At &lt;code&gt;org/jenkinsci/plugins/reactplugintemplate/PluginManagementLink.java&lt;/code&gt; , change names.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also use the &lt;code&gt;same value&lt;/code&gt; to modify the occurrence in &lt;code&gt;src\main\react\app\utils\urlConfig.js&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;customize-a-page-for-your-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#customize-a-page-for-your-plugin&quot; /&gt;Customize a page for your plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A management Link is recommended, which would get your plugin a standalone page, along with a entry button in the &lt;code&gt;/manage&lt;/code&gt; system manage page.&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/react-plugin-template/management-link.jpg&quot; alt=&quot;management link&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-does-this-template-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-does-this-template-work&quot; /&gt;How does this template work?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This template is putting a webpack project inside a Maven project, and this template is just chaining the build result by copy the webpack output to the plugin’s webapp folder to make it accessible from the iframe, then Jelly render the iframe and the client gets the Plugin UI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-iframe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-iframe&quot; /&gt;Why iframe?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over time, Jenkins has added a lot of various javascript libraries to every regular page, which now causes problems for using modern Javascript tooling and as such, we decided to inline the new react based pages in their own sandbox which prevents collisions with other libraries, and maybe the iframe is a good sandbox case.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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://github.com/jenkinsci/react-plugin-template&quot;&gt;Github: React Plugin Template&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/working-hours-plugin&quot;&gt;Github: Working Hours Plugin&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/08/22/devops-world/</id>
<title>My DevOps World - Jenkins World 2019 Experience</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-08-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/08/22/devops-world/" />
<author>
<name>stopalopa</name>
</author>
<category term='pluginmanagement'></category>
<category term='devopsworld2019'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<category term='community'></category>
<category term='events'></category>
<summary>
Last week I had the privilege of attending DevOps World - Jenkins World in San
Francisco to present my Google Summer of Code project for plugin management. It was
an amazing experience getting to meet people from all over world who are trying
to make the development and release process easier and more efficient. I enjoyed
learning more about industry tools, processes, and standards, and meeting CI/CD
experts and contributors in the open source community.


Below is a summary of my experience. Thank you to the Jenkins project and CloudBees for making
 my trip and attendance possible!


Day 1

Monday was the Continuous Delivery Contributor Summit, which focused...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week I had the privilege of attending &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;DevOps World - Jenkins World in San
Francisco&lt;/a&gt; to present &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/plugin-installation-manager-tool-cli&quot;&gt;my Google Summer of Code project&lt;/a&gt; for plugin management. It was
an amazing experience getting to meet people from all over world who are trying
to make the development and release process easier and more efficient. I enjoyed
learning more about industry tools, processes, and standards, and meeting CI/CD
experts and contributors in the open source community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below is a summary of my experience. Thank you to the Jenkins project and CloudBees for making
 my trip and attendance possible!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;day-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-1&quot; /&gt;Day 1&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Monday was the Continuous Delivery Contributor Summit, which focused on projects
under the CDF umbrella.  After checking in and grabbing my badge, I was able to
meet up with some of the Google Summer of Code org admins. It was great
being able to actually meet them in person after talking to them over video
conferencing and chats all summer!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/speakerbadge.jpg&quot; alt=&quot;Speaker Badge&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tracy Miranda started the summit out by introducing the &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation&lt;/a&gt;,
which aims to provide a vendor neutral home to help and sustain open source projects
focusing on all aspects of continuous delivery.  Currently, Jenkins, Tekton, Spinnaker,
and JenkinsX have joined the foundation.  Project updates were given for Jenkins,
Tekton, and JenkinsX.  In the afternoon, attendees split into different groups for
unconference sessions.  I presented my project to the Jenkins group.  Afterwards,
there was free time to chat with other attendees about my project and the other Jenkins
projects. Lastly, lightning talks were given before everyone headed to the contributor
appreciation event to grab some food and drinks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/contributorsummit.jpg&quot; alt=&quot;Contributor Summit&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;day-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-2&quot; /&gt;Day 2&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I attended the Jenkins Pipeline Fundamentals Short Course in the morning. Even
though I’m working on a project for Jenkins, there’s still a lot I don’t know so
I just wanted to try to learn more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/pipeline.jpg&quot; alt=&quot;Jenkins Pipeline Basics Session&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A lot of the afternoon sessions filled up, so I spent the afternoon trying to meet
other people at the conference, before heading to the keynote. The keynote
talked more about the CDF and some of the backstory behind its origin.  This year is also a big anniversary for Jenkins - it has now been
around for 15 years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/cdfkeynote.jpg&quot; alt=&quot;CDF Key Note&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/cdforigin.jpg&quot; alt=&quot;CDF Origin&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the keynote, I checked out a Women in Tech mixer and
the opening of the exhibition hall. Probably my favorite swag I picked up was the
&quot;Will Code for Beer&quot; stickers and a bottle of hot sauce.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/jenkinssticker.jpg&quot; alt=&quot;Jenkins Sticker&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/willcodeforbeer.jpg&quot; alt=&quot;Will Code for Beer Sticker&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;day-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-3&quot; /&gt;Day 3&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The morning began with another keynote. Shawn Ahmed of CloudBees talked about the
challenges of visibility into bottlenecks of the development process and Rajeev Mahajan
discussed how HSBC tackled DevOps.  The rest of the day I attended different sessions
on container tooling, implementing CI/CD in a cloud native environment, running
Jenkins on Jenkins, and database DevOps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/kubernetes.jpg&quot; alt=&quot;Session on Containers&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the sessions finished, I wandered
around the expo until it closed, then joined some of the other conference attendees
to have some fun at a ping pong bar nearby.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;day-4&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-4&quot; /&gt;Day 4&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final and last day of the conference was probably my favorite.  The morning
keynote revealed that &lt;a href=&quot;https://github.com/LinuxSuRen&quot;&gt;Zhao Xiaojie&lt;/a&gt; had won an award for his work on Jenkins advocacy,
some other DevOps award panelists talked about their approaches to different challenges,
then David Stanke gave an enjoyable presentation about cloud native CI/CD. I was
able to present my summer project and attend a few more sessions, including one
about DevOps at scale, and another about use cases for machine learning in CI/CD pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/presentation.jpg&quot; alt=&quot;Plugin Management Tool Presentation&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last keynote given by James Governor was a thoughtful look into the current and
future states of tech. How does tech look like it will scale in the coming years
in the U.S. and across the world? How can we make tech more inclusive and accessible?
What can we do to minimize our environmental footprint?  In particular, his points
on welcoming people from a non-traditional computer science background resonated with
me since I’m currently undergoing my own career transition to tech.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the conference ended, I said goodbye to the remaining GSoC org admins before
meeting an old friend for dinner and bringing along some new friends I met at the
conference.  I spent the remaining part of the night singing karaoke with
them before heading out of San Francisco the next morning.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-plugin-management-tool/orgadmins.jpg&quot; alt=&quot;GSoC Mentors&quot; height=&quot;500&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks again to everyone who supported me and encouraged me leading up to and during
my presentation, patiently answered my questions as I tried to gather more context
about CI/CD tools and practices, and made my first DevOps conference so enjoyable!&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/08/19/remoting-kafka-kubernetes-release-2/</id>
<title>Remoting over Apache Kafka 2.0: Built-in Kubernetes support</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-08-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/08/19/remoting-kafka-kubernetes-release-2/" />
<author>
<name>longnguyen</name>
</author>
<category term='remoting'></category>
<category term='kafka'></category>
<category term='kubernetes'></category>
<category term='helm'></category>
<category term='plugin'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
I am Long Nguyen from FPT University, Vietnam. My project for Google Summer of Code 2019 is Remoting over Apache Kafka with Kubernetes features. After a successful Phase 1, finally the 2.0 version of the plugin has been released. The 2.0 version provides seamless integration with Kubernetes environment.


2.0 version features




Start a simple Apache Kafka server in Kubernetes.


Dynamically provision Remoting Kafka Agent in Kubernetes.


Helm chart to bootstrap the whole system in Kubernetes.






Start a simple Apache Kafka server in Kubernetes


Use of the plugin requires that users have a configured Apache Zookeeper and Apache Kafka server, which could be intimidating for people who...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am Long Nguyen from &lt;a href=&quot;https://international.fpt.edu.vn/&quot;&gt;FPT University&lt;/a&gt;, Vietnam. My project for Google Summer of Code 2019 is &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/remoting-over-apache-kafka-docker-k8s-features/&quot;&gt;Remoting over Apache Kafka with Kubernetes features&lt;/a&gt;. After a successful &lt;a href=&quot;https://www.jenkins.io/blog/2019/07/11/remoting-kafka-kubernetes-phase-1/&quot;&gt;Phase 1&lt;/a&gt;, finally the 2.0 version of the plugin has been released. The 2.0 version provides seamless integration with Kubernetes environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;2-0-version-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-0-version-features&quot; /&gt;2.0 version features&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;Start a simple Apache Kafka server in Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dynamically provision Remoting Kafka Agent in Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Helm chart to bootstrap the whole system in Kubernetes.&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;start-a-simple-apache-kafka-server-in-kubernetes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#start-a-simple-apache-kafka-server-in-kubernetes&quot; /&gt;Start a simple Apache Kafka server in Kubernetes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Use of the plugin requires that users have a configured Apache Zookeeper and Apache Kafka server, which could be intimidating for people who just want to try out the plugin. Now, users can start a simple, single-node Apache Kafka server in Kubernetes environment with just one button click.&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/remoting-kafka/kafka-provisioning-kubernetes-ui.png&quot; alt=&quot;Apache Kafka provisioning in Kubernetes UI&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the Global Configuration page, users can input Kubernetes server information and credentials. When users click &lt;code&gt;Start Kafka on Kubernetes&lt;/code&gt; button, Jenkins will create a Kubernetes client from the information and then apply Apache Zookeeper and Apache Kafka YAML specification files from &lt;code&gt;resources&lt;/code&gt;. After downloading images and creating containers, it will automatically update Apache Zookeeper and Apache Kafka URLs into respective fields.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;dynamically-provision-remoting-kafka-agent-in-kubernetes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dynamically-provision-remoting-kafka-agent-in-kubernetes&quot; /&gt;Dynamically provision Remoting Kafka Agent in Kubernetes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With previous version, users have to manually add/remove nodes so it is hard to scale builds quickly. &lt;a href=&quot;https://plugins.jenkins.io/kubernetes&quot;&gt;Kubernetes plugin&lt;/a&gt; allows us to dynamically provision agents in Kubernetes but it is designed for JNLP agent. With this new version, Remoting Kafka agent can also be provisioned automatically in Kubernetes environment.&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/remoting-kafka/cloud-ui.png&quot; alt=&quot;Remoting Kafka Cloud UI&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users can find the new feature in Cloud section in &lt;code&gt;/configure&lt;/code&gt;. Here users could input Kubernetes connection parameters and desired Remoting Kafka agent properties including labels. When new build with matching labels gets started and there are no free nodes, Cloud will automatically provision Remoting Kafka agent pod in Kubernetes to run the build.&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/remoting-kafka/cloud-nodes.png&quot; alt=&quot;Remoting Kafka Agent get provisioned&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;helm-chart&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#helm-chart&quot; /&gt;Helm Chart&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Helm chart for Remoting over Apache Kafka plugin is based on &lt;a href=&quot;https://github.com/helm/charts/tree/master/stable/jenkins&quot;&gt;stable/jenkins&lt;/a&gt; chart and &lt;a href=&quot;https://github.com/helm/charts/tree/master/incubator/kafka&quot;&gt;incubator/kafka&lt;/a&gt; chart. You can follow the instruction &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin/blob/master/README.md&quot;&gt;here&lt;/a&gt; to install a demo ready-to-use Helm release. Your &lt;code&gt;kubectl get all&lt;/code&gt; should look like 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;bash&quot;&gt;NAME                                READY   STATUS    RESTARTS   AGE
pod/demo-jenkins-64dbd87987-bmndf   1/1     Running   0          2m21s
pod/demo-kafka-0                    1/1     Running   0          2m21s
pod/demo-zookeeper-0                1/1     Running   0          2m21s

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;S&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;                      AGE
service/demo-jenkins              NodePort    10.108.238.56   &amp;lt;none&amp;gt;        8080:30386/TCP               2m21s
service/demo-jenkins-agent        ClusterIP   10.98.85.184    &amp;lt;none&amp;gt;        50000/TCP                    2m21s
service/demo-kafka                ClusterIP   10.109.231.58   &amp;lt;none&amp;gt;        9092/TCP                     2m21s
service/demo-kafka-headless       ClusterIP   None            &amp;lt;none&amp;gt;        9092/TCP                     2m21s
service/demo-zookeeper            ClusterIP   10.103.2.231    &amp;lt;none&amp;gt;        2181/TCP                     2m21s
service/demo-zookeeper-headless   ClusterIP   None            &amp;lt;none&amp;gt;        2181/TCP,3888/TCP,2888/TCP   2m21s

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/demo-jenkins   1/1     1            1           2m21s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/demo-jenkins-64dbd87987   1         1         1       2m21s

NAME                              READY   AGE
statefulset.apps/demo-kafka       1/1     2m21s
statefulset.apps/demo-zookeeper   1/1     2m21s&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;how-to-contribute&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-contribute&quot; /&gt;How to Contribute&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You are welcome to try out the plugin and integrate it into your current setup. If you find out any bug or if you would like to request new feature, you can create ticket at &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project+%3D+JENKINS+AND+component+%3D+remoting-kafka-plugin&quot;&gt;JIRA&lt;/a&gt;. If you would like to contribute code directly, you can create pull requests in the GitHub page below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://youtu.be/tnoObQqGhyM?t=2368&quot;&gt;Phase 2 Demo Video&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1BN2lUcI5UweN2pumAu2m4XHIVXQw6ujzeO9Fbage3ys/edit?usp=sharing&quot;&gt;Phase 2 Presentation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2019/07/11/remoting-kafka-kubernetes-phase-1/&quot;&gt;Phase 1 Blog Post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/MDs0Vr7gnnA?t=2601&quot;&gt;Phase 1 Demo Video&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1yIPwwL7P051XaSE2EOJYAtbVsd6YvGvvKp9QcJE4J1Y/edit?usp=sharing&quot;&gt;Phase 1 Presentation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;Remoting over Apache Kafka plugin source code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/remoting-over-apache-kafka-docker-k8s-features/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_remoting:gitter.im&quot;&gt;Gitter Channel&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/2019/08/16/folder-auth-plugin/</id>
<title>Introducing new Folder Authorization Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-08-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/08/16/folder-auth-plugin/" />
<author>
<name>abhyudayasharma</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<category term='performance'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
During my Google Summer of Code Project,
I have created the brand new Folder Auth Plugin for easily
managing permissions to projects organized in folders from the Folders plugin.
This new plugin is designed for fast permission checks with easy-to-manage roles.
The 1.0 version of the plugin has just been released and can be downloaded
from your Jenkins' Update center.


This plugin was inspired by the Role Strategy Plugin
and brings about performance improvements and makes managing roles much easier.
The plugin was developed to overcome performance limitations of the Role Strategy
plugin on a large number of roles. At the same time, the plugin addresses one
of the most...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During my &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/role-strategy-performance&quot;&gt;Google Summer of Code Project&lt;/a&gt;,
I have created the brand new &lt;a href=&quot;https://plugins.jenkins.io/folder-auth&quot;&gt;Folder Auth Plugin&lt;/a&gt; for easily
managing permissions to projects organized in folders from the &lt;a href=&quot;https://plugins.jenkins.io/cloudbees-folder&quot;&gt;Folders plugin&lt;/a&gt;.
This new plugin is designed for fast permission checks with easy-to-manage roles.
The 1.0 version of the plugin has just been released and can be downloaded
from your Jenkins&#39; Update center.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin was inspired by the &lt;a href=&quot;https://plugins.jenkins.io/role-strategy&quot;&gt;Role Strategy Plugin&lt;/a&gt;
and brings about performance improvements and makes managing roles much easier.
The plugin was developed to overcome performance limitations of the Role Strategy
plugin on a large number of roles. At the same time, the plugin addresses one
of the most popular ways of organizing projects in Jenkins, through folders.
The plugin also has a new UI with more improvements to come in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin supports three types of roles which are applicable at different places
in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Global Roles: applicable everywhere in Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agent Roles: restrict permissions for multiple agents connected to your instance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Folder Roles: applicable to multiple jobs organized inside folders&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/gsoc-folder-auth-plugin/folder-auth.png&quot; alt=&quot;Screenshot of the Folder Auth Plugin&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;performance-improvements-over-role-strategy-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#performance-improvements-over-role-strategy-plugin&quot; /&gt;Performance Improvements over Role Strategy Plugin&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin, unlike the Role Strategy plugin, does not use regular expressions
for finding matching projects and agents giving us performance improvements
and makes administrators&#39; lives easier. To reduce the number of roles required
to be managed, permissions given to a folder through a folder role get inherited
to all of its children. This is useful for giving access to multiple projects
through a single role. Similarly, an agent role can be applied to multiple agents
and assigned to multiple users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin is designed to outperform Role Strategy Plugin in permission
checks. The improvements were measured using the
&lt;a href=&quot;https://www.jenkins.io/blog/2019/06/21/performance-testing-jenkins/&quot;&gt;micro-benchmark framework&lt;/a&gt;
I had created during the first phase of my GSoC project.
Benchmarks for identical configurations for both plugin show that the
permissions check are up to 934x faster for 500 global roles when compared to
the global roles from the Role Strategy 2.13, which in itself contains several
performance improvements. Comparing folder roles with Role Strategy’s project
roles, a permission check for access to a job almost 15x faster for 250 projects
organized in two-level deep folders on an instance with 150 users. You can see
the benchmarks and the result comparisons
&lt;a href=&quot;https://github.com/jenkinsci/folder-auth-plugin/pull/13&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jenkins-configuration-as-code-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-configuration-as-code-support&quot; /&gt;Jenkins Configuration as Code Support&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin supports Jenkins Configuration-as-Code so you can configure permissions
without going through the Web UI. A YAML configuration looks like 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;na&quot;&gt;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;authorizationStrategy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;folderBased&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;globalRoles&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;name&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;admin&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;permissions&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;hudson.model.Hudson.Administer&quot;&lt;/span&gt;
              &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;sids&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;admin&quot;&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&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;read&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;permissions&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;hudson.model.Hudson.Read&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;sids&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;user1&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;folderRoles&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;folders&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;root&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;name&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;viewRoot&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;permissions&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;hudson.model.Item.Read&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;sids&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;user1&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;agentRoles&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;agents&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;agent1&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;name&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;agentRole1&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;permissions&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;hudson.model.Computer.Configure&quot;&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;hudson.model.Computer.Disconnect&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;sids&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;user1&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;rest-apis-with-swagger-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#rest-apis-with-swagger-support&quot; /&gt;REST APIs with Swagger support&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin provides REST APIs for managing roles with OpenAPI specifications
through Swagger.json. You can check out the Swagger API on
&lt;a href=&quot;https://app.swaggerhub.com/apis/abhyudaya/folder-auth/1.0.0s&quot;&gt;SwaggerHub&lt;/a&gt;.
SwaggerHub provides stubs in multiple languages which can be downloaded and
used to interact with the plugin. You can also see some sample requests from
the command line using &lt;a href=&quot;https://curl.haxx.se/&quot;&gt;curl&lt;/a&gt;.&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/gsoc-folder-auth-plugin/swagger.png&quot; alt=&quot;Screenshot of the APIs on SwaggerHub&quot; height=&quot;500&quot;&gt;
&lt;/img&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/gsoc-folder-auth-plugin/swagger2.png&quot; alt=&quot;Another Screenshot of the APIs on SwaggerHub&quot; height=&quot;400&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s next&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the (not-too-distant) future, I would like to work on improving the UI and
make the plugin easier to work with. I would also like to work on improving the
APIs, documentation and more optimizations for improving the plugin’s performance.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links-and-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links-and-feedback&quot; /&gt;Links and Feedback&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would love to hear your comments and suggestions. Please feel free to reach
out to me through either the
link:https://app.gitter.im/#/room/#jenkinsci_role-strategy-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Role Strategy Plugin Gitter chat&lt;/a&gt; or through
&lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins Developer Mailing list&lt;/a&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://drive.google.com/file/d/1IVe3T8WdTILmb62PAIJveR4KbBWzPt1k/view?usp=sharing&quot;&gt;Presentation slides for second phase evaluations&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/folder-auth-plugin/blob/master/README.md&quot;&gt;Documentation for the Folder Auth Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tAUHfYYQrpo&quot;&gt;Demo of the Folder Authorization plugin&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/2019/07/30/plugin-management-tool-phase2-updates/</id>
<title>Plugin Management Library and CLI Tool Phase 2 GSoC Updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-07-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/07/30/plugin-management-tool-phase2-updates/" />
<author>
<name>stopalopa</name>
</author>
<category term='plugins'></category>
<category term='pluginmanagement'></category>
<category term='platform-sig'></category>
<category term='cli'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
At end of the first GSoC phase, I
announced
the first alpha release of the CLI tool and library that will help centralize
plugin management and make plugin tooling easier.


Phase 2 has mainly been focused on improving upon the initial CLI and library written
in Coding Phase 1. In particular, we&#8217;ve been focusing on getting the tool ready to
incorporate into the Jenkins Docker Image to replace the
install-plugins.sh bash script
to download plugins.  This work included parsing improvements so that blank lines and comments in the
plugins.txt file are filtered out, allowing update centers and the plugin download
directory to be set via environment variables or CLI...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At end of the first &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;GSoC&lt;/a&gt; phase, I
&lt;a href=&quot;https://www.jenkins.io/blog/2019/07/02/plugin-management-tool-alpha-release/&quot;&gt;announced
the first alpha release&lt;/a&gt; of the CLI tool and library that will help centralize
plugin management and make plugin tooling easier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Phase 2 has mainly been focused on improving upon the initial CLI and library written
in Coding Phase 1. In particular, we’ve been focusing on getting the tool ready to
incorporate into the Jenkins Docker Image to replace the
&lt;a href=&quot;https://github.com/jenkinsci/docker/blob/master/install-plugins.sh&quot;&gt;install-plugins.sh bash script&lt;/a&gt;
to download plugins.  This work included parsing improvements so that blank lines and comments in the
plugins.txt file are filtered out, allowing update centers and the plugin download
directory to be set via environment variables or CLI Options, creating Windows
compatible defaults, and fixing a bug in which dependencies for specific
plugin versions were not always getting resolved correctly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In parallel to getting the tool ready for Jenkins Docker integration, Phase 2 saw
the addition of several new features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;yaml-input&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yaml-input&quot; /&gt;Yaml Input&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to specifying the plugins they want to download via the &lt;code&gt;--plugins&lt;/code&gt;
CLI option or through a .txt file, users can now use a Jenkins yaml file with a
&lt;code&gt;plugins&lt;/code&gt; root element.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Say goodbye to the days of specifying incremental
plugins like &lt;code&gt;incrementals;org.jenkins-ci.plugins.workflow;2.20-rc530.b4f7f7869384&lt;/code&gt; -
  you can enter the artifactId, groupId, and version to specify an incremental plugin.&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/gsoc-plugin-management-tool/yamlexample.png&quot; alt=&quot;Yaml Input Example&quot;&gt;
&lt;/img&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/gsoc-plugin-management-tool/yamlcli.png&quot; alt=&quot;Yaml CLI Example&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;making-the-download-process-more-transparent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#making-the-download-process-more-transparent&quot; /&gt;Making the Download Process More Transparent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously, the plugin download process was not very transparent to users - it was
difficult to know the final set of plugins that would be downloaded after pulling in
all the dependencies.  Instead of determining the set of plugins that will be downloaded
at the time of download, users now have the option to see the full set of plugins
and their versions that will be downloaded in advance. With the &lt;code&gt;--list&lt;/code&gt; CLI
option, users can see all currently downloaded and bundled plugins, the set of all
plugins that will be downloaded, and the effective plugin set - the set of all
plugins that are already downloaded or will be downloaded.&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/gsoc-plugin-management-tool/listplugins.png&quot; alt=&quot;List CLI Option Example&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;viewing-information-about-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#viewing-information-about-plugins&quot; /&gt;Viewing Information About plugins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that you know which plugins will be downloaded, wouldn’t it be nice to know
if these are the latest versions or if any of the versions you want to install have
security warnings?  You can do that now too.&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/gsoc-plugin-management-tool/securitywarnings.png&quot; alt=&quot;Security Warning CLI Option Example&quot;&gt;
&lt;/img&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/gsoc-plugin-management-tool/available-updates.png&quot; alt=&quot;Security Warning CLI Option Example&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;next-steps-and-additional-information&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-steps-and-additional-information&quot; /&gt;Next Steps and Additional Information&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The updates mentioned in this blog will be released soon so you can try them out.
The focus of Phase 3 will be to continue to iterate upon and improve the library
and CLI. We hope to release a first version and submit a pull request to Jenkins Docker soon.
Thanks to everyone who has already tried it out and given feedback! I will also be
presenting my work at &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;DevOps World&lt;/a&gt;
in San Francisco in a few weeks.  You can use the code PREVIEW for a discounted registration
($799 instead of $1,499).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to reach out through
the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_plugin-installation-manager-cli-tool:gitter.im&quot;&gt;Plugin Installation Manager CLI Tool Gitter chat&lt;/a&gt; or through
the &lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins Developer Mailing list&lt;/a&gt;. I would love to get your questions, comments, and feedback!
We have meetings Tuesdays and Thursdays at 6PM UTC.&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://docs.google.com/presentation/d/1wsM09IGgoA7gSsA9tW5fHlFAhl6B9fXlr-4iEP89SCk/edit?usp=sharing&quot;&gt;Phase 2 Presentation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/HlENuZZq7zc?t=221&quot;&gt;Phase 2 Recorded Demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/58199?jql=project%20%3D%20JENKINS%20AND%20component%20%3D%20plugin-installation-manager-tool&quot;&gt;Jira Issue Search&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/plugin-installation-manager-tool&quot;&gt;Repository&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/2019/07/25/azure-artifact-manager/</id>
<title>Managing Jenkins Artifacts with the Azure Artifact Manager Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-07-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/07/25/azure-artifact-manager/" />
<author>
<name>jshen</name>
</author>
<category term='general'></category>
<category term='azure'></category>
<category term='plugin'></category>
<summary>
Jenkins stores all generated artifacts on the controller server filesystem. This presents a couple of challenges especially when you try to run Jenkins in the cloud:




As the number of artifacts grow, your Jenkins controller will run out of disk space. Eventually, performance can be impacted.


Frequent transfer of files between agents and controller may cause load, CPU or network issues which are always hard to diagnose.




Several existing plugins allow you to manage your artifacts externally. To use these plugins, you need to know how they work and perform specific steps in your job&#8217;s configuration. And if you are new to Jenkins,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins stores all generated artifacts on the controller server filesystem. This presents a couple of challenges especially when you try to run Jenkins in the cloud:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;As the number of artifacts grow, your Jenkins controller will run out of disk space. Eventually, performance can be impacted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Frequent transfer of files between agents and controller may cause load, CPU or network issues which are always hard to diagnose.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several existing plugins allow you to manage your artifacts externally. To use these plugins, you need to know how they work and perform specific steps in your job’s configuration. And if you are new to Jenkins, you may find it hard to follow existing samples in Jenkins tutorial like &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/tour/tests-and-artifacts/&quot;&gt;Recording tests and artifacts&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, if you are running Jenkins in Azure, you can consider automatically managing new artifacts on &lt;a href=&quot;https://azure.microsoft.com/en-us/services/storage/&quot;&gt;Azure Storage&lt;/a&gt;. The new &lt;a href=&quot;https://plugins.jenkins.io/azure-artifact-manager&quot;&gt;Azure Artifact Management plugin&lt;/a&gt; allows you to store artifacts in Azure blob storage and simplify your existing Jenkins jobs that contain Jenkins general artifacts management steps. This approach will give you all the advantages of a cloud storage, with less effort on your part to maintain your Jenkins instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration&quot; /&gt;Configuration&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;azure-storage-account&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#azure-storage-account&quot; /&gt;Azure storage account&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, you need to have an Azure Storage account. You can skip this section if you already have one. Otherwise, create an Azure storage account for storing your artifacts. Follow this &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/storage/common/storage-quickstart-create-account?tabs=azure-portal&quot;&gt;tutorial&lt;/a&gt; to quickly create one. Then navigate to &lt;strong&gt;Access keys&lt;/strong&gt; in the &lt;strong&gt;Settings&lt;/strong&gt; section to get the storage account name and one of its keys.&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/2019-07-25-azure-artifact-manager/1-azure-accesskey.png&quot; alt=&quot;1 azure accesskey&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;existing-jenkins-instance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#existing-jenkins-instance&quot; /&gt;Existing Jenkins instance&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For existing Jenkins instance, make sure you install the &lt;a href=&quot;https://plugins.jenkins.io/azure-artifact-manager&quot;&gt;Azure Artifact Manager&lt;/a&gt; plugin. Then you can go to your Jenkins &lt;em&gt;System Configuration&lt;/em&gt; page and locate the &lt;em&gt;Artifact Management for Builds&lt;/em&gt; section. Select the &lt;strong&gt;Add&lt;/strong&gt; button to configure an Azure Artifact Storage. Fill in the following parameters:&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;Storage Type:&lt;/strong&gt; Azure storage supports several storage types like blob, file, queue etc. This plugin currently supports blob storage only.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage Credentials:&lt;/strong&gt; Credentials used to authenticate with Azure storage. If you do not have an existing Azure storage credential in you Jenkins credential store, click the &lt;strong&gt;Add&lt;/strong&gt; button and choose &lt;strong&gt;Microsoft Azure Storage&lt;/strong&gt; kind to create one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure Container Name:&lt;/strong&gt; The container under which to keep your artifacts. If the container name does not exist in the blob, this plugin automatically creates one for you when artifacts are uploaded to the blob.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Base Prefix:&lt;/strong&gt; Prefix added to your artifact paths stored in your container, a forward slash will be parsed as a folder. In the following screenshot, all your artifacts will be stored in the “staging” folder in the container “Jenkins”.&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/2019-07-25-azure-artifact-manager/2.configuration.png&quot; alt=&quot;2.configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-jenkins-instance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-jenkins-instance&quot; /&gt;New Jenkins instance&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you need to create a new Jenkins controller, follow this &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/jenkins/install-jenkins-solution-template&quot;&gt;tutorial&lt;/a&gt; to quickly create an Jenkins instance on Azure. In the &lt;strong&gt;Integration Settings&lt;/strong&gt; section, you can now set up Azure Artifact Manager directly. Note that you can change any of the configuration after your Jenkins instance is created. Azure storage account and credential, in this case, are still prerequisites.&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/2019-07-25-azure-artifact-manager/3.integration-setting-azure.png&quot; alt=&quot;3.integration setting azure&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;usage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#usage&quot; /&gt;Usage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-pipeline&quot; /&gt;Jenkins Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are a few commonly used artifact related steps in pipeline jobs; all are supported to push artifacts to the Azure Storage blob specified.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use &lt;em&gt;archiveArtifacts&lt;/em&gt; step to archive target artifacts into Azure storage. For more details about &lt;em&gt;archiveArtifacts&lt;/em&gt; step, see the Jenkins &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/core/#archiveartifacts-archive-the-artifacts&quot;&gt;archiveArtifacts step documentation&lt;/a&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;nowrap&quot;&gt;node {
  //...
  stage(&#39;Archive&#39;) {
    archiveArtifacts &quot;pattern&quot;
  }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use the &lt;em&gt;unarchive&lt;/em&gt; step to retrieve the artifacts from Azure storage. For more details about &lt;em&gt;unarchive&lt;/em&gt; step, please see &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/#unarchive-copy-archived-artifacts-into-the-workspace&quot;&gt;unarchive step documentation&lt;/a&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;nowrap&quot;&gt;node {
  //...
  stage(&#39;Unarchive&#39;) {
    unarchive mapping: [&quot;pattern&quot;: &#39;.&#39;]
  }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To save a set of files so that you can use them later in the same build (generally on another node or workspace), you can use &lt;em&gt;stash&lt;/em&gt; step to store files into Azure storage for later use. &lt;em&gt;Stash&lt;/em&gt; step documentation can be found &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/#unstash-restore-files-previously-stashed&quot;&gt;here&lt;/a&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;nowrap&quot;&gt;node {
  //...
  stash name: &#39;name&#39;, includes: &#39;*&#39;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use &lt;em&gt;unstash&lt;/em&gt; step to retrieve the files saved with &lt;em&gt;stash&lt;/em&gt; step from Azure storage to the local workspace.  &lt;em&gt;Unstash&lt;/em&gt; documentation can be found &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/#unstash-restore-files-previously-stashed&quot;&gt;here&lt;/a&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;nowrap&quot;&gt;node {
  //...
  unstash &#39;name&#39;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;freestyle-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#freestyle-job&quot; /&gt;FreeStyle Job&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a FreeStyle Jenkins job, you can use &lt;strong&gt;Archive the artifacts&lt;/strong&gt; step in &lt;strong&gt;Post-build Actions&lt;/strong&gt; to upload the target artifacts into Azure storage.&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/2019-07-25-azure-artifact-manager/4.post-build-actions.png&quot; alt=&quot;4.post build actions&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This Azure Artifact Manager plugin is also compatible with some other popular management plugins, such as the &lt;a href=&quot;https://plugins.jenkins.io/copyartifact&quot;&gt;Copy Artifact&lt;/a&gt; plugin. You can still use these plugins without changing anything.&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/2019-07-25-azure-artifact-manager/5-build.png&quot; alt=&quot;5 build&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;troubleshooting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#troubleshooting&quot; /&gt;Troubleshooting&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any problems or suggestions when using Azure Artifact Manager plugin, you can file a ticket on &lt;a href=&quot;https://issues.jenkins.io/secure/Dashboard.jspa&quot;&gt;Jenkins JIRA&lt;/a&gt; for the azure-artifact-manager-plugin component.&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;The &lt;a href=&quot;https://plugins.jenkins.io/azure-artifact-manager&quot;&gt;Azure Artifact Manager&lt;/a&gt; enables a more cloud-native Jenkins. This is the first step in the &lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native/&quot;&gt;Cloud Native project&lt;/a&gt;. We have a long way to go to get Jenkins to run on cloud environments as a true “Cloud Native” application. We need help and welcome your participation and contributions to make Jenkins better. Please start contributing and/or give us feedback!&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/2019/07/21/Jenkins-code-coverage-diff-for-pull-request/</id>
<title>Jenkins code coverage diff in pull requests</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-07-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/07/21/Jenkins-code-coverage-diff-for-pull-request/" />
<author>
<name>asavanchuk</name>
</author>
<category term='plugins'></category>
<category term='codecoverage'></category>
<summary>
Hello.


As you may know, during the last year GSoC Mr. Shenyu Zheng was working on the Jenkins Code Coverage API Plugin. With Mr. Zheng we made a change so the plugin now is able to check the difference in code coverage between pull requests and target branches.


In lots of projects it is a common practice to track if unit tests code coverage doesn&#8217;t decrease. So, with this plugin, you may skip separate services that track code coverage and have this feature right in your favorite CI system.


How it works


When you build a PR in Jenkins, using plugins like Github or...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you may know, during the last year GSoC &lt;a href=&quot;https://github.com/cizezsy&quot;&gt;Mr. Shenyu Zheng&lt;/a&gt; was working on the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/code-coverage-api-plugin/&quot;&gt;Jenkins Code Coverage API Plugin&lt;/a&gt;. With Mr. Zheng we made a change so the plugin now is able to check the difference in code coverage between pull requests and target branches.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In lots of projects it is a common practice to track if unit tests code coverage doesn’t decrease. So, with this plugin, you may skip separate services that track code coverage and have this feature right in your favorite CI system.&lt;/p&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;paragraph&quot;&gt;
&lt;p&gt;When you build a PR in Jenkins, using plugins like &lt;a href=&quot;https://plugins.jenkins.io/github&quot;&gt;Github&lt;/a&gt; or &lt;a href=&quot;https://plugins.jenkins.io/cloudbees-bitbucket-branch-source&quot;&gt;Bitbucket Branch Source&lt;/a&gt;, that use &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/SCM+API+Plugin&quot;&gt;SCM API Plugin&lt;/a&gt;, your PR knows what target branch commit it is based on. (The commit may change because of &lt;em&gt;Discover pull requests from origin&lt;/em&gt; strategies). To calculate the diff, when you publish your coverage from PR, it looks for the target branch build for the commit that your PR was based on. If it finds the build on the target branch, it looks for any published code coverage for this target branch build. In case the build has it, the plugin calculates the percentage diff for the &lt;strong&gt;line coverage&lt;/strong&gt; and shows it on the pull request build page. Also, it gives you a link to the target branch build that was used for the comparison.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That it how it looks like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Decreased coverage&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2019-07-21-Jenkins-code-coverage-diff-for-pull-request/decrease.png&quot; alt=&quot;decrease&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Increased coverage&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2019-07-21-Jenkins-code-coverage-diff-for-pull-request/increase.png&quot; alt=&quot;increase&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;how-to-enable-code-coverage-diff-for-pull-requests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-enable-code-coverage-diff-for-pull-requests&quot; /&gt;How to enable code coverage diff for pull requests&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To enable this behavior you need to publish your code coverage with the &lt;code&gt;calculateDiffForChangeRequests&lt;/code&gt; flag equals &lt;code&gt;true&lt;/code&gt;, like this:
.Jenkinsfile&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;node&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;c1&quot;&gt;// Here we are using the istanbulCoberturaAdapter&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;publishCoverage&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;adapters:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;istanbulCoberturaAdapter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;cobertura-coverage.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;sourceFileResolver:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceFiles&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;NEVER_STORE&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;calculateDiffForChangeRequests:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;links-and-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links-and-feedback&quot; /&gt;Links and Feedback&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have some questions about this behavior, please ask me &lt;a href=&quot;mailto:dntsaygoodbye@gmail.com&quot;&gt;in email&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You are free to contribute to this plugin to make it better for everyone. There are a lot of interesting features that can be added and issues that can be solved. Also, you can write some new plugins for other code coverage formats that use the Code Coverage API plugin as a base.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is the repo of the plugin - &lt;a href=&quot;https://github.com/jenkinsci/code-coverage-api-plugin&quot;&gt;Code Coverage API Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you.&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/2019/07/17/DevOps-World-Jenkins-World-2019-San-Francisco-Lunch-Demos/</id>
<title>DevOps World - Jenkins World 2019 San Francisco: Lunch Time Demos</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-07-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/07/17/DevOps-World-Jenkins-World-2019-San-Francisco-Lunch-Demos/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='devopsworldjenkinsworld2019'></category>
<summary>
If you’re looking for more opportunities to learn Jenkins and Jenkins X during the lunch hours while at DevOps World - Jenkins World 2019 San Francisco, come join us at the Jenkins and Jenkins X Community Booth!


If you don&#8217;t yet have your pass for DevOps World - Jenkins World 2019 San Francisco, and don&#8217;t want to miss out on the fun, you can get yours using JWFOSS for a 30% discount.


During lunch hours we are scheduling the following demo briefs at the Jenkins and Jenkins X Community Booth:


Wednesday  August 14, 2019

12:10 - 12:25pm 	Faster Git	Mark Waite

Attendees will learn the...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock center center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/dwjw-2019/2019-dwjw-email-san-fran-rev.png&quot; alt=&quot;2019 dwjw email san fran&quot; height=&quot;256&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re looking for more opportunities to learn Jenkins and Jenkins X during the lunch hours while at &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;&lt;strong&gt;DevOps World - Jenkins World 2019 San Francisco&lt;/strong&gt;&lt;/a&gt;, come join us at the Jenkins and Jenkins X Community Booth!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you don’t yet have your pass for &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;&lt;strong&gt;DevOps World - Jenkins World 2019 San Francisco&lt;/strong&gt;&lt;/a&gt;, and don’t want to miss out on the fun, you can get yours using &lt;strong&gt;JWFOSS&lt;/strong&gt; for a 30% discount.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During lunch hours we are scheduling the following demo briefs at the Jenkins and Jenkins X Community Booth:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;wednesday-august-14-2019&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#wednesday-august-14-2019&quot; /&gt;Wednesday  August 14, 2019&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1210-1225pm-faster-gitmark-waite&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1210-1225pm-faster-gitmark-waite&quot; /&gt;12:10 - 12:25pm 	Faster Git	&lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Attendees will learn the techniques they can use with Jenkins to make their systems clone and update git repositories faster and with less disc space.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1225-1240pmobservability-in-jenkins-xoscar-medina&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1225-1240pmobservability-in-jenkins-xoscar-medina&quot; /&gt;12:25 - 12:40pm	Observability in Jenkins X	&lt;a href=&quot;https://github.com/sharepointoscar&quot;&gt;Oscar Medina&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are using Jenkins X, you’re already building at rapid pace.  However, most miss the opportunity to gain real insights into their build and release pipeline.  I’ll show you how you can increase observability by activating metric capture and analysis during a containerized application deployment with Jenkins X.  This  entails modifying the declarative Tekton pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1240-1255pmfrom-setup-to-build-status-on-the-command-linemartin-danjou&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1240-1255pmfrom-setup-to-build-status-on-the-command-linemartin-danjou&quot; /&gt;12:40 - 12:55pm	From setup to build status on the command line	&lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using bash, groovy, &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;JCasC&lt;/a&gt; and the &lt;a href=&quot;https://github.com/cdancy/jenkins-rest&quot;&gt;jenkins-rest&lt;/a&gt;, we demonstrate how to setup Jenkins from scratch, upload a configuration as code yaml file, create folders and jobs, run a build, and track it to its completion, all from the command line, without ever touching the GUI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1255-110pmdevops-without-quality-an-it-horror-storylaura-keaton&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1255-110pmdevops-without-quality-an-it-horror-storylaura-keaton&quot; /&gt;12:55 - 1:10pm		DevOps without Quality: An IT Horror Story	Laura Keaton&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;DevOps, the current IT Industry sweetheart, has a dark secret that has victimized organizations on their transformational journey. Investigate two case studies that left development and delivery teams in tatters and how quality engineering solutions could have prevented their disastrous outcomes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;110-125pmsecuring-your-jenkins-container-pipeline-with-open-source-toolschristian-wiens&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#110-125pmsecuring-your-jenkins-container-pipeline-with-open-source-toolschristian-wiens&quot; /&gt;1:10 - 1:25pm	Securing Your Jenkins Container Pipeline with Open Source Tools	&lt;a href=&quot;https://github.com/cwiens1211&quot;&gt;Christian Wiens&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Discuss the security pitfalls of containers and how embedding an open source image scanning and policy based compliance tool like Anchore into your CI/CD pipeline can mitigate this risk.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;thursday-august-15-2019&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thursday-august-15-2019&quot; /&gt;Thursday  August 15, 2019&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1225-1235pmresults-from-the-2019-jenkins-google-summer-of-codemartin-danjou&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1225-1235pmresults-from-the-2019-jenkins-google-summer-of-codemartin-danjou&quot; /&gt;12:25 - 12:35pm	Results from the 2019 Jenkins Google Summer of Code	&lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2019, the Jenkins project participated in the Google Summer of Code. This is an annual, international, program which encourages college-aged students to participate in open source projects during the summer break between classes. In 2019, we had dozens of applications and many student projects. In this session, we will showcase the students&#39; projects and talk about what they bring to the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1235-1245pmplugin-installation-cli-toolnatasha-stopa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1235-1245pmplugin-installation-cli-toolnatasha-stopa&quot; /&gt;12:35 - 12:45pm		Plugin installation CLI Tool		&lt;a href=&quot;https://github.com/stopalopa&quot;&gt;Natasha Stopa&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This talk will demo the new plugin installation tool done as part of a Google Summer of Code project. It will show the CLI features and how the library has been incorporated into other areas of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1245-1255pmsysdig-secure-jenkins-pluginmarky-jackson&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1245-1255pmsysdig-secure-jenkins-pluginmarky-jackson&quot; /&gt;12:45 - 12:55pm		Sysdig Secure Jenkins Plugin		&lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky Jackson&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://sysdig.com/products/secure&quot;&gt;Sysdig Secure&lt;/a&gt; is a container security platform that brings together docker image scanning and run-time protection to identify vulnerabilities, block threats, enforce compliance, and audit activity across your microservices. The Sysdig Secure Jenkins plugin can be used in a Pipeline job, or added as a build step to a Freestyle job, to automate the process of running an image analysis, evaluating custom policies against images, and performing security scans.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1255-110pmusing-react-for-plugin-uijeff-pearce&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1255-110pmusing-react-for-plugin-uijeff-pearce&quot; /&gt;12:55 - 1:10pm		Using React for plugin UI	&lt;a href=&quot;https://github.com/jeffpearce&quot;&gt;Jeff Pearce&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The working hours plugin has a date driven UI. During this summer’s Google Summer of Code, our student rewrite the UI in React, so that we could take advantage open source modules such as calendar pickers. I’ll talk about how the student approached the UI, demonstrate the UI and talk about particular challenges we faces.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;110-125pmjenkins-gke-plugincraig-barber&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#110-125pmjenkins-gke-plugincraig-barber&quot; /&gt;1:10 - 1:25pm		Jenkins GKE Plugin	&lt;a href=&quot;https://github.com/craigdbarber&quot;&gt;Craig Barber&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this demo we will showcase the Jenkins GKE plugin, newest addition to GCP’s suite of officially supported plugins. We’ll show how to leverage this plugin to deploy applications built in Jenkins pipelines to multiple clusters running in GKE.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Grab your lunch and join us at the community theater!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/07/15/pipeline-config-history-plugin/</id>
<title>Introducing the Pipeline Configuration History Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-07-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/07/15/pipeline-config-history-plugin/" />
<category term='pipeline'></category>
<category term='plugins'></category>
<summary>
Pipelines are the efficient and modern way how to create jobs in Jenkins.
To recognize pipeline changes quickly and easily, we developed the Pipeline Configuration History plugin.
This plugin detects changes of pipelines and provides the user an option to view changes between two builds (diffs) of pipeline configurations visibly and traceably.


How everything started


It all started 10 years ago&#8201;&#8212;&#8201;with classical job types (e.g. Freestyle, Maven, etc.).
Every once in a while users contacted us because their jobs failed to build overnight.
Why did the job fail?
Was the failure related to a job configuration change?
The users' typical answer was: "We didn&#8217;t change anything!", but is...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;Pipelines&lt;/a&gt; are the efficient and modern way how to create jobs in Jenkins.
To recognize pipeline changes quickly and easily, we developed the &lt;a href=&quot;https://plugins.jenkins.io/pipeline-config-history&quot;&gt;Pipeline Configuration History&lt;/a&gt; plugin.
This plugin detects changes of pipelines and provides the user an option to view changes between two builds (diffs) of pipeline configurations visibly and traceably.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-everything-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-everything-started&quot; /&gt;How everything started&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It all started 10 years ago — with classical job types (e.g. Freestyle, Maven, etc.).
Every once in a while users contacted us because their jobs failed to build overnight.
Why did the job fail?
Was the failure related to a job configuration change?
The users&#39; typical answer was: &quot;We didn’t change anything!&quot;, but is that really true?
We thought about this and decided to develop a plugin that helped us solve this problem.
This was the idea and the beginning of &lt;a href=&quot;https://plugins.jenkins.io/jobConfigHistory&quot;&gt;Job Configuration History&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now it was possible to view changes of job configurations (like other branches, JDK versions, etc.) and more often the reason for breaking builds were changes of job configurations.&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/2019-07-pipeline-config-history/Diff_2.6.png&quot; alt=&quot;Screenshot of Job Configuration History&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the years the plugin got developed and is still under development.
New functions were added, that not only view job configurations, but also changes of global and agent configurations.
It is also possible to recover old configuration versions.
Today the plugin has more than 30,000 installations.
For many years JobConfigHistory relieves our daily work — with more than 3,000 Jenkins jobs!
Then there was a new type of job: &lt;strong&gt;Pipelines&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;pipelines-something-new-was-needed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipelines-something-new-was-needed&quot; /&gt;Pipelines - something new was needed&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline jobs are fundamentally different than classical job types .
While classic job types are configured via the Jenkins GUI, Pipeline jobs are configured as code.
Every pipeline job indeed gets created via the Jenkins GUI, however that is not necessarily where the pipeline configuration is located.
Pipelines can be configured:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Directly in the Jenkins job as script.
The code gets inserted directly in the job configuration page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As Jenkinsfile in the source code management system (SCM): The pipeline configuration is defined in a text file (Jenkinsfile) in the SCM.
In the job itself only the path to the repository of the Jenkinsfile is configured.
During the build the Jenkinsfile gets checked out from the SCM and processed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a shared library: A part of the pipeline configuration gets moved to separate files that can be used by several jobs.
These files are also saved in the SCM.
Even so a Jenkinsfile is still needed (or a pipeline script in the job).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With every save operation of the job configuration, JobConfigHistory creates a copy of the actual job configuration if something has changed.
That only works for pipeline jobs if the pipeline configuration is inserted in the job configuration page as script.
Changes in the Jenkinsfile or the shared libraries are not detected by JobConfigHistory.
You have to use the SCM system to view changes of the Jenkinsfile or the shared libraries.
It is complex and time intensive to find a correlation between the time of a build and a change to the Jenkinsfile or shared library.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This new problem is much more than JobConfigHistory.  A new solution was needed to detect pipeline changes and show these changes in Jenkins.
So we developed Pipeline Configuration History.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During every pipeline run the Jenkinsfile and related shared libraries are saved in the &lt;code&gt;builds&lt;/code&gt; directory of the job.
Pipeline Configuration History saves changes of the pipeline files between the last run and the previous run as history events.
Therefore when a pipeline job ceases to build successfully, you can check if something has changed on any used pipeline file.
You can also see the build where changes occurred.&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/2019-07-pipeline-config-history/image2019-5-15_13-44-54.png&quot; alt=&quot;Screenshot of Pipeline Configuration History&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because a pipeline configuration can consist of several files where changes could have occurred, only files with changes between two builds are shown in the diff.
That makes the whole thing more compact and effective:&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/2019-07-pipeline-config-history/image2019-5-15_14-5-13.png&quot; alt=&quot;Screenshot of Pipeline Configuration History&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But sometimes you may want to show more than the differences between pipeline files.  You may want to see which pipeline files are in use or the content of those files when they were used.
So it’s possible to view all files and their content.
If required you can download them as well:&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/2019-07-pipeline-config-history/image2019-5-15_14-11-7.png&quot; alt=&quot;Screenshot of Pipeline Configuration History&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;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;We use Pipeline Configuration History successfully in production. It has helped us from the very first day as we solved problems that occurred due to pipeline configuration changes.
Pipeline Configuration History won’t replace Job Configuration History.
The plugins have different use cases.
Many times small changes on job or pipeline configurations also have big impacts.
Because of the correlation in time between changes of job or pipeline configurations and different build behavior, it is now possible to substantially reduce the time and effort to analyze build failures.
The Job Configuration History and Pipeline Configuration History plugins let us help our users in consulting and in solving issues.  We resolve problems much faster through easy access to the configuration history of jobs.  These plugins are essential for our daily work.&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/2019/07/11/remoting-kafka-kubernetes-phase-1/</id>
<title>Remoting over Apache Kafka plugin with Kafka launcher in Kubernetes</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-07-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/07/11/remoting-kafka-kubernetes-phase-1/" />
<author>
<name>longnguyen</name>
</author>
<category term='remoting'></category>
<category term='kafka'></category>
<category term='kubernetes'></category>
<category term='helm'></category>
<category term='developer'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
I am Long Nguyen from FPT University, Vietnam. My project for Google Summer of Code 2019 is Remoting over Apache Kafka with Kubernetes features. This is the first time I have contributed for Jenkins and I am very excited to announce the features that have been done in Phase 1.




Project Introduction


Current version of Remoting over Apache Kafka plugin requires users to manually configure the entire system which includes Zookeeper, Kafka and remoting agents. It also doesn&#8217;t support dynamic agent provisioning so scalability is harder to achieve. My project aims to solve two problems:




Out-of-the-box solution to provision Apache Kafka cluster.


Dynamic agent...
</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;I am Long Nguyen from FPT University, Vietnam. My project for Google Summer of Code 2019 is &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/remoting-over-apache-kafka-docker-k8s-features/&quot;&gt;Remoting over Apache Kafka with Kubernetes features&lt;/a&gt;. This is the first time I have contributed for Jenkins and I am very excited to announce the features that have been done in Phase 1.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;project-introduction&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-introduction&quot; /&gt;Project Introduction&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Current version of &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;Remoting over Apache Kafka plugin&lt;/a&gt; requires users to manually configure the entire system which includes Zookeeper, Kafka and remoting agents. It also doesn’t support dynamic agent provisioning so scalability is harder to achieve. My project aims to solve two problems:&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;Out-of-the-box solution to provision Apache Kafka cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dynamic agent provisioning in a Kubernetes cluster.&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;current-state&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-state&quot; /&gt;Current State&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;Kubernetes connector with credentials supported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apache Kafka provisioning in Kubernetes feature is fully implemented.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Helm chart is partially implemented.&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;apache-kafka-provisioning-in-kubernetes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#apache-kafka-provisioning-in-kubernetes&quot; /&gt;Apache Kafka provisioning in Kubernetes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature is part of 2.0 version so it is not yet released officially. You can try out the feature by using the &lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/releasing-experimental-updates/&quot;&gt;Experimental Update Center&lt;/a&gt; to update to &lt;code&gt;2.0.0-alpha&lt;/code&gt; version or building directly from master branch:&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 clone https://github.com/jenkinsci/remoting-kafka-plugin.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;remoting-kafka-plugin/plugin
mvn hpi:run&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the Global Configuration page, users can input Kubernetes server information and credentials. Then they can start Apache Kafka with only one button click.&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/remoting-kafka/kafka-provisioning-kubernetes-ui.png&quot; alt=&quot;Kafka provisioning in Kubernetes UI&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When users click &lt;code&gt;Start Kafka on Kubernetes&lt;/code&gt; button, Jenkins will create a Kubernetes client from the information and then apply Zookeeper and Kafka YAML specification files from &lt;code&gt;resources&lt;/code&gt;.&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/remoting-kafka/kafka-provisioning-kubernetes-architecture.png&quot; alt=&quot;Kafka provisioning in Kubernetes 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;helm-chart&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#helm-chart&quot; /&gt;Helm Chart&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Helm chart for Remoting over Apache Kafka plugin is based on &lt;a href=&quot;https://github.com/helm/charts/tree/master/stable/jenkins&quot;&gt;stable/jenkins&lt;/a&gt; chart and &lt;a href=&quot;https://github.com/helm/charts/tree/master/incubator/kafka&quot;&gt;incubator/kafka&lt;/a&gt; chart. As of now, the chart is still a &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin/pull/62&quot;&gt;Work in Progress&lt;/a&gt; because it is still waiting for Cloud API implementation in Phase 2. However, you can check out the demo chart with a single standalone Remoting Kafka Agent:&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 clone &lt;span class=&quot;nt&quot;&gt;-b&lt;/span&gt; demo-helm-phase-1 https://github.com/longngn/remoting-kafka-plugin.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;remoting-kafka-plugin
&lt;span class=&quot;nv&quot;&gt;K8S_NODE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&amp;lt;your Kubernetes node IP&amp;gt; ./helm/jenkins-remoting-kafka/do.sh start&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The command &lt;code&gt;do.sh start&lt;/code&gt; will do the following steps:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install the chart (with Jenkins and Kafka).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Launch a Kafka computer on Jenkins controller by applying the following JCasC.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;nodes&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;permanent&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;name&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;test&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;remoteFS&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;/home/jenkins&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;launcher&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;kafka&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&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;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Launch a single Remoting Kafka Agent pod.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can check the chart state by running &lt;code&gt;kubectl&lt;/code&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;bash&quot;&gt;kubectl get all &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; demo-helm
NAME                                    READY   STATUS    RESTARTS   AGE
pod/demo-jenkins-998bcdfd4-tjmjs        2/2     Running   0          6m30s
pod/demo-jenkins-remoting-kafka-agent   1/1     Running   0          4m10s
pod/demo-kafka-0                        1/1     Running   0          6m30s
pod/demo-zookeeper-0                    1/1     Running   0          6m30s

NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;S&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;                      AGE
service/demo-0-external           NodePort    10.106.254.187   &amp;lt;none&amp;gt;        19092:31090/TCP              6m30s
service/demo-jenkins              NodePort    10.101.84.33     &amp;lt;none&amp;gt;        8080:31465/TCP               6m31s
service/demo-jenkins-agent        ClusterIP   10.97.169.65     &amp;lt;none&amp;gt;        50000/TCP                    6m31s
service/demo-kafka                ClusterIP   10.106.248.10    &amp;lt;none&amp;gt;        9092/TCP                     6m30s
service/demo-kafka-headless       ClusterIP   None             &amp;lt;none&amp;gt;        9092/TCP                     6m30s
service/demo-zookeeper            ClusterIP   10.109.222.63    &amp;lt;none&amp;gt;        2181/TCP                     6m30s
service/demo-zookeeper-headless   ClusterIP   None             &amp;lt;none&amp;gt;        2181/TCP,3888/TCP,2888/TCP   6m31s

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/demo-jenkins   1/1     1            1           6m30s

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/demo-jenkins-998bcdfd4   1         1         1       6m30s

NAME                              READY   AGE
statefulset.apps/demo-kafka       1/1     6m30s
statefulset.apps/demo-zookeeper   1/1     6m30s&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;next-phase-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-phase-plan&quot; /&gt;Next Phase Plan&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 Cloud API to provision Remoting Kafka Agent. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/57668&quot;&gt;JENKINS-57668&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integrate Cloud API implementation with Helm chart. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/58288&quot;&gt;JENKINS-58288&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unit tests and integration tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release version 2.0 and address feedbacks. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/58289&quot;&gt;JENKINS-58289&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://youtu.be/MDs0Vr7gnnA?t=2601&quot;&gt;Phase 1 Demo Video&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1yIPwwL7P051XaSE2EOJYAtbVsd6YvGvvKp9QcJE4J1Y/edit?usp=sharing&quot;&gt;Phase 1 Presentation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;Remoting over Apache Kafka plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/remoting-over-apache-kafka-docker-k8s-features/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_remoting:gitter.im&quot;&gt;Gitter Channel&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/2019/07/09/Phase1-Updates-On-Working-Hours-Plugin/</id>
<title>GSOC Phase 1 Updates On Working Hours Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-07-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/07/09/Phase1-Updates-On-Working-Hours-Plugin/" />
<author>
<name>jackshen</name>
</author>
<category term='react'></category>
<category term='plugins'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
The Working Hour Plugin provides an interface to set up a schedule of allowable build days and times.  Jobs that run outside of configured working hours are held until the next allowable build time.


For the first code phase at Google Summer of Code, I&#8217;ve been working on Working Hours Project, which needed improvements on usability.


Rather than classical Jelly pages, React seems to be more preferred when we want to design a much customized UI with a huge amount of libraries we could use, especially the open source components such as date pickers.


But we have to face a challenge of...
</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;The Working Hour Plugin provides an interface to set up a schedule of allowable build days and times.  Jobs that run outside of configured working hours are held until the next allowable build time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the first code phase at Google Summer of Code, I’ve been working on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/working-hours-improvements/&quot;&gt;Working Hours Project&lt;/a&gt;, which needed improvements on usability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Rather than classical Jelly pages, React seems to be more preferred when we want to design a much customized UI with a huge amount of libraries we could use, especially the open source components such as date pickers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But we have to face a challenge of the integration of React and Jenkins, which I’m currently working on.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;achievements-for-the-first-code-phase&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#achievements-for-the-first-code-phase&quot; /&gt;Achievements For The First Code Phase&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the first code phase, we are focusing on the UI improvements, we’ve achieved following major improvements:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A standalone webapp which could be then integrated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Slider for choosing a time range.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More fields when setting a excluded date.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Presets for choosing a excluded date.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A Jenkins styling UI.&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;how-we-integrate-react-into-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-we-integrate-react-into-jenkins&quot; /&gt;How We Integrate React Into Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A solution doc for integration could be found at
&lt;a href=&quot;https://drive.google.com/open?id=1JLRCDg9JNBWR0Dfq8w3pTI9mrl6i9JU29pBoH6bO0J8&quot; class=&quot;bare&quot;&gt;https://drive.google.com/open?id=1JLRCDg9JNBWR0Dfq8w3pTI9mrl6i9JU29pBoH6bO0J8&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At first, we found BlueOcean is a great example for using React in Jenkins, but yet it’s not a choice for common development with plugins. So we need to find out another way to integrate.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are the steps to do the integration:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A mount point in your jelly file, usually it’s a element with a unique &lt;code&gt;id&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write your React Application, but need to set the mount point to the id you set above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy the output after you build the Project into the plugin’s webapp dir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your files using a script tag in your jelly file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;&amp;lt;script type=&quot;text/javascript&quot;
        src=&quot;${resURL}/plugin/working-hours/js/main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Once we are using React, the traditional jelly request won’t be available anymore, another way to process requests will be using stapler. You can define a process function like below.
[source, java]&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;public HttpResponse doDynamic(StaplerRequest request) {
        if (config == null) {
            config = ExtensionList.lookup(WorkingHoursPlugin.class).get(0);
        }
        String restOfPath = request.getRestOfPath();
        String[] pathTokens = restOfPath.split(&quot;/&quot;);
        List&amp;lt;String&amp;gt; params = new ArrayList&amp;lt;&amp;gt;();
        switch (params.get(0)) {
            case &quot;list-excluded-dates&quot;:
                return listExcludedDate(request);
            case &quot;set-excluded-dates&quot;:
                return setExcludedDates(request);
            case &quot;list-time-ranges&quot;:
                return listTimeRanges(request);
            case &quot;set-time-ranges&quot;:
                return setTimeRanges(request);
        }
    }&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;run-our-application&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#run-our-application&quot; /&gt;Run Our Application&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you would like to take a look at our plugin, you can go to the repo
&lt;a href=&quot;https://github.com/jenkinsci/working-hours-plugin/tree/dev&quot;&gt;working-hours-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just follow the README file, then you could run a copy of your working hours plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;screenshots&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#screenshots&quot; /&gt;Screenshots&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The current plugin’s outlook is a bit simple and the plugin is a bit unconvinient for use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the problems is that if we want to input a excluded date, it’ll be a string in a constant format like 15/9/2019, but we chose React for the new UI so we could use a datepicker to improve this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-plugin&quot; /&gt;Current Plugin&lt;/h3&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/working-hours/working-hours-config.png&quot; alt=&quot;Screenshot for Current Plugin&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-time-ranges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-time-ranges&quot; /&gt;New (Time Ranges)&lt;/h3&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/working-hours/working-hours-example-time-range.png&quot; alt=&quot;Time Ranges Example&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-exclude-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-exclude-dates&quot; /&gt;New (Exclude Dates)&lt;/h3&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/working-hours/working-hours-exmaple-excluded-date.png&quot; alt=&quot;Excluded Dates Example&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;helpful-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#helpful-links&quot; /&gt;Helpful links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any questions or advice, we are glad to hear from you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several useful links are listed below:&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/working-hours-plugin/tree/dev&quot;&gt;Develop Repo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/working-hours-plugin&quot;&gt;Main Repo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1SezLtQejur2ji-KUur3dC3TXK8ivxrttiwHYbTkA8Yk/edit#&quot;&gt;Design Doc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://drive.google.com/open?id=1JLRCDg9JNBWR0Dfq8w3pTI9mrl6i9JU29pBoH6bO0J8&quot;&gt;Doc for React Integration Solution &lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_working-hours-plugin:gitter.im&quot;&gt;
    Gitter Chat
&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1Psz6MrYvw81D_7d8pfW04FDoBtexlSVdgrbqp99Wjm0/edit?usp=sharing&quot;&gt;
    Slides for Phase 1 Demo
&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=MDs0Vr7gnnA&quot;&gt;
    Video Recording for Phase 1
&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/2019/07/05/jenkins-pipeline-stage-result-visualization-improvements/</id>
<title>Jenkins Pipeline Stage Result Visualization Improvements</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-07-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/07/05/jenkins-pipeline-stage-result-visualization-improvements/" />
<author>
<name>dwnusbaum</name>
</author>
<category term='pipeline'></category>
<category term='blueocean'></category>
<summary>
Some changes have recently been released to give Pipeline authors some new tools to improve Pipeline visualizations in Blue Ocean, in particular to address the highly-voted issue JENKINS-39203, which causes all non-failing stages to be visualized as though they were unstable if the overall build result of the Pipeline was unstable. This issue made it difficult to quickly identify why a build was unstable, and forced users to read through builds logs and the Jenkinsfile to figure out what actually happened.


In order to fix this issue, we introduced a new Pipeline API that can be used to attach additional result...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some changes have recently been released to give Pipeline authors some new tools to improve Pipeline visualizations in Blue Ocean, in particular to address the highly-voted issue &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/39203&quot;&gt;JENKINS-39203&lt;/a&gt;, which causes all non-failing stages to be visualized as though they were unstable if the overall build result of the Pipeline was unstable. This issue made it difficult to quickly identify why a build was unstable, and forced users to read through builds logs and the Jenkinsfile to figure out what actually happened.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to fix this issue, we introduced a new Pipeline API that can be used to attach additional result information to individual Pipeline steps. Visualization tools like Blue Ocean use this new API when deciding how a given stage should be displayed. Steps like &lt;code&gt;junit&lt;/code&gt; that used to set only the overall build result now additionally use the new API to set step-level result information. We created the new &lt;code&gt;unstable&lt;/code&gt; and &lt;code&gt;warnError&lt;/code&gt; steps so that Pipeline authors with more complicated use cases can still take advantage of this new API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The core fixes for the issue are present in the following plugins, all of which require Jenkins 2.138.4 or newer:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pipeline: API 2.34&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline: Basic Steps 2.18 (requires a simultaneous update to Pipeline: Groovy 2.70)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline: Graph Analysis 1.10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline: Declarative 1.3.9&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blue Ocean 1.17.0&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is a screenshot from Blue Ocean of a Pipeline using the &lt;code&gt;unstable&lt;/code&gt; step where only the failing stage is marked as unstable:&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/2019/07/2019-07-05-jenkins-pipeline-stage-result-visualization-improvements/unstable-stage-example.png&quot; alt=&quot;Visualization of a Pipeline in Blue Ocean with a single stage shown as unstable&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;examples&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#examples&quot; /&gt;Examples&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are some examples of how to update your Pipelines to use the new 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;Use the new &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/#warnerror-catch-error-and-set-build-and-stage-result-to-unstable&quot;&gt;&lt;code&gt;warnError&lt;/code&gt;&lt;/a&gt; step to catch errors and mark the build and stage as unstable.&lt;/strong&gt; &lt;code&gt;warnError&lt;/code&gt; requires a single &lt;code&gt;String&lt;/code&gt; parameter, which is a message to log when an error is caught. When &lt;code&gt;warnError&lt;/code&gt; catches an error, it logs the message  and the error and sets the build and stage result to unstable. Using it looks like this:&lt;/p&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;warnError&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Script failed!&#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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;false&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use the new &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/#unstable-set-stage-result-to-unstable&quot;&gt;&lt;code&gt;unstable&lt;/code&gt;&lt;/a&gt; step to set the build and stage result to unstable&lt;/strong&gt;. This step can be used as a direct replacement for &lt;code&gt;currentBuild.result = &#39;UNSTABLE&#39;&lt;/code&gt;, and may be useful in cases where &lt;code&gt;warnError&lt;/code&gt; is not flexible enough. &lt;code&gt;unstable&lt;/code&gt; requires a single &lt;code&gt;String&lt;/code&gt; parameter, which is a message to log when the step runs. Using it might look like this:&lt;/p&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;k&quot;&gt;try&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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;false&#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;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ex&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;unstable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Script failed!&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://plugins.jenkins.io/junit&quot;&gt;JUnit Plugin&lt;/a&gt;&lt;/strong&gt;: Update to version 1.28 or newer to pick up fixes for the &lt;code&gt;junit&lt;/code&gt; step so that it correctly marks the stage as unstable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://plugins.jenkins.io/warnings-ng&quot;&gt;Warnings Next Generation Plugin&lt;/a&gt;&lt;/strong&gt;: Update to version 5.2.0 or newer to pick up fixes for the &lt;code&gt;publishIssues&lt;/code&gt; and &lt;code&gt;recordIssues&lt;/code&gt; steps so that they correctly mark the stage as unstable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Other Plugins&lt;/strong&gt;: If your Pipeline is marked as unstable by a step in another plugin, please &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;file a new issue&lt;/a&gt; with the component set to that plugin (after checking for duplicates), clearly describing which step has the problem and under what circumstances it occurs, and link to the developer section of this post as a reference for how the maintainer might be able to address the problem.&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;limitations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#limitations&quot; /&gt;Limitations&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;If you do not migrate to the &lt;code&gt;unstable&lt;/code&gt; or &lt;code&gt;warnError&lt;/code&gt; steps, or update plugins that set the build result to versions that integrate with the new API, then in cases where the build is unstable, Blue Ocean will not show any stages as unstable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Even after these changes, &lt;code&gt;currentBuild.result&lt;/code&gt; continues to refer only to the overall build result. Unfortunately, it was not possible to adapt the &lt;code&gt;currentBuild&lt;/code&gt; global variable to make it track step or stage-level results, since it is implemented as a global variable, which means it does not have any step-level context through which it could use the new API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/pipeline-stage-view&quot;&gt;Pipeline Stage View Plugin&lt;/a&gt; has not yet been updated to use the new API, so these changes do not affect the visualization it provides.&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;history&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#history&quot; /&gt;History&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Pipeline steps can complete in one of two ways: successfully, by returning a (possibly null) result, or unsuccessfully, by throwing an exception. When a step fails by throwing an exception, that exception propagates throughout the Pipeline until another step or Groovy code catches it, or it reaches the top level of the Pipeline, which causes the Pipeline itself to fail. Depending on the type of exception thrown, the final result of the Pipeline may be something other than failure (for example in some cases it will be aborted). Because of the way the exception propagates, it is easy for tools like Blue Ocean to identify steps (and therefore stages) which failed due to an exception.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order for Pipelines to be able to interact with established Jenkins APIs, it was also necessary for Pipeline builds to have an overall build result that can be modified during the build. Among other things, this allows Pipelines to use build steps and wrappers that were originally written for use in Freestyle projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In some cases, it is desirable for a Pipeline step to be able to complete successfully so that the rest of the Pipeline continues normal execution, but for it to be able to note that some kind of error occurred so that visualizations are able to identify that something went wrong with the step, even though it didn’t fail completely. A good example of this is the &lt;code&gt;junit&lt;/code&gt; step. This step looks at specified test results, and if there were any failures, marks the overall build result as unstable. This kind of behavior is problematic for visualization tools like Blue Ocean, because the step completed successfully, and there is no programmatic way to associate the overall build result with the step that ended up setting that result.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking at &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/39203&quot;&gt;JENKINS-39203&lt;/a&gt; again, we see that there were essentially two options for the visualization. If the overall build result was unstable, either all steps that completed successfully could be shown as unstable, because they may have been the step that caused the build to become unstable, or they could be shown as successful, because we have no way to relate the setting of the build result to a specific step. In the end, the first option was chosen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To work around this issue, some users tried to do things like throw exceptions and add try/catch blocks around stages that handle exceptions so that Blue Ocean would be able to use the exceptions to mark step and stage results as desired, and then by catching the exception the Pipeline would be able to continue normal execution. These kinds of workarounds were hard to understand, fragile, and did not work well (if at all) for Declarative Pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#developers&quot; /&gt;Developers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are a developer of a plugin that integrates with Pipeline using a step, and want to take advantage of the new API so that your step can report an non-successful result without throwing an exception, please see &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/5A7U1KmfX08/IP5Bg_OaAgAJ&quot;&gt;this post&lt;/a&gt; to the Jenkins Developers mailing list, and respond there if you have any questions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/07/02/plugin-management-tool-alpha-release/</id>
<title>Plugin Management Library and CLI Tool Alpha Release</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-07-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/07/02/plugin-management-tool-alpha-release/" />
<author>
<name>stopalopa</name>
</author>
<category term='plugins'></category>
<category term='pluginmanagement'></category>
<category term='platform-sig'></category>
<category term='cli'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
"Everybody is re-inventing the wheel, partially implementing the "details" of plugin management (signed metadata, artifacts checksums, plugins detached from core,&#8230;&#8203;).
It becomes obvious Jenkins should provide adequate tooling for plugin installation outside a live Jenkins instance." JENKINS-53767


My Google Summer of Code project
tries to solve this problem by creating a library that will unify plugin management logic across the different implementations
of Jenkins and providing a CLI tool that will make it easy for users to download plugins and view plugin information before Jenkins even starts.
I&#8217;m excited to share that we just released an alpha version that you can check out here!


GSoC Phase 1 Update


While...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;&quot;Everybody is re-inventing the wheel, partially implementing the &quot;details&quot; of plugin management (signed metadata, artifacts checksums, plugins detached from core,…​).
It becomes obvious Jenkins should provide adequate tooling for plugin installation outside a live Jenkins instance.&quot;&lt;/em&gt; &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-53767&quot;&gt;JENKINS-53767&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/plugin-installation-manager-tool-cli/&quot;&gt;Google Summer of Code project&lt;/a&gt;
tries to solve this problem by creating a library that will unify plugin management logic across the different implementations
of Jenkins and providing a CLI tool that will make it easy for users to download plugins and view plugin information before Jenkins even starts.
I’m excited to share that we just released an alpha version that you can check out &lt;a href=&quot;https://github.com/jenkinsci/plugin-installation-manager-tool/releases&quot;&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;gsoc-phase-1-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gsoc-phase-1-update&quot; /&gt;GSoC Phase 1 Update&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While I looked into pulling the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/PluginManager.java&quot;&gt;Plugin Manager&lt;/a&gt; out of Jenkins core,
this ended up being a challenging first step due to the complexity and number of dependencies.  We instead decided to start by converting the
&lt;a href=&quot;https://github.com/jenkinsci/docker/blob/master/install-plugins.sh&quot;&gt;install-plugins.sh bash script&lt;/a&gt; in Jenkins Docker to Java.
There are several issues with the install-plugins.sh script - namely, that it is a bash script and has limited extensibility.
Furthermore, it does not retrieve all of the most-up-to-date update center metadata.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;alpha-release-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#alpha-release-details&quot; /&gt;Alpha Release Details&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mimicking what was done in the &lt;a href=&quot;https://github.com/jenkinsci/docker/blob/master/install-plugins.sh&quot;&gt;install-plugins.sh&lt;/a&gt; script from the official Jenkins Docker image, the new plugin management library takes in a list of plugins, their versions,
and/or urls from which to download the plugins, and downloads the requested plugins and their dependencies. The plugins are downloaded from the update center
to a specified directory, and can then be loaded into Jenkins. Currently, the plugins to be downloaded can be specified via a plugins.txt file and/or the -plugins cli option, but we plan to further expand the input formats that can be accepted.
&lt;a href=&quot;https://github.com/jenkinsci/docker#plugin-version-format&quot;&gt;Custom version specifiers&lt;/a&gt; for different update centers are also supported.&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/gsoc-plugin-management-tool/pluginstxt.png&quot; alt=&quot;Example plugins.txt File&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The library will first check if any of the requested plugins are currently either installed in the user-specified download location or user-specified Jenkins war file.
Already installed plugins will be ignored or upgraded if a higher version is requested or required as a dependency.  After determining the plugin download URL, the library
will download the plugins and resolve and download their dependencies.&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/gsoc-plugin-management-tool/downloadexample.png&quot; alt=&quot;Example of Downloading Plugins&quot;&gt;
&lt;/img&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/gsoc-plugin-management-tool/downloadedplugins.png&quot; alt=&quot;Plugin Download Directory&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is just the beginning: the plugin manager library and cli tool are very much still a work in progress.
For the most up-to-date information on CLI options and how to run the tool, see the &lt;a href=&quot;https://github.com/jenkinsci/plugin-installation-manager-tool/blob/master/README.md&quot;&gt;repository README.md&lt;/a&gt;.
More robust input parsing, support for security warnings and available updates, Docker integration, and additional features coming soon!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links-and-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links-and-feedback&quot; /&gt;Links and Feedback&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to reach out through
the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_plugin-installation-manager-cli-tool:gitter.im&quot;&gt;Plugin Installation Manager CLI Tool Gitter chat&lt;/a&gt; or through
the &lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins Developer Mailing list&lt;/a&gt;. I would love to get your questions, comments, and feedback!
We have meetings Tuesdays and Thursdays at 6PM UTC.&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://docs.google.com/presentation/d/12Bo8w9SinrG5n82w-Unjx4MNq0mjkHFEOMc3Jf6rTQQ/edit#slide=id.p1&quot;&gt;Phase 1 Presentation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/MDs0Vr7gnnA?t=196&quot;&gt;Phase 1 Recorded Demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/58199?jql=project%20%3D%20JENKINS%20AND%20component%20%3D%20plugin-installation-manager-tool&quot;&gt;Jira Issue Search&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/plugin-installation-manager-tool&quot;&gt;Repository&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/2019/06/29/phase-1-multibranch-pipeline-support-for-gitlab/</id>
<title>Multi-branch Pipeline Jobs Support for GitLab SCM</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-06-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/06/29/phase-1-multibranch-pipeline-support-for-gitlab/" />
<author>
<name>baymac</name>
</author>
<category term='gitlab'></category>
<category term='plugins'></category>
<category term='pipeline'></category>
<category term='credentials'></category>
<category term='developer'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
This is one of the Jenkins project in GSoC 2019. We are working on adding support
for Multi-branch
Pipeline Jobs and Folder Organisation in GitLab. The plan is to create the following
plugins:




GitLab API Plugin - Wraps GitLab Java APIs.


GitLab Branch Source Plugin - Contains two packages:



io.jenkins.plugins.gitlabserverconfig - Manages server configuration and web hooks management.
Ideally should reside inside another plugin with name GitLab Plugin. In future, this package should
be moved into a new plugin.


io.jenkins.plugins.gitlabbranchsource - Adds GitLab Branch Source for Multi-branch Pipeline Jobs (including
Merge Requests) and Folder organisation.









Present State




FreeStyle Job and Pipeline(Single Branch) Job are fully supported.


Multi-branch Pipeline Job is partially supported (no...
</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;This is one of the Jenkins project in GSoC 2019. We are working on adding support
for &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/gitlab-support-for-multibranch-pipeline/&quot;&gt;Multi-branch
Pipeline Jobs and Folder Organisation in GitLab&lt;/a&gt;. The plan is to create the following
plugins:&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/gitlab-api-plugin&quot;&gt;GitLab API Plugin&lt;/a&gt; - Wraps GitLab Java APIs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/baymac/gitlab-branch-source-plugin&quot;&gt;GitLab Branch Source Plugin&lt;/a&gt; - Contains two packages:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;io.jenkins.plugins.gitlabserverconfig&lt;/code&gt; - Manages server configuration and web hooks management.
Ideally should reside inside another plugin with name &lt;code&gt;GitLab Plugin&lt;/code&gt;. In future, this package should
be moved into a new plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;io.jenkins.plugins.gitlabbranchsource&lt;/code&gt; - Adds GitLab Branch Source for Multi-branch Pipeline Jobs (including
Merge Requests) and Folder organisation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;present-state&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#present-state&quot; /&gt;Present State&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;FreeStyle Job and Pipeline(Single Branch) Job are fully supported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multi-branch Pipeline Job is partially supported (no MRs detection).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitLab Folder Organisation is not supported.&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;goals-of-this-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#goals-of-this-project&quot; /&gt;Goals of this project&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 a lightweight GitLab Plugin that depends on GitLab API Plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Follow convention of 3 separate plugins i.e. &lt;code&gt;GitLab Plugin&lt;/code&gt;, &lt;code&gt;GitLab API Plugin&lt;/code&gt;, &lt;code&gt;GitLab Branch Source Plugin&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implement GitLab Branch Source Plugin with support for Multi-branch Pipeline Jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support new Jenkins features such as
&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Jenkins Code as Configuration&lt;/a&gt; (JCasC),
&lt;a href=&quot;https://github.com/jenkinsci/incrementals-tools/&quot;&gt;Incremental Tools&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clear &amp;amp; Efficient design.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support new SCM Trait APIs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support Java 8 and above.&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;building-the-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#building-the-plugin&quot; /&gt;Building the plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No binaries are available for this plugin as the plugin is in the very early alpha stage, and not ready for the general
public quite yet.  If you want to jump in early, you can try building it yourself from source.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;installation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installation&quot; /&gt;Installation:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Checkout source code to your local machine:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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 clone https://github.com/baymac/gitlab-branch-source-plugin.git

&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;gitlab-branch-source-plugin&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install the plugin:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;mvn clean &lt;span class=&quot;nb&quot;&gt;install

&lt;/span&gt;mvn clean &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-DskipTests&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# to skip tests&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the plugin:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;mvn hpi:run &lt;span class=&quot;c&quot;&gt;# runs a Jenkins instance at localhost:8080&lt;/span&gt;

mvn hpi:run &lt;span class=&quot;nt&quot;&gt;-Djetty&lt;/span&gt;.port&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&amp;lt;port&amp;gt; &lt;span class=&quot;c&quot;&gt;# to run on your desired port number&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;If you want to test it with your Jenkins server, after &lt;code&gt;mvn clean install&lt;/code&gt; follow these steps in your Jenkins instance:&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;Select &lt;code&gt;Manage Jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Manage Plugins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Advanced&lt;/code&gt; tab&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;code&gt;Upload Plugin&lt;/code&gt; section, select &lt;code&gt;Choose file&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;$&amp;lt;root_dir&amp;gt;/target/gitlab-branch-source.hpi&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Upload&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Install without restart&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;usage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#usage&quot; /&gt;Usage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Assuming plugin installation has done been already.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;setting-up-gitlab-server-configuration-on-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-up-gitlab-server-configuration-on-jenkins&quot; /&gt;Setting up GitLab Server Configuration on Jenkins&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;On jenkins, select &lt;code&gt;Manage Jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Configure System&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scroll down to find the &lt;code&gt;GitLab&lt;/code&gt; section&lt;/p&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/2019/06/2019-06-29-multibranch-pipeline-support-for-gitlab/gitlab-section.png&quot; alt=&quot;gitlab-section&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Add GitLab Server&lt;/code&gt; | Select &lt;code&gt;GitLab Server&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now you will now see the GitLab Server Configuration options.&lt;/p&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/2019/06/2019-06-29-multibranch-pipeline-support-for-gitlab/gitlab-server.png&quot; alt=&quot;gitlab-server&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are 4 fields that needs to be configured:&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;Name&lt;/code&gt; - Plugin automatically generates an unique server name for you. User may want to configure this field
to suit their needs but should make sure it is sufficiently unique. We recommend to keep it as it is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Server URL&lt;/code&gt; - Contains the URL to your GitLab Server. By default it is set to &quot;https://gitlab.com&quot;. User can
modify it to enter their GitLab Server URL e.g. &lt;a href=&quot;https://gitlab.gnome.org/&quot; class=&quot;bare&quot;&gt;https://gitlab.gnome.org/&lt;/a&gt;, &lt;a href=&quot;http://gitlab.example.com:7990&quot; class=&quot;bare&quot;&gt;http://gitlab.example.com:7990&lt;/a&gt;. etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Credentials&lt;/code&gt; - Contains a list of credentials entries that are of type GitLab Personal Access Token. When
no credential has been added it shows &quot;-none-&quot;. User can add a credential by clicking &quot;Add&quot; button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Web Hook&lt;/code&gt; - This field is a checkbox. If you want the plugin to setup a webhook on your GitLab project(s)
related jobs, check this box. The plugin listens to a URL for the concerned GitLab project(s) and when an event
occurs in the GitLab Server, the server sends an event trigger to the URL where the web hook is setup. If you
want continuous integration (or continuous delivery) on your GitLab project then you may want to automatically
set it up.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Adding a Personal Access Token Credentials (To automatically generate Personal Access Token see
&lt;a href=&quot;#creating-personal-access-token-within-jenkins&quot;&gt;next section&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;User is required to add a &lt;code&gt;GitLab Personal Access Token&lt;/code&gt; type credentials entry to securely persist the token
inside Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate a &lt;code&gt;Personal Access Token&lt;/code&gt; on your GitLab Server:&lt;/p&gt;
&lt;div class=&quot;olist lowerroman&quot;&gt;
&lt;ol class=&quot;lowerroman&quot; type=&quot;i&quot;&gt;
&lt;li&gt;
&lt;p&gt;Select profile dropdown menu from top-right corner&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Settings&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Access Token&lt;/code&gt; from left column&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter a name | Set Scope to &lt;code&gt;api&lt;/code&gt;,&lt;code&gt;read_user&lt;/code&gt;, &lt;code&gt;read_repository&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Create Personal Access Token&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy the token generated&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Return to Jenkins | Select &lt;code&gt;Add&lt;/code&gt; in Credentials field | Select &lt;code&gt;Jenkins&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set &lt;code&gt;Kind&lt;/code&gt; to GitLab Personal Access Token&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter &lt;code&gt;Token&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter a unique id in &lt;code&gt;ID&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter a human readable description&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Add&lt;/code&gt;&lt;/p&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/2019/06/2019-06-29-multibranch-pipeline-support-for-gitlab/gitlab-credentials.png&quot; alt=&quot;gitlab-credentials&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Testing connection:&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;Select your desired token in the &lt;code&gt;Credentials&lt;/code&gt; dropdown&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Test Connection&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It should return something like &lt;code&gt;Credentials verified for user &amp;lt;username&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Apply&lt;/code&gt; (at the bottom)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitLab Server is now setup on Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;creating-personal-access-token-within-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-personal-access-token-within-jenkins&quot; /&gt;Creating Personal Access Token within Jenkins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alternatively, users can generate a GitLab Personal Access Token within Jenkins itself and automatically add the
GitLab Personal Access Token credentials to Jenkins server credentials.&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;Select &lt;code&gt;Advanced&lt;/code&gt; at the bottom of &lt;code&gt;GitLab&lt;/code&gt; Section&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Manage Additional GitLab Actions&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;code&gt;Convert login and password to token&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the &lt;code&gt;GitLab Server URL&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are 2 options to generate token;&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;code&gt;From credentials&lt;/code&gt; - To select an already persisting Username Password Credentials or add an Username Password
credential to persist it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;From login and password&lt;/code&gt; - If this is a one time thing then you can directly enter you credentials to the text boxes
and the username/password credential is not persisted.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After setting your username/password credential, select &lt;code&gt;Create token credentials&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The token creator will create a Personal Access Token in your GitLab Server for the given user with the
required scope and also create a credentials for the same inside Jenkins server. You can go back to the GitLab Server
Configuration to select the new credentials generated (select &quot;-none-&quot; first then new credentials will appear). For
security reasons this token is not revealed as plain text rather returns an &lt;code&gt;id&lt;/code&gt;. It is a 128-bit long UUID-4 string
(36 characters).&lt;/p&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/2019/06/2019-06-29-multibranch-pipeline-support-for-gitlab/gitlab-token-creator.png&quot; alt=&quot;gitlab-token-creator&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configuration-as-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-as-code&quot; /&gt;Configuration as Code&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No need for messing around in the UI. &lt;code&gt;Jenkins Configuration as Code (JCasC)&lt;/code&gt; or simply &lt;code&gt;Configuration as Code&lt;/code&gt; Plugin
allows you to configure Jenkins via a &lt;code&gt;yaml&lt;/code&gt; file. If you are a first time user, you can learn more about JCasC
&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;add-configuration-yaml&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#add-configuration-yaml&quot; /&gt;Add configuration YAML:&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are multiple ways to load JCasC yaml file to configure Jenkins:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JCasC by default searches for a file with the name &lt;code&gt;jenkins.yaml&lt;/code&gt; in &lt;code&gt;$JENKINS_ROOT&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The JCasC looks for an environment variable &lt;code&gt;CASC_JENKINS_CONFIG&lt;/code&gt; which contains the path
for the configuration &lt;code&gt;yaml&lt;/code&gt; file.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A path to a folder containing a set of config files e.g. &lt;code&gt;/var/jenkins_home/casc_configs&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A full path to a single file e.g. &lt;code&gt;/var/jenkins_home/casc_configs/jenkins.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A URL pointing to a file served on the web e.g. &lt;code&gt;&lt;a href=&quot;https://&amp;lt;your-domain&amp;gt;/jenkins.yaml&quot; class=&quot;bare&quot;&gt;https://&amp;lt;your-domain&amp;gt;/jenkins.yaml&lt;/a&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can also set the configuration yaml path in the UI. Go to &lt;code&gt;&amp;lt;your-jenkins-domain&amp;gt;/configuration-as-code&lt;/code&gt;.
Enter path or URL to &lt;code&gt;jenkins.yaml&lt;/code&gt; and select &lt;code&gt;Apply New Configuration&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;An example of configuring GitLab server via &lt;code&gt;jenkins.yaml&lt;/code&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;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;system&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;domainCredentials&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;credentials&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;gitlabPersonalAccessToken&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;SYSTEM&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;i&amp;lt;3GitLab&quot;&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;token&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;XfsqZvVtAx5YCph5bq3r&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# gitlab personal access token&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;unclassified&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;gitLabServers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;servers&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;credentialsId&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;i&amp;lt;3GitLab&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;manageHooks&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;name&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;gitlab.com&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;serverUrl&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;https://gitlab.com&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 better security, see handling secrets
&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin#handling-secrets&quot;&gt;section&lt;/a&gt; in JCasC
documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/ol&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;future-scope-of-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-scope-of-work&quot; /&gt;Future Scope of work&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second phase of GSoC will be utilized to develop GitLab Branch Source. The new feature is a work in progress, but
the codebase is unstable and requires lot of bugfixes. Some features like Multibranch Pipeline Jobs are functioning
properly. More about it at the end of second phase.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;issue-tracking&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issue-tracking&quot; /&gt;Issue Tracking&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project uses Jenkins &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;JIRA&lt;/a&gt; to track issues. You can file issues under
&lt;code&gt;gitlab-branch-source-plugin&lt;/code&gt; component.&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;This plugin is built and maintained by the Google Summer of Code (GSoC) Team for
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/gitlab-support-for-multibranch-pipeline/&quot;&gt;Multi-branch Pipeline
Support for GitLab&lt;/a&gt;. A lot of inspiration was drawn from &lt;code&gt;GitLab Plugin&lt;/code&gt;, &lt;code&gt;Gitea Plugin&lt;/code&gt; and &lt;code&gt;GitHub Plugin&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our team consists of: &lt;a href=&quot;https://www.github.com/baymac&quot;&gt;baymac&lt;/a&gt;, &lt;a href=&quot;https://github.com/LinuxSuRen&quot;&gt;LinuxSuRen&lt;/a&gt;,
&lt;a href=&quot;https://github.com/markjacksonfishing&quot;&gt;Marky&lt;/a&gt;, &lt;a href=&quot;https://github.com/jetersen&quot;&gt;Joseph&lt;/a&gt;,
&lt;a href=&quot;https://github.com/justinharringa&quot;&gt;Justin&lt;/a&gt;, &lt;a href=&quot;https://github.com/jeffpearce&quot;&gt;Jeff&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With support from: &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg&lt;/a&gt;, &lt;a href=&quot;https://github.com/gmessner&quot;&gt;Greg&lt;/a&gt;,
&lt;a href=&quot;https://github.com/omehegan&quot;&gt;Owen&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also thanks to entire Jenkins community for contributing with technical expertise and inspiration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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.youtube.com/watch?v=ij6ByZqI67o&quot;&gt;Phase 1 demo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://drive.google.com/open?id=1c3UWwEb5rDmO6YEn5fU3qVbVW-opuUXb&quot;&gt;Presentation slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/gitlab-api-plugin&quot;&gt;GitLab API Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/baymac/gitlab-branch-source-plugin&quot;&gt;GitLab Branch Source Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/GitLab+API+Plugin&quot;&gt;GitLab API Plugin Wiki&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/57445&quot;&gt;Issue Tracker for Phase 1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://baymac.github.io&quot;&gt;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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/06/21/performance-testing-jenkins/</id>
<title>Micro-benchmarking Framework for Jenkins Plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-06-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/06/21/performance-testing-jenkins/" />
<author>
<name>abhyudayasharma</name>
</author>
<category term='jmh'></category>
<category term='plugins'></category>
<category term='benchmark'></category>
<category term='performance'></category>
<category term='developer'></category>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<summary>
I have been working on improving the performance of the Role Strategy Plugin as a part of my Google Summer of Code project.
Since there was no existing way to measure performance and do benchmarks on Jenkins Plugins,
my work for the first phase of the project was to create a framework for running
benchmarks in Jenkins plugins with a Jenkins instance available. To make our job a bit easier,
we chose Java Microbenchmark Harness for running these benchmarks. This
allows us to reliably measure performance of our time-critical functions and will help make Jenkins perform faster
for everyone.


The micro-benchmarking framework was recently released in the...
</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;I have been working on improving the performance of the Role Strategy Plugin as a part of my &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/role-strategy-performance/&quot;&gt;Google Summer of Code project&lt;/a&gt;.
Since there was no existing way to measure performance and do benchmarks on Jenkins Plugins,
my work for the first phase of the project was to create a framework for running
benchmarks in Jenkins plugins with a Jenkins instance available. To make our job a bit easier,
we chose &lt;a href=&quot;https://openjdk.java.net/jeps/230&quot;&gt;Java Microbenchmark Harness&lt;/a&gt; for running these benchmarks. This
allows us to reliably measure performance of our time-critical functions and will help make Jenkins perform faster
for everyone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The micro-benchmarking framework was recently released in the Jenkins Unit Test Harness &lt;a href=&quot;https://github.com/jenkinsci/jenkins-test-harness/releases/tag/jenkins-test-harness-2.50&quot;&gt;2.50&lt;/a&gt;.
The blog post below shows how to run benchmarks in your plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&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;The framework runs works by starting a temporary Jenkins instance for each fork of the JMH benchmark,
just like &lt;code&gt;JenkinsRule&lt;/code&gt; from Jenkins Test Harness. Benchmarks are run directly from your JUnit Tests which allows
you to fail builds on the fly and easily run benchmarks from your IDE, just like unit tests. You can easily
configure your benchmarks by either using your Java methods, or by using Jenkins &lt;a href=&quot;https://plugins.jenkins.io/configuration-as-code&quot;&gt;Configuration-as-Code plugin&lt;/a&gt;
and passing the path to your YAML file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To run benchmarks from your plugins, you need to do the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;bump up the minimum required Jenkins version to 2.60.3 or above&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bump Plugin-POM to a version ≥ 3.46 or manually upgrade to Jenkins Test Harness ≥ 2.51.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, to run the benchmarks, you need to have a benchmark runner that contains a &lt;code&gt;@Test&lt;/code&gt; so it can run
like a JUnit test. From inside a test method, you can use the &lt;code&gt;OptionsBuilder&lt;/code&gt; provided by JMH to
configure your benchmarks. 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;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BenchmarkRunner&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@Test&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;runJmhBenchmarks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;ChainedOptionsBuilder&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;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;OptionsBuilder&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;na&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Mode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;AverageTime&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;na&quot;&gt;forks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&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;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jmh-report.json&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Automatically detect benchmark classes annotated with @JmhBenchmark&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;BenchmarkFinder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getClass&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;findBenchmarks&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;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Runner&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;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;run&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;sample-benchmarks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sample-benchmarks&quot; /&gt;Sample benchmarks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, you can write your first benchmark:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Without any special setup&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;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@JmhBenchmark&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JmhStateBenchmark&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyState&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JmhBenchmarkState&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;nd&quot;&gt;@Benchmark&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;benchmark&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;MyState&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&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;c1&quot;&gt;// benchmark code goes here&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getJenkins&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setSystemMessage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello world&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Using Configuration as Code&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To use configuration as code, apart from the dependencies above you also need to add the following
to your &lt;code&gt;pom.xml&lt;/code&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;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.jenkins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;configuration-as-code&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.21&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;optional&amp;gt;&lt;/span&gt;true&lt;span class=&quot;nt&quot;&gt;&amp;lt;/optional&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;io.jenkins&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;configuration-as-code&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.21&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;classifier&amp;gt;&lt;/span&gt;tests&lt;span class=&quot;nt&quot;&gt;&amp;lt;/classifier&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class=&quot;nt&quot;&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;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;Now configuring a benchmark is as simple as providing path to your YAML file and specifying the class
containing the benchmark state.&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;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@JmhBenchmark&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SampleBenchmark&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyState&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CascJmhBenchmarkState&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nd&quot;&gt;@NonNull&lt;/span&gt;
        &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getResourcePath&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;config.yml&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;nd&quot;&gt;@NonNull&lt;/span&gt;
        &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getEnclosingClass&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SampleBenchmark&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&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;nd&quot;&gt;@Benchmark&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;benchmark&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;MyState&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&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;nc&quot;&gt;Jenkins&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;jenkins&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getJenkins&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// jenkins is configured and ready to be benchmarked.&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// your benchmark code goes here...&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;&lt;strong&gt;More Samples&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a part of this project, a few benchmarks have been created in the Role Strategy Plugin which show
configuring the instances for various situations. You can find them
&lt;a href=&quot;https://github.com/jenkinsci/role-strategy-plugin/tree/master/src/test/java/jmh/benchmarks&quot;&gt;here&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;running-benchmarks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-benchmarks&quot; /&gt;Running Benchmarks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Running benchmarks from Maven&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To easily run benchmarks from Maven, a Maven profile to run the benchmarks has been created
and is available starting Plugin-POM version 3.45. You can then run your benchmarks from the
command line using &lt;code&gt;mvn test -Dbenchmark&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Running benchmarks on ci.jenkins.io&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have your plugins hosted on ci.jenkins.io, you can easily run benchmarks directly from your Jenkinsfile
by using the &lt;code&gt;runBenchmarks()&lt;/code&gt; method after the &lt;code&gt;buildPlugin()&lt;/code&gt; step in your which is now available in
&lt;a href=&quot;https://github.com/jenkins-infra/pipeline-library&quot;&gt;Jenkins Pipeline library&lt;/a&gt;.
This function also accepts the path to your generated JMH benchmark reports as an optional
parameter and archives the benchmark results. Running benchmarks in pull request builds allows you to constantly
monitor the performance implications of a given change. For example, the Jenkinsfile from Role Strategy Plugin:&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;buildPlugin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;runBenchmarks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;jmh-report.json&#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&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;visualizing-benchmark-results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#visualizing-benchmark-results&quot; /&gt;Visualizing benchmark results&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Benchmark reports generated (in JSON) can be visualized using the either the &lt;a href=&quot;https://plugins.jenkins.io/jmh-report&quot;&gt;JMH Report Plugin&lt;/a&gt;
or by passing the benchmark reports to the &lt;a href=&quot;https://jmh.morethan.io&quot;&gt;JMH visualizer&lt;/a&gt; web service. As an example, here is
a visualized report of some benchmarks from the Role Strategy Plugin:&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/jmh-microbenchmark-framework/jmh-visualizer.png&quot; alt=&quot;Role Strategy Plugin benchmarks visualized by JMH Visualizer&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These improvements seen above were obtained through a small &lt;a href=&quot;https://github.com/jenkinsci/role-strategy-plugin/pull/81&quot;&gt;pull request&lt;/a&gt;
to the plugin and shows how even seemingly small changes can bring major performance improvements. Microbenchmarks
help to find these hot-spots and estimate the impact of changes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;some-tips-and-tricks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-tips-and-tricks&quot; /&gt;Some tips and tricks&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;Since &lt;code&gt;BenchmarkRunner&lt;/code&gt; class name in the example above does not qualify as a test according to Maven surefire plugin’s
naming conventions, the benchmarks will not interfere with your JUnit tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Benchmark methods need to be annotated by &lt;code&gt;@Benchmark&lt;/code&gt; for JMH to detect them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Classes containing benchmarks are found automatically by the &lt;code&gt;BenchmarkFinder&lt;/code&gt;
when annotated with &lt;code&gt;@JmhBenchmark&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A reference to the Jenkins instance is available through either &lt;code&gt;JmhBenchmarkState#getJenkins()&lt;/code&gt; or through
&lt;code&gt;Jenkins.getInstance()&lt;/code&gt; like you would otherwise do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;JmhBenchmarkState&lt;/code&gt; provides &lt;code&gt;setup()&lt;/code&gt; and &lt;code&gt;tearDown()&lt;/code&gt; methods which can be overridden to configure the
Jenkins instance according to your benchmark’s requirements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The benchmark builds on ci.jenkins.io are currently throttled because of the limited availability of &lt;code&gt;highmem&lt;/code&gt; nodes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The benchmark framework was made available in Jenkins Test Harness 2.50, it is recommended to use version &lt;a href=&quot;https://github.com/jenkinsci/jenkins-test-harness/releases/tag/jenkins-test-harness-2.51&quot;&gt;2.51&lt;/a&gt; as it includes some bug fixes.&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;links-and-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links-and-feedback&quot; /&gt;Links and Feedback&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any feedback, comments or questions, please feel free to reach out to me through either
the link:https://app.gitter.im/#/room/#jenkinsci_role-strategy-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Role Strategy Plugin Gitter chat&lt;/a&gt; or through
the &lt;a href=&quot;mailto:jenkinsci-dev@googlegroups.com&quot;&gt;Jenkins Developer Mailing list&lt;/a&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://drive.google.com/file/d/1gig6u64rzvSzGKjN_PTTXTkSXQ9Ah7E5/view?usp=sharing&quot;&gt;Presentation slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/lyfbmhQd0Ag?t=847&quot;&gt;Demo at Platform SIG meeting&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation for the micro-benchmark framework:&lt;/p&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/jenkins-test-harness/blob/master/docs/jmh-benchmarks.adoc&quot;&gt;Writing benchmarks (Jenkins Test Harness)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/blob/master/docs/benchmarks/jmh-benchmarks.md&quot;&gt;Preconfiguring benchmarks using JCasC&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/plugin-pom#running-benchmarks&quot;&gt;Running benchmarks using Plugin POM profile&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/pipeline-library#runbenchmarks&quot;&gt;Build Step for running benchmarks on ci.jenkins.io&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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/2019/06/03/DevOps-World-Jenkins-World-2019-San-Francisco-Agenda-is-Live/</id>
<title>DevOps World-Jenkins World 2019 San Francisco: Agenda is Live</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-06-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/06/03/DevOps-World-Jenkins-World-2019-San-Francisco-Agenda-is-Live/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='devopsworldjenkinsworld2019'></category>
<summary>
We are a little over two months away from the largest Jenkins gathering of the year.  From Jenkins users, to maintainers, contributors, mentors and those new to Jenkins this event will have something for everyone.


This year’s DevOps World - Jenkins World 2019 San Francisco has moved to a larger venue to facilitate the growth. From August 12 - 15, 2019 the event will take place at the Moscone West Center.  The event boasts 100+ sessions, and will offer training, hands-on workshops, onsite certification, contributor summit and much more.  Conference attendees can expect to be inspired while learning...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock center center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/dwjw-2019/2019-dwjw-email-san-fran-rev.png&quot; alt=&quot;2019 dwjw email san fran&quot; height=&quot;256&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are a little over two months away from the largest Jenkins gathering of the year.  From Jenkins users, to maintainers, contributors, mentors and those new to Jenkins this event will have something for everyone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year’s &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;&lt;strong&gt;DevOps World - Jenkins World 2019 San Francisco&lt;/strong&gt;&lt;/a&gt; has moved to a larger venue to facilitate the growth. From August 12 - 15, 2019 the event will take place at the Moscone West Center.  The event boasts 100+ sessions, and will offer training, hands-on workshops, onsite certification, contributor summit and much more.  Conference attendees can expect to be inspired while learning the latest innovations from industry leaders. Attendees will learn the value that digital transformation has in delivering software more efficiently, more quickly and with higher quality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to announce most of the agenda for DevOps World Jenkins World San Francisco is now live. We will continue to fill out the agenda with more sessions, trainings/workshops, and activities. Below is a small sampling of sessions from some of our favorite Jenkins contributors:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-configuration-as-code-try-it-start-contributing-ewelina-wilkosz&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-configuration-as-code-try-it-start-contributing-ewelina-wilkosz&quot; /&gt;Jenkins Configuration as Code: try it &amp;amp; start contributing! - &lt;a href=&quot;https://github.com/ewelinawilkosz&quot;&gt;Ewelina Wilkosz&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Jenkins Configuration as Code&lt;/a&gt; is an open source Jenkins plugin that allows users to keep complete Jenkins configuration in a simple configuration file (yaml format). In the talk, I’ll briefly present the history of the plugin, the vision for the future and current status. Then I’ll move to the demo section where I’ll show how easy it is to configure and run Jenkins with the help of the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;thinking-about-jenkins-security-mark-waite-wadeck-follonier&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thinking-about-jenkins-security-mark-waite-wadeck-follonier&quot; /&gt;Thinking about Jenkins Security - &lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite &amp;amp; Wadeck Follonier&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins security concepts, authorization, authentication and auditing, secure builds, agent security, configuration and administration security, auditing, and security best practices.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;docker-and-jenkins-as-code-dr-oleg-nenashev&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-and-jenkins-as-code-dr-oleg-nenashev&quot; /&gt;Docker and Jenkins [as Code] - &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Dr. Oleg Nenashev&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Configuration as Code plugin is a new milestone which enables managing Jenkins configurations via YAML. Together with Docker, this plugin offers many ways to produce ready-to-fly Jenkins images for any environments. In my talk, I will describe official controller and agent images offered by the Jenkins project. What’s inside them? How do you configure images with JCasC and Groovy hooks? How do you use these approaches together? And, finally, how do you simplify packaging of custom Jenkins images and define the entire system [as code]?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;can-jenkins-be-the-engine-of-mobile-devops-shashikant-jagtap&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#can-jenkins-be-the-engine-of-mobile-devops-shashikant-jagtap&quot; /&gt;Can Jenkins be the Engine of Mobile DevOps? - &lt;a href=&quot;https://github.com/shashikantjagtap&quot;&gt;Shashikant Jagtap&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this talk, we will explore the following topics:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How mobile DevOps is different than web DevOps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Challenges in mobile DevOps ( iOS and Android)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How Jenkins fits in mobile DevOps and CI/CD pipelines&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What Jenkins misses for mobile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How we can make Jenkins better for mobile apps&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;creating-a-cicd-pipeline-for-your-shared-libraries-roderick-randolph&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-a-cicd-pipeline-for-your-shared-libraries-roderick-randolph&quot; /&gt;Creating a CI/CD Pipeline for Your Shared Libraries - &lt;a href=&quot;https://github.com/roderickrandolph&quot;&gt;Roderick Randolph&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At Capital One we run tens of thousands of CI/CD pipelines on Jenkins, leveraging the Jenkins Pipeline shared libraries extension to enable code reuse and decrease time to market for dev teams. A code change to our shared library goes live immediately and is consumed the next time a team triggers their project’s pipeline. So, why do we have such high confidence that a code change to our library won’t break a team’s pipeline? The answer: we’ve developed a fully automated CI/CD pipeline for our shared library.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this talk, you will learn how to create a fully automated pipeline for your shared libraries including how to develop tests, create canary releases, monitor for issues and quickly rollback changes to your shared library to achieve rapid delivery while minimizing any impact on dev teams.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-jenkins-builds-and-delivers-jenkins-in-the-cloud-brian-benz-tyler-croy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-jenkins-builds-and-delivers-jenkins-in-the-cloud-brian-benz-tyler-croy&quot; /&gt;How Jenkins Builds and Delivers Jenkins in the Cloud - &lt;a href=&quot;https://github.com/bbenz&quot;&gt;Brian Benz&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://github.com/rtyler&quot;&gt;Tyler Croy&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Want to know how Jenkins builds Jenkins? Catch this session to see the real-life implementation of Jenkins’ development (at &lt;a href=&quot;https://ci.jenkins.io&quot;&gt;ci.jenkins.io&lt;/a&gt;) and delivery infrastructure in the cloud as it evolved from a mix of platforms to multi-platform VMs, containers and Kubernetes on Microsoft Azure.  Expect a frank discussion of issues that were encountered along the way, how the architecture has evolved and what’s on the roadmap.  We’ll share important tips and tricks for implementing your own Jenkins infrastructure on any cloud, based on Jenkins’ own implementation experience.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;declarative-pipeline-2019-tips-tricks-and-whats-next-liam-newman&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#declarative-pipeline-2019-tips-tricks-and-whats-next-liam-newman&quot; /&gt;Declarative Pipeline 2019: Tips, Tricks and What’s Next - &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Are you using Declarative Pipeline? Are you considering using them? Are you just curious? Well, we’re going to help you get more out of Declarative Pipeline with less complexity and less effort. We’ll walk through some best practices, point out some tricks you might not have known, warn you off some common mistakes, review what’s changed in the last year and give you a preview of what we’re working on for Declarative Pipeline going forward.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;say-goodbye-to-hello-world-say-hello-to-real-world-delivery-pipelines-brian-benz-jessica-deen&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#say-goodbye-to-hello-world-say-hello-to-real-world-delivery-pipelines-brian-benz-jessica-deen&quot; /&gt;Say Goodbye to Hello World, Say Hello to Real World Delivery Pipelines - &lt;a href=&quot;https://github.com/bbenz&quot;&gt;Brian Benz&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://github.com/jldeen&quot;&gt;Jessica Deen&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Are you tired of &quot;Hello World&quot; and hypothetical demos? So are we! In this code-heavy, deeply technical session, you’ll learn more than just tips and tricks.  You’ll learn best practices and how to start from absolute zero. Whether you’re using Jenkins, Azure DevOps, a mixture of the two, or another CI/CD tool, you’ll learn how to create multiple build and release pipelines using real world code hosted on open source platforms such as GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the complete agenda see &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;&lt;strong&gt;DevOps World - Jenkins World 2019 San Francisco&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to use discount code &lt;strong&gt;JWFOSS&lt;/strong&gt; for a 30% discount off your &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;pass&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hope to see you there!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/05/30/becoming-contributor-newbie-tickets/</id>
<title>Becoming a Jenkins contributor: Newbie-friendly tickets</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-05-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/05/30/becoming-contributor-newbie-tickets/" />
<author>
<name>romenrg</name>
</author>
<category term='jenkins'></category>
<category term='community'></category>
<category term='developer'></category>
<category term='contributing'></category>
<category term='newcomer'></category>
<summary>
Two months ago I published an introductory article on
the journey of becoming a Jenkins contributor. In that first article, the jenkins.io site was reviewed, learning about
the multiple ways in which we can participate and contribute. Then, a first&#8212;&#8203;basic&#8212;&#8203;contribution I made to the site
repository was described.


Now, in this new article we will be exploring more advanced contributions, committing code to the actual Jenkins core.


Getting started with tickets and processes


Beginners guide to contributing and Jenkins Jira

Reviewing the developer section in jenkins.io is probably the best starting point, and a
reference link to keep handy. The beginners guide to contributing to Jenkins
can also be...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Two months ago I published an &lt;a href=&quot;https://www.jenkins.io/blog/2019/03/29/becoming-contributor-intro/&quot;&gt;introductory article&lt;/a&gt; on
the journey of becoming a Jenkins contributor. In that first article, the jenkins.io site was reviewed, learning about
the multiple ways in which we can participate and contribute. Then, a first—​basic—​contribution I made to the site
repository was described.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, in this new article we will be exploring more advanced contributions, committing code to the actual Jenkins core.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;getting-started-with-tickets-and-processes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started-with-tickets-and-processes&quot; /&gt;Getting started with tickets and processes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;beginners-guide-to-contributing-and-jenkins-jira&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#beginners-guide-to-contributing-and-jenkins-jira&quot; /&gt;Beginners guide to contributing and Jenkins Jira&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Reviewing the &lt;a href=&quot;https://www.jenkins.io/doc/developer/&quot;&gt;developer section&lt;/a&gt; in jenkins.io is probably the best starting point, and a
reference link to keep handy. The &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beginners+Guide+to+Contributing&quot;&gt;beginners guide to contributing to Jenkins&lt;/a&gt;
can also be useful, since it points to different repositories, tools (such as the issue tracker) and governance documents.
Besides, it describes best practices for commit messages, code style conventions, PR guidelines, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once we get a general understanding of the former and want to actually start coding, we may get stuck trying to come up
with something to work on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Visiting the &lt;a href=&quot;https://issues.jenkins.io/projects/JENKINS/issues&quot;&gt;Jenkins issue tracker&lt;/a&gt;, feels like the natural next
step, since it is full of potential bugs and enhancements that have already been reported by the community. However, it
is quite easy to feel overwhelmed by the possibilities listed there. Bear in mind that in a 10+-year-old project like
this, most of the things that are reported are tricky for a newcomer to work on. For that reason, filtering by
&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20JENKINS%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22%2C%20Reopened)%20AND%20component%20%3D%20core%20AND%20labels%20in%20(newbie-friendly)&quot;&gt;newbie-friendly tickets&lt;/a&gt; is probably
the best idea.&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/2019-05-30-becoming-contributor/list-newbie-tickets.png&quot; alt=&quot;list newbie tickets&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Screenshot displaying the list of newbie-friendly tickets in the Jenkins Jira&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;selecting-a-ticket&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#selecting-a-ticket&quot; /&gt;Selecting a ticket&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my case, I spent some time reviewing the &lt;code&gt;newbie-friendly&lt;/code&gt; tickets, until &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/56477&quot;&gt;I found one&lt;/a&gt;
that seemed interesting to me and also looked like something I would be able to fix:&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/2019-05-30-becoming-contributor/jenkins-newbie-jira-ticket-selected.png&quot; alt=&quot;jenkins newbie jira ticket selected&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Screenshot of the ticket I decided to work on&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;processes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#processes&quot; /&gt;Processes&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this stage, when we have decided to take ownership of a ticket, it’s a good practice to let the rest of the community
know that we are planning to start working on it. We can do so easily, by assigning the ticket to ourselves (see the
“&lt;em&gt;Assign&lt;/em&gt;” button below the ticket summary).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Assigning the ticket to ourselves in the Jenkins Jira will allow any other contributors to know that we are planning to
take care of the ticket; and in case they are also interested in contributing to it, they will know who to reach if they
want to coordinate work or ask for status. That said, it is worth mentioning that assigning a ticket to yourself does
not mean that other contributors cannot work on it from then onwards. Jenkins is an open-source project and anyone is
welcome to create their own PRs, so anybody can propose their own solution to the ticket. But as you can guess, if the
ticket is assigned to somebody, most people will probably reach the assignee before starting to work on it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Related to the former, it is also important to bear in mind that we should not postpone work on the ticket for too long
once we have assigned the ticket to ourselves. Other potential contributors might be ignoring the ticket because they
see yourself assigned to it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once we are about to actually start working on the ticket, it is also a good practice to click the “&lt;em&gt;Start Progress&lt;/em&gt;”
button. This action will change the status to “&lt;em&gt;In progress&lt;/em&gt;”, signaling to the community that we are currently working
on this particular ticket.&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;setting-up-the-necessary-stuff-on-our-computer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-up-the-necessary-stuff-on-our-computer&quot; /&gt;Setting up the necessary stuff on our computer&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configuring-installing-and-testing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuring-installing-and-testing&quot; /&gt;Configuring, installing and testing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As described in the &lt;a href=&quot;https://www.jenkins.io/blog/2019/03/29/becoming-contributor-intro/&quot;&gt;first article of this journey&lt;/a&gt;, the
initial step to start contributing to a particular repository is to fork it to our GitHub account, and then clone it to
our local computer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As usual, in the Jenkins core repository the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/CONTRIBUTING.md&quot;&gt;CONTRIBUTING file&lt;/a&gt;
describes the necessary steps to get the repository working locally. This includes installing the necessary development
tools: Java Development Kit (&lt;em&gt;&lt;a href=&quot;https://adoptopenjdk.net/&quot;&gt;OpenJDK&lt;/a&gt; is the recommended choice&lt;/em&gt;), Maven and any IDE supporting
Maven projects. Note that instructions to install JDK and Maven are linked in the contributing guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once we have all the necessary tools installed and configured, we are ready to &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/CONTRIBUTING.md#building-and-debugging&quot;&gt;build Jenkins locally&lt;/a&gt;
and also to &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/CONTRIBUTING.md#testing-changes&quot;&gt;run tests&lt;/a&gt;.&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-down-to-business&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-down-to-business&quot; /&gt;Getting down to business&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reviewing-ticket-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reviewing-ticket-details&quot; /&gt;Reviewing ticket details&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that I was ready to start working on the ticket, I had to review it in more detail, to fully understand the problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The description of the ticket I was planning to work on included two links. The first one was to
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/3715#issuecomment-470873111&quot;&gt;a screenshot that showed the actual bug&lt;/a&gt;. It showed
how several non-compatible plugins were being selected when clicking “&lt;em&gt;All&lt;/em&gt;”, even though the intended behavior was to
only select the compatible plugins. The second link was &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/core/src/main/resources/hudson/PluginManager/table.jelly#L108…​L120&quot;&gt;a reference to a code fragment&lt;/a&gt;
that showed other validations that had to be taken into account when checking if a plugin update was compatible or not
with the current installation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reproducing-the-issue-locally&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reproducing-the-issue-locally&quot; /&gt;Reproducing the issue locally&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even though I had now understood the issue in better detail, I had not seen it myself live yet, so it seemed to me that
the next logical step was to reproduce it locally.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To reproduce the issue locally in our computer, we can either use the local &lt;code&gt;war&lt;/code&gt; file that we can generate by
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/CONTRIBUTING.md#building-and-debugging&quot;&gt;building Jenkins from the source code&lt;/a&gt;
or we can download the &lt;a href=&quot;https://www.jenkins.io/download/&quot;&gt;latest Jenkins version&lt;/a&gt; available and run it locally. When I worked
on this ticket, the latest available version was &lt;code&gt;2.172&lt;/code&gt; and, when I built if from the sources I saw version &lt;code&gt;2.173-SNAPSHOT&lt;/code&gt;,
which was the next version, in which the community was already working on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In general it is a good idea to reproduce bugs locally, not only to get a better understanding, but also to make sure
they are actual issues. It could always be an issue happening only on the reporter’s end (e.g. some user misconfiguration).
Or it could be a ticket referencing an old issue that has been fixed already. This latest possibility didn’t sound that
strange to me, since the ticket was one month old. It could have been handled by someone else in the meantime, without
noticing the ticket existed. Or the contributor might have forgotten to update the ticket in the issue tracker after the
fix was committed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, for all the reasons above, I ran the latest Jenkins version locally. From a terminal, I went to the
folder in which the war file was placed, and ran &lt;code&gt;java -jar jenkins.war&lt;/code&gt;, which starts Jenkins locally on &lt;a href=&quot;http://localhost:8080&quot; class=&quot;bare&quot;&gt;http://localhost:8080&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the home page I navigated to the Plugin Manager (clicking the “&lt;em&gt;Manage Jenkins&lt;/em&gt;” link in the left hand side and
then selecting “&lt;em&gt;Manage Plugins&lt;/em&gt;” in the list).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Manage Plugins page, the list of plugin updates appears. In my case, since I re-used an old &lt;code&gt;JENKINS_HOME&lt;/code&gt;
from an older installation, several plugins showed up in the list, requiring updates. That allowed me to test the behavior
that was supposed to be failing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I clicked on the “Select all” option at the bottom, this is what I got:&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/2019-05-30-becoming-contributor/jenkins-plugin-manager-updates-selected-bottom.png&quot; alt=&quot;jenkins plugin manager updates selected bottom&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. Screenshot showing the error, reproduced locally, after clicking “Select All”&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As it had been reported in the ticket, the behavior was inconsistent. In a previous version, the behavior of the “&lt;em&gt;All&lt;/em&gt;”
selector had been changed (with the best intent), aiming to only check the compatible plugins. However, as can be seen
in the screenshot, the behavior was not the expected one. Now, neither “all” nor “only compatible” plugins were being
selected, since some plugins with compatibility issues were also being checked, unintentionally.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;figuring-out-a-fix&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#figuring-out-a-fix&quot; /&gt;Figuring out a fix&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When reading the conversation in the original PR in which the behavior of the “&lt;em&gt;All&lt;/em&gt;” selector had been changed, I saw a
suggestion of having a separate “&lt;em&gt;Compatible&lt;/em&gt;” selector, thus leaving the “&lt;em&gt;All&lt;/em&gt;” selector with the traditional behavior.
I liked the idea, so I decided to include it as part of my proposed change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this stage, I had a clear picture of the different things I needed to change. These included: 1) The UI, to add a new
selector for “Compatible” plugins only, 2) the JS code that applied the changes to the interface when the selectors were
clicked and 3) probably the back-end method that was determining if a plugin was compatible or not.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;applying-the-change&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#applying-the-change&quot; /&gt;Applying the change&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As usual, and as it is also recommended in the contributing guidelines, I created a separate feature branch to work on
the ticket.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After reviewing the code, I spent some time figuring out which pieces I needed to change, both in the back-end and also
in the front-end. For more details about the changes I had to make, you can take a look at the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/3985/files&quot;&gt;changes in my PR&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a basic summary, I learned that the classic Jenkins UI was built using &lt;a href=&quot;https://commons.apache.org/proper/commons-jelly/tutorial.html&quot;&gt;Jelly&lt;/a&gt;
and, after understanding its basics, I modified the &lt;code&gt;index.jelly&lt;/code&gt; file to include the new selector, assigning the
function that checked the compatible plugins to this new selector, and re-using the existing “toggle” function to set
all checkboxes to true in the case of “&lt;em&gt;All&lt;/em&gt;”. I also had to modify the behavior of the &lt;code&gt;checkPluginsWithoutWarnings&lt;/code&gt;
JavaScript function, to un-check the incompatible ones, since there was now an actual “&lt;em&gt;All&lt;/em&gt;” selector that was not there
previously, and that un-check case was not being taken into account. Then, I created a new back-end Java method
&lt;code&gt;isCompatible&lt;/code&gt;, inside the &lt;code&gt;UpdateSite.java&lt;/code&gt; class, which now calls all the different methods that check different
compatibilities and returns the combined boolean result. For this change, I included an automated test to verify the
correct behavior of the method, contributing to the test coverage of the project. Finally, I modified the &lt;code&gt;table.jelly&lt;/code&gt;
file to call the new back-end method from the UI, replacing the existing one that was not taking all cases into account.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, the change involved touching different technologies, but even if you face a similar situation in which
you are not familiar with some of them, my advice would be carry on, don’t let that stop you. As software engineers, we
should &lt;a href=&quot;https://github.com/romenrg/evergreen-skills-developers&quot;&gt;focus on our evergreen skills&lt;/a&gt;, rather than on knowing
specific technologies; adapting to whatever framework we have to use at a given moment, learning whatever we need about
the new technology to complete the task and applying cross-framework principles and best practices to provide a quality
solution.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;result&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#result&quot; /&gt;Result&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the changes described above, the resulting UI includes a new option, and the corresponding behaviors of the three
selectors work as expected:&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/2019-05-30-becoming-contributor/fixed-select-compatible.png&quot; alt=&quot;fixed select compatible&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. Screenshot of the new version, displaying the behavior achieved by clicking the new “Compatible” selector&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;publishing-the-change&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#publishing-the-change&quot; /&gt;Publishing the change&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;submitting-a-pull-request&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#submitting-a-pull-request&quot; /&gt;Submitting a Pull Request&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the contributing guidelines of the Jenkins core repository there is also a section about &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/CONTRIBUTING.md#proposing-changes&quot;&gt;proposing changes&lt;/a&gt;,
which describes the necessary steps that have to be followed in order to create a Pull Request (PR) with our change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Furthermore, there is a &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/.github/PULL_REQUEST_TEMPLATE.md&quot;&gt;PR template&lt;/a&gt; in
the repository, which will be loaded automatically when creating a new PR and that will serve as a basis for us to provide
the necessary information for the reviewers. We are expected to: include a link to the ticket, list the proposed changelog
entries describing our changes, complete the submitter checklist and add mentions to the desired reviewers (if any).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my case, &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/3985#issue-270291185&quot;&gt;I followed the template when creating my PR&lt;/a&gt;,
completing all sections. I linked the Jira ticket, provided two proposed changelog entries, completed the submitter
checklist and added three desired reviewers (explaining why I thought their reviews would be valuable). I also linked
the original PR that was referenced in the ticket, to provide further context.&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/2019-05-30-becoming-contributor/pr-created.png&quot; alt=&quot;pr created&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 5. Screenshot of the PR I submitted&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-approve-and-merge-process&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-approve-and-merge-process&quot; /&gt;The approve and merge process&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As stated in the contributing guidelines, typically two approvals are needed for the PR to be merged; and it can take
from a few days to a couple of weeks to get them. Sometimes, one approval from a reviewer and a 1-week delay without
extra reviews is considered enough to set the PR as &lt;code&gt;ready-for-merge&lt;/code&gt;. However, both the time-to-merge and the number
of approvals necessary might vary, depending on the complexity of the change or the area of Jenkins core that it affects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the necessary approvals have been received, a Jenkins core maintainer will set the PR as  &lt;code&gt;ready-for-merge&lt;/code&gt;, which
will lead to it being merged into the master branch when one of the following releases are being prepared.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my case, I received a review by Daniel (the reporter of the ticket and one of my “desired reviewers”) the very day I
submitted the PR (April 14th). He made several very useful suggestions, which led to changes from my side. After those
changes, Daniel made minor remarks and my PR got another review, which was its first approval. After a week had passed
without further news, I added the remaining minor suggestions from Daniel and a few days later received another approval,
to which Daniel’s final approval was added, leading the PR to be labeled &lt;code&gt;ready-for-merge&lt;/code&gt;, being later merged the same
day (April 26th).&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/2019-05-30-becoming-contributor/pr-merged.png&quot; alt=&quot;pr merged&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 6. Screenshot of the final state of the PR, after being merged&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#release&quot; /&gt;Release&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For every new release, repository maintainers will select a set of PRs that have already been labeled &lt;code&gt;ready-for-merge&lt;/code&gt;,
merge them to master, prepare changelogs (often using the suggestions included in the PRs by the authors) and proceed with
the creation of the new release. There is no additional action required from Pull Request authors at this point.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every week a new version of Jenkins is released, so when your PR is merged, your changes will—​most likely—​become part
of the following weekly release of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Eventually, your changes will also reach the &lt;a href=&quot;https://www.jenkins.io/download/lts/&quot;&gt;Long-term support (LTS) release&lt;/a&gt;, which is
a different release line, aimed for more conservative users. This release line gets synced with the weekly release by
picking, every 12 weeks, a relatively recent weekly release as baseline for the new LTS release. In between, intermediate
LTS releases are created only to include important bug fixes, cherry-picked from the weekly releases. New features are
typically delayed until the next baseline for the LTS release is defined.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regarding the example described in this post, &lt;strong&gt;it was released in Jenkins &lt;code&gt;2.175&lt;/code&gt;&lt;/strong&gt; (weekly release), soon after being
merged. And will probably be included in the next LTS, which should be released next month (June 2019).&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;done&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#done&quot; /&gt;Done!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And that’s it! We have now covered the whole lifecycle of a new proposed change to Jenkins core. We have reviewed the
process from the very beginning, picking a ticket from the Jenkins issue tracker; all the way to the end, having our
change released in a new Jenkins version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have never contributed but are willing to do so, I hope this article motivates you to go back to the list of
&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20JENKINS%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22%2C%20Reopened)%20AND%20component%20%3D%20core%20AND%20labels%20in%20(newbie-friendly)&quot;&gt;&lt;code&gt;newbie-friendly&lt;/code&gt; tickets&lt;/a&gt;, find one that looks interesting to you, and follow the steps described above, until you see
your own change released in a new Jenkins version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remember, don’t try to solve a complicated issue as your first ticket, there are plenty of easier ways in which you can
contribute, and every little helps!&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/2019/05/22/outreachy-audit-log-project/</id>
<title>Audit Logging in Jenkins: An Outreachy Project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-05-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/05/22/outreachy-audit-log-project/" />
<author>
<name>jvz</name>
</author>
<category term='community'></category>
<category term='logging'></category>
<category term='outreachy'></category>
<summary>
The Audit Log Plugin for Jenkins is an in development project to integrate standardized audit logging trails to various core actions in Jenkins.
This project integrates the recently released Apache Log4j Audit library to allow for a vast array of possible audit logging destinations and configuration.
We began this plugin not long after Log4j Audit 1.0.0 was released last year by partnering with Outreachy where we mentored two interns who laid the foundations of the project.
This year, we applied to Outreachy again to continue the project, and we were able to accept two more Outreachy interns: Aarthi Rajaraman and Gayathri Rajendar.
Both have...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin&quot;&gt;Audit Log Plugin&lt;/a&gt; for Jenkins is an in development project to integrate standardized audit logging trails to various core actions in Jenkins.
This project integrates the recently released &lt;a href=&quot;https://logging.apache.org/log4j-audit/latest/&quot;&gt;Apache Log4j Audit&lt;/a&gt; library to allow for a vast array of possible audit logging destinations and configuration.
We began this plugin not long after Log4j Audit 1.0.0 was released last year by partnering with &lt;a href=&quot;https://www.outreachy.org/&quot;&gt;Outreachy&lt;/a&gt; where we &lt;a href=&quot;https://www.jenkins.io/blog/2018/12/10/outreachy-audit-log-plugin/&quot;&gt;mentored two interns&lt;/a&gt; who laid the foundations of the project.
This year, we applied to Outreachy again to continue the project, and we were able to accept two more Outreachy interns: &lt;a href=&quot;https://github.com/aarthira&quot;&gt;Aarthi Rajaraman&lt;/a&gt; and &lt;a href=&quot;https://github.com/gayathrirajendar&quot;&gt;Gayathri Rajendar&lt;/a&gt;.
Both have already been adding new features and improving the plugin over the past couple months, and the internship officially began on 20 May.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This round has some ambitious goals of various features and documentation we wish to create.
After having added audit log support for several built-in event listeners in Jenkins around the lifecycle of projects, builds, nodes, and authentication during both the previous internship and the applications to this one, we would like to accomplish the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Make a &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/milestone/1&quot;&gt;1.0 release&lt;/a&gt; of the plugin for the Jenkins Update Center. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/34&quot;&gt;#34&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add documentation on supported audit log types and configuration options. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/40&quot;&gt;#40&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add audit logs for credential usage and lifecycle events. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/35&quot;&gt;#35&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/36&quot;&gt;#36&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add audit logs for user property lifecycle events. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/37&quot;&gt;#37&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Define or document an API for other plugins to use to define and log their own audit events. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/30&quot;&gt;#30&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure audit log events use consistent vocabulary with the Jenkins UI. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/33&quot;&gt;#33&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add an audit log event recorder/viewer comparable to the Jenkins logger recorder administrative UI. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/32&quot;&gt;#32&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add support for configuring a syslog-compatible log server for writing audit logs. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/29&quot;&gt;#29&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add support for configuring a relational database such as &lt;a href=&quot;https://www.postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt; for writing audit logs. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/31&quot;&gt;#31&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improve unit test coverage and pay down technical debt. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/38&quot;&gt;#38&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Begin discovery on alternative ways to manage the underlying Log4j Core configuration such as via the upcoming integration with Spring Cloud Configuration. &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin/issues/39&quot;&gt;#39&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;In the future, we hope to participate with more projects and mentors.
Going on concurrently with Outreachy right now is &lt;a href=&quot;https://www.jenkins.io/blog/2019/03/04/gsoc2019-announcement/&quot;&gt;Google Summer of Code 2019&lt;/a&gt; where we are mentoring several more projects and students.
Please extend a warm welcome to all our new contributors and community members from Outreachy and GSoC!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/05/11/docs-sig-announcement/</id>
<title>Jenkins Documentation Special Interest Group</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-05-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/05/11/docs-sig-announcement/" />
<author>
<name>markewaite</name>
</author>
<category term='documentation'></category>
<category term='docs'></category>
<category term='community'></category>
<summary>
We&#8217;re pleased to announce the formation of the Jenkins Documentation Special Interest Group.
The Docs SIG encourages contributors and external communities to create and review Jenkins documentation.


See the Special Interest Group Overview for more details and plans.


How can I help?


The Jenkins Documentation SIG would love to have your help with:




reviewing and fixing open bug reports


reviewing Jenkins documentation pull requests


reviewing Jenkins X documentation pull requests






How can I fix a documentation bug?


Instructions for contributing to the Jenkins documentation are in the CONTRIBUTING file of the site repository.
Follow the instructions in that file and submit pull requests for review.


Instructions for contributing to the Jenkins...
</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/logos/needs-you/Jenkins_Needs_You-02.png&quot; alt=&quot;Jenkins Needs You&quot; height=&quot;256&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re pleased to announce the formation of the Jenkins Documentation Special Interest Group.
The Docs SIG encourages contributors and external communities to create and review Jenkins documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.jenkins.io/sigs/docs&quot;&gt;Special Interest Group Overview&lt;/a&gt; for more details and plans.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-can-i-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-i-help&quot; /&gt;How can I help?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Documentation SIG would love to have your help with:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;reviewing and fixing &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20%22Jenkins%20Website%22%20AND%20status%20!%3D%20Done&quot;&gt;open bug reports&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;reviewing &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pulls&quot;&gt;Jenkins documentation pull requests&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;reviewing &lt;a href=&quot;https://github.com/jenkins-x/jx-docs/pulls&quot;&gt;Jenkins X documentation pull requests&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;how-can-i-fix-a-documentation-bug&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-i-fix-a-documentation-bug&quot; /&gt;How can I fix a documentation bug?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instructions for contributing to the Jenkins documentation are in the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc#getting-started&quot;&gt;CONTRIBUTING file&lt;/a&gt; of the site repository.
Follow the instructions in that file and submit pull requests for review.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instructions for contributing to the Jenkins X documentation are on the &lt;a href=&quot;https://jenkins-x.io/community/documentation/&quot;&gt;Jenkins X documentation site&lt;/a&gt;.
Follow the instructions in that file and submit pull requests for review.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-can-i-evaluate-a-pull-request&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-i-evaluate-a-pull-request&quot; /&gt;How can I evaluate a pull request?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pull requests for the Jenkins project are reviewed in the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/pulls&quot;&gt;Jenkins documentation repository&lt;/a&gt;.
Log in to GitHub with your credentials and add your review comments to pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pull requests for the Jenkins X project are reviewed in the &lt;a href=&quot;https://github.com/jenkins-x/jx-docs/pulls&quot;&gt;Jenkins X documentation repository&lt;/a&gt;.
Login to GitHub with your credentials and add your review comments to pull requests.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/05/09/templating-engine/</id>
<title>Introducing the Jenkins Templating Engine!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-05-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/05/09/templating-engine/" />
<author>
<name>steven-terrana</name>
</author>
<category term='general'></category>
<category term='pipeline'></category>
<category term='plugin'></category>
<category term='pipeline-authoring'></category>
<summary>
Implementing DevSecOps practices at the enterprise scale is challenging. With multiple programming languages, automated testing frameworks, and security compliance tools being used by different applications within your organization, it becomes difficult to build and maintain pipelines for each team.


Most pipelines are going to follow the same generic workflow regardless of which specific tech stack is employed by an application.  The Templating Engine Plugin (abbreviated as JTE for Jenkins Templating Engine) allows you to capture this efficiency by creating tool-agnostic, templated workflows to be reused by every team.


As technology consultants with clients in both the public and private sectors, at...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Implementing DevSecOps practices at the enterprise scale is challenging. With multiple programming languages, automated testing frameworks, and security compliance tools being used by different applications within your organization, it becomes difficult to build and maintain pipelines for each team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most pipelines are going to follow the same generic workflow regardless of which specific tech stack is employed by an application.  The &lt;a href=&quot;https://plugins.jenkins.io/templating-engine&quot;&gt;Templating Engine Plugin&lt;/a&gt; (abbreviated as JTE for Jenkins Templating Engine) allows you to capture this efficiency by creating tool-agnostic, templated workflows to be reused by every team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As technology consultants with clients in both the public and private sectors, at Booz Allen we found ourselves building DevSecOps pipelines from scratch for every new project.  Through developing the Jenkins Templating Engine, we’ve seen pipeline development decrease from months to days now that we can reuse tool integrations while bringing a new level of governance to Jenkins pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;pipeline-templating&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-templating&quot; /&gt;Pipeline Templating&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Organizations benefit from letting application developers focus on what they do best: building applications. Supporting this means building a centralized DevOps team responsible for maintaining platform infrastructure and creating CI/CD pipelines utilized by development teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the rise of microservice-based architectures, a centralized DevOps teams can support many different development teams simultaneously; all of whom may be leveraging different programming languages and automated testing tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the tools may differ between development teams, the workflow is often the same: unit test, static code analysis, build and publish an artifact, deploy it, and then perform different types of testing against the deployed application.&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;
The Templating Engine Plugin allows you to remove the Jenkinsfile from each repository by defining a common workflow for teams to inherit.  Instead of an entire pipeline definition in each repository, teams supply a configuration file specifying which tools to use for the workflow.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jte-in-action&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jte-in-action&quot; /&gt;JTE in Action&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s walk through a bare bones example to demonstrate the reusability of templates:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Example Pipeline Template:&lt;/div&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;unit_test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;static_code_analysis&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;Templates leverage &lt;em&gt;Steps&lt;/em&gt; contributed by &lt;em&gt;Libraries&lt;/em&gt; to outline a workflow teams must implement.  While a template does get executed just like any other &lt;code&gt;Jenkinsfile&lt;/code&gt; (meaning that the standard scripted and declarative syntax is supported), the goal of a template should be to read like plain English and avoid any technical implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Leveraging templates in this way lets you separate the &lt;strong&gt;business logic&lt;/strong&gt; (what should happen when) of your pipeline from the
&lt;strong&gt;technical implementation&lt;/strong&gt; (what’s actually going to happen).  The result of this is a CI/CD pipeline that’s proven to be
significantly easier to manage when supporting multiple teams simultaneously.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The steps outlined by this template (&lt;code&gt;unit_test&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;, and &lt;code&gt;static_code_analysis&lt;/code&gt;) have been named generically on purpose. This way teams can specify &lt;em&gt;different&lt;/em&gt; libraries to use while sharing the &lt;em&gt;same&lt;/em&gt; pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;implementing-the-template&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementing-the-template&quot; /&gt;Implementing the Template&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Implementing a shareable pipeline with the Templating Engine requires a few key components:&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;&lt;strong&gt;Pipeline Template&lt;/strong&gt;: &lt;em&gt;Outline the workflow to be performed&lt;/em&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Libraries&lt;/strong&gt;: &lt;em&gt;Provide technical implementations of the steps of the workflow&lt;/em&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configuration Files&lt;/strong&gt;: &lt;em&gt;Specify which libraries to use and their configuration&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-1-create-a-pipeline-configuration-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-1-create-a-pipeline-configuration-repository&quot; /&gt;Step 1: Create a Pipeline Configuration Repository&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A &lt;em&gt;Pipeline Configuration Repository&lt;/em&gt; is used to store common configurations and pipeline templates inherited by teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This &lt;a href=&quot;https://github.com/steven-terrana/example-jte-configuration&quot;&gt;example Pipeline Configuration Repository&lt;/a&gt; will later be configured as part of a &lt;a href=&quot;https://jenkinsci.github.io/templating-engine-plugin/2.5.3/reference/governance-tier/&quot;&gt;Governance Tier&lt;/a&gt;: the mechanism in JTE that allows you to build hierarchical configurations representing your organization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A Governance Tier holds three things:&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;Pipeline Templates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A list of Library Sources&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The tier’s configuration file (&lt;code&gt;pipeline_config.groovy&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;
The pipeline templates and the configuration file for a Governance Tier are stored in the pipeline configuration repository.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When configuring the Governance Tier in Jenkins, you will provide a source code management location for a repository that contains the above components as well as the base directory where these artifacts can be found.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-2-create-the-pipeline-template&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-2-create-the-pipeline-template&quot; /&gt;Step 2: Create the Pipeline Template&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, we’ll create a &lt;code&gt;Jenkinsfile&lt;/code&gt; for the Governance Tier.  In JTE, the &lt;code&gt;Jenkinsfile&lt;/code&gt; is the default pipeline template that an execution will use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;unit_test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;static_code_analysis&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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-3-create-the-libraries&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-3-create-the-libraries&quot; /&gt;Step 3: Create the Libraries&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Templating Engine Plugin has implemented a version of Jenkins Shared Libraries to enhance the reusability of libraries.  A library is a root directory within a source code repository that has been configured as a Library Source on a Governance Tier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our example, the pipeline template needs to perform unit testing, package an artifact, and run static code analysis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s assume that we have some teams using &lt;strong&gt;gradle&lt;/strong&gt; and some teams using &lt;strong&gt;maven&lt;/strong&gt; to build and test their application but they will both use SonarQube to perform static code analysis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this scenario, we should create &lt;code&gt;gradle&lt;/code&gt;, &lt;code&gt;maven&lt;/code&gt;, and &lt;code&gt;sonarqube&lt;/code&gt; libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;|- gradle/
  \-- build.groovy
  \-- unit_test.groovy
|- maven/
  \-- build.groovy
  \-- unit_test.groovy
|- sonarqube/
  \-- static_code_analysis.groovy&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-4-implement-the-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-4-implement-the-steps&quot; /&gt;Step 4: Implement the Steps&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Implementing a library step is exactly the same as just writing regular global variables as part of the default Jenkins Shared Libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the purposes of this demonstration, we will just have each step print out the step name and contributing library.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;gradle/build.groovy&lt;/div&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;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;gradle: build()&quot;&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;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Read more about &lt;a href=&quot;https://boozallen.github.io/jenkins-templating-engine/pages/Library_Development/index.html&quot;&gt;Library Development within JTE&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-5-create-the-configuration-files&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-5-create-the-configuration-files&quot; /&gt;Step 5: Create the Configuration Files&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The configuration file for JTE is named &lt;code&gt;pipeline_config.groovy&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Governance Tier we’ll create a configuration file specifying common configurations between the applications. In this case, both applications are using the &lt;code&gt;sonarqube&lt;/code&gt; library:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;pipeline_config.groovy&lt;/div&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;libraries&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// allow individual apps to contribute additional libraries&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sonarqube&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;Next, we’ll create two more repositories representing the &lt;a href=&quot;https://github.com/steven-terrana/example-jte-app-maven&quot;&gt;maven&lt;/a&gt; and &lt;a href=&quot;https://github.com/steven-terrana/example-jte-app-gradle&quot;&gt;gradle&lt;/a&gt; applications. Within those repositories all we’ll need is an application-specific &lt;code&gt;pipeline_config.groovy&lt;/code&gt; file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These repositories both contain an application &lt;code&gt;pipeline_config.groovy&lt;/code&gt; configuration file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;maven app: pipeline_config.groovy&lt;/div&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;libraries&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;maven&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;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;gradle app: pipeline_config.groovy&lt;/div&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;libraries&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;gradle&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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-6-configure-the-governance-tier-in-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-6-configure-the-governance-tier-in-jenkins&quot; /&gt;Step 6: Configure the Governance Tier in Jenkins&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that we have a &lt;a href=&quot;https://github.com/steven-terrana/example-jte-configuration&quot;&gt;Pipeline Configuration Repository&lt;/a&gt; and a &lt;a href=&quot;https://github.com/steven-terrana/example-jte-libraries&quot;&gt;Library Source Repository&lt;/a&gt;, we can configure a &lt;a href=&quot;https://jenkinsci.github.io/templating-engine-plugin/2.5.3/reference/governance-tier/&quot;&gt;Governance Tier&lt;/a&gt; in Jenkins:&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/2019-05-09-templating-engine/governance_tier.png&quot; alt=&quot;governance tier&quot; /&gt;&lt;/span&gt;
&lt;/p&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;
This configuration shown in the image above can be found under &lt;code&gt;Manage Jenkins &amp;gt;&amp;gt; Configure System&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Through the Templating Engine, you can create a pipeline governance hierarchy matching your organization’s taxonomy by representing this structure via Folders in Jenkins.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-7-create-a-multibranch-pipeline-for-both-applications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-7-create-a-multibranch-pipeline-for-both-applications&quot; /&gt;Step 7: Create a Multibranch Pipeline for Both Applications&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When creating Multibranch Pipeline Projects for each app, the Templating Engine plugin supplies a new &lt;code&gt;Project Recognizer&lt;/code&gt;
called &lt;strong&gt;Jenkins Templating Engine&lt;/strong&gt;.  This sets the project to use the Templating Engine framework for all branches within the
repository.&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/2019-05-09-templating-engine/project_recognizer.png&quot; alt=&quot;project recognizer&quot; /&gt;&lt;/span&gt;
&lt;/p&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;
You can also set the &lt;strong&gt;Jenkins Templating Engine&lt;/strong&gt; project recognizer for a GitHub Organization project, enabling you to easily share the same pipeline across an entire Github Organization!
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-8-run-the-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-8-run-the-pipelines&quot; /&gt;Step 8: Run the Pipelines&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s it!  Now, both applications will leverage the exact same pipeline template while having the flexibility to select which
tools should be used during each phase of the workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below is sample output from the console log from both applications pipeline runs:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Gradle:&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;[JTE] Obtained Template Configuration File pipeline_config.groovy from git https://github.com/steven-terrana/example-jte-configuration
[JTE] Obtained Template Configuration File pipeline_config.groovy from git https://github.com/steven-terrana/example-jte-app-gradle.git
[JTE] Loading Library sonarqube from git https://github.com/steven-terrana/example-jte-libraries.git
[JTE] Loading Library gradle from git https://github.com/steven-terrana/example-jte-libraries.git
...
[JTE] Obtained Template Jenkinsfile from git https://github.com/steven-terrana/example-jte-configuration
[JTE][Step - gradle/unit_test]
[Pipeline] echo
gradle: unit_test()
[JTE][Step - gradle/build]
[Pipeline] echo
gradle: build()
[JTE][Step - sonarqube/static_code_analysis]
[Pipeline] echo
sonarqube: static_code_analysis()
[Pipeline] End of Pipeline&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Maven:&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;[JTE] Obtained Template Configuration File pipeline_config.groovy from git https://github.com/steven-terrana/example-jte-configuration
[JTE] Obtained Template Configuration File pipeline_config.groovy from git https://github.com/steven-terrana/example-jte-app-maven.git
[JTE] Loading Library sonarqube from git https://github.com/steven-terrana/example-jte-libraries.git
[JTE] Loading Library maven from git https://github.com/steven-terrana/example-jte-libraries.git
...
[JTE] Obtained Template Jenkinsfile from git https://github.com/steven-terrana/example-jte-configuration
[JTE][Step - maven/unit_test]
[Pipeline] echo
maven: unit_test()
[JTE][Step - maven/build]
[Pipeline] echo
maven: build()
[JTE][Step - sonarqube/static_code_analysis]
[Pipeline] echo
sonarqube: static_code_analysis()
[Pipeline] End of Pipeline&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/ol&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;benefits-of-the-templating-engine&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#benefits-of-the-templating-engine&quot; /&gt;Benefits of the Templating Engine&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/2019-05-09-templating-engine/jte_benefits.png&quot; alt=&quot;jte benefits&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;apply-organizational-governance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#apply-organizational-governance&quot; /&gt;Apply Organizational Governance&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Leveraging the Templating Engine Plugin will allow you to define enterprise-scale, approved
workflows that can be used by teams regardless of what tools are being used.  This top-down
approach makes scaling and enforcing DevSecOps principles significantly easier within your organization.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;optimize-code-reuse&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#optimize-code-reuse&quot; /&gt;Optimize Code Reuse&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s really no need for every team in your organization to figure out how to do the same things over
and over again.  At Booz Allen, we have seen pipeline development time decrease from months to days as
we have continuously reused and expanded upon our Templating Engine library portfolio as part of our Solutions
Delivery Platform.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;simplify-pipeline-maintainability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#simplify-pipeline-maintainability&quot; /&gt;Simplify Pipeline Maintainability&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Often DevOps engineers find themselves building and supporting pipelines for multiple development teams at
the same time.  By decoupling the workflow from the technical implementation and consolidating the pipeline
definition to a centralized location, the Templating Engine plugin allows DevOps engineers to scale much 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;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;The &lt;a href=&quot;https://plugins.jenkins.io/templating-engine&quot;&gt;Templating Engine Plugin&lt;/a&gt; has been open sourced and made available in the Jenkins Update Center.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We always appreciate feedback and contributions! If you have an interesting use case or would like to ask questions, try the link:https://app.gitter.im/#/room/#jenkinsci_templating-engine-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;templating-engine-plugin on Gitter&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;advanced-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#advanced-features&quot; /&gt;Advanced Features&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://boozallen.github.io/sdp-docs/jte/2/governance/config_file_aggregation.html&quot;&gt;Configuration File Conditional Inheritance&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://boozallen.github.io/sdp-docs/jte/2/library-development/parameterizing_libraries.html&quot;&gt;Externalize Library Configurations&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://boozallen.github.io/sdp-docs/jte/2/library-development/lifecycle_hooks.html&quot;&gt;Aspect Oriented LifeCycle Hooks&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://boozallen.github.io/sdp-docs/jte/2/governance/pipeline_template_selection.html#_2_named_pipeline_template&quot;&gt;Multiple Pipeline Templates&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://boozallen.github.io/sdp-docs/jte/2/primitives/default_step_implementation.html&quot;&gt;Default Step Implementation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://boozallen.github.io/sdp-docs/jte/2/pipeline-templating/configuration_file_sandboxing.html&quot;&gt;Configuration File DSL Sandboxing&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;more-resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-resources&quot; /&gt;More Resources&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;for-this-demonstration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#for-this-demonstration&quot; /&gt;For this Demonstration&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/steven-terrana/example-jte-configuration&quot;&gt;Pipeline Configuration Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/steven-terrana/example-jte-libraries&quot;&gt;Sample Libraries&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/steven-terrana/example-jte-app-maven&quot;&gt;Sample Maven Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/steven-terrana/example-jte-app-gradle&quot;&gt;Sample Gradle Repository&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;additional-resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#additional-resources&quot; /&gt;Additional 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://jenkinsci.github.io/templating-engine-plugin/&quot;&gt;Templating Engine Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/templating-engine-plugin&quot;&gt;Source Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/boozallen/sdp-libraries&quot;&gt;Booz Allen’s SDP Pipeline Libraries&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://boozallen.com&quot;&gt;Booz Allen Hamilton&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/05/09/chinese-localization/</id>
<title>A Big Step of the Chinese Localization</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-05-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/05/09/chinese-localization/" />
<author>
<name>linuxsuren</name>
</author>
<category term='general'></category>
<category term='community'></category>
<category term='localization'></category>
<category term='chinese'></category>
<summary>
Since 2017, I started to do some contributions to the Jenkins community. As a beginner, translation might be
the easiest way to help the project. You don&#8217;t need to understand the whole context, even to create a ticket in the
issue tracker system. Improvement of localization usually is minor. But some problems occurred soon,
there isn&#8217;t a native speaker of Chinese that could review my PRs. So, sometimes my PRs
are delayed from being merged into master.


Some contributors told me that I can start a thread at the mailing list. Normally, discussing at the mailing list
is the open source community way. We got a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since 2017, I started to do some contributions to the Jenkins community. As a beginner, translation might be
the easiest way to help the project. You don’t need to understand the whole context, even to create a ticket in the
issue tracker system. Improvement of localization usually is minor. But some problems occurred soon,
there isn’t a native speaker of Chinese that could review my PRs. So, sometimes my PRs
are delayed from being merged into master.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some contributors told me that I can start a thread at the mailing list. Normally, discussing at the mailing list
is the open source community way. We got a lot of ideas for the localization from there. As a result,
we achieved some goals that I’d like to share here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jep-216&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jep-216&quot; /&gt;JEP-216&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously, language localization files were distributed in core and in each plugin.
For &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/216/README.adoc&quot;&gt;this proposal&lt;/a&gt;, each language has a single localization plugin, such as &lt;a href=&quot;https://github.com/jenkinsci/localization-zh-cn-plugin&quot;&gt;Chinese Localization plugin&lt;/a&gt;.
Finally, &lt;a href=&quot;https://github.com/jenkinsci/localization-support-plugin&quot;&gt;Localization Support Plugin&lt;/a&gt; and
&lt;a href=&quot;https://github.com/jenkinsci/localization-zh-cn-plugin&quot;&gt;Chinese Localization plugin&lt;/a&gt; are able to support
all types of localization resource files. From the &lt;a href=&quot;https://plugins.jenkins.io/localization-zh-cn&quot;&gt;plugins website&lt;/a&gt;,
you can see that there are already 13 000 installations.
We removed all Chinese localization files at the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/4008&quot;&gt;PR-4008&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I really appreciate &lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt; for helping me to add localization support,
&lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt; helping me to review JEP-216, and many other community members.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;chinese-localization-sig&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#chinese-localization-sig&quot; /&gt;Chinese Localization SIG&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We believe that this SIG could help to improve Jenkins experience for Chinese users and gather more contributors
from China. This SIG is responsible for maintaining the &lt;a href=&quot;https://www.jenkins.io/zh/&quot;&gt;Chinese Jenkins website&lt;/a&gt;,
promoting the Jenkins community in China in the social media with WeChat account. We publish translated blog
articles, Jenkins release notes, JAM or other events at the WeChat account. For now, there are 1800 followers that can
read our news from the last half a year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Especially, I want to say thanks to &lt;a href=&quot;https://github.com/donhui&quot;&gt;Wang Donghui&lt;/a&gt;, &lt;a href=&quot;https://github.com/zacker330&quot;&gt;Zhai Zhijun&lt;/a&gt;, and other &lt;a href=&quot;https://github.com/jenkins-infra/wechat/graphs/contributors&quot;&gt;contributors&lt;/a&gt;. They did a lot of contributions.
I wish I could see more and more folks join us.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/05/05/telemetry-success/</id>
<title>First successful use of Jenkins telemetry</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-05-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/05/05/telemetry-success/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<category term='telemetry'></category>
<summary>
Half a year ago we delivered a security fix for Jenkins that had the potential to break the entire Jenkins UI.
We needed to change how Jenkins, through the Stapler web framework, handled HTTP requests, tightening the rules around what requests would be processed by Jenkins.
In the six months since, we didn&#8217;t receive notable reports of problems resulting from this change, and it&#8217;s thanks to the telemetry we gathered beforehand.


The Problem


Jenkins uses the Stapler web framework for HTTP request handling.
Stapler&#8217;s basic premise is that it uses reflective access to code elements matching its naming conventions.
For example, any public method whose name...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Half a year ago we delivered a security fix for Jenkins that had the potential to break the entire Jenkins UI.
We needed to change how Jenkins, through the Stapler web framework, handled HTTP requests, tightening the rules around what requests would be processed by Jenkins.
In the six months since, we didn’t receive notable reports of problems resulting from this change, and it’s thanks to the telemetry we gathered beforehand.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-problem&quot; /&gt;The Problem&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins uses the Stapler web framework for HTTP request handling.
Stapler’s basic premise is that it uses reflective access to code elements matching its naming conventions.
For example, any public method whose name starts with &lt;code&gt;get&lt;/code&gt;, and that has a &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;long&lt;/code&gt;, or no argument can be invoked this way on objects that are reachable through these means.
As these naming conventions closely match common code patterns in Java, accessing crafted URLs could invoke methods never intended to be invoked this way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A simple example of that is a URL every Jenkins user would be familiar with: &lt;code&gt;/job/jobname&lt;/code&gt;.
This ends up invoking a method called &lt;code&gt;#getJob(String)&lt;/code&gt;, with the argument being &lt;code&gt;&quot;jobname&quot;&lt;/code&gt;, on the root application object, and having it handle the rest of the URL, if any.
Of course, this is a URL intended to be accessed this way.
How about invoking &lt;code&gt;Object#getClass()&lt;/code&gt;, followed by &lt;code&gt;Class#getClassLoader()&lt;/code&gt;, by accessing the URL &lt;code&gt;/class/classLoader&lt;/code&gt;?
While this particular chain would not result in a useful response, this doesn’t change that the methods were invoked.
We identified a number of URLs that could be abused to access otherwise inaccessible jobs, or even invoke internal methods in the web application server to invalidate all sessions.
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-12-05/&quot;&gt;The security advisory&lt;/a&gt; provides an overview of the issues we’d identified by then.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-idea&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-idea&quot; /&gt;The Idea&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To solve this problem inherent in the Stapler framework’s design, we defined rules that restrict invocation beyond what would be allowed by Stapler.
For example, the declared return type of getters now needed to be one defined in Jenkins core or a Jenkins plugin and have either clearly Stapler-related methods (with Stapler annotations, parameter types, etc.) or Stapler-related resource files associated with it.
Otherwise, the type wouldn’t be aware of Stapler, and couldn’t produce a meaningful response anyway.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This meant that getters just declaring &lt;code&gt;Object&lt;/code&gt; (or &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Map&lt;/code&gt;, etc.) would no longer be allowed by default.
It was clear to the developers working on this problem that we needed the ability to be able to override the default rules for specific getters.
But allowing plugin developers to adapt their plugins after we published the fix wasn’t going to cut it;
Jenkins needed to ship with a comprehensive default whitelist for methods known to not conform to the new rules, so that updating would not result in problems for users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-solution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-solution&quot; /&gt;The Solution&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While there is tooling like &lt;a href=&quot;https://github.com/jenkinsci/plugin-compat-tester/&quot;&gt;Plugin Compatibility Tester&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness&quot;&gt;Acceptance Test Harness&lt;/a&gt;, many Jenkins plugins do not have comprehensive tests of their UI — the Jenkins UI is fairly stable after all.
We did not expect to have sufficient test coverage to deliver a change like this with confidence.
The only way we would be able to build such a comprehensive whitelist would be to add telemetry to Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While Jenkins instances periodically report usage statistics to the Jenkins project, the information included is very bare bones and mostly useful to know the number of installations, the popularity of plugins, and the general size of Jenkins instances through number and types of jobs and agents.
We also didn’t want to just collect data without a clear goal, so we set ourselves some limitations — collect as little data as possible, no personally identifiable information, have a specific purpose for each kind of information we would collect, and define an end date for the collection in advance.
We defined all of this in &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/214/README.adoc&quot;&gt;JEP-214&lt;/a&gt;, created the &lt;a href=&quot;https://github.com/jenkins-infra/uplink&quot;&gt;Uplink service that would receive submissions&lt;/a&gt;, and added the basic client framework to Jenkins.
The implementation is fairly basic — we just submit an arbitrary JSON object with some added metadata to a service.
This system would inform tweaks to a security fix we were anxious to get out, after all.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting in mid October for weekly releases, and early November for LTS, tens of thousands of Jenkins instances would submit Stapler request dispatch telemetry daily, and we would keep identifying code incompatible with the new rules and amending the fix.
Ultimately, &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/44c4d3989232082c254d27ae360aa810669f44b7/core/src/main/resources/jenkins/security/stapler/default-whitelist.txt&quot;&gt;the whitelist&lt;/a&gt; would include a few dozen entries, preventing serious regressions in popular plugins like &lt;a href=&quot;https://plugins.jenkins.io/credentials&quot;&gt;Credentials Plugin&lt;/a&gt;, &lt;a href=&quot;https://plugins.jenkins.io/junit&quot;&gt;JUnit Plugin&lt;/a&gt;, or the Pipeline plugins suite, down to &lt;a href=&quot;https://plugins.jenkins.io/google-cloud-health-check&quot;&gt;Google Health Check Plugin&lt;/a&gt;, a plugin with just 80 installations when we published the fix.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Learning what requests would result in problems also allowed us to write better developer documentation — we already knew what code patterns would break, and how popular each of them was in the 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;the-overhaul&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-overhaul&quot; /&gt;The Overhaul&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I wrote above:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, the declared return type of getters now needed to be one defined in Jenkins core or a Jenkins plugin and have either clearly Stapler-related methods (with Stapler annotations, parameter types, etc.) or Stapler-related resource files associated with it.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While this was true for the fix during most of development, it isn’t how the fix that we published actually works.
About a month before the intended release date, internal design/code review feedback criticized the complicated and time-consuming implementation that at the time required scanning the class path of Jenkins and all plugins and looking for related resources, and suggested a different approach.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we tried to require that the declared type or any of its ancestors be annotated with the new annotation &lt;code&gt;@StaplerAccessibleType&lt;/code&gt;, annotated a bunch of types in Jenkins itself (&lt;a href=&quot;https://javadoc.jenkins.io/hudson/model/ModelObject.html&quot;&gt;&lt;code&gt;ModelObject&lt;/code&gt;&lt;/a&gt; being the obvious first choice), and ran our scripts that check to see whether Stapler would be allowed to dispatch methods identified in telemetry.
We’d long since automated the daily update of dispatch telemetry processing, so it was a simple matter of changing which Jenkins build we were working with.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a few iterations of adding the annotation to more classes, the results were very positive: Very few additional types needed whitelisting, while many more were no longer (unnecessarily) allowed to be dispatched to.
This experiment, late during development, ended up being essentially the fix we delivered.
We didn’t need to perform costly scanning of the class path on startup — we didn’t need to scan the class path at all — , and the rules governing request dispatch in Stapler, while different from before, are still pretty easy to understand and independent of how components are packaged.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-outcome&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-outcome&quot; /&gt;The Outcome&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As usual when delivering a fix we expect could result in regressions in plugins, we &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins+affected+by+the+SECURITY-595+fix&quot;&gt;created a wiki page&lt;/a&gt; that users could report problems on.
Right now, there’s one entry on that wiki page.
It is one we were aware of well before release, decided against whitelisting it, and the affected, undocumented feature in Git Plugin ended up being removed.
The situation in our issue tracker is only slightly worse, with two apparently minor issues having been reported in Jira.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Without telemetry, delivering a fix like this one would have been difficult to begin with.
Tinkering with the implementation just a few weeks before release and having any confidence in the result?
Not causing any significant regressions?
I think this would simply be impossible.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/04/03/security-advisory/</id>
<title>Security spring cleaning</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-04-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/04/03/security-advisory/" />
<author>
<name>daniel-beck</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<summary>
Today we published a security advisory that mostly informs about issues in Jenkins plugins that have no fixes.
What&#8217;s going on?


The Jenkins security team triages incoming reports both to Jira and our non-public mailing list.
Once we&#8217;ve determined it is a plugin not maintained by any Jenkins security team members, we try to inform the plugin maintainer about the issue, offering our help in developing, reviewing, and publishing any fixes.
Sometimes the affected plugin is unmaintained, or maintainers don&#8217;t respond in a timely manner to the notifications or the followup emails we send.


In such cases, we publish security advisories informing users about these...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today we published &lt;a href=&quot;https://www.jenkins.io/security/advisory/2019-04-03/&quot;&gt;a security advisory&lt;/a&gt; that mostly informs about issues in Jenkins plugins that have &lt;em&gt;no fixes&lt;/em&gt;.
What’s going on?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins security team triages &lt;a href=&quot;https://www.jenkins.io/security/#reporting-vulnerabilities&quot;&gt;incoming reports both to Jira and our non-public mailing list&lt;/a&gt;.
Once we’ve determined it is a plugin not maintained by any Jenkins security team members, we try to inform the plugin maintainer about the issue, offering our help in developing, reviewing, and publishing any fixes.
Sometimes the affected plugin is unmaintained, or maintainers don’t respond in a timely manner to the notifications or the followup emails we send.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In such cases, we publish &lt;a href=&quot;https://www.jenkins.io/security/#vulnerabilities-in-plugins&quot;&gt;security advisories informing users about these issues, even if there’s no new release with a fix&lt;/a&gt;.
Doing so allows administrators to make an informed decision about the continued use of plugins with unresolved security vulnerabilities.
Today’s advisory is overwhelmingly such an advisory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See a plugin you love on this list and want to help out? &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-governance/adopt-a-plugin/&quot;&gt;Learn about adopting plugins&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/03/29/becoming-contributor-intro/</id>
<title>The journey of becoming a Jenkins contributor: Introduction</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-03-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/03/29/becoming-contributor-intro/" />
<author>
<name>romenrg</name>
</author>
<category term='jenkins'></category>
<category term='community'></category>
<category term='developer'></category>
<category term='contributing'></category>
<category term='newcomer'></category>
<summary>
As a software engineer, for many years I have used open source software (frameworks, libraries, tools&#8230;&#8203;) in the
different companies I have worked at. However, I had never been able to engage in an open-source project as a
contributor, until now.


Since I made my first&#8212;&#8203;ridiculously simple&#8212;&#8203;commit into Jenkins, six months ago (in September, 2018), I have been
attempting to contribute more to the Jenkins project. However, contributing to open-source projects is, in general,
challenging. Especially to long-lived projects, with a lot of history, legacy code and tribal knowledge. It is often
difficult to know where to start and also difficult to come up with a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a software engineer, for many years I have used open source software (frameworks, libraries, tools…​) in the
different companies I have worked at. However, I had never been able to engage in an open-source project as a
contributor, until now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since I made my first—​ridiculously simple—​commit into Jenkins, six months ago (in September, 2018), I have been
attempting to contribute more to the Jenkins project. However, contributing to open-source projects is, in general,
challenging. Especially to long-lived projects, with a lot of history, legacy code and tribal knowledge. It is often
difficult to know where to start and also difficult to come up with a plan to keep moving forward and contributing
regularly, and in more meaningful ways over time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When it comes to the Jenkins project, I have encountered challenges that others trying to get into the community are
likely to encounter. For that reason, I have decided to go ahead and share my journey of becoming a more engaged Jenkins
contributor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I plan to publish roughly 1 post per month, describing this journey. I will attempt to start contributing to the pieces
that are easier to start with, transitioning towards more complex contributions over time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;where-to-start&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-to-start&quot; /&gt;Where to start&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-io&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-io&quot; /&gt;jenkins.io&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To become a Jenkins contributor, the most obvious place to start looking at is &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;jenkins.io&lt;/a&gt;. In the
top navbar there is a Community dropdown, with several links to different sections. The first entry,
&lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Overview&lt;/a&gt;, takes us to the “Participate and contribute” section.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this section we get lots of information about the many ways in which we can engage with the Jenkins project and
community. Even though the intention is to display all the possible options, allowing the reader to choose, it can feel
a bit overwhelming.&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/2019-03-29-becoming-contributor/jenkins-participate-page.png&quot; alt=&quot;jenkins participate page&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The page is divided into two columns, the column on the left shows the different options to participate, while the
column on the right shows the different options to contribute.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;suggestions-to-participate&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#suggestions-to-participate&quot; /&gt;Suggestions to Participate&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the left column of the “Participate and contribute” page, there are several ideas on how to engage with the community,
ranging from communicating to reviewing changes or providing feedback.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the pieces that got me confused at first in this area were the communication channels. There are many different
channels for communication. There are &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;several mailing lists&lt;/a&gt; and there are also IRC
and Gitter channels.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During my first attempts to get involved, I subscribed to many of the mailing lists and several IRC and Gitter channels,
but I quickly noticed that there is significant communication going on; and that most threads in the most active lists
and channels are specific to issues users or developers have. So, unless your goal is to support other users right away
(if you are an experienced Jenkins user already it might be the case) or you plan to ask questions that you already
have in mind, I would advise against spending too much time on this at first.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even though it is great to see how the community members support each other, the amount of communication might be
overwhelming for a newcomer, and if you are also trying to contribute to the project (either with translations,
documentation or code), following these conversations might not be the best way to start.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;suggestions-to-contribute&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#suggestions-to-contribute&quot; /&gt;Suggestions to Contribute&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the right column of the “Participate and contribute” page there are several ideas on how to contribute, mostly
grouped into: writing code, translating, documenting and testing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In following posts, I will be going through all of these types of contributions, as well as through some of the
suggestions to participate, which include reviewing Pull Requests (PRs) or providing feedback (either reporting new
issues or replicating cases other users have already described, providing additional information to help the maintainer
reproduce and fix them).&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;my-first-contribution-in-this-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#my-first-contribution-in-this-journey&quot; /&gt;My first contribution in this journey&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When looking at the “Participate and contribute” page, I noticed a couple of things in that page that I could help
improve. And I was actually planning to pick one of those as the first example of a contribution for this post. But
when I was reading the contributing guidelines of the repository, I found an even easier contribution I could make,
which I thought would be a great example to illustrate how simple it could be to start contributing. So I decided to go
ahead with it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-website-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-website-repository&quot; /&gt;The website repository&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the ”Document” section there is a link to the
&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc&quot;&gt;contributing guidelines of the jenkins.io repository&lt;/a&gt;.
The CONTRIBUTING file is a common file present in the root folder of most open-source-project repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following the link to that file, I reached the jenkins.io repository, which is the one that contains the sources for
the corresponding website—​which also includes this blog. And, in fact, the contributing file was the first file I
wanted to review, in order to learn more about how to contribute to the website.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;found-a-broken-link&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#found-a-broken-link&quot; /&gt;Found a broken link&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When reading the contributing file, I learned about the Awestruct static site generator, which is the tool used to
transform the AsciiDoc source files in the repo into a website. However, when I clicked the link to learn more about it, I noticed it was broken. The domain had expired.&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/2019-03-29-becoming-contributor/awestruct-site.png&quot; alt=&quot;awestruct site&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-not-fix-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-not-fix-it&quot; /&gt;Why not fix it?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was the opportunity I chose to show other newcomers how easy it can be to start contributing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;forking-the-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#forking-the-repository&quot; /&gt;Forking the repository&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first step, as usual, would be to fork the repository and clone it to my machine.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;applying-the-change&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#applying-the-change&quot; /&gt;Applying the change&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next step would be to apply the change to the corresponding file. To do so, I created a new branch
“alternative-awestruct-link” and applied the change there:&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/2019-03-29-becoming-contributor/making-change.png&quot; alt=&quot;making change&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;making-sure-everything-builds-correctly-and-tests-pass&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#making-sure-everything-builds-correctly-and-tests-pass&quot; /&gt;Making sure everything builds correctly and tests pass&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even though in this case my contribution was not to the actual website, but to the contributing guidelines (and for
that reason was unlikely to break anything), it is a best practice to get used to the regular process every
contribution should follow, making sure everything builds correctly after any change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As stated in the contributing guidelines themselves, in order to build this repository we just have to run the default
“make” target, in the root of the repository.&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/2019-03-29-becoming-contributor/executing-make.png&quot; alt=&quot;executing make&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the command execution finishes, if everything looks good, we are ready to go to the next step: creating the PR.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;creating-the-pr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-the-pr&quot; /&gt;Creating the PR&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once my change had been committed and pushed to my repository, I just had to create the PR. We have an easy way to do so
by just clicking the link that we get in our git logs once the push is completed, although we can create the PR directly
through the GitHub UI, if we prefer so; or even use &lt;a href=&quot;https://github.com/github/hub&quot;&gt;“hub”&lt;/a&gt;, the GitHub CLI, to do it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this case, I just clicked the link, which took me to the PR creation page on GitHub. Once there, I added a
description and created the PR.&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/2019-03-29-becoming-contributor/creating-pr.png&quot; alt=&quot;creating pr&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When a PR to this repository is created, we notice there are some checks that start running. Jenkins repositories are
configured to notify the &lt;a href=&quot;https://ci.jenkins.io/&quot;&gt;“Jenkins on Jenkins”&lt;/a&gt;, which runs the corresponding CI pipelines for
each repository, as described in the corresponding &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the checks are completed, we can see the result in the PR:&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/2019-03-29-becoming-contributor/pr-created-passing.png&quot; alt=&quot;pr created passing&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And if we want to see the details of the execution, we can follow the “Show all checks” link:&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/2019-03-29-becoming-contributor/pr-checks-jenkins.png&quot; alt=&quot;pr checks jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;pr-review&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pr-review&quot; /&gt;PR Review&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that the PR has been created and all automated checks are passing, we only have to wait for peer code reviews.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once someone approves the PR and it is later merged, your contribution is integrated into the master branch of the
repository, becoming part of the next release.&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/2019-03-29-becoming-contributor/pr-merged.png&quot; alt=&quot;pr merged&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;i-have-contributed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-have-contributed&quot; /&gt;I have contributed!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This contribution I made is a trivial one, with very little complexity and it might not be the most interesting one if
you are trying to contribute code to the Jenkins project itself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, for me, as the contributor, it was a great way to get familiar with the repository, its contributing
guidelines, the technology behind the jenkins.io website; and, above anything else, to start “losing the fear” of
contributing to an open source project like Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, if you are in the same position I was, do not hesitate. Go ahead and find your own first contribution. Every little
counts!&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/03/28/outreachy-review/</id>
<title>Outreachy 2018-2019 In Review</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-03-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/03/28/outreachy-review/" />
<author>
<name>jvz</name>
</author>
<category term='outreachy'></category>
<summary>
Over the past three months, I have been mentoring two Outreachy interns, David and Latha, with my co-mentor, Jeff Thompson.
Our project was to introduce a standardized way for creating an audit log of Jenkins and plugins using Apache Log4j Audit.
While this type of feature is addressed by other existing plugins, there is no unifying way for plugins to contribute their own actions.
This project provided ample opportunities for each of our interns to experience the community processes for starting a new Jenkins plugin, contributing changes to Jenkins itself in order to support more audit event types, using CICD principles, and developing...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past three months, I have been mentoring two Outreachy interns, &lt;a href=&quot;https://www.jenkins.io/blog/2018/12/10/outreachy-audit-log-plugin/&quot;&gt;David and Latha&lt;/a&gt;, with my co-mentor, Jeff Thompson.
&lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin&quot;&gt;Our project&lt;/a&gt; was to introduce a standardized way for creating an audit log of Jenkins and plugins using Apache Log4j Audit.
While this type of feature is addressed by other existing plugins, there is no unifying way for plugins to contribute their own actions.
This project provided ample opportunities for each of our interns to experience the community processes for starting a new Jenkins plugin, contributing changes to Jenkins itself in order to support more audit event types, using CICD principles, and developing a Jenkins Enhancement Proposal to begin the standardization process of audit logging throughout the ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this internship, David and Latha contributed several aspects of the project, much of which lays the foundation for easily instrumenting more subsystems and plugins with audit logs.
A template &lt;code&gt;log4j2.xml&lt;/code&gt; file is used for allowing more complex logging output configurations with a configuration UI.&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/audit-log-1.0.png&quot; alt=&quot;Audit log configuration UI&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;New APIs have been introduced in Jenkins to allow for more authentication-related events to be audited by the plugin.
Audit events have been defined for a few authorization scenarios and some build events.
For example, here is a snippet of audit log output for a build execution in the JSON layout:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;{
  &quot;thread&quot; : &quot;Executor #0 for master : executing test #1&quot;,
  &quot;level&quot; : &quot;OFF&quot;,
  &quot;loggerName&quot; : &quot;AuditLogger&quot;,
  &quot;marker&quot; : {
    &quot;name&quot; : &quot;Audit&quot;,
    &quot;parents&quot; : [ {
      &quot;name&quot; : &quot;EVENT&quot;
    } ]
  },
  &quot;message&quot; : &quot;Audit [buildStart buildNumber=\&quot;1\&quot; cause=\&quot;[Started by user anonymous]\&quot; projectName=\&quot;test\&quot; timestamp=\&quot;Mon Mar 25 13:48:09 CDT 2019\&quot; userId=\&quot;SYSTEM\&quot;]&quot;,
  &quot;endOfBatch&quot; : false,
  &quot;loggerFqcn&quot; : &quot;org.apache.logging.log4j.audit.AuditLogger&quot;,
  &quot;instant&quot; : {
    &quot;epochSecond&quot; : 1553539689,
    &quot;nanoOfSecond&quot; : 810000000
  },
  &quot;contextMap&quot; : { },
  &quot;threadId&quot; : 54,
  &quot;threadPriority&quot; : 5
}
{
  &quot;thread&quot; : &quot;Executor #0 for master : executing test #1&quot;,
  &quot;level&quot; : &quot;OFF&quot;,
  &quot;loggerName&quot; : &quot;AuditLogger&quot;,
  &quot;marker&quot; : {
    &quot;name&quot; : &quot;Audit&quot;,
    &quot;parents&quot; : [ {
      &quot;name&quot; : &quot;EVENT&quot;
    } ]
  },
  &quot;message&quot; : &quot;Audit [buildFinish buildNumber=\&quot;1\&quot; cause=\&quot;[Started by user anonymous]\&quot; projectName=\&quot;test\&quot; timestamp=\&quot;Mon Mar 25 13:48:10 CDT 2019\&quot; userId=\&quot;SYSTEM\&quot;]&quot;,
  &quot;endOfBatch&quot; : false,
  &quot;loggerFqcn&quot; : &quot;org.apache.logging.log4j.audit.AuditLogger&quot;,
  &quot;instant&quot; : {
    &quot;epochSecond&quot; : 1553539690,
    &quot;nanoOfSecond&quot; : 155000000
  },
  &quot;contextMap&quot; : { },
  &quot;threadId&quot; : 54,
  &quot;threadPriority&quot; : 5
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Best of all, this project has helped instill important software engineering values such as automated testing and continuous delivery.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we conclude this round, we look forward to participating in the next Outreachy internship to continue this project and grow the community.
For more information about the next round, check out &lt;a href=&quot;https://www.outreachy.org/may-2019-august-2019-outreachy-internships/communities/jenkins/&quot;&gt;the Outreachy website&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/03/12/cdf-launch/</id>
<title>Jenkins is joining the Continuous Delivery Foundation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-03-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/03/12/cdf-launch/" />
<author>
<name>kohsuke</name>
</author>
<category term='cdf'></category>
<category term='general'></category>
<category term='community'></category>
<summary>
Today Linux Foundation, along with CloudBees, Google, and a number of other companies, launched a new open-source software foundation called Continuous Delivery Foundation (CDF.) The CDF believes in the power of Continuous Delivery, and it aims to foster and sustain the ecosystem of open-source, vendor neutral projects.


Jenkins contributors have decided that our project should join this new foundation. This discussion happened over a period of time, with a relatively succinct summary of the motivation comes from here.


Now, as a user, what does this mean?




First, there will be no big disruption/discontinuity. The same people are still here, no URL is changing,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/cdf/logo/cdf-logo.png&quot; alt=&quot;CDF&quot; width=&quot;300&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today &lt;a href=&quot;https://www.linuxfoundation.org/&quot;&gt;Linux Foundation&lt;/a&gt;, along with &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;, &lt;a href=&quot;https://about.google/&quot;&gt;Google&lt;/a&gt;, and &lt;a href=&quot;https://cd.foundation/members/&quot;&gt;a number of other companies&lt;/a&gt;, launched a new open-source software foundation called &lt;a href=&quot;https://cd.foundation/&quot;&gt;Continuous Delivery Foundation&lt;/a&gt; (CDF.) The CDF believes in the power of Continuous Delivery, and it aims to foster and sustain the ecosystem of open-source, vendor neutral projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins contributors &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/KFhQaYEl70c&quot;&gt;have decided&lt;/a&gt; that our project should join this new foundation. This discussion happened over a period of time, with a relatively succinct summary of the motivation comes from &lt;a href=&quot;https://groups.google.com/d/topic/jenkinsci-dev/1w57jl3K4S4/discussion&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, as a user, what does this mean?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;First, there will be no big disruption/discontinuity. The same people are still here, no URL is changing, releases will come out like they’ve always been. We will make the decisions the same way as we’ve been making, and pull requests land the same way. Changes will happen continuously over the period of time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is yet another testament to the maturity and the importance of the Jenkins project in this space. With &lt;a href=&quot;https://stats.jenkins.io/jenkins-stats/svg/svgs.html&quot;&gt;a quarter million Jenkins running around the globe&lt;/a&gt;, it’s truly rocking the world of software development from IoT to games, cloud native webapps to machine learning projects. It makes Jenkins such an obvious, safe choice for anyone seeking open heterogeneous DevOps strategy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The CDF creates a level playing field that is well-understood to organized contributors, which further, translate into more contributors, hence resulting in a better Jenkins, faster. Over the past years, the Jenkins project has been steadily growing &lt;a href=&quot;https://www.jenkins.io/sigs/&quot;&gt;more&lt;/a&gt; &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep#index-of-jenkins-enhancement-proposals&quot;&gt;structures&lt;/a&gt; that provide this clarity, and this is the newest step on this trajectory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Any serious dev teams are combining multiple tools and services to cover the whole software development spectrum. A lot of work gets reinvented in those teams to integrate those tools together. Jenkins will be working more closely with other projects under the umbrella of the CDF, which would result in better aligned software with less overlap.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our users are practitioners trying to improve the software development process in their organizations. They get that CI/CD/automation which unlocks the productivity that their organizations need, but that’s not always obvious to their organizations as a whole. So our users often struggle to get the necessary support. The CDF will advocate for the practice of Continuous Delivery, and because it’s not coming from a vendor or a project, it will reach the people who can lend that support.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So I hope you can see why we are so excited about this!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In fact, for us, this is an idea that we’ve been cooking for close to two years. I don’t think I’m exaggerating much to say the whole idea of the CDF &lt;em&gt;started&lt;/em&gt; from the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A lot of people have done so much work behind the scene to make this happen. But a few people played such instrumental roles that I have to personally thank them namely, &lt;a href=&quot;https://github.com/caniszczyk&quot;&gt;Chris Aniszczyk&lt;/a&gt; for his patience and persistence, &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt; for cooking and evolving the idea, and &lt;a href=&quot;https://github.com/tracymiranda&quot;&gt;Tracy Miranda&lt;/a&gt; for bringing this idea into a reality.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/03/11/let-s-celebrate-java-11-support/</id>
<title>Let&#39;s celebrate Java 11 Support on Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-03-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/03/11/let-s-celebrate-java-11-support/" />
<author>
<name>alecharp</name>
</author>
<category term='core'></category>
<category term='developer'></category>
<category term='java11'></category>
<category term='community'></category>
<category term='platform-sig'></category>
<summary>
This is a joint blog post prepared by the Java 11 Support Team: Adrien Lecharpentier, Ashton Treadway, Baptiste Mathus, Jenn Briden, Kevin Earls, María Isabel Vilacides, Mark Waite, Ramón León and Oleg Nenashev.








We have worked hard for this and it&#8217;s now here.
We are thrilled to announce full support for Java 11 in Jenkins starting from Jenkins 2.164 (released on Feb 10, 2019) and LTS 2.164.1 (ETA: March 14th).
This means you can now run your Jenkins controllers and agents with a Java 11 JVM.


Starting in June 2018, many events were organized to improve Jenkins code base and add Java 11 support.
Beyond...
</summary>
<content type='html'>
&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;
This is a joint blog post prepared by the Java 11 Support Team: Adrien Lecharpentier, Ashton Treadway, Baptiste Mathus, Jenn Briden, Kevin Earls, María Isabel Vilacides, Mark Waite, Ramón León and Oleg Nenashev.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/logos/formal/256.png&quot; alt=&quot;Jenkins Java&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have worked hard for this and it’s now here.
We are thrilled to announce &lt;strong&gt;full support for Java 11 in Jenkins&lt;/strong&gt; starting from Jenkins 2.164 (released on Feb 10, 2019) and LTS 2.164.1 (ETA: March 14th).
This means you can now run your Jenkins controllers and agents with a Java 11 JVM.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting in June 2018, many events were organized to improve Jenkins code base and add Java 11 support.
Beyond these events, Core/Plugins maintainers and many other contributors have worked hard to make sure they discover and solve as many issues as possible related to Java 11 support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The effort to support Java 11 led to the creation of the &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/211/README.adoc&quot;&gt;JEP-211: Java 10+ support in Jenkins&lt;/a&gt;.
It also spurred the creation of the &lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Platform Special Interest Group&lt;/a&gt; to coordinate the Java 11 work and other platform support efforts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;celebration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#celebration&quot; /&gt;Celebration&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’d like to take a moment to thank everyone involved in these tasks: code contributors, issue reporters, testers, event planners and attendees and all those in the community who have generously lent their time and support to this effort.
Thank you all!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are some of the contributors who helped with this task (alphabetical order):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alex Earl,
Alyssa Tong,
Ashton Treadway,
Baptiste Mathus,
Carlos Sanchez,
Daniel Beck,
David Aldrich,
Denis Digtyar,
Devin Nusbaum,
Emeric Vernat,
Evaristo Gutierrez,
Gavin Mogan,
Gianpaolo Macario,
Isabel Vilacides,
James Howe,
Jeff Pearce,
Jeff Thompson,
Jenn Briden,
Jesse Glick,
Jonah Graham,
Kevin Earls,
Ksenia Nenasheva,
Kohsuke Kawaguchi,
Liam Newman,
Mandy Chung,
Mark Waite,
Nicolas De Loof,
Oleg Nenashev,
Oliver Gondža,
Olivier Lamy,
Olivier Vernin,
Parker Ennis,
Paul Sandoz,
Ramón León,
Sam Van Oort,
Tobias Getrost,
Tracy Miranda,
Ulli Hafner,
Vincent Latombe,
Wadeck Follonier&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(We are deeply sorry if we missed anyone in this list.)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;guidelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#guidelines&quot; /&gt;Guidelines&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to keep it simple, here is how you can start Jenkins on Java 11 using the Docker image.
You can select a Java 11 based image by suffixing the tag of the image with &lt;code&gt;-jdk11&lt;/code&gt;.
If you are upgrading an existing instance please read the &lt;a href=&quot;https://www.jenkins.io/doc/administration/requirements/upgrade-java-guidelines/&quot;&gt;Upgrading Jenkins Java version from 8 to 11&lt;/a&gt; page before upgrading.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So you can run Jenkins on Java 11 with:&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;docker run &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 50000:50000 &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; 8080:8080 jenkins/jenkins:2.164-jdk11&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, and as always, you can still start Jenkins with other methods.
Please see the more detailed documentation at &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/&quot;&gt;Installing Jenkins&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;developer-guidelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#developer-guidelines&quot; /&gt;Developer guidelines&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For developers involved in Jenkins development, you can find details on developing and testing Jenkins to run on Java 11 on the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Java+11+Developer+Guidelines&quot;&gt;Java 11 Developer Guidelines&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This resource regroups the modifications which might need to be done in order to validate the compatibility of plugins for Java 11.&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;Even though this is a big achievement, we still have work to do.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our first priority is adding Java 11 support to &lt;a href=&quot;https://github.com/jenkinsci/jenkinsfile-runner&quot;&gt;JenkinsFile Runner&lt;/a&gt; project.
From there, we will move on to port Java 11 support to the &lt;a href=&quot;https://github.com/jenkins-x&quot;&gt;Jenkins X&lt;/a&gt; project and the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/c0ba3cab7a7dfe398ec411d3271922bb98f04f8e/content/projects/evergreen/index.adoc&quot;&gt;Evergreen&lt;/a&gt; project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, even if this is a big deal to us, this is not the end of the story.
It is a major step that will benefit users, developers, and members of the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reference-links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reference-links&quot; /&gt;Reference 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/doc/administration/requirements/jenkins-on-java-11&quot;&gt;Running Jenkins on Java 11&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Known+Java+11+Compatibility+issues&quot; class=&quot;bare&quot;&gt;https://wiki.jenkins.io/display/JENKINS/Known+Java+11+Compatibility+issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Java+11+Developer+Guidelines&quot; class=&quot;bare&quot;&gt;https://wiki.jenkins.io/display/JENKINS/Java+11+Developer+Guidelines&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/211/README.adoc&quot;&gt;JEP-211: Java 11 support in Jenkins&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/2019/03/04/gsoc2019-announcement/</id>
<title>Jenkins is accepted to Google Summer Of Code 2019!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-03-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/03/04/gsoc2019-announcement/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
On behalf of the Jenkins GSoC org team,
I am happy to announce that the Jenkins project has been accepted to
Google Summer of Code 2019.
This year we invite students and mentors to join the Jenkins community and work together
on enhancing the Jenkins ecosystem.


Just to provide some numbers, this is the biggest GSoC ever, 206 organizations will participate in GSoC this year.
And it will be hopefully the biggest year for Jenkins as well.
We have 25 project ideas
and more than 30 potential mentors (and counting!).
It is already more than in 2016 and 2018 combined.
There are many plugins, SIGs and sub-projects which have already...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the Jenkins GSoC org team,
I am happy to announce that the Jenkins project &lt;strong&gt;has been accepted&lt;/strong&gt; to
&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code 2019&lt;/a&gt;.
This year we invite students and mentors to join the Jenkins community and work together
on enhancing the Jenkins ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just to provide some numbers, this is the biggest GSoC ever, 206 organizations will participate in GSoC this year.
And it will be hopefully the biggest year for Jenkins as well.
We have 25 &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/project-ideas&quot;&gt;project ideas&lt;/a&gt;
and more than 30 potential mentors (and counting!).
It is already more than in 2016 and 2018 combined.
There are many plugins, SIGs and sub-projects which have already joined GSoC this year.
And we have already received messages and first contributions from dozens of students, yey!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;What’s next?&lt;/strong&gt;
GSoC is officially announced, and please expect more students to contact projects in our
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/#contacts&quot;&gt;Gitter channels and mailing lists&lt;/a&gt;.
Many communications will also happen in SIG and sub-project channels.
We will be working hard in order to help students to find interesting projects, to explore the area,
and to prepare their project proposals before the deadline on April 9th.
Then we will process the applications, select projects and assign mentor teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All information about the Jenkins GSoC is available on its &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;sub-project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;i-am-a-student-how-do-i-apply&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-am-a-student-how-do-i-apply&quot; /&gt;I am a student. How do I apply?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors&quot;&gt;Information for students&lt;/a&gt; page for full application guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage interested students to reach out to the Jenkins community early and to start exploring project ideas.
All project ideas have chats and mailing lists referenced on their pages.
We will be also organizing office hours for students,
and you can use these meetings to meet org admins and mentors and to ask questions.
Also, join our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;Gitter channel&lt;/a&gt; to receive information about such incoming events in the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The application period starts on March 25th, but you can prepare now!
Use the time before the application period to discuss and improve your project proposals.
We also recommend that you become familiar with Jenkins and start exploring your proposal areas.
Project ideas include quick-start guidelines and reference newbie-friendly issues
which may help with initial study.
If you do not see anything interesting,
you can &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas/&quot;&gt;propose your own project idea&lt;/a&gt;
or check out ideas proposed by &lt;a href=&quot;https://summerofcode.withgoogle.com/organizations/&quot;&gt;other organizations&lt;/a&gt;
participating in GSoC.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;i-want-to-be-a-mentor-is-it-too-late&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-want-to-be-a-mentor-is-it-too-late&quot; /&gt;I want to be a mentor. Is it too late?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s not!
We are looking for more project ideas and for Jenkins contributors/users
who are passionate about Jenkins and want to mentor students.
No hardcore experience required, mentors can study the project internals together with students and technical advisors.
We are especially interested in ideas beyond the Java stack, and in ideas focusing new technologies and areas
(e.g. Kubernetes, IoT, Python, Go, whatever).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can either propose a new project idea or join an existing one.
See the &lt;a href=&quot;https://www.jenkins.io/blog/2018/12/26/gsoc-2019-call-for-mentors/&quot;&gt;Call for Mentors post&lt;/a&gt;
and &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors&quot;&gt;Information for mentors&lt;/a&gt; for details.
If you want to propose a new project,
please do so by March 11th so that students have time to explore them and to prepare their proposals.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year mentorship does &lt;strong&gt;NOT&lt;/strong&gt; require strong expertise in Jenkins development.
The objective is to guide students and to get involved into the Jenkins community.
GSoC org admins will help to find advisers if special expertise is required.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates&quot; /&gt;Important dates&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;Mar 11 - deadline for new GSoC project idea proposals&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apr 09 - deadline for student applications&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;May 06 - accepted projects announced, teams start community bonding and coding&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aug 26 - coding period ends&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sep 03 - Results announced&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://summerofcode.withgoogle.com/how-it-works/#timeline&quot;&gt;GSoC Timeline&lt;/a&gt; for more info.
In the Jenkins project we will also organize special events during and after GSoC (e.g. at Jenkins world).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/03/01/devops-world-jenkins-world-cfp-open/</id>
<title>DevOps World - Jenkins World 2019: Call for Papers is Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-03-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/03/01/devops-world-jenkins-world-cfp-open/" />
<author>
<name>svanalstine</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<summary>
The DevOps World | Jenkins World shuttle is ready for lift off once again. As usual, the sign of festivities looming begins with the Call for Speakers.
Those who attended DevOps World | Jenkins World 2018 know that DevOps World | Jenkins World 2019 is coming back to San Francisco, and adding a stop in  Europe - Lisbon, Portugal.




Jenkins World USA | San Francisco | August 12 - 15, 2019


Jenkins World Europe | Lisbon | December 2 - 5, 2019*




To encourage open collaboration and stimulate discussions that will help advance Jenkins adoption and drive it forward, we invite Jenkins users,...
</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/JW2019.png&quot; alt=&quot;Jenkins World 2019&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The DevOps World | Jenkins World shuttle is ready for lift off once again. As usual, the sign of festivities looming begins with the Call for Speakers.
Those who attended DevOps World | Jenkins World 2018 know that DevOps World | Jenkins World 2019 is coming back to San Francisco, and adding a stop in  Europe - Lisbon, Portugal.&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.cloudbees.com/devops-world/san-francisco&quot;&gt;&lt;strong&gt;Jenkins World USA&lt;/strong&gt; | San Francisco | August 12 - 15, 2019&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/devops-world/lisbon&quot;&gt;Jenkins World Europe&lt;/a&gt; | Lisbon | December 2 - 5, 2019*&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To encourage open collaboration and stimulate discussions that will help advance Jenkins adoption and drive it forward, we invite Jenkins users, developers and industry experts to submit a speaking proposal to DevOps World | Jenkins World San Francisco and or Lisbon.
Submissions for both locations are being accepted now.
The submission deadline for San Francisco, CA has been extended through March 24, 2019, @ 11:59 PM Pacific and the submission deadline for Lisbon, Portugal is June 9, 2019, @ 11:59 PM Pacific.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The below Q&amp;amp;A will help you breeze through the submission process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;where-do-i-go-to-submit-my-proposal&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-do-i-go-to-submit-my-proposal&quot; /&gt;Where do I go to submit my proposal?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Submissions for both DevOps World | Jenkins World USA and Europe are accepted at:&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.cvent.com/c/abstracts/6eb10034-9500-43a1-97cd-ab4d9230d7f9&quot;&gt;Jenkins World USA&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cvent.com/c/abstracts/6eb10034-9500-43a1-97cd-ab4d9230d7f9&quot;&gt;Jenkins World Europe&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;can-i-make-proposals-to-both-conferences&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#can-i-make-proposals-to-both-conferences&quot; /&gt;Can I make proposal(s) to both conferences?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, you can! Once you’ve created an account on the &lt;a href=&quot;https://www.cvent.com/c/abstracts/6eb10034-9500-43a1-97cd-ab4d9230d7f9&quot;&gt;CFP&lt;/a&gt; website you will be given the option to make submission(s) to one conference or both conferences.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;when-is-the-deadline-for-devops-world-jenkins-world-usa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#when-is-the-deadline-for-devops-world-jenkins-world-usa&quot; /&gt;When is the deadline for DevOps World | Jenkins World USA?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Saturday March 24, 2019 @ 11:59PM Pacific&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;when-is-the-deadline-for-devops-world-jenkins-world-europe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#when-is-the-deadline-for-devops-world-jenkins-world-europe&quot; /&gt;When is the deadline for DevOps World | Jenkins World Europe?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tuesday, June 9, 2019, @ 11:59 PM Pacific&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;san-francisco-important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#san-francisco-important-dates&quot; /&gt;San Francisco Important Dates:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;January 9, 2019:&lt;/strong&gt; Call for papers opens&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;March 24, 2019:&lt;/strong&gt; Call for papers closes&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;April 12, 2019:&lt;/strong&gt; Submission decisions sent&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;May 1, 2019:&lt;/strong&gt; Agenda published - San Francisco, CA&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;May 6, 2019:&lt;/strong&gt; Speaker tasklist is sent out&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;August 12-15, 2019:&lt;/strong&gt; DevOps World | Jenkins World 2019 San Francisco&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;*Due to the deadline extensions for DevOps World | Jenkins World 2019 San Francisco any talks submitted after March 10th will be subject to the important dates below:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;January 9, 2019:&lt;/strong&gt; Call for papers opens&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;March 24, 2019:&lt;/strong&gt; Call for papers closes&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Week of April 1, 2019:&lt;/strong&gt; Submission decisions sent&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Week of April 29, 2019:&lt;/strong&gt; Agenda published - San Francisco, CA&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;May 6, 2019:&lt;/strong&gt; Speaker tasklist is sent out&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;August 12-15, 2019:&lt;/strong&gt; DevOps World | Jenkins World 2019 San Francisco&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;lisbon-important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lisbon-important-dates&quot; /&gt;Lisbon Important Dates:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;January 9, 2019:&lt;/strong&gt; Call for papers opens&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;June 9, 2019:&lt;/strong&gt; Call for papers closes&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;July 19, 2019:&lt;/strong&gt; Submission decisions sent&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;August 19, 2019:&lt;/strong&gt; Agenda published&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;August 23, 2019:&lt;/strong&gt; Speaker tasklist is sent out&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;December 2-5, 2019:&lt;/strong&gt; DevOps World | Jenkins World 2019 Lisbon, Portugal&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;*All Dates Are Subject To Change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We look forward to receiving your inspiring stories!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/02/28/serverless-jenkins/</id>
<title>Run your Jenkins pipeline without operating a Jenkins instance</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-02-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/02/28/serverless-jenkins/" />
<author>
<name>fwilhe</name>
</author>
<category term='jenkins'></category>
<category term='serverless'></category>
<summary>
My job is to work on a Jenkins pipeline specific to SAP S/4HANA extensions running on SAP Cloud Platform.
See the original blog post here.





Jenkins is a powerful tool for automation, and we heavily rely on the codified pipeline syntax introduced in Jenkins 2.


With regards to operations, we minimized the need for care with the cx-server life-cycle management greatly.
Still, you need to run that Jenkins server.
This means you’ll need to update the server and plugins (simplified by our life-cycle management), and scale as the number of builds grows.
User administration and backups are also required in a productive setup.


Is this really required,...
</summary>
<content type='html'>
&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;
My job is to work on a &lt;a href=&quot;https://github.com/sap/cloud-s4-sdk-pipeline&quot;&gt;Jenkins pipeline&lt;/a&gt; specific to SAP S/4HANA extensions running on SAP Cloud Platform.
See the &lt;a href=&quot;https://blogs.sap.com/2019/02/11/deep-dive-experimental-serverless-cicd-with-sap-s4hana-cloud-sdk-continuous-delivery-toolkit/&quot;&gt;original blog post here&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is a powerful tool for automation, and we heavily rely on the codified pipeline syntax introduced in Jenkins 2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With regards to operations, we minimized the need for care with the &lt;a href=&quot;https://blogs.sap.com/2017/09/20/continuous-integration-and-delivery/&quot;&gt;cx-server life-cycle management&lt;/a&gt; greatly.
Still, you need to run that Jenkins server.
This means you’ll need to update the server and plugins (simplified by our life-cycle management), and scale as the number of builds grows.
User administration and backups are also required in a productive setup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Is this really required, or is there an alternative approach?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post, I’ll introduce a prototype I did to get rid of that long running pet Jenkins instance.
Rather, we’ll have cattle Jenkins instances, created and destroyed on demand.
“Serverless” Jenkins in the sense that we don’t have to provision the server for Jenkins to run.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
The setup described in this post is highly experimental. I encourage you to try this out in a demo project, but be very cautious until further notice to use this on productive code. In this proof of concept, I’ll use a public GitHub repository and the free open-source offering by TravisCI. This setup is not suitable for commercial software.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The pets vs cattle metaphor describes how approaches in managing servers differ.
While you care for pets and treat them when they are unwell, cattle can be easily replaced.
Your traditional Jenkins server is a pet because it is often configured manually, and replacing it is a major effort.
For more background on this metaphor, &lt;a href=&quot;https://cloudscaling.com/blog/cloud-computing/the-history-of-pets-vs-cattle/&quot;&gt;click here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before we’re getting into the technical details, let’s discuss why we would want to try this out in the first place.
Running Jenkins on arbitrary CI/CD services, such as TravisCI seems very odd on first sight.
On such services you’ll usually invoke your build tools like Maven or npm in a small script, and that will do your build.
But in the enterprise world, both inside SAP and in the community, Jenkins has a huge market share.
There are many shared libraries for Jenkins, providing pre-made build steps which would be expensive to re-implement for other platforms.
Additionally, SAP S/4HANA Cloud SDK Pipeline is a ready to use pipeline based on Jenkins where you as the developer of an SAP S/4HANA extension application do not need to write and maintain the pipeline yourself.
This means reduced costs and effort for you, while the quality of your application improves, for example due to the many &lt;a href=&quot;https://github.com/SAP/cloud-s4-sdk-pipeline/blob/master/doc/pipeline/cloud-qualities.md&quot;&gt;cloud qualities&lt;/a&gt; which are checked out of the box.&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/2019-02-22/green.png&quot; alt=&quot;green&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let me show you an experiment to see if we can get the best of both worlds.
The goal is to get all the quality checks and the continuous delivery that the SAP S/4HANA Cloud SDK Pipeline provides us, without the need for a pet Jenkins server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How do we do that? The Jenkins project has a project called &lt;a href=&quot;https://github.com/jenkinsci/jenkinsfile-runner&quot;&gt;Jenkinsfile runner&lt;/a&gt;.
It is a command line tool that basically boots up a stripped-down Jenkins instance, creates and runs a single job, and throws away that instance once the job is done. As you might guess, there is some overhead in that process.
This will add about 20 seconds to each build, which I found to be surprisingly fast, considering the usual startup time of a Jenkins server.
For convenient consumption, we have packaged &lt;a href=&quot;https://hub.docker.com/r/ppiper/jenkinsfile-runner&quot;&gt;Jenkinsfile runner as a Docker image&lt;/a&gt; which includes the Jenkins plugins that are required for SAP S/4HANA Cloud SDK Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also utilize the quite new &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Configuration as Code plugin for Jenkins&lt;/a&gt;, which allows to codify the Jenkins configuration as YAML files.
As you will see in a minute, both Jenkinsfile runner and Configuration as Code are a perfect match.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to follow along, feel free to use our provided &lt;a href=&quot;https://github.com/sap/cloud-s4-sdk-book&quot;&gt;Address Manager example application&lt;/a&gt;.
You may fork the repository, or create your own repository and activate it on TravisCI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Based on the existing Address Manager, let’s add a small &lt;code&gt;.travis.yml&lt;/code&gt; file to instruct the build:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;language: minimal
services:
- docker
script: docker run -v /var/run/docker.sock:/var/run/docker.sock -v ${PWD}:/workspace -v /tmp -e CASC_JENKINS_CONFIG=/workspace/jenkins.yml -e CF_PW -e ERP_PW -e BRANCH_NAME=$TRAVIS_BRANCH ppiper/jenkinsfile-runner&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The script line has quite a few things going on, let’s see what is there.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We run a Docker container based on the &lt;code&gt;ppiper/jenkinsfile-runner&lt;/code&gt; image.
We need to mount the Docker socket, so that our container can spawn sibling containers for tooling such as Maven or the CloudFoundry CLI.
We also need to mount the current directory (root of our project) to &lt;code&gt;/workspace&lt;/code&gt;, and tell the Jenkins Configuration as Code Plugin where to find the configuration file.
We’ll come to that file in a minute. Also be sure to pass your secret variables here.
Travis will mask them, so they are not in plain text in your build log.
Take note to change the names of the variables according to your requirements.
You might wonder that we need a &lt;code&gt;BRANCH_NAME&lt;/code&gt; environment variable.
This is required for the Pipeline to check if you’re working on the “productive branch”, where a productive deployment to SAP Cloud Platform is supposed to happen.
If you omit passing this variable, the pipeline will still run but never in the productive mode, and hence not deploy to SAP Cloud Platform.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You might need some secrets in the build, for example in integration tests or for deployment to SAP Cloud Platform.
You can make use of the &lt;a href=&quot;https://github.com/travis-ci/travis.rb#readme&quot;&gt;travis command line tool&lt;/a&gt; to encrypt them on your local machine as &lt;a href=&quot;https://docs.travis-ci.com/user/encryption-keys/&quot;&gt;documented here&lt;/a&gt;.
Take care that this might add your secret in plain text to the shell history on your machine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;travis encrypt CF_PW=supersecret --add
travis encrypt ERP_PW=alsosupersecret --add&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This command will add a line to your &lt;code&gt;.travis.yml&lt;/code&gt; file with the encrypted secret value.
Be sure to commit this change.
Also take note of the name of your variable, which must match the environment parameter, and your Jenkins configuration.
You should be aware of &lt;a href=&quot;https://docs.travis-ci.com/user/best-practices-security/&quot;&gt;this TravisCI document on secrets&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll also need to add a &lt;code&gt;jenkins.yml&lt;/code&gt; file to our project.
Here we need to configure two shared libraries which are required for the SAP S/4HANA Cloud SDK Pipeline, and the credentials that are required for our pipeline.
Be sure not to put your secrets in plain text in here, but use the variables you used before via the travis cli tool.
TravisCI will decrypt the password on the fly for you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;jenkins:
  numExecutors: 10
unclassified:
  globallibraries:
    libraries:
    - defaultVersion: &quot;master&quot;
      name: &quot;s4sdk-pipeline-library&quot;
      retriever:
        modernSCM:
          scm:
            git:
              remote: &quot;https://github.com/SAP/cloud-s4-sdk-pipeline-lib.git&quot;
    - defaultVersion: &quot;master&quot;
      name: &quot;piper-library-os&quot;
      retriever:
        modernSCM:
          scm:
            git:
              remote: &quot;https://github.com/SAP/jenkins-library.git&quot;
credentials:
  system:
    domainCredentials:
      - credentials:
          - usernamePassword:
              scope: GLOBAL
              id: &quot;MY-ERP&quot;
              username: MY_USER
              password: ${ERP_PW}
          - usernamePassword:
              scope: GLOBAL
              id: &quot;cf&quot;
              username: P12344223
              password: ${CF_PW}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You might add more configuration to this file &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/blob/master/README.md#initial-configuration&quot;&gt;as you need it&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Commit both files to your repo and push.
If the travis build works, you’ll see the build integration on GitHub.&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/2019-02-22/in-progress.png&quot; alt=&quot;in progress&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On travis, you can follow the progress of your build live, and get the full text log of your Jenkins build.
If all went well, you will be greeted with a green build after a few minutes.&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/2019-02-22/log.png&quot; alt=&quot;log&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations. You’re running a serverless Jenkins build with all the qualities checked by the SAP S/4HANA Cloud SDK Pipeline, without hosting your own Jenkins instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Keep in mind this is a proof of concept at this point.
The serverless Jenkins ecosystem is currently evolving, and neither Jenkinsfile runner, nor Configuration as Code are in a mature state as of February 2019.
One downside of this approach is that we lose the Jenkins user interface, so we can’t see our pipeline in blue ocean, and we don’t get the nice build summary.
We can get the whole log output from TravisCI, so this can be mitigated, but this is arguable not the best user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But on the contrary, we don’t have to care for our pet Jenkins, we don’t need to update plugins or backup the configuration or build logs.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/02/26/jenkins-alexa-voice-controlled-cicd/</id>
<title>Jenkins + Alexa: Say Hello to Voice Controlled CI/CD</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-02-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/02/26/jenkins-alexa-voice-controlled-cicd/" />
<author>
<name>keshawilliams</name>
</author>
<category term='jenkins'></category>
<category term='alexa'></category>
<summary>
Integrating Jenkins with Alexa to launch your pipelines and obtain results
about your deployments through voice is easier than you think.  Learn how Alexa
Champion, Kesha Williams', latest side project teaches Alexa to deploy code to
the cloud.







Alexa (named after the ancient library of Alexandria) is Amazon&#8217;s Artificial
Intelligence (AI) powered intelligent voice assistant that runs in the cloud.
Software engineers make Alexa smarter by creating apps, called skills.  From
the time that I developed my first Alexa skill, I dreamed of deploying my Java
projects to the cloud via voice.  For me, telling Alexa to deploy my code is
the ultimate level of cool!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Integrating Jenkins with Alexa to launch your pipelines and obtain results
about your deployments through voice is easier than you think.  Learn how Alexa
Champion, Kesha Williams&#39;, latest side project teaches Alexa to deploy code to
the cloud.&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/2019-02-26-alexa/jenkins_alexa_header.png&quot; alt=&quot;Jenkins with Amazon Alexa&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alexa (named after the ancient library of Alexandria) is Amazon’s Artificial
Intelligence (AI) powered intelligent voice assistant that runs in the cloud.
Software engineers make Alexa smarter by creating apps, called skills.  From
the time that I developed my first Alexa skill, I dreamed of deploying my Java
projects to the cloud via voice.  For me, telling Alexa to deploy my code is
the ultimate level of cool!  I recently made my dream a reality when I devoted
a weekend to developing my newest Alexa skill, DevOps Pal.  In this blog, I
will show you how I developed DevOps Pal and hopefully inspire you to build
your own version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/NsFbSJMrVQA?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-choose-voice-to-deploy-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-choose-voice-to-deploy-code&quot; /&gt;Why Choose Voice to Deploy Code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voice-first technology is revolutionizing how we interact with technology because the interaction is simple, frictionless, and time-saving.
For me, voice is an easier way to control Jenkins and retrieve results about my deployments without having to touch a keyboard.
In this use case, voice is another access point for data and is a way to further automate the process of building, testing, and deploying a Java project to the cloud, improving efficiency.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;continuous-integration-and-continuous-delivery-cicd&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#continuous-integration-and-continuous-delivery-cicd&quot; /&gt;Continuous Integration and Continuous Delivery (CI/CD)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re working with DevOps, you understand the need for Continuous Integration and Continuous Delivery (CI/CD) to automate the software delivery pipeline in a reproducible way.
CI/CD is the practice of continuously building, testing, and deploying code once it’s committed to version control.
DevOps and CI/CD provides software engineering teams with confidence in the code being pushed to production and shorter development lifecycles, which in the end produces happier users, clients, and customers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;devops-pal-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#devops-pal-overview&quot; /&gt;DevOps Pal Overview&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;DevOps Pal is a private Alexa for Business skill that is used to kick off a Jenkins pipeline job.
Alexa for Business was the perfect way for me to distribute DevOps Pal since I have the ability to enable the skill on an organization-by-organization basis, which gives me complete control over who has access.
Once DevOps Pal invokes the job, the pipeline status displays in real-time via the Blue Ocean Pipeline Run Details View Page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;devops-pal-architecture&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#devops-pal-architecture&quot; /&gt;DevOps Pal Architecture&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I used several components and tools to create DevOps Pal. Let’s review the architecture in detail.&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/2019-02-26-alexa/devops_pal_architecture.png&quot; alt=&quot;DevOps Pal Skill Architecture&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The flow begins by saying, &quot;Alexa, open DevOps Pal and deploy my code&quot;, to the Echo device.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Echo device listens for the wake word (e.g. Alexa, Echo, Computer, or Amazon), which employs deep learning technology running on the device to recognize the wake word the user has chosen.
Once the wake word is detected, what I say is recorded and sent to the Alexa Voice Service (AVS), which uses speech to text and natural language understanding (NLU) to identify my intent.
My intent is sent to DevOps Pal; the skill acts accordingly by kicking off the Jenkins job and sending a response back using text-to-speech synthesis (TTS), which makes the response natural sounding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s explore each component in more detail:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Alexa Voice Service (AVS) - I often refer to the Alexa Voice Service as the &quot;Alexa brain that runs in the cloud&quot;. The AVS is a suite of services built around a voice-controlled AI assistant. The AVS is flexible enough to allow third parties to add intelligent voice control to any connected product that has a microphone and speaker, so Alexa is not limited to just Echo devices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alexa Skills Kit (ASK) - ASK is the &quot;SDK&quot; (Software Development Kit) that allows developers to build custom skills for Alexa.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alexa Developer Portal - An Alexa skill includes a voice user interface, or VUI, to understand user intents, and a back-end cloud service to process intents by telling Alexa how to respond. The VUI and the integration with the back-end service is setup and configured through the Alexa Developer Portal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Lambda - A chunk of code that runs in the cloud. Developers can run their code without having to provision or manage servers. Applications created with AWS Lambda are considered to be serverless. Lambda supports several popular languages like Python, Java, Node.js, Go, C#, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub - A version control system for the Java project source code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins on EC2 - I use Jenkins to build, test, and deploy my Java Application Programming Interface (API). Elastic Cloud Computer (EC2) is the virtual server where Jenkins is installed. Jenkins works alongside several other tools:&lt;/p&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Maven - A build automation tool for Java projects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Junit - A testing framework for Java projects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Command Line Interface (CLI) - This is a command line tool that allows developers to access their Amazon Web Services (AWS) account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blue Ocean - This is a plugin for Jenkins that provides an easy to use interface to create and monitor Jenkins pipelines.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AWS Elastic Beanstalk - This is an orchestration service that allows developers to deploy and manage web applications in the AWS cloud.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Postman - This is an HTTP client for testing APIs and web services.&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;voice-interaction-model&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#voice-interaction-model&quot; /&gt;Voice Interaction Model&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Voice User Interface (VUI) describes the overall conversational flow and is setup via the Alexa Developer Console.&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/2019-02-26-alexa/alexa_dev_console.png&quot; alt=&quot;Invocation Name Setup Via Alexa Developer Console&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few important components of the VUI are the Invocation Name (how users launch your skill) and the Intents (phrases a user says to &quot;talk to&quot; or interact with your skill).&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/2019-02-26-alexa/alexa_dev_console_deploy.png&quot; alt=&quot;Utterances for DeployCodeIntent Via Alexa Developer Console&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Specifically, the &quot;DeployCodeIntent&quot; is invoked when a user says one of several phrases (e.g. run jenkins pipeline, run jenkins job, deploy the code, deploy code, or deploy ) or a variation of the phrase like, &quot;deploy my code&quot;.&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/2019-02-26-alexa/alexa_dev_console_endpoint.png&quot; alt=&quot;Backend Fulfillment Logic - Endpoint Via Alexa Developer Console&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The endpoint is the destination where the skill requests are sent for fulfillment.
In this case, the backend logic is an AWS Lambda authored in Python.
The business logic in the Python Lambda uses the Jenkins remote access API to trigger the job remotely.
The format of the URL to trigger the job is &lt;code&gt;jenkins_url/job/job_name/build&lt;/code&gt;.
The API call uses BASIC authentication and a Jenkins Crumb passed in the HTTP request header for CSRF protection.
Alternatively, since Jenkins 2.96, you can use an API token instead of a Jenkins Crumb and password to authenticate your API call.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-job&quot; /&gt;Jenkins Job&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/2019-02-26-alexa/jenkins_classic_alexa.png&quot; alt=&quot;Jenkins Classic UI&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins job, &#39;alexa-cicd&#39;, is the job invoked from DevOps Pal.
Although, the Jenkins Classic User Interface (UI) is functional, I prefer the Blue Ocean interface because it rethinks the user experience of Jenkins by making it visually intuitive.
Blue Ocean is easily enabled via a &lt;a href=&quot;https://plugins.jenkins.io/blueocean&quot;&gt;plugin&lt;/a&gt; and leaves the option to continue using the Jenkins Classic UI should you so choose.&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/2019-02-26-alexa/jenkins_blueocean_alexa.png&quot; alt=&quot;Jenkins Blue Ocean Pipeline Run Details View Page&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After Alexa kicks off the &#39;alexa-cicd&#39; job, I navigate to the Pipeline Run Details View Page, which allows me to watch the job status in realtime.
This job has four stages: Initialize, Build, Test, and Deploy.
The final stage, Deploy, uses the AWS Command Line Interface (CLI) on the Jenkins server to copy the artifact to Amazon Simple Storage Service (S3) and create a new Elastic Beanstalk application version based on the artifact located on S3.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;cool-features-to-add&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cool-features-to-add&quot; /&gt;Cool Features to Add&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The ability to deploy code with voice is just the beginning.
There are several cool features that can easily be added:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DevOps Pal can be updated to prompt the user for the specific Jenkins pipeline job name. This adds a level of flexibility that will really empower DevOps teams.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alexa Notifications can be integrated with DevOps Pal to send a notification to the Echo device when the Jenkins job is finished or when it fails. If the job fails, more information about where the job failed and exactly why will be provided. This will prove useful for long running jobs or for getting timely updates regarding the job status.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DevOps Pal can be updated to answer direct questions about the real-time status of a specific job.&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;want-to-learn-more&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#want-to-learn-more&quot; /&gt;Want to Learn More&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope you’ve enjoyed learning more about the architecture of DevOps Pal and deploying code to the cloud using Jenkins and voice.
For more detailed steps, I’ve collaborated with Cloud Academy to author a course, &lt;a href=&quot;https://cloudacademy.com/aws-alexa-for-ci-cd-new-course&quot;&gt;AWS Alexa for CI/CD&lt;/a&gt; on the subject.&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/02/21/credentials-masking/</id>
<title>Limitations of Credentials Masking</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-02-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/02/21/credentials-masking/" />
<author>
<name>daniel-beck</name>
</author>
<category term='security'></category>
<summary>
In the Jenkins project, we ask that people report security issues to our private issue tracker.
This allows us to review issues and prepare fixes in private, often resulting in better, safer security fixes.


As a side effect of that, we also learn about common misconceptions and usability problems related to security in Jenkins.
This post is intended to address one of those:
The goal and limitations of credentials masking.


The Problem


One very common example of that is the role of credentials masking in Jenkins, typically involving a pipeline snippet that looks like this:

  
    Jenkinsfile (Scripted Pipeline)
   ...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Jenkins project, we ask that people &lt;a href=&quot;https://www.jenkins.io/security/#reporting-vulnerabilities&quot;&gt;report security issues to our private issue tracker&lt;/a&gt;.
This allows us to review issues and prepare fixes in private, often resulting in better, safer security fixes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a side effect of that, we also learn about common misconceptions and usability problems related to security in Jenkins.
This post is intended to address one of those:
The goal and limitations of credentials masking.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-problem&quot; /&gt;The Problem&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One very common example of that is the role of credentials masking in Jenkins, typically involving a pipeline snippet that looks like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: true&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;withCredentials([usernamePassword(&lt;span style=&quot;color:#606&quot;&gt;credentialsId&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;topSecretCredentials&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;passwordVariable&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;PWD&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;usernameVariable&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;USR&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)])
  sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;./deploy.sh&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;// requires PWD and USR to be set&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Credentials that are in scope are made available to the pipeline without limitation.
To prevent accidental exposure in the build log, credentials are masked from regular output, so an invocation of &lt;code&gt;env&lt;/code&gt; (Linux) or &lt;code&gt;set&lt;/code&gt; (Windows), or programs printing their environment or parameters would not reveal them in the build log to users who would not otherwise have access to the credentials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The misconception here is that Jenkins will prevent other, perhaps deliberate ways to reveal the password.
Some examples:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: true&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;withCredentials([usernamePassword(&lt;span style=&quot;color:#606&quot;&gt;credentialsId&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;topSecretCredentials&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;passwordVariable&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;PWD&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;usernameVariable&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;USR&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)])
  sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo $PWD | base64&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;// will print e.g. dDBwczNjcjN0Cg= which is trivially converted back to the top secret password&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: true&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;withCredentials([usernamePassword(&lt;span style=&quot;color:#606&quot;&gt;credentialsId&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;topSecretCredentials&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;passwordVariable&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;PWD&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;usernameVariable&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;USR&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)])
  sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo $PWD &amp;gt; myfile&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  archiveArtifacts &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;myfile&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;// then browse archived artifacts from the Jenkins UI&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both of these snippets circumvent credentials masking in the build log, and show that people with control over the build script can use credentials in ways not necessarily intended or approved by admins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Obviously these are just the most straightforward examples illustrating the problem.
Others could involve the proc file system, sending it to an HTTP server in response to a 401 authentication challenge, embedding it in the (otherwise legitimate) build result, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It would be great if Jenkins could allow the flexible use of credentials with no risk of exposing them through straightforward build script modifications, but realistically, it is impossible for Jenkins to police use of the credential by a build script without the support of a very specific environment setup (e.g. restrictive network configuration).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It should also be noted that credentials aren’t just at risk from users able to control the pipeline, typically by editing the &lt;code&gt;Jenkinsfile&lt;/code&gt;.
Actual build scripts invoked by pipelines, either shell scripts as in the example above, or more standard build tools such as Maven (controlled by &lt;code&gt;pom.xml&lt;/code&gt;) are just as much of a risk if they are run inside a &lt;code&gt;withCredentials&lt;/code&gt; block, or executing on the same agent as another block that passed such credentials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Disclosure of secrets can also happen inadvertently:
Jenkins will prevent &lt;em&gt;exact&lt;/em&gt; matches of the password or other secret to appear in the log file.
Consider that the secret may contain shell metacharacters that &lt;code&gt;bash +x&lt;/code&gt; would escape by adding a &lt;code&gt;\&lt;/code&gt; before those characters.
The sequence of characters to be printed is no longer identical to the secret, so would not be masked.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-solution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-solution&quot; /&gt;The Solution&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Credentials can be defined in different scopes:
Credentials defined on the root &lt;em&gt;Jenkins&lt;/em&gt; store (the default) will be available to all jobs on the instance.
The only exception are credentials with &lt;em&gt;System&lt;/em&gt; scope, intended for the global configuration only, for example, to connect to agents.
Credentials defined in a folder are only available within that folder (transitively, i.e. also in folders inside this folder).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This allows defining sensitive credentials, such as deployment credentials, on specific folders whose contents only users trusted with those credentials are allowed to configure:
Directly in Jenkins using &lt;a href=&quot;https://plugins.jenkins.io/matrix-auth&quot;&gt;Matrix Authorization Plugin&lt;/a&gt; and by limiting write access to repositories defining pipelines as code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipelines inside this folder can use the (e.g. deployment) credentials without limitation, while they’re inaccessible to pipelines outside the folder.
Those would need to use the &lt;a href=&quot;https://plugins.jenkins.io/pipeline-build-step&quot;&gt;&lt;code&gt;build&lt;/code&gt; step&lt;/a&gt; or similar approaches to invoke the pipelines inside the folder to deploy their output.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;caveats&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#caveats&quot; /&gt;Caveats&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the previous section outlines a solution to the problem of restricting access to credentials, care needs to be taken so that credentials are not captured anyway.
For example, a deployment pipeline that allows its users to define where to deploy to as a build parameter might still be used to send credentials to a maliciously set up host to capture them.
&lt;a href=&quot;https://www.jenkins.io/blog/2018/05/15/incremental-deployment/&quot;&gt;A blog post explaining the design of some Jenkins project infrastructure&lt;/a&gt; discusses some of these concerns around trust.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It should also be noted that credential domains are a UI hint only — defining a credential to only be valid for &lt;code&gt;github.com&lt;/code&gt; does not actually prevent its use elsewhere.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/02/17/remoting-cli-removed/</id>
<title>Remoting-based CLI removed from Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-02-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/02/17/remoting-cli-removed/" />
<author>
<name>jglick</name>
</author>
<category term='core'></category>
<category term='security'></category>
<category term='remoting'></category>
<summary>
Close to two years ago, we announced in
New, safer CLI in 2.54
that the traditional “Remoting” operation mode of the Jenkins command-line interface
was being deprecated for a variety of reasons, especially its very poor security record.
Today in Jenkins 2.165 support for this mode is finally being removed altogether,
in both the server and bundled jenkins-cli.jar client.
The projected June 5th LTS release will reflect this removal,
at which point the Jenkins project will no longer maintain this feature
nor investigate security vulnerabilities in it.


This change makes the code in Jenkins core related to the CLI considerably simpler and more maintainable.
(There are still two transports—HTTP(S) and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Close to two years ago, we announced in
&lt;a href=&quot;https://www.jenkins.io/blog/2017/04/11/new-cli/&quot;&gt;New, safer CLI in 2.54&lt;/a&gt;
that the traditional “Remoting” operation mode of the Jenkins command-line interface
was being deprecated for a variety of reasons, especially its very poor security record.
Today in Jenkins 2.165 support for this mode is finally being removed altogether,
in both the server and bundled &lt;code&gt;jenkins-cli.jar&lt;/code&gt; client.
The projected June 5th LTS release will reflect this removal,
at which point the Jenkins project will no longer maintain this feature
nor investigate security vulnerabilities in it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This change makes the code in Jenkins core related to the CLI considerably simpler and more maintainable.
(There are still two &lt;em&gt;transports&lt;/em&gt;—HTTP(S) and SSH—but they have similar capabilities and behavior.)
It also reduces the “attack surface” the Jenkins security team must consider.
Among other issues, a compromised &lt;em&gt;server&lt;/em&gt; could freely attack a developer’s laptop if &lt;code&gt;-remoting&lt;/code&gt; were used.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The
&lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.46/&quot;&gt;2.46.x upgrade guide&lt;/a&gt;
already urged administrators to disable Remoting mode on the server.
Those Jenkins users who rely on the CLI for remote scripting (as opposed to the HTTP(S) REST APIs)
would be affected only if they were still using the &lt;code&gt;-remoting&lt;/code&gt; CLI flag,
since the default has long been to use HTTP(S) mode.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most CLI features have long worked fine without &lt;code&gt;-remoting&lt;/code&gt;,
in some cases using slightly different syntax such as requiring shell redirects to access local files.
As part of this change, some CLI commands, options, and option types in Jenkins core have been removed, other than &lt;code&gt;-remoting&lt;/code&gt; itself:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;login&lt;/code&gt; and &lt;code&gt;logout&lt;/code&gt; commands, and the &lt;code&gt;--username&lt;/code&gt; and &lt;code&gt;--password&lt;/code&gt; options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;-p&lt;/code&gt; option to select a proxy. (The CLI in default &lt;code&gt;-http&lt;/code&gt; mode accesses Jenkins no differently than any other HTTP client.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;install-tool&lt;/code&gt;, &lt;code&gt;set-build-parameter&lt;/code&gt;, and &lt;code&gt;set-build-result&lt;/code&gt; commands relied on a fundamentally insecure idiom that is no longer supportable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Command options or arguments which took either a local file or &lt;code&gt;=&lt;/code&gt; for standard input/output (e.g., &lt;code&gt;install-plugin&lt;/code&gt;, &lt;code&gt;build -p&lt;/code&gt;, &lt;code&gt;support&lt;/code&gt;) now only accept the latter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some features of relatively little-used plugins will no longer work, such as:&lt;/p&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/distfork&quot;&gt;DistFork&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/remote-terminal-access&quot;&gt;Remote Terminal Access&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/build-env-propagator&quot;&gt;Build Env Propagator&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/02/06/ssh-steps-for-jenkins-pipeline/</id>
<title>SSH Steps for Jenkins Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-02-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/02/06/ssh-steps-for-jenkins-pipeline/" />
<author>
<name>nrayapati</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='ssh'></category>
<category term='steps'></category>
<summary>
Pipeline-as-code or defining the deployment pipeline through code rather than manual job creation through UI, provides tremendous benefits for teams automating builds and deployment infrastructure across their environments.





Jenkins Pipelines


Jenkins is a well-known open source continuous integration and continuous deployment automation tool. With the latest 2.0 release, Jenkins introduced the Pipeline plugin that implements Pipeline-as-code. This plugin lets you define delivery pipelines using concise scripts which deal elegantly with jobs involving persistence and asynchrony.


The Pipeline-as-code&#8217;s script is also known as a Jenkinsfile.


Jenkinsfiles uses a domain specific language syntax based on the Groovy programming language. They are persistent files which can be...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Pipeline-as-code&lt;/strong&gt; or defining the deployment pipeline through code rather than manual job creation through UI, provides tremendous benefits for teams automating builds and deployment infrastructure across their environments.&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/pipeline/realworld-pipeline-flow.png&quot; alt=&quot;Pipeline Flow&quot; width=&quot;100%&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-pipelines&quot; /&gt;Jenkins Pipelines&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://www.jenkins.io/&quot;&gt;Jenkins&lt;/a&gt; is a well-known open source continuous integration and continuous deployment automation tool. With the latest 2.0 release, Jenkins introduced the Pipeline plugin that implements Pipeline-as-code. This plugin lets you define delivery pipelines using concise scripts which deal elegantly with jobs involving persistence and asynchrony.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline-as-code’s script is also known as a &lt;em&gt;Jenkinsfile&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkinsfiles uses a domain specific language syntax based on the &lt;a href=&quot;https://groovy-lang.org/&quot;&gt;Groovy&lt;/a&gt; programming language. They are persistent files which can be checked in and version-controlled along with the rest of their project source code. This file can contain the complete set of encoded steps (steps, nodes, and stages) necessary to define the entire application life-cycle, becoming the intersecting point between development and operations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;missing-piece-of-the-puzzle&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#missing-piece-of-the-puzzle&quot; /&gt;Missing piece of the puzzle&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most common steps defined in a basic pipeline job is the &lt;em&gt;Deploy&lt;/em&gt; step. The deployment stage encompasses everything from publishing build artifacts to pushing code into pre-production and production environments. This deployment stage usually involves both development and operations teams logging onto various remote nodes to run commands and/or scripts to deploy code and configuration. While there are a couple of existing ssh plugins for Jenkins, they currently don’t support the functionality such as logging into nodes for pipelines. Thus, there was a need for a plugin that supports these steps.&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;introducing-ssh-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-ssh-steps&quot; /&gt;Introducing SSH Steps&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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/2019-02-06-ssh-steps/JenkinsPlusSSH.png&quot; alt=&quot;SSH Steps&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently, our team at Cerner started working on a project to automate deployments through Jenkins pipelines to help facilitate running commands on over one thousand nodes. We looked at several options including existing plugins, internal shared Jenkins libraries, and others. In the end, we felt it was best to create and open source a plugin to fill this gap so that it can be used across Cerner and beyond.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The initial version of this new plugin SSH Steps supports the following:&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;sshCommand&lt;/code&gt;: Executes the given command on a remote node.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sshScript&lt;/code&gt;: Executes the given shell script on a remote node.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sshGet&lt;/code&gt;: Gets a file/directory from the remote node to current workspace.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sshPut&lt;/code&gt;: Puts a file/directory from the current workspace to remote node.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;sshRemove&lt;/code&gt;: Removes a file/directory from the remote node.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;usage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#usage&quot; /&gt;Usage&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below is a simple demonstration on how to use above steps. More documentation can be found on &lt;a href=&quot;https://github.com/jenkinsci/ssh-steps-plugin/blob/master/README.adoc&quot;&gt;GitHub&lt;/a&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;groovy&quot;&gt;&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&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;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;node&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;node.abc.com&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;allowAnyHosts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&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;sshUserAcct&#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;password&#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;userName&#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;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;userName&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;password&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;password&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;s2&quot;&gt;&quot;SSH Steps Rocks!&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;n&quot;&gt;writeFile&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;file:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test.sh&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;text:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ls&#39;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sshCommand&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;remote:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;command:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;for i in {1..5}; do echo -n \&quot;Loop \$i \&quot;; date ; sleep 1; done&#39;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sshScript&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;remote:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;script:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test.sh&#39;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sshPut&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;remote:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;from:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test.sh&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;into:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;.&#39;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sshGet&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;remote:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;from:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test.sh&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;into:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test_new.sh&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;override:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sshRemove&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;remote:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;path:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test.sh&#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;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configuring-via-yaml&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuring-via-yaml&quot; /&gt;Configuring via YAML&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At Cerner, we always strive to have simple configuration files for CI/CD pipelines whenever possible. With that in mind, my team built a wrapper on top of these steps from this plugin. After some design and analysis, we came up with the following YAML structure to run commands across various remote groups:&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;config&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;credentials_id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sshUserAcct&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;remote_groups&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;r_group_1&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;node01&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;node01.abc.net&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;node02&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;node02.abc.net&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;r_group_2&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;node03&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;node03.abc.net&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;command_groups&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;c_group_1&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;commands&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;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;ls&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-lrt&#39;&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;whoami&#39;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;scripts&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;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;test.sh&#39;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;c_group_2&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;gets&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;from&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;test.sh&#39;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;test_new.sh&#39;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;puts&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;from&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;test.sh&#39;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.&#39;&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;removes&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;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;test.sh&#39;&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;deploy&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;remote_groups&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;s&quot;&gt;r_group_1&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;command_groups&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;s&quot;&gt;c_group_1&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;remote_groups&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;s&quot;&gt;r_group_2&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;command_groups&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;s&quot;&gt;c_group_2&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 above example runs commands from &lt;code&gt;c_group_1&lt;/code&gt; on remote nodes within &lt;code&gt;r_group_1&lt;/code&gt; in parallel before it moves on to the next group using &lt;code&gt;sshUserAcct&lt;/code&gt; (from the &lt;a href=&quot;https://www.jenkins.io/doc/book/using/using-credentials/&quot;&gt;Jenkins Credentials&lt;/a&gt; store) to logon to nodes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;shared-pipeline-library&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#shared-pipeline-library&quot; /&gt;Shared Pipeline Library&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have created a shared pipeline library that contains a &lt;code&gt;sshDeploy&lt;/code&gt; step to support the above mentioned YAML syntax. Below is the code snippet for the sshDeploy step from the library. The full version can be found &lt;a href=&quot;https://github.com/nrayapati/ssh-deploy-library&quot;&gt;here&lt;/a&gt; on Github.&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;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/usr/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groovy&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&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;n&quot;&gt;yamlName&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;yaml&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;readYaml&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;file:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;yamlName&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;n&quot;&gt;yaml&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;credentials_id&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;password&#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;userName&#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;yaml&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stageName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remoteGroups&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;allRemotes&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;it&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;remote_groups&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;remoteGroups&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;it&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;yaml&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;remotes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;$it&quot;&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

                &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;commandGroups&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;it&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;command_groups&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;commandGroups&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;it&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;yaml&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;commands&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;$it&quot;&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isSudo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;remoteGroups&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remoteGroupName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remotes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;allRemotes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remotes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;collect&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;host&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;userName&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;password&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;password&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;allowAnyHosts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;groupName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remoteGroupName&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;remote&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;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;allRemotes&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;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;allRemotes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stepsForParallel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;allRemotes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;collectEntries&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
                            &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;${remote.groupName}-${remote.name}&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;transformIntoStep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stageName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;groupName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;commandGroups&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stageName&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;parallel&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stepsForParallel&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;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;allRemotes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;first&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;n&quot;&gt;stageName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;\n&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;groupName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;-&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;name&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;transformIntoStep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stageName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;groupName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;commandGroups&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;call&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;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;By using the step (as described in the snippet above) from this shared pipeline library, a Jenkinsfile can be reduced to:&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;nd&quot;&gt;@Library&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;ssh_deploy&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;
  &lt;span class=&quot;nf&quot;&gt;sshDeploy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;dev/deploy.yml&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An example execution of the above pipeline code in Blue Ocean looks like this:&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/2019-02-06-ssh-steps/jenkins-ssh-deploy.png&quot; alt=&quot;SSH Deploy BlueOcean View&quot; width=&quot;80%&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;wrapping-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#wrapping-up&quot; /&gt;Wrapping up&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Steps from the &lt;a href=&quot;https://github.com/jenkinsci/ssh-steps-plugin&quot;&gt;SSH Steps Plugin&lt;/a&gt; are deliberately generic enough that they can be used for various other use-cases as well, not just for deploying code. Using SSH Steps has significantly reduced the time we spend on deployments and has given us the possibility of easily scaling our deployment workflows to various environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Help us make this &lt;a href=&quot;https://github.com/jenkinsci/ssh-steps-plugin&quot;&gt;plugin&lt;/a&gt; better by contributing. Whether it is adding or suggesting a new feature, bug fixes, or simply improving documentation, contributions are always welcome.&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/2019/02/05/jenkins-new-year-in-china/</id>
<title>Jenkins new year in China</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-02-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/02/05/jenkins-new-year-in-china/" />
<author>
<name>linuxsuren</name>
</author>
<category term='core'></category>
<category term='community'></category>
<category term='chinese'></category>
<summary>
At the time of the Spring Festival. I want to make a summary of some activities in the last year.
You might already notice that more and more Chinese contributors emerge in the Jenkins community.
We have a GSoC champion who is Shenyu Zheng.
He is a great example for other students. With the effort of three skilled engineers,
many Jenkins users could learn the edge technologies and useful use cases.
They co-organized several Jenkins Meetups in a couple of cities in China.


There are two workshops about Jenkins and Jenkins X in the DevOps International Summit. James Rawlings gave us a wonderful view of the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the time of the Spring Festival. I want to make a summary of some activities in the last year.
You might already notice that more and more Chinese contributors emerge in the Jenkins community.
We have a GSoC champion who is &lt;a href=&quot;https://github.com/cizezsy&quot;&gt;Shenyu Zheng&lt;/a&gt;.
He is a great example for other students. With the effort of three skilled engineers,
many Jenkins users could learn the edge technologies and useful use cases.
They co-organized several Jenkins Meetups in a couple of cities in China.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are two workshops about Jenkins and Jenkins X in the DevOps International Summit. &lt;a href=&quot;https://github.com/rawlingsj&quot;&gt;James Rawlings&lt;/a&gt; gave us a wonderful view of the Jenkins X. Many people start to know this project. The &lt;a href=&quot;https://jenkins-x.io/zh/&quot;&gt;Chinese website of jx&lt;/a&gt; would be helpful to those people.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On November 3rd, 2018 the &lt;a href=&quot;https://www.jenkins.io/blog/2019/01/09/jenkins-user-conference-china-shenzhen-update/&quot;&gt;Jenkins User Conference China(JUCC)&lt;/a&gt; was hosted in Shenzhen. More than 200 attendees gathered at JUCC to share and discuss Jenkins, DevOps, Continuous Delivery, Pipeline, and Agile.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was a Jenkins workshop to teach users to develop a plugin in October. It was during the Hacktoberfest 2018. So some people got a beautiful T-shirt at this meetup. We’ll keep this event in 2019. I hope more users and developers could join us.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you all folks. And other friendly contributors.&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/logos/kongfu/256.png&quot; alt=&quot;Chinese KongFu&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Chinese is our main communication language. A large number of the Jenkins users are not a proficient English speaker.
So letting most of Chinese Jenkins users could easily use Jenkins as their CI/CD platform is the final mission of &lt;a href=&quot;https://www.jenkins.io/sigs/chinese-localization/&quot;&gt;Chinese Localization SIG&lt;/a&gt;.
You can find three participants on the page. But that’s not the &lt;a href=&quot;https://github.com/jenkins-infra/cn.jenkins.io/graphs/contributors&quot;&gt;full list&lt;/a&gt;.
More exciting thing is that &lt;a href=&quot;https://github.com/alauda&quot;&gt;Alauda&lt;/a&gt; giving a big support which as a startup company.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;WeChat is the greatest social media channel in China. WeChat has one billion users.
Almost everyone in China has a WeChat account. It must be a perfect place to publish articles and events.
There are over 1k people subscribed the &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=Mzg2MzAwNzU3Nw==&amp;amp;mid=2247483664&amp;amp;idx=1&amp;amp;sn=fa3fb0171d999d345105ce17f8175be7&quot;&gt;Jenkins official WeChat Subscription Account&lt;/a&gt; in the last three months.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the new year, I’m looking forward to growing up with you all!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/02/01/windows-installers/</id>
<title>Windows Installer Updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-02-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/02/01/windows-installers/" />
<author>
<name>slide_o_mix</name>
</author>
<category term='windows'></category>
<category term='platform-sig'></category>
<category term='installers'></category>
<summary>
The Windows Installer for Jenkins has been around for many years as a way for users to install a Jenkins controller on Windows as a service.
Since it&#8217;s initial development, it has not received a lot of updates or features, but that is about to change.


First, let&#8217;s take a look at the current installer experience.


Step 1




This is the default look and feel for a Windows Installer using the WiX Toolset, not very pretty and doesn&#8217;t give
much branding information as to what the installer is for.



Step 2




Again, not much branding information.



Step 3




The installer in general does not give many options for installing...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Windows Installer for Jenkins has been around for many years as a way for users to install a Jenkins controller on Windows as a service.
Since it’s initial development, it has not received a lot of updates or features, but that is about to change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, let’s take a look at the current installer experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-1&quot; /&gt;Step 1&lt;/h3&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/2019-02-01-windows-installer/old_installer_1.png&quot; alt=&quot;Installer Startup&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the default look and feel for a Windows Installer using the &lt;a href=&quot;https://wixtoolset.org&quot;&gt;WiX Toolset&lt;/a&gt;, not very pretty and doesn’t give
much branding information as to what the installer is for.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-2&quot; /&gt;Step 2&lt;/h3&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/2019-02-01-windows-installer/old_installer_2.png&quot; alt=&quot;Installation Directory&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Again, not much branding information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-3&quot; /&gt;Step 3&lt;/h3&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/2019-02-01-windows-installer/old_installer_3.png&quot; alt=&quot;Install It&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The installer in general does not give many options for installing Jenkins, other than selecting the installation location.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues&quot; /&gt;Issues&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The current installer has a few issues that the Platform SIG wanted to fix in a new install experience for users.&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 installer only supports 32-bit installations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The user could not select ports or user accounts to run the service on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The installer bundled a 32-bit version of the Java runtime instead of using a pre-existing JRE&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The installer did not support the experimental support in Jenkins for Java 11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The JENKINS_HOME directory was not placed in a good spot for modern Windows&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is no branding in the installer.&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;road-forward&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#road-forward&quot; /&gt;Road Forward&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the experimental Jenkins Windows Installer, most of these issues have been resolved!&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 installer will only support 64-bit systems going forward. This is the vast majority of Windows systems these days,
so this will help more users install Jenkins using the installer package.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The user is now able to enter user information for the service and select the port that Jenkins will use and verify that the port is available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The installer no longer bundles a JRE, but will search for a compatible JRE on the system. If the user wants to use a different JRE, they can specify during install.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The installer has support for running with a Java 11 JRE, including the components listed on the &lt;a href=&quot;https://www.jenkins.io/blog/2018/12/14/java11-preview-availability/&quot;&gt;Java 11 Preview Page&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the JENKINS_HOME directory is placed in the LocalAppData directory for the user that the service will run as, this aligns with modern Windows file system layouts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The installer has been updated with branding to make it look nicer and provide a better user experience.&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;screenshots&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#screenshots&quot; /&gt;Screenshots&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below are screenshots of the new installer sequence:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-1-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-1-2&quot; /&gt;Step 1&lt;/h3&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/2019-02-01-windows-installer/new_installer_1.png&quot; alt=&quot;Installer Startup&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins logo is now a prominent part of the UI for the installer.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-2-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-2-2&quot; /&gt;Step 2&lt;/h3&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/2019-02-01-windows-installer/new_installer_2.png&quot; alt=&quot;Installation Directory&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins logo and name are now in the header during all phases of the installer.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-3-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-3-2&quot; /&gt;Step 3&lt;/h3&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/2019-02-01-windows-installer/new_installer_3.png&quot; alt=&quot;Account Selection&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The installer now allows you to specify the username/password for the account to run as and checks that the account has LogonAsService rights.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-4&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-4&quot; /&gt;Step 4&lt;/h3&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/2019-02-01-windows-installer/new_installer_4.png&quot; alt=&quot;Port Selection&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The installer also allows you to specify the port that Jenkins should run on and will not continue until a valid port is entered and tested.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-5&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-5&quot; /&gt;Step 5&lt;/h3&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/2019-02-01-windows-installer/new_installer_5.png&quot; alt=&quot;JRE Selection&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of bundling a JRE, the installer now searches for a compatible JRE on the system (JRE 8 is the current search). If you want to use a different
JRE on the system than the one found by the installer, you can browse and specify it. Only JRE 8 and JRE 11 runtimes are supported. The installer will
automatically add the necessary arguments and additional jar files for running under Java 11 if the selected JRE is found to be version 11.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-6&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-6&quot; /&gt;Step 6&lt;/h3&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/2019-02-01-windows-installer/new_installer_6.png&quot; alt=&quot;Install It&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All of the items that users can enter in the installer should be overridable on the command line for automated deployment as well. The full list of properties that
can be overridden will be available soon.&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;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;The new installer is under review by the members of the Platform SIG, but we need people to test the installer and give feedback. If you are interested in testing
the new installer, please join the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_platform-sig:gitter.im&quot;&gt;Platform SIG gitter room&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are still some things that are being researched and implemented in the new installer (e.g., keeping port and other selections when doing an upgrade), but it is
getting close to release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to updates to the MSI based Windows installer, the Platform SIG is working on taking over the &lt;a href=&quot;https://chocolatey.org/packages/jenkins&quot;&gt;Chocolatey Jenkins package&lt;/a&gt; and
releasing a version for each update.&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/01/21/fosdem-2019/</id>
<title>FOSDEM 2019!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-01-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/01/21/fosdem-2019/" />
<author>
<name>lnewman</name>
</author>
<category term='community'></category>
<category term='events'></category>
<summary>
FOSDEM 2019 (February 2 &amp; 3) is a free event for software developers to meet, share ideas and collaborate.
It is an annual event that brings open source contributors from around the world for two days of presentations, discussions, and learning.
While the Jenkins project won&#8217;t have a table at FOSDEM 2019, we will be well represented before, during, and after the event.







Friday Day - Workshops and Jenkins Office Hours


On Friday, February 1, we&#8217;ll start off with a couple workshops:




Jenkins Pipeline Fundamentals
(9:00 AM – 5:00 PM)
Learn to create and run Declarative Pipelines!
You’ll learn the structure of Declarative Pipeline, how to control the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2019/&quot;&gt;FOSDEM 2019&lt;/a&gt; (February 2 &amp;amp; 3) is a free event for software developers to meet, share ideas and collaborate.
It is an annual event that brings open source contributors from around the world for two days of presentations, discussions, and learning.
While the Jenkins project won’t have a table at FOSDEM 2019, we will be well represented before, during, and after the event.&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/2019-01-21/fosdem.png&quot; alt=&quot;FOSDEM 2019&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;friday-day-workshops-and-jenkins-office-hours&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#friday-day-workshops-and-jenkins-office-hours&quot; /&gt;Friday Day - Workshops and Jenkins Office Hours&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On Friday, February 1, we’ll start off with a couple workshops:&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.eventbrite.com/e/jenkins-pipeline-fundamentals-training-tickets-54626761113&quot;&gt;Jenkins Pipeline Fundamentals&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;(9:00 AM – 5:00 PM)&lt;/strong&gt;&lt;br&gt;
Learn to create and run Declarative Pipelines!
You’ll learn the structure of Declarative Pipeline, how to control the flow of execution, how to save artifacts of the build, and get practice using some of the features that give fit and finish to your Pipeline.&lt;br&gt;
Registration required - see the
&lt;a href=&quot;https://www.eventbrite.com/e/jenkins-pipeline-fundamentals-training-tickets-54626761113&quot;&gt;event page&lt;/a&gt;
for details&lt;/br&gt;
&lt;/br&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.eventbrite.com/e/workshop-continuous-deployment-with-jenkins-x-kubernetes-and-friends-tickets-54562126790&quot;&gt;Jenkins X, Kubernetes, and Friends&lt;/a&gt;&lt;br&gt;
Two sessions: &lt;strong&gt;(9:00 AM – 12:00 PM)&lt;/strong&gt; and &lt;strong&gt;(1:00pm to 4:00pm)&lt;/strong&gt;&lt;br&gt;
By combining the power of Jenkins, its community and the power of Kubernetes, the Jenkins X project provides a path to the future of continuous delivery for microservices and cloud-native applications.
Come explore some of the features of Jenkins X through this hands-on workshop.&lt;br&gt;
Registration required - see the
&lt;a href=&quot;https://www.eventbrite.com/e/jenkins-pipeline-fundamentals-training-tickets-54626761113&quot;&gt;event page&lt;/a&gt;
for details&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aside from the workshops, from 9am to 5pm a bunch of people will be working out of Hilton Brussels Grand Place, hanging out as travelers come in.
It’ll be a casual, unstructured day. Sign up on this &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/257871603/&quot;&gt;meetup page&lt;/a&gt; to be notified what meeting room we’re in.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/br&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;friday-evening-happy-hour&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#friday-evening-happy-hour&quot; /&gt;Friday Evening - Happy Hour&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the office hours and workshops, we’ll have a &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/257871603/&quot;&gt;happy hour&lt;/a&gt; Friday evening before FOSDEM at Cafe Le Roy d’Espagne.
See the &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/257871603&quot;&gt;meetup page&lt;/a&gt; for details.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;presentations-at-fosdem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#presentations-at-fosdem&quot; /&gt;Presentations at FOSDEM&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://fosdem.org/2019/schedule/event/community_hackers_gotta_eat/&quot;&gt;Hackers gotta eat: Building a Company Around an Open Source Project&lt;/a&gt;
by &lt;a href=&quot;https://fosdem.org/2019/schedule/speaker/kohsuke_kawaguchi/&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2019/schedule/event/hpc_lab_from_scratch/&quot;&gt;Setting up an HPC lab from scratch with Mr-Provisioner, Jenkins and Ansible&lt;/a&gt;
by &lt;a href=&quot;https://fosdem.org/2019/schedule/speaker/renato_golin/&quot;&gt;Renato Golin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2019/schedule/event/multicloud_ci_cd_openstack_kubernetes/&quot;&gt;Multicloud CI/CD with OpenStack and Kubernetes&lt;/a&gt; by &lt;a href=&quot;https://fosdem.org/2019/schedule/speaker/maxime_guyot/&quot;&gt;Maxime Guyot&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;jenkins-hackfest-after-fosdem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-hackfest-after-fosdem&quot; /&gt;Jenkins Hackfest after FOSDEM&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, a Jenkins Hackfest will be held the day after FOSDEM 2019 on Monday (February 4).
Those who would like to join us for the hackfest should register for the &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/257810396/&quot;&gt;meetup&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Meals, snacks, and beverages will be provided for the hackfest.  Come join us, and let’s write some code!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Questions? feel free to contact
&lt;a href=&quot;mailto:alytong13@gmail.com&quot;&gt;Alyssa Tong&lt;/a&gt; or
&lt;a href=&quot;mailto:baptiste@mathus.fr&quot;&gt;Baptiste Mathus&lt;/a&gt; or join us on the
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_advocacy-and-outreach-sig:gitter.im&quot;&gt;advocacy-and-outreach gitter channel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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/2019/01/09/jenkins-user-conference-china-shenzhen-update/</id>
<title>Jenkins User Conference China - Shenzhen Update</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-01-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/01/09/jenkins-user-conference-china-shenzhen-update/" />
<author>
<name>ijyun</name>
</author>
<category term='jenkins'></category>
<category term='jenkinsuserconference'></category>
<category term='chinese'></category>
<summary>
On November 3rd, 2018 the Jenkins User Conference China (JUCC) met Jenkins users in Shenzhen which is the most burgeoning city in China.
It was the first time to hold JUCC in Shenzhen.
We held JUCC along with DevOps International Summit, which is the biggest DevOps event in China.
More than 200 attendees gathered at JUCC Shenzhen to share and discuss Jenkins, DevOps, Continuous Delivery, Pipeline, and Agile.


Below, I am sharing pictures and some of the topics discussed at the event:







Yu Gu from Accenture presented New challenges for DevOps in Cloud Native.







Peng Wang from Meituan which is the biggest group-buying website in China...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On November 3rd, 2018 the Jenkins User Conference China (JUCC) met Jenkins users in Shenzhen which is the most burgeoning city in China.
It was the first time to hold JUCC in Shenzhen.
We held JUCC along with DevOps International Summit, which is the biggest DevOps event in China.
More than 200 attendees gathered at JUCC Shenzhen to share and discuss Jenkins, DevOps, Continuous Delivery, Pipeline, and Agile.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below, I am sharing pictures and some of the topics discussed at the event:&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/2019-01-09-jucc-images/image1.jpg&quot; alt=&quot;image1&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yu Gu from Accenture presented &lt;strong&gt;New challenges for DevOps in Cloud Native&lt;/strong&gt;.&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/2019-01-09-jucc-images/image2.jpg&quot; alt=&quot;image2&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Peng Wang from Meituan which is the biggest group-buying website in China much like Groupon presented
&lt;strong&gt;The continuous delivery toolchains based on Jenkins for ten thousand times build per day&lt;/strong&gt;.&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/2019-01-09-jucc-images/image3.jpg&quot; alt=&quot;image3&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Guangming Zhou from Ctrip who is a Jenkins expert in China presented &lt;strong&gt;CD system in Ctrip&lt;/strong&gt;.&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/2019-01-09-jucc-images/image4.jpg&quot; alt=&quot;image4&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jiaqi Guo Jiaqi Guo from Kingston presented &lt;strong&gt;DevOps practices in large manufacturing industry&lt;/strong&gt;.&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/2019-01-09-jucc-images/image5.jpg&quot; alt=&quot;image5&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yaxing Li from Tencent presented &lt;strong&gt;How to support the CI CD requirements for thousands of products in Tencent based on Jenkins&lt;/strong&gt;.&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/2019-01-09-jucc-images/image6.jpg&quot; alt=&quot;image6&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mei Xiao from ZTE presented &lt;strong&gt;Fast integration practice for Android&lt;/strong&gt;.&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/2019-01-09-jucc-images/image7.jpg&quot; alt=&quot;image7&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;John Willis presented &lt;strong&gt;Next Generation Infrastructure which included Kubernetes and  Istio practices&lt;/strong&gt;.&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/2019-01-09-jucc-images/image8.png&quot; alt=&quot;image8&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;BC Shi from JD.com who is also a Jenkins Ambassador and the co-organizer of JUCC presented &lt;strong&gt;Pipeline 3.0  for DevOps toolchains&lt;/strong&gt;.
He introduced the practices based on Jenkins and Jenkins X to build an end to end pipeline for DevOps from requirement to online service.&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/2019-01-09-jucc-images/image9.png&quot; alt=&quot;image9&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve also released a DevOps tool map to recommend an excellent tool to the community.&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/2019-01-09-jucc-images/image10.jpg&quot; alt=&quot;image10&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, myself, Forest Jing co-organizer of JUCC and also am a Jenkins Ambassador interacted with the attendees.&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/2019-01-09-jucc-images/image11.png&quot; alt=&quot;image11&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also organized the Jenkins workshop and Open space for the attendees.
Ruddy Li ,Yunhua Li , Yu Gu and Dingan Liang have worked together to run an open space to lead the attendees to discuss problems they met in DevOps and CD.&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/2019-01-09-jucc-images/image12.png&quot; alt=&quot;image12&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Huaqiang Li who is a Certified Jenkins Engineer and CCJE has led the attendees to practice Jenkins functions for a whole afternoon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are more photos from our event, it was a fantastic JUCC in Shenzhen.
There were so much interest and appetite to learn about Jenkins and DevOps.
We are looking forward to doing this again next year.&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/2019-01-09-jucc-images/image13.png&quot; alt=&quot;image13&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Slides from the event can be downloaded at &lt;a href=&quot;https://pan.baidu.com/share/init?surl=dE6tlaEZ9t7KhOg6Xn63sw&quot;&gt;PPT Download Address&lt;/a&gt;, password: &lt;code&gt;sepe&lt;/code&gt; (the website is in Chinese).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to Alyssa and Maxwell’s help to organize this event.
Jenkins User Conference China continues and we hope to see many of you next year in China for our next JUCC.
Let’s be Kung fu Jenkins!&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2019/01/08/mpl-modular-pipeline-library/</id>
<title>MPL - Modular Pipeline Library</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-01-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/01/08/mpl-modular-pipeline-library/" />
<author>
<name>sparshev</name>
</author>
<category term='jenkinsfile'></category>
<category term='pipeline'></category>
<category term='sharedlibrary'></category>
<summary>
Despite speeding up development with deployment automation, one of our clients
was experiencing slow time-to-market due to a lack of collaboration in DevOps.
While they had invested in DevOps, every production pipeline was set up
individually, forcing teams to remake the wheel for each project. Making matters
worse, there was no cross-team collaboration, so any bug in the platform was
present in each new pipeline. Many of our clients have similar issues, so we
decided that we should develop a common tool which would both help current
clients, and be adaptable for use in the future. While the most obvious option
was standardizing the CI/CD platform with a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Despite speeding up development with deployment automation, one of our clients
was experiencing slow time-to-market due to a lack of collaboration in DevOps.
While they had invested in DevOps, every production pipeline was set up
individually, forcing teams to remake the wheel for each project. Making matters
worse, there was no cross-team collaboration, so any bug in the platform was
present in each new pipeline. Many of our clients have similar issues, so we
decided that we should develop a common tool which would both help current
clients, and be adaptable for use in the future. While the most obvious option
was standardizing the CI/CD platform with a common framework, this led to a
monolithic structure, which was inflexible and ultimately unworkable. Since each
team needed to work on their own pipelines, we developed a solution that would
store each reusable part of the DevOps pipeline for later use: a Jenkins-powered
modular pipeline library.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;solution-a-modular-pipeline-library&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#solution-a-modular-pipeline-library&quot; /&gt;Solution: a modular pipeline library&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The modular pipeline library (&lt;a href=&quot;https://github.com/griddynamics/mpl&quot;&gt;MPL&lt;/a&gt;) we
created is a highly-flexible shared library for a Jenkins Pipeline that enables
easy sharing of best practices across the entire company. It has a clear modular
structure, an advanced testing framework, multi-level nesting, a pipeline
configuration system, improved error handling, and many other useful components.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will take a look under the hood and explain how our solution works in several
parts:&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;Explore the technologies and tools we used to build the MPL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Review the MPL, and illustrate why it’s effective&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Follow a step-by-step guide to operate the MPL on a sample pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dive into some of the more important components of the solution, such as the test framework and nested libraries&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So now let’s jump right into an explanation of the crucial features we used to
build our solution.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;building-the-mpl-with-shared-libraries-and-jenkins-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#building-the-mpl-with-shared-libraries-and-jenkins-pipelines&quot; /&gt;Building the MPL with shared libraries and Jenkins pipelines&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins, our main automation platform, recently received some updates to
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/#overview&quot;&gt;Jenkins Pipeline&lt;/a&gt;. These updates allow us to
create one &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/tour/hello-world/&quot;&gt;Jenkinsfile&lt;/a&gt; that
describes the entire pipeline, and the steps that need to be executed with a
series of self-explanatory scripts. This increases the visibility of CI/CD
automation processes for end users, and improves supportability by DevOps teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, there’s a large issue with Pipeline: it’s hard to support multiple
Jenkinsfiles (and therefore multiple projects) with unique pipelines. We need to
store the common logic somewhere, which is where
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/#extending-with-shared-libraries&quot;&gt;Jenkins Shared Libraries&lt;/a&gt;
come in. They are included in the Jenkinsfile, and allow the use of prepared
interfaces to simplify automation and store common pieces.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While shared libraries allow you to store logic and manipulate Jenkins, they
don’t provide a good way to utilize all the common information. Therefore, the
MPL optimizes the pipeline and shared libraries by allowing users to create
easy-to-follow descriptions for processes, which are then stored for later use
by other teams.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-mpl-works-to-create-collaborative-devops-processes-across-teams&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-mpl-works-to-create-collaborative-devops-processes-across-teams&quot; /&gt;The MPL works to create collaborative DevOps processes across teams&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the MPL, we are now able to collaborate and share our DevOps practices
across teams, easily adopt existing pipelines for specific projects, and debug
and test features before we actually integrate them into the library. Each team
can create a nested library, add a number of pipelines and modules inside, and
use it with pipeline automation to create great visibility of the processes for
the end user. The MPL can also work on any project to prepare a Jenkinsfile, and
manage it as flexibly as the project team wants.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At its core, the MPL provides a simple way to:&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;Separate pipelines and steps by introducing modules&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Describe steps in the modules with an easy configuration interface&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test the described modules and share the results with other pipelines and projects&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are a lot of other features in the MPL, but it’s essentially a platform to
solve general DevOps collaboration issues. To simplify development and manual
testing, the MPL provides modules overriding and an inheritance model, allowing
users to test specific fixes in the project without affecting anything else. In
Jenkins, a module is a file with scripted steps and logic to reach a simple goal
(build an artifact, run tests, create an image, etc.). These modules are
combined in the pipeline stages, and are easily readable for anyone who knows
the Jenkins Pipeline syntax.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The MPL allows users to use the core features of the library (structure,
modules, pipelines) and create nested libraries for specific DevOps team needs.
A DevOps team can prepare complete pipelines with any custom logic and use it
for their projects. They can also override and inherit the core MPL modules in a
number of ways, or prepare custom modules which are easy to share with other
teams. Check out the infographic below to see how modules fit in:&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/2019-01-08-mpl/fig01-layers-of-the-mpl.png&quot; alt=&quot;Fig 1. Layers of the MPL&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also specify certain pipeline required poststeps in a module. For
example, a dynamic deployment module creates the test environment, which needs
to be destroyed when the pipeline ends. To take a closer look at the MPL calling
process, check out the infographic below:&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/2019-01-08-mpl/fig02-the-mpl-process.png&quot; alt=&quot;Fig 2. The MPL process&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This infographic shows how calls are executed in the MPL. First, you need a job
on your Jenkins, which will call a Jenkinsfile (for example, when the source
code is changed), after which the Jenkinsfile will call a pipeline. The pipeline
could be described on the MPL side, in the pipeline script in the job, in the
nested library, or in the project Jenkinsfile. Finally, the stages of the
pipeline will call the modules, and these modules will use features, which could
be groovy logic, pipeline steps, or steps in the shared libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that we’ve done an overview of the solution, let’s take a look at a simple
pipeline execution to see how the MPL works in action.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;an-example-of-a-pipeline-execution-in-the-mpl&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#an-example-of-a-pipeline-execution-in-the-mpl&quot; /&gt;An example of a pipeline execution in the MPL&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, let’s say you have a common Java Maven project. You are creating a
Jenkinsfile in the repo, and want to use the default pipeline prepared by your
DevOps team. The MPL already has a simple pipeline: the core &lt;code&gt;MPLPipeline&lt;/code&gt;. It’s
a really simple pipeline, but it’s a good start for anyone who wants to try the
MPL. Let’s look at a simple Jenkinsfile:&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;nd&quot;&gt;@Library&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;mpl&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MPLPipeline&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 Jenkinsfile contains a single line to load the MPL, and another line to run
the pipeline. Most of the shared libraries implement an interface like this,
calling one step and providing some parameters. &lt;code&gt;MPLPipeline&lt;/code&gt; is merely a custom
Pipeline step, as it lies in the &lt;code&gt;vars&lt;/code&gt; directory, and its structure is very
simple, following these steps:&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;&lt;strong&gt;Initialize the MPL&lt;/strong&gt;&lt;br&gt;
The MPL uses the &lt;code&gt;MPLManager&lt;/code&gt; singleton object to control the pipeline&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Merge configuration with default and store it&lt;/strong&gt;&lt;br&gt;
A default configuration needed to specify stages and predefine some useful configs&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define a declarative pipeline with 4 stages and poststeps:&lt;/strong&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;Checkout - Getting the project sources&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build - Compiling, validation of static, unit tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy - Uploading artifacts to the dynamic environment and running the app&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test - Checking integration with other components&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Poststeps - Cleaning dynamic environment, sending notifications, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Running the defined pipeline&lt;/strong&gt;&lt;br&gt;
This is where the MPL starts to work its magic and actually runs&lt;/br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stages of the main MPL usually have just one step, the &lt;a href=&quot;https://github.com/griddynamics/mpl/blob/master/vars/MPLModule.groovy#L29&quot;&gt;&lt;code&gt;MPLModule&lt;/code&gt;&lt;/a&gt;.
This step contains the core functionality of the MPL: executing the modules
which contain the pipeline logic. You can find default modules in the MPL
repository, which are placed in &lt;a href=&quot;https://github.com/griddynamics/mpl/tree/master/resources/com/griddynamics/devops/mpl/modules&quot;&gt;resources/com/griddynamics/devops/mpl/modules&lt;/a&gt;.
Some of the folders include: Checkout, Build, Deploy, and Test, and in each of
them we can find Groovy files with the actual logic for the stages. This
infographic is a good example of a simplified &lt;a href=&quot;https://github.com/griddynamics/mpl/&quot;&gt;MPL repository&lt;/a&gt;
structure:&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/2019-01-08-mpl/fig03-a-simplified-mpl-repository-structure.png&quot; alt=&quot;Fig 3. A simplified MPL repository structure&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the Checkout stage starts, &lt;code&gt;MPLModule&lt;/code&gt; loads the module by name (by default
a stage name), and runs the &lt;a href=&quot;https://github.com/griddynamics/mpl/blob/master/resources/com/griddynamics/devops/mpl/modules/Checkout/Checkout.groovy&quot;&gt;Checkout/Checkout.groovy&lt;/a&gt;
logic:&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;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CFG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;git.url&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;MPLModule&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Git Checkout&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CFG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
  &lt;span class=&quot;nf&quot;&gt;MPLModule&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Default Checkout&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CFG&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;If the configuration contains the &lt;code&gt;git.url&lt;/code&gt; option, it will load a &lt;code&gt;Git Checkout&lt;/code&gt;
module; otherwise, it will run the &lt;code&gt;Default Checkout&lt;/code&gt; module. All the called
modules use the same configuration as the parent module, which is why CFG was
passed to the &lt;code&gt;MPLModule&lt;/code&gt; call. In this case, we have no specific configuration,
so it will run the
&lt;a href=&quot;https://github.com/griddynamics/mpl/blob/master/resources/com/griddynamics/devops/mpl/modules/Checkout/DefaultCheckout.groovy&quot;&gt;Checkout/DefaultCheckout.groovy&lt;/a&gt;
logic. The space in the name is a separator to place the module into a specific
folder.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the &lt;code&gt;Default Checkout&lt;/code&gt; module, there is just one line with &lt;code&gt;checkout scm&lt;/code&gt;
execution, which clones the repository specified in the Jenkins job. That’s all
the Checkout stage does, as the MPL functionality is excessive for such a small
stage, and we only need to talk about it here to show how the MPL works in
modules.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The same process applies to the Build stage, as the pipeline runs the
&lt;a href=&quot;https://github.com/griddynamics/mpl/blob/master/resources/com/griddynamics/devops/mpl/modules/Build/MavenBuild.groovy&quot;&gt;Maven Build&lt;/a&gt;
module:&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;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;PATH+MAVEN=${tool(CFG.&#39;maven.tool_version&#39; ?: &#39;Maven 3&#39;)}/bin&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;settings&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CFG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;maven.settings_path&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;-s &#39;${CFG.&#39;maven.settings_path&#39;}&#39;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;mvn -B ${settings} -DargLine=&#39;-Xmx1024m -XX:MaxPermSize=1024m&#39; clean install&quot;&quot;&quot;&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 stage is a little bit more complicated, but the action is simple: we take
the tool with the default name &lt;code&gt;Maven 3&lt;/code&gt;, and use it to run &lt;code&gt;mvn clean install&lt;/code&gt;.
The modules are scripted pipelines, so you can do the same steps usually
available in the Jenkins Pipeline. The files don’t need any specific and
complicated syntax, just a plain file with steps and &lt;code&gt;CFG&lt;/code&gt; as a predefined
variable with a stage configuration. The MPL modules inherited the sandbox from
the parent, so your scripts will be safe and survive the Jenkins restart, just
like a plain Jenkins pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Deploy folder, we find the sample structure of the &lt;code&gt;Openshift Deploy&lt;/code&gt;
module. Its main purpose here is to show how to use poststep definitions in the
modules:&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;MPLPostStep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;always&#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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;OpenShift Deploy Decommission poststep&quot;&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;Executing Openshift Deploy process&#39;&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;First, we define the &lt;code&gt;always&lt;/code&gt; poststep. It is stored in the &lt;code&gt;MPLManager&lt;/code&gt;, and is
called when poststeps are executed. We can call &lt;code&gt;MPLPostStep&lt;/code&gt; with &lt;code&gt;always&lt;/code&gt; as
many times as we want: all the poststeps will be stored and executed in FILO
order. Therefore, we can store poststep logic for actions that need to be done,
and then undone, in the same module, such as the decommission of the dynamic
environment. This ensures that the actions will be executed when the pipeline
is complete.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the deploy stage, the pipeline executes the Test stage, but nothing too
interesting happens there. However, there is an aspect of testing which is very
important, and that’s the testing framework of the MPL itself.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;testing-of-the-mpl&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-of-the-mpl&quot; /&gt;Testing of the MPL&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The testing framework of the MPL is based on the
&lt;a href=&quot;https://github.com/jenkinsci/JenkinsPipelineUnit&quot;&gt;JenkinsPipelineUnit&lt;/a&gt;
from LesFurets, with the one small difference being its ability to test the MPL
modules. Testing the whole pipeline doesn’t work, as pipelines can be really
complicated, and writing tests for such monsters is a Sisyphean task. It is much
easier to test a black box with a small amount of steps, ensuring that this
particular task is working correctly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the MPL, you can find &lt;code&gt;Build&lt;/code&gt; module testing examples: all the tests are
stored in the
&lt;a href=&quot;https://github.com/griddynamics/mpl/tree/master/test/groovy/com/griddynamics/devops/mpl/modules&quot;&gt;test/groovy/com/griddynamics/devops/mpl/modules&lt;/a&gt;
directory, and you can find the
&lt;a href=&quot;https://github.com/griddynamics/mpl/blob/master/test/groovy/com/griddynamics/devops/mpl/modules/Build/BuildTest.groovy&quot;&gt;Build/BuildTest.groovy&lt;/a&gt;
file with a number of test cases there. Tests are executed during the MPL build
process, allowing users to see traces like 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;nowrap&quot;&gt;Loading shared library mpl with version snapshot
  MPLModule.call(Build, {maven={tool_version=Maven 2}})
    Build.run()
      Build.MPLModule(Maven Build, {maven.tool_version=Maven 2})
        MavenBuild.run()
          MavenBuild.tool(Maven 2)
          MavenBuild.withEnv([PATH+MAVEN=Maven 2_HOME/bin], groovy.lang.Closure)
            MavenBuild.sh(mvn -B  -DargLine=&#39;-Xmx1024m -XX:MaxPermSize=1024m&#39; clean install)
      Build.fileExists(openshift)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The test runs the &lt;code&gt;MPLModule&lt;/code&gt; with custom configuration and mocked steps to
check that, during execution, the tool was changed to &lt;code&gt;Maven 2&lt;/code&gt; according to the
provided configuration. We cover all test cases with such tests, ensuring that
the modules are working as expected, and that the pipeline will work properly.
You can test the whole pipeline if you want, but testing by modules is just an
additional way to simplify the testing process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that we’ve looked at how to test the MPL modules, it’s time to look at one
of the key features of the MPL, which is nested libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-benefits-of-nested-libraries&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-benefits-of-nested-libraries&quot; /&gt;The benefits of nested libraries&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When working with a large company, supporting one big library makes no sense.
Each department requires multiple configuration options and tuning for a
somewhat standard pipeline, which creates extra work. The MPL solves such
problems by introducing nested libraries. This infographic displays how a nested
library compares to just using the main library:&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/2019-01-08-mpl/fig04-ways-to-use-the-mpl.png&quot; alt=&quot;Fig 4. Ways to use the MPL&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A nested library is the same as a shared library that imports the MPL and uses
its functionality, modules, and pipelines. Also, it allows the separation of
some team-related logic from the company common logic. Here is the structure of
the MPL with nested libraries:&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/2019-01-08-mpl/fig05-example-of-a-companys-libraries-tree-structure.png&quot; alt=&quot;Fig 5. Example of company’s libraries tree structure&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can import the MPL in the overridden pipeline, specify the path of some
additional modules, override module logic, and use Jenkins power moves: there
are no limitations. When another team needs your unique module, you can just
create a change request to the basic company MPL repo, and share your functional
module with the others.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With nested libraries, it’s possible to debug and modify MPL-provided steps
(&lt;code&gt;MPLModule&lt;/code&gt; for example) and pipelines. This is because nested libraries can
override low-level functionalities of the MPL or the Jenkins Pipeline. There are
no limitations to what you can or can’t change, as these overrides only affect
your own pipeline. This enables experimentation to be done, and then discussed
with other teams to see if it will work in other nested libraries as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are also no limits to the number of nesting levels created, but we
recommend using just two (MPL and nested), because additional levels make
configuration and testing of the nested libraries on lower levels very
complicated.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-power-of-module-overriding&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-power-of-module-overriding&quot; /&gt;The power of module overriding&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Further into the nested libraries or project-side modules, it’s possible to
store a module with the same name as one in the upper-level library. This is a
good way to override the logic - you can just replace Build/Build.groovy with
your own - as the functional module will be executed instead of the upper-level
module. For example, this infographic shows module overriding:&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/2019-01-08-mpl/fig06-mpl-modules-overriding.png&quot; alt=&quot;Fig 6. MPL modules overriding&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even better, one of the strengths of the MPL is that you still can use the
upper-level module! The MPL has mechanisms to prevent loops, so the same module
can’t be executed in the same executing branch again. However, you can easily
call the original module a name from another module to use the upper-level
logic.&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/2019-01-08-mpl/fig07-petclinic-selenium-example-pipeline-structure.png&quot; alt=&quot;Fig 7. Petclinic-Selenium example pipeline structure&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Petclinic-Selenium example above uses the default &lt;code&gt;MPLPipeline&lt;/code&gt; (you can
find it on the &lt;a href=&quot;https://github.com/griddynamics/mpl/wiki&quot;&gt;MPL Wiki-page&lt;/a&gt;), and
contains project-side modules in a &lt;code&gt;.jenkins&lt;/code&gt; directory. These modules will be
called before the library modules. For example, the &lt;code&gt;Checkout&lt;/code&gt; module is not
placed on the project side, so it will be called from the MPL, but the &lt;code&gt;Build&lt;/code&gt;
module exists in a &lt;code&gt;.jenkins&lt;/code&gt; directory on the project side, and it will be
called:&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;MPLPostStep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;always&#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;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;target/surefire-reports/*.xml&#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;MPLModule&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Build&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CFG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fileExists&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Dockerfile&#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;MPLModule&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Docker Build&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CFG&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;As you can see, the &lt;code&gt;Build&lt;/code&gt; module from the project registers the poststep,
calls the original &lt;code&gt;Build&lt;/code&gt; module from the MPL, and then calls the additional
&lt;code&gt;Docker Build&lt;/code&gt; module. The following stages of the pipeline are more
complicated, but all module overriding essentially works like this. Some
projects can be tricky, and need some small tunings for the existing modules.
However, you can easily implement those changes on the project level, and think
about how to move the functionality to the nested library or MPL later.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion-what-the-mpl-brings-to-devops&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion-what-the-mpl-brings-to-devops&quot; /&gt;Conclusion: what the MPL brings to DevOps&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many DevOps teams and companies work with bloated, restrictive, and buggy CI/CD
automation platforms. These increase the learning curve for users, cause teams
to work slower, and raise production costs. DevOps teams frequently run into
similar issues on different projects, but a lack of collaboration means that
they have to be individually fixed each time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, with the MPL, DevOps teams have a shared, simple, and flexible CI/CD
platform to improve user support, collaboration, and overall project source code
to the production process. By utilizing the MPL, your company can find an
automation consensus, reach cross-company collaboration goals, and reuse the
best practices from a large community, all with open source tools. If you’re
interested in building an MPL, please contact us to learn more!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;additional-resources&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#additional-resources&quot; /&gt;Additional resources&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/doc/book/pipeline/#overview&quot;&gt;Jenkins Pipeline Engine&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/#extending-with-shared-libraries&quot;&gt;Jenkins Shared Libraries&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/griddynamics/mpl&quot;&gt;MPL GitHub repository&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;Overview &amp;amp; demo videos:&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://youtu.be/02zCNJ20AC0&quot;&gt;Introduction&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/CXghkwmsoXY&quot;&gt;Overview&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/knXX18E-W_s&quot;&gt;Demo of the MPL Build&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/D72vnIBxQYE&quot;&gt;Demo of the Nested Library&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/Gq8RYlZjds0&quot;&gt;Demo of the Petclinic Pipeline&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;/ol&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/2019/01/07/webhook-firewalls/</id>
<title>Triggering builds with webhooks behind a secure firewall</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2019-01-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2019/01/07/webhook-firewalls/" />
<author>
<name>michaelneale</name>
</author>
<category term='jenkins'></category>
<category term='webhooks'></category>
<category term='security'></category>
<summary>
In this post I wanted to show how you can run Jenkins behind a firewall (which could be a corporate firewall, a NAT’ed network like you have at home) but still receive webhooks in real time from GitHub.com. You can generalise this to other services too - such as BitBucket or DockerHub, or anything really that emits webhooks, but the instructions will be for GitHub projects hosted on github.com.


What are webhooks

Just a very quick refresher on what webhooks are: Messages (often JSON, but not always) typically posted by HTTP(S) from a server to a client that is listening for events.





The...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this post I wanted to show how you can run Jenkins behind a firewall (which could be a corporate firewall, a NAT’ed network like you have at home) but still receive webhooks in real time from GitHub.com. You can generalise this to other services too - such as BitBucket or DockerHub, or anything really that emits webhooks, but the instructions will be for GitHub projects hosted on github.com.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-are-webhooks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-are-webhooks&quot; /&gt;What are webhooks&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just a very quick refresher on what webhooks are: Messages (often JSON, but not always) typically posted by HTTP(S) from a server to a client that is listening for events.&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/2019-01-07-webhook-firewalls/webhooks.png&quot; alt=&quot;webhook diagram&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The events flow left to right, Jenkins sits there happily listing on paths like &lt;code&gt;/github-webhook/&lt;/code&gt; or &lt;code&gt;/dockerhub-webhook/&lt;/code&gt; etc for some HTTP request to tell it to wake up and do some work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GitHub/BitBucket may be reporting a new commit or PR, or DockerHub reporting an upstream image has changed. What all these things have in common is that they push to Jenkins, and expect to be able to push to it (ie that Jenkins is visible to them). This works great when the network is open - say GitHub Enterprise, or Jenkins is listening on the web.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;not-on-the-web&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#not-on-the-web&quot; /&gt;Not on the web&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The trick is when something gets in the middle, say a firewall:&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/2019-01-07-webhook-firewalls/firewalls.png&quot; alt=&quot;firewall diagram&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(&lt;em&gt;As is industry standard, all firewalls have to be a wall on fire. Please don’t somehow set bricks on fire in your organisation&lt;/em&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is just the same when you fire up Jenkins on your laptop, and want to receive webhooks from github.com (a legitimate thing, perhaps to test out your setup, perhaps to run builds for iOS on a mac, or some corner of a network that is not exposed to the web). Unless your laptop is addressable to the whole web that is (not likely), or your network is configured just right, the webhooks won’t be able to flow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is fine - we can fall back to polling for changes. Except this is terrible. You burn through API quotas, and you don’t get changes in real time, and really no one is happy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;some-problems-are-opportunities&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-problems-are-opportunities&quot; /&gt;Some problems are opportunities&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can both solve this problem, but also, view this is an opportunity. Having things not addressable on the web, or locked down in some default way is a feature, not a bug. You massively reduce your attack surface, and can have defence in depth:&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/2019-01-07-webhook-firewalls/exposed.png&quot; alt=&quot;exposed on web&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-webhook-forwarding-service&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-webhook-forwarding-service&quot; /&gt;A Webhook forwarding service&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enter the memorably named &lt;a href=&quot;https://smee.io/&quot;&gt;Smee&lt;/a&gt;. This is an &lt;a href=&quot;https://github.com/probot/smee&quot;&gt;OSS project&lt;/a&gt; provided by GitHub and also helpfully hosted as a service by GitHub. This can capture and forward webhooks for you. I’ll try to explain it with a diagram:&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/2019-01-07-webhook-firewalls/forwarding.png&quot; alt=&quot;forwarding&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GitHub pushes an event (via HTTPS/json in this case) to Smee.io (the funny thing with circles, which is on the public web and accessible from GitHub.com) - and Jenkins in turn subscribes to Smee with an outgoing connection from a client. Note the direction of the arrows: Jenkins only makes an outbound connection.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the important point: this will work as long as the firewall is one way (like a NAT typically is, and many networks). If the Jenkins side can’t connect to anything on the outside world - well, this won’t help with that of course (but that is not often the case).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;setting-it-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-it-up&quot; /&gt;Setting it up&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Step 1: Firstly - go to &lt;a href=&quot;https://smee.io/&quot; class=&quot;bare&quot;&gt;https://smee.io/&lt;/a&gt; and click “Start a new channel”:&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/2019-01-07-webhook-firewalls/smee.png&quot; alt=&quot;smee website&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will give you a unique URL (which you should copy for later use):&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/2019-01-07-webhook-firewalls/config1.png&quot; alt=&quot;smee config&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next you should install the smee client next to where you have the Jenkins server running:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;npm install --global smee-client&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(This will make the smee client/command available to receive and forward webhooks).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now start the smee client and point it to your Jenkins server. In this case I have it running on port 8080 (the default if you fire it up on your laptop, change both the port and the smee URL as needed):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;smee --url &lt;a href=&quot;https://smee.io/GSm1B40sRfBvSjYS&quot; class=&quot;bare&quot;&gt;https://smee.io/GSm1B40sRfBvSjYS&lt;/a&gt; --path /github-webhook/ --port 8080&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This says to connect to the smee service, and forward webhooks to /github-webhook/ (that trailing slash is important, don’t miss it). Once this is running, you will see it log that it is connected and forwarding webhooks. Leave this command running for as long as you want to receive webhooks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, you need to configure a pipeline that makes use of github. In this case I set up one from scratch. You can skip this if you already have a pipeline setup:&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/2019-01-07-webhook-firewalls/newpipeline.png&quot; alt=&quot;new pipeline&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I then chose “GitHub” as the where the code is:&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/2019-01-07-webhook-firewalls/choice.png&quot; alt=&quot;choose github&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then choose your repository. This will set things up ready to receive webhooks from GitHub. (also if you have an existing pipeline setup, and it is using GitHub as the SCM source, that is also fine).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final step is to tell GitHub to post webhook events for that repository (or organization, you can do that too) to Smee (which ultimately means Jenkins will receive them).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Go to the settings tab for your GitHub repository, and then click “add webhook”:&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/2019-01-07-webhook-firewalls/addwebhook.png&quot; alt=&quot;add webhook&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, configure the webhook:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Paste in the “smee” URL you copied from the step above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose &lt;code&gt;application/json&lt;/code&gt; as the content type&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tell it to &lt;code&gt;send everything&lt;/code&gt; (you can pick and choose what events, but I just did that as simpler).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press Add Webhook (or update)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It should look something 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/2019-01-07-webhook-firewalls/config2.png&quot; alt=&quot;config webhook&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;OK - webhooks should be flowing now. You can make a change to your repository, and check that a build starts soon after:&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/2019-01-07-webhook-firewalls/running.png&quot; alt=&quot;running pipeline&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Good luck!&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/12/26/gsoc-2019-call-for-mentors/</id>
<title>Google Summer of Code 2019. Call for Project ideas and Mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-12-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/12/26/gsoc-2019-call-for-mentors/" />
<author>
<name>martinda</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2019'></category>
<category term='community'></category>
<category term='events'></category>
<category term='developer'></category>
<summary>
Google Summer of Code
is as program where students are paid a stipend by Google to work on a free open source project like Jenkins,
at full-time for four months (May to August).
Mentors get actively involved with students starting at the end of February when students start to apply
(see the timeline).








We are looking for mentors and project ideas to participate in the 15th edition of the Google Summer of Code program!
We have until February 6th, 2019 at 8pm UTC to submit the application on behalf the Jenkins Organization, but obviously,
we want to be ready before that.


The first step in the process is...
</summary>
<content type='html'>
&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;a href=&quot;https://developers.google.com/open-source/gsoc/&quot;&gt;Google Summer of Code&lt;/a&gt;
is as program where students are paid a stipend by Google to work on a free open source project like Jenkins,
at full-time for four months (May to August).
Mentors get actively involved with students starting at the end of February when students start to apply
(see the &lt;a href=&quot;https://developers.google.com/open-source/gsoc/timeline&quot;&gt;timeline&lt;/a&gt;).
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;paragraph&quot;&gt;
&lt;p&gt;We are looking for mentors and project ideas to participate in the 15th edition of the Google Summer of Code program!
We have until February 6th, 2019 at 8pm UTC to submit the application on behalf the Jenkins Organization, but obviously,
we want to be ready before that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first step in the process is to have mentors and project ideas.
Then we will apply to Google.
We need Google to accept Jenkins&#39; application to the program itself.
And for this to happen, &lt;strong&gt;we need project proposals and mentors&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We currently have a &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2019/project-ideas&quot;&gt;list of project idea proposals&lt;/a&gt;,
and we are looking for new project proposals, mentors, technical advisers, and subject matter experts.
GSoC projects may be about anything around code: new features, plugins, test frameworks, infrastructure, etc., etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Making a project idea proposal is easy, you can read the instructions &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/proposing-project-ideas&quot;&gt;here&lt;/a&gt;.
Quick start:&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;Copy the &lt;a href=&quot;https://docs.google.com/document/d/1l5SdcLnlCwWA6qH8FKT9XC714Dl1XJ9lyy1CKDdKKAU&quot;&gt;project proposal template&lt;/a&gt;,
add a short description of your project idea&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the document for public view and comments, reference communication channels there (if any)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let us know about the project idea via &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;our gitter channel&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After getting initial feedback from org admins, share your idea with other contributors who might be interested
(via the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;developer mailing list&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/chat&quot;&gt;chats&lt;/a&gt;, or &lt;a href=&quot;https://www.jenkins.io/sigs&quot;&gt;special interest groups&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&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; for more information about the project.
Note that being a GSoC mentor does not require expert knowledge of Jenkins.
GSoC org admins will help to find technical advisors, so you can study together with your students.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentoring takes about 5 to 6 hours of work per week (more at the start, less at the end).
In return, a student works on your project full time for four months.
Think about the projects that you’ve always wanted to do but could not find the time…​
There are also many opportunities to engage with the Jenkins community (meetups, knowledge sharing, communications) and with other projects (e.g. &lt;a href=&quot;https://www.jenkins.io/blog/2018/11/13/martinda-gsoc-mentor-summit-experience/&quot;&gt;going to the GSoC Mentor Summit&lt;/a&gt;).
GSoC is a pretty good return on the investment!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For any question, you can find the GSoC 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 chat&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins GSoC Org Admin Team 2019&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/12/25/year-in-review/</id>
<title>2018 in Review: A year of innovation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-12-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/12/25/year-in-review/" />
<author>
<name>kohsuke</name>
</author>
<category term='core'></category>
<category term='community'></category>
<category term='new-year-blogpost'></category>
<summary>
The end of a year is a great time to step back from the daily grind to look at the big picture.





Across the industry, the relentless march toward more automation still continues on. We are writing software faster than ever, but the demand for software seems to be going up even more, and I feel more and more businesses and executives are keenly aware that software and developers are king. At the ground level, every team I meet sees the software delivery automation to be a critical part of their "software factory," and it&#8217;s important for them to create and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The end of a year is a great time to step back from the daily grind to look at the big picture.&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/post-images/2018-12-25-year-in-review/2018-256.jpg&quot; alt=&quot;Year in review&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Across the industry, the relentless march toward more automation still continues on. We are writing software faster than ever, but the demand for software seems to be going up even more, and I feel more and more businesses and executives are keenly aware that &lt;a href=&quot;https://www.ciodive.com/news/software-is-king-and-developers-are-in-high-demand/519272/&quot;&gt;software and developers are king&lt;/a&gt;. At the ground level, every team I meet sees the software delivery automation to be a critical part of their &quot;software factory,&quot; and it’s important for them to create and manage them with unhinged flexibility and visibility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins continues to play a major role in making this possible, after 14+ years since its birth, and if anything &lt;a href=&quot;https://stats.jenkins.io/jenkins-stats/svg/total-jenkins.svg&quot;&gt;the pace of growth seems to be accelerating&lt;/a&gt;. In this dog year industry, that’s truly remarkable. Being a part of this achievement truly makes me proud.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building Jenkins, being a tool that everyone uses, comes with a great responsibility. So within the Jenkins community, we’ve been hard at work. In fact, &lt;strong&gt;2018 has been the single most innovative year in the history of the whole project&lt;/strong&gt; across the field, at multiple levels.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;As we got bigger, we needed better ways to drive initiatives that cut across multiple people. This thinking led to &lt;a href=&quot;https://github.com/jenkinsci/jep/&quot;&gt;JEPs&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/sigs/&quot;&gt;SIGs&lt;/a&gt;, and 2018 saw these formats getting great traction. After a year of operating them, I think we’ve learnt a lot, and I hope we will continue to improve them based on the learning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These new formats gave rise to new collaborations. For example, &lt;a href=&quot;https://www.jenkins.io/sigs/chinese-localization/&quot;&gt;Chinese Localization SIG&lt;/a&gt; resulted in &lt;a href=&quot;https://www.jenkins.io/sigs/chinese-localization/#wechat&quot;&gt;our WeChat presence&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/zh/&quot;&gt;localized website&lt;/a&gt;. &lt;a href=&quot;https://www.jenkins.io/sigs/platform/&quot;&gt;Platform SIG&lt;/a&gt; was instrumental in &lt;a href=&quot;https://www.jenkins.io/blog/2018/12/14/java11-preview-availability/&quot;&gt;Java 11 support&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I’m also very happy to see new batch of leaders. In fear of missing out some people, I’m not going to list them individually, but we celebrated many of them as &lt;a href=&quot;https://flic.kr/p/2asPXx1&quot;&gt;Jenkins Ambassadors&lt;/a&gt; this fall (and please &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Ambassador&quot;&gt;nominate more&lt;/a&gt; for the next year!) Those people who lead key efforts are often people who are new to those roles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some of the new leaders led other efforts that unlock new contributors. It’s about consciously thinking which segment of our potential contributors we aren’t tapping today and understanding why. Something any business does all the time. Ours resulted in &lt;a href=&quot;https://www.jenkins.io/blog/2018/10/14/gsoc2018-results/&quot;&gt;Google Summer of Code&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/2018/12/10/outreachy-audit-log-plugin/&quot;&gt;Outreachy&lt;/a&gt; participations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our security process and the pace of fixes have gone up considerably this year again, reflecting our stepping up to the trust our users gave to us. For example, this year &lt;a href=&quot;https://www.jenkins.io/blog/2018/10/09/telemetry/&quot;&gt;we rolled out a telemetry system&lt;/a&gt; that informs us to develop better fixes more quickly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, where these community improvements ultimately matter is what impact we are creating to software that you use. On that front, I think we did great in 2018, resulting in what I call &lt;a href=&quot;https://www.youtube.com/watch?v=qE3tfS7k1VI&quot;&gt;&quot;5 super powers&quot;&lt;/a&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://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt; is probably the most visible innovation of this year, making it much easier to create modern cloud applications on Kubernetes. This also represents &lt;a href=&quot;https://www.jenkins.io/blog/2018/03/20/evolving-mission-of-jenkins/&quot;&gt;the significant expansion of the Jenkins community and its mission&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/jcasc/&quot;&gt;Jenkins Configuration as Code&lt;/a&gt; hit a major milestone &quot;1.0&quot; this year, and it’s continuing to gain more momentum and traction.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Cloud Native Jenkins&quot; is the term I gave to &lt;a href=&quot;https://www.jenkins.io/blog/2018/08/31/shifting-gears/&quot;&gt;a new effort that I’m calling to transform Jenkins&lt;/a&gt; into general purpose CI/CD engine that runs at scale on Kubernetes. There’s still much to be defined here, but you can already see some great things like &lt;a href=&quot;https://medium.com/@jdrawlings/serverless-jenkins-with-jenkins-x-9134cbfe6870&quot;&gt;Serverless Jenkins&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/blob/c0ba3cab7a7dfe398ec411d3271922bb98f04f8e/content/projects/evergreen/index.adoc&quot;&gt;Evergreen&lt;/a&gt; is another young and upcoming project that has ambitious thesis --- drastically simplifying the adoption and operation of Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline effort formed &lt;a href=&quot;https://www.jenkins.io/sigs/pipeline-authoring/&quot;&gt;a new SIG&lt;/a&gt; and I’m looking forward to the impact this will drive in 2019.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The not-so-secret sauce of the Jenkins community that threads together all these improvements from user visible changes to the community improvements is our ability to evolve. As I look forward to 2019, no doubt these things I mentioned will evolve, morph, merge, and split as we continue to learn and adopt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So please, follow &lt;a href=&quot;https://twitter.com/jenkinsci&quot;&gt;@jenkinsci&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/jenkinsxio&quot;&gt;@jenkinsxio&lt;/a&gt; on Twitter to get updates on how we will evolve, and join our community to together build the software that rocks the world. How many open-source projects can say that?&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/12/14/java11-preview-availability/</id>
<title>Java 11 Support Preview is available in Jenkins 2.155+</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-12-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/12/14/java11-preview-availability/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='core'></category>
<category term='developer'></category>
<category term='java11'></category>
<category term='community'></category>
<category term='platform-sig'></category>
<summary>
Please refer to Installing Jenkins documentation to have the up-to-date details on how to run Jenkins on Java 11.












This is a joint blogpost prepared by the Java 11 Support Team.
On Dec 18 (4PM UTC) we will be also presenting the Java 11 Preview Support at the Jenkins Online Meetup
(link)








Jenkins, one of the leading open-source automation servers, still supports only Java 8.
On September 25 OpenJDK 11 was released.
This is a Long-Term-Support which will stay around for years,
and in the Jenkins project we are interested to offer a full support of this version.
Over the last year many contributors have been working towards...
</summary>
<content type='html'>
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/&quot;&gt;Installing Jenkins&lt;/a&gt; documentation to have the up-to-date details on how to run Jenkins on Java 11.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;
This is a joint blogpost prepared by the &lt;a href=&quot;https://github.com/orgs/jenkinsci/teams/java11-support&quot;&gt;Java 11 Support Team&lt;/a&gt;.
On Dec 18 (4PM UTC) we will be also presenting the Java 11 Preview Support at the Jenkins Online Meetup
(&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/257008190/&quot;&gt;link&lt;/a&gt;)
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/logos/formal/256.png&quot; alt=&quot;Jenkins Java&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins, one of the leading open-source automation servers, still supports only Java 8.
On September 25 OpenJDK 11 was released.
This is a Long-Term-Support which will stay around for years,
and in the Jenkins project we are interested to offer a full support of this version.
Over the last year many contributors have been working towards enabling support for Java 11 in the project (Jenkins JEP-211).
It was a thorny path,
but now, on behalf of the &lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Jenkins Platform SIG&lt;/a&gt;,
we are happy to announce preview availability of Java 11 support in Jenkins weekly releases!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why do we need preview availability for Java 11?
It offers Jenkins contributors and early adopters a way
to try out the changes before the general availability release happens early next year.
It should help us to get more exploratory testing and, hopefully,
resolve most of the issues before Java 11 is officially supported in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post we will describe how to run with Java 11,
and how to investigate compatibility issues and report them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you probably remember,
in June 2018 we had an &lt;a href=&quot;https://www.jenkins.io/blog/2018/06/08/jenkins-java10-hackathon/&quot;&gt;online hackathon&lt;/a&gt; targeting Java 10+ support in Jenkins.
As a part of the hackathon,
we provided the &lt;a href=&quot;https://www.jenkins.io/blog/2018/06/17/running-jenkins-with-java10-11/&quot;&gt;experimental support of Java 11&lt;/a&gt;.
This event was a big success for us,
and we were able to get Jenkins running with Java 10 and 11-ea,
including major features like Jenkins Pipeline, JobDSL, Docker/Kubernetes plugins, Configuration as Code, BlueOcean, etc.
It gave us confidence that we can provide Java 11 support in Jenkins without major breaking changes.
After the hackathon, &lt;a href=&quot;https://github.com/oleg-nenashev/&quot;&gt;Oleg Nenashev&lt;/a&gt; created
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/211/README.adoc&quot;&gt;JEP-211: Java 10+ support in Jenkins&lt;/a&gt; (was later adjusted to target Java 11 only).
&lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Platform Special Interest Group&lt;/a&gt;
has been also founded to coordinate the Java 11 support work
and other platform support efforts (packaging, operating system support, etc.).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A group of contributors continued working on Java 11 support,
mostly focusing on upstreaming functional patches,
enabling Java 11 support in development tools,
testing and addressing known compatibility issues.
See the &lt;a href=&quot;https://www.jenkins.io/sigs/platform/#meetings&quot;&gt;Platform SIG meeting notes&lt;/a&gt; for detailed status updates.
Starting from Jenkins 2.148, Jenkins successfully runs with latest OpenJDK 11 releases on various Linux and Windows platforms.
We performed a LOT of automated and exploratory tests, Jenkins plugins appear to work well with some exceptions (see below).
There is ongoing test automation effort towards the GA releases,
but we were able to successfully run Jenkins core tests,
full &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness/&quot;&gt;Acceptance Test Harness&lt;/a&gt;,
and &lt;a href=&quot;https://github.com/jenkinsci/plugin-compat-tester&quot;&gt;Plugin Compat Tester&lt;/a&gt; for recommended plugins.
We also deployed a temporary
&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/211#temporary-experimental-update-center-for-java-11&quot;&gt;Experimental Update Center for Java 11&lt;/a&gt;
which allows quickly delivering fixes for Java 11 early adopters.
Jenkins 2.155+ defaults to this update center when running with Java 11,
and that’s why we announce preview availability for this version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On Nov 19, 2018 we presented the current Java 11 support status at the Platform SIG meeting
&lt;a href=&quot;https://docs.google.com/presentation/d/1lw4unaFhsQk7a8HzhxhgTK4X2X2ocv_W_VW7aoH2WkM/edit?usp=sharing&quot;&gt;slides&lt;/a&gt;,
and we agreed that we would like to proceed with the preview availability so that
we can offer something for evaluation to Jenkins users.
By the next meeting on Dec 04, all blockers have been addressed,
and the Platform SIG meeting signed off the Java 11 preview availability.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;running-jenkins-and-java-11-in-docker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-jenkins-and-java-11-in-docker&quot; /&gt;Running Jenkins and Java 11 in Docker&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting from Jenkins 2.155, we provide Docker images for the Jenkins controller and agent.
All these images are based on the official
&lt;a href=&quot;https://hub.docker.com/r/_/openjdk/&quot;&gt;openjdk:11-jdk&lt;/a&gt; image maintained by the Docker Community.
There were discussions about migrating to other base images,
but we decided to exclude it from the Preview Availability scope.
Similarly, we do not provide Alpine images for now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jenkins-controller-image&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-controller-image&quot; /&gt;Jenkins controller image&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 11 support is now provided as a part of the official
&lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins/&quot;&gt;jenkins/jenkins&lt;/a&gt; image.
You can run the Jenkins with Java 11 simply as:&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;docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:jdk11&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following tags are available:&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;jdk11&lt;/code&gt; - Latest weekly release with Java 11 support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;2.155-jdk11&lt;/code&gt; - Weekly releases packaged with Java 11&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The image is fully compatible with
&lt;a href=&quot;https://github.com/jenkinsci/docker/blob/master/README.md&quot;&gt;jenkins/jenkins documentation&lt;/a&gt;,
e.g. you can use &lt;code&gt;plugins.txt&lt;/code&gt; to install plugins, mount volumes and pass extra options via environment variables.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;agent-images&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#agent-images&quot; /&gt;Agent images&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you use containerized agents via Docker or Kubernetes plugins,
we have also released official Docker images for Jenkins agents:&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://hub.docker.com/r/jenkins/agent/&quot;&gt;jenkins/agent&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkins/inbound-agent/&quot;&gt;jenkins/inbound-agent&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkins/ssh-build-agent/&quot;&gt;jenkins/ssh-build-agent&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;All images use the &lt;code&gt;latest-jdk11&lt;/code&gt; image tag for JDK11 bundles.
And sorry for the obsolete names!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;experimental-jenkins-controller-images&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#experimental-jenkins-controller-images&quot; /&gt;Experimental Jenkins controller images&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to simplify testing, we also provide some experimental images on DockerHub.
We set up a continuous delivery flow for them,
so you can get patches without waiting for Jenkins weekly releases.&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://hub.docker.com/r/jenkins4eval/blueocean-platform-support/&quot;&gt;jenkins4eval/blueocean-platform-support&lt;/a&gt; -
Equivalent of &lt;a href=&quot;https://hub.docker.com/r/jenkinsci/blueocean/&quot;&gt;jenkinsci/blueocean&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tag: &lt;code&gt;latest-jdk11&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The image bundles all Jenkins Pipeline and Blue Ocean patches required to run on Java 11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you want to try Pipeline, use this image&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins-experimental/&quot;&gt;jenkins/jenkins-experimental&lt;/a&gt; -
Equivalent of &lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins/&quot;&gt;jenkins/jenkins&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tag: &lt;code&gt;latest-jdk11&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The image is released from the &lt;code&gt;java11-support&lt;/code&gt; feature branch in the Jenkins core&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The branch may be slightly ahead or behind the &lt;code&gt;master&lt;/code&gt; branch,
we may use the branch to quickly deliver patches to Java 11 users&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Eventually we will move the experimental flow to the new &lt;code&gt;jenkins4eval&lt;/code&gt; organization
being created as a part of &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/217/README.adoc&quot;&gt;JEP-217&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;running-jenkins-war-with-java-11&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-jenkins-war-with-java-11&quot; /&gt;Running jenkins.war with Java 11&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Running without Docker is not that trivial,
because Jenkins depends on some modules which have been removed from Java 11.
We plan to address it in the General Availability release somehow (see &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-52186&quot;&gt;JENKINS-52186&lt;/a&gt;),
but for now some manual actions are required to run Jenkins WAR with Java 11.&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;Download Jenkins WAR for 2.155&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download the following libraries to the same directory as jenkins.war&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://central.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar&quot;&gt;jaxb-api-2.3.0.jar&lt;/a&gt; (save as jaxb-api.jar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://central.maven.org/maven2/com/sun/xml/bind/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar&quot;&gt;jaxb-core-2.3.0.1.jar&lt;/a&gt; (save as jaxb-core.jar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://central.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.0.1/jaxb-impl-2.3.0.1.jar&quot;&gt;jaxb-impl-2.3.0.1.jar&lt;/a&gt; (save as jaxb-impl.jar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/javaee/activation/releases/download/JAF-1_2_0/javax.activation.jar&quot;&gt;javax.activation v.1.2.0&lt;/a&gt;  (save as javax.activation.jar)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the following command:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;Run Jenkins with &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JAVA11_HOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/bin/java &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; jaxb-api.jar:javax.activation.jar &lt;span class=&quot;nt&quot;&gt;--add-modules&lt;/span&gt; java.xml.bind,java.activation &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-cp&lt;/span&gt; jaxb-core.jar:jaxb-impl.jar &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; jenkins.war &lt;span class=&quot;nt&quot;&gt;--enable-future-java&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--httpPort&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;8080 &lt;span class=&quot;nt&quot;&gt;--prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/jenkins&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;known-compatibility-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#known-compatibility-issues&quot; /&gt;Known compatibility issues&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To help users to track down the compatibility issues,
we have created a new &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Known+Java+11+Compatibility+issues&quot;&gt;Known Java 11 Compatibility Issues&lt;/a&gt; Wiki page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several important issues and obstacles:&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/workflow-support&quot;&gt;Pipeline: Support Plugin&lt;/a&gt; has a known issue
with context persistency when running with Java 11 (&lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-51998&quot;&gt;JENKINS-51998&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We have deployed a temporary fix to the
&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/211#temporary-experimental-update-center-for-java-11&quot;&gt;Experimental Update Center for Java 11&lt;/a&gt;.
 Fix version: &lt;code&gt;3.0-java11-alpha-1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you use Jenkins Pipeline, make sure you run with this fix.
Otherwise the jobs will fail almost immediately&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When updating instances to Java 11, make sure there is no running Pipelines&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-54305&quot;&gt;JENKINS-54305&lt;/a&gt; -
&lt;a href=&quot;https://plugins.jenkins.io/jdk-tool&quot;&gt;JDK Tool Plugin&lt;/a&gt; does not offer installers for JDK 11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-52282&quot;&gt;JENKINS-52282&lt;/a&gt; -
Java Web Start is no longer available in Java 11, so it is no longer possible to start agents from Web UI.
We do not plan to provide a replacement.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also know about some minor incompatibilities in other plugins,
but we do not consider them as blockers for preview availability.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reporting-compatibility-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporting-compatibility-issues&quot; /&gt;Reporting compatibility issues&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you discover any Java 11 incompatibilities, please
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/How+to+report+an+issue&quot;&gt;report issues in our bugtracker&lt;/a&gt;.
Please set &lt;code&gt;java11-compatibility&lt;/code&gt; labels for such issues
so that they automatically appear on the Wiki page and get triaged.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the security issues please use the standard
&lt;a href=&quot;https://www.jenkins.io/security/#reporting-vulnerabilities&quot;&gt;vulnerability reporting process&lt;/a&gt;.
Although we will be fixing Java 11 specific issues in public while it is in the preview,
following the security process will help us to investigate impact on Java 8 users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java-11-support-team&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-11-support-team&quot; /&gt;Java 11 Support Team&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once Java 11 support is released, we expect reports of regressions in plugins and Jenkins core.
One of the concerns are exotic platforms with native libraries, and of course other Java versions.
There is also a risk of 3rd-party library incompatibilities with Java 11.
To mitigate the risks, we have created a
&lt;a href=&quot;https://github.com/orgs/jenkinsci/teams/java11-support&quot;&gt;Java 11 Support Team&lt;/a&gt;.
This team will be focusing on triaging the incoming issues,
helping to review pull requests and, in some cases, delivering the fixes.
The process for this team is &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/211#post-release-support&quot;&gt;documented&lt;/a&gt; in JEP-211.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We do not expect the &lt;em&gt;Java 11 Support Team&lt;/em&gt; to be able to fix all discovered issues,
and we will be working with Jenkins core and plugin maintainers to get the fixes delivered.
If you are interested to join the team,
reach out to us in the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_platform-sig:gitter.im&quot;&gt;Platform SIG Gitter Channel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing&quot; /&gt;Contributing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will appreciate any kind of contributions in the Java 11 effort,
including trying out Jenkins with Java 11, reporting and fixing compatibility issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you want to do the exploratory testing,
we recommend to try out Java 11 support at one of your test instances.
Such testing will be much appreciated,
especially if you use some service integration plugins or exotic platforms.
The issue reporting guidelines are provided &lt;a href=&quot;https://www.jenkins.io/blog/2018/12/14/java11-preview-availability/#reporting-compatibility-issues&quot;&gt;above&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are a plugin developer/maintainer,
we would appreciate if you could test your plugin with Java 11.
In order to help with that, we have created a Wiki page with
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Java+11+Developer+Guidelines&quot;&gt;Java 11 Developer guidelines&lt;/a&gt;.
This page explains how to build and test plugins with Java 11,
and it also lists known issues in development tools&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whatever you do, please let us know about your experience by sending a message to
the &lt;a href=&quot;https://community.jenkins.io/&quot;&gt;forums&lt;/a&gt;.
Such information will help us a lot to track changes and contributions.
Any other feedback about the migration complexity will be appreciated!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s next?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On Dec 18 (4PM UTC) we will be presenting the Java 11 Preview Support at the Jenkins Online Meetup
(&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/257008190/&quot;&gt;link&lt;/a&gt;).
At this meetup we will summarize the current Java 11 Preview support status.
If you are a plugin developer, we will also organize separate sessions about testing plugins with Java 11 and about common best practices for fixing compatibility issues.
Please follow the Platform SIG announcements if you are interested.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the next weeks we will focus on addressing feedback from early adopters and
fixing the discovered compatibility issues.
We will also continue working on Java 11 support patches towards the general availability next year (&lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-51805&quot;&gt;JENKINS-51805&lt;/a&gt;).
In addition to that, we will start working on Java 11 support in subprojects,
including &lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/c0ba3cab7a7dfe398ec411d3271922bb98f04f8e/content/projects/evergreen/index.adoc&quot;&gt;Jenkins Evergreen&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&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/jep/tree/master/jep/211&quot;&gt;JEP-211: Java 11 support in Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/platform-information/support-policy-java/&quot;&gt;Java requirements in Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Known+Java+11+Compatibility+issues&quot;&gt;Known Java 11 Compatibility Issues&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Java+11+Developer+Guidelines&quot;&gt;Java 11 Developer guidelines&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/sigs/platform/&quot;&gt;Platform Special Interest Group&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/12/10/the-official-Docker-image/</id>
<title>Official Jenkins image to use from Docker Hub</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-12-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/12/10/the-official-Docker-image/" />
<author>
<name>batmat</name>
</author>
<category term='docker'></category>
<summary>
There are now three different Docker Hub repositories that are or have been used as the "official" Jenkins image.
This article aims at providing a clarification about which one is the current official one (as of December 2018 :-)).


The official one



docker pull jenkins/jenkins



i.e. https://hub.docker.com/r/jenkins/jenkins/ is the right repository to use.


I also documented some time ago on my blog the recommended way to run Jenkins using the official Docker image.




The deprecated ones



jenkins

Deprecated since a long time already.
A short version of why we stopped using and updating this image is that we never had a way to get our images published without having...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are now three different Docker Hub repositories that are or have been used as the &quot;official&quot; Jenkins image.
This article aims at providing a clarification about which one is the current official one (as of December 2018 :-)).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-official-one&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-official-one&quot; /&gt;The official one&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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;docker pull jenkins/jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;i.e. &lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins/&quot; class=&quot;bare&quot;&gt;https://hub.docker.com/r/jenkins/jenkins/&lt;/a&gt; is the right repository to use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I also documented some time ago on my blog the &lt;a href=&quot;http://batmat.net/2018/09/07/how-to-run-and-upgrade-jenkins-using-the-official-docker-image/&quot;&gt;recommended way to run Jenkins using the official Docker image&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;the-deprecated-ones&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-deprecated-ones&quot; /&gt;The deprecated ones&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;a href=&quot;https://hub.docker.com/_/jenkins/&quot;&gt;&lt;code&gt;jenkins&lt;/code&gt;&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Deprecated since a long time already.
A short version of why we stopped using and updating this image is that we never had a way to get our images published without having each time to go through a manual process.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkinsci/jenkins&quot;&gt;&lt;code&gt;jenkinsci/jenkins&lt;/code&gt;&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Deprecated since a long time too, but for easing transition, we had kept updating both &lt;code&gt;jenkins/jenkins&lt;/code&gt; (the right one) and &lt;code&gt;jenkinsci/jenkins&lt;/code&gt; together.
We stopped updating &lt;code&gt;jenkinsci/jenkins&lt;/code&gt; in early December 2018 (cf. &lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-1934&quot;&gt;INFRA-1934&lt;/a&gt; for details if you are interested)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/12/10/outreachy-audit-log-plugin/</id>
<title>Outreachy internships to add audit logging support to Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-12-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/12/10/outreachy-audit-log-plugin/" />
<author>
<name>jvz</name>
</author>
<category term='community'></category>
<category term='outreachy'></category>
<category term='outreachy2018'></category>
<summary>
This year marks the first time the Jenkins project is participating in Outreachy.
Outreachy is a program similar to Google Summer of Code (GSoC) where interns work on open source projects for a paid stipend.
The key difference is that Outreachy reaches out to underrepresented groups and those who face systemic bias or discrimination in the technology industry in their home country.
Once I learned about this program, I immediately volunteered to mentor as the concept strongly aligns with my ideals of inclusiveness and community building.
I&#8217;m happy to report that both the Jenkins project,  and my employer CloudBees, have been very supportive...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year marks the first time the Jenkins project is participating in &lt;a href=&quot;https://www.outreachy.org/&quot;&gt;Outreachy&lt;/a&gt;.
Outreachy is a program similar to Google Summer of Code (GSoC) where interns work on open source projects for a paid stipend.
The key difference is that Outreachy reaches out to underrepresented groups and those who face systemic bias or discrimination in the technology industry in their home country.
Once I learned about this program, I immediately volunteered to mentor as the concept strongly aligns with my ideals of inclusiveness and community building.
I’m happy to report that both the Jenkins project,  and my employer &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;, have been very supportive of this program.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Expanding on our previous efforts to mentor students in GSoC, this year we’ve joined up with Outreachy to mentor two interns.
Our interns for this season of Outreachy,  &lt;a href=&quot;https://github.com/Lathaguna&quot;&gt;Latha Gunasekar&lt;/a&gt; and &lt;a href=&quot;https://github.com/davidolorundare&quot;&gt;David Olorundare&lt;/a&gt;, will be working with me on &lt;a href=&quot;https://github.com/jenkinsci/audit-log-plugin&quot;&gt;audit logging support for Jenkins&lt;/a&gt;.
I am excited to welcome both David and Latha, and am looking forward to what they will learn about both professional software engineering and contributing to an open source community.
Stay tuned for blog post entries introducing both people in the near future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The audit logging support project forms a new connection between Jenkins and &lt;a href=&quot;https://logging.apache.org/log4j/2.x/&quot;&gt;Apache Log4j&lt;/a&gt; which offers great opportunities for our interns to learn more about open source governance and meet new people.
As a bonus, the project aims to provide the tooling necessary to support advanced observability concerns such as running anomaly detection on authentication events to detect potential intrusion attempts.
We will also be authoring a &lt;a href=&quot;https://github.com/jenkinsci/jep&quot;&gt;JEP&lt;/a&gt; to detail the audit logging API provided by the plugin and how other plugins can define and log their own audit events besides the Jenkins Core ones that come with the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m looking forward to the great work we’ll be doing together, and I hope that we’ll be able to welcome more Outreachy interns in the future!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/12/10/kubecon-is-here/</id>
<title>KubeCon + CloudNativeCon North America 2018 is Here!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-12-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/12/10/kubecon-is-here/" />
<author>
<name>lnewman</name>
</author>
<category term='cloud-native'></category>
<category term='kubernetes'></category>
<category term='kubecon'></category>
<summary>
The time has come - KubeCon + CloudNativeCon North America 2018 has arrived.
The conference has completely sold out and the schedule is jam packed with interesting talks.


If you&#8217;re among those with tickets, here are a couple Jenkins related events that might interest you:




On Wednesday at 3:40pm, Carlos Sanchez will be presenting
Jenkins X: Continuous Delivery for Kubernetes in
Tahoma 3/4 @ TCC.


On Tuesday at 2:35pm, Jonathan Hess &amp; Loren Trout from
SAP will discuss how
Migrating Jenkins to Kubernetes Broke Our Brains in Room 606-609.




I look forward to seeing you there!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://events.linuxfoundation.org/events/kubecon-cloudnativecon-north-america-2018&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-12-kubecon-na/logo.svg&quot; alt=&quot;KubeCon + CloudNativeCon North America 2018&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The time has come - KubeCon + CloudNativeCon North America 2018 has arrived.
The conference has completely sold out and the schedule is jam packed with interesting talks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re among those with tickets, here are a couple Jenkins related events that might interest you:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;On Wednesday at 3:40pm, Carlos Sanchez will be presenting
&lt;a href=&quot;https://kccna18.sched.com/event/GrT2&quot;&gt;Jenkins X: Continuous Delivery for Kubernetes&lt;/a&gt; in
&lt;a href=&quot;https://kccna18.sched.com/venue/Tahoma+3%2F4+%40+TCC&quot;&gt;Tahoma 3/4 @ TCC&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On Tuesday at 2:35pm, Jonathan Hess &amp;amp; Loren Trout from
&lt;a href=&quot;https://www.sap.com&quot;&gt;SAP&lt;/a&gt; will discuss how
&lt;a href=&quot;https://kccna18.sched.com/event/GrSh&quot;&gt;Migrating Jenkins to Kubernetes Broke Our Brains&lt;/a&gt; in Room 606-609.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I look forward to seeing you there!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/12/05/security-updates/</id>
<title>Important security updates for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-12-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/12/05/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.154 and LTS 2.150.1, that fix multiple security vulnerabilities.
Since 2.150.1 is the first release in the new LTS line, we also released 2.138.4, a security update for the previous LTS line.
This allows administrators to install today&#8217;s security fixes without having to upgrade to the new LTS line immediately.


For an overview of what was fixed, see the security advisory.
For an overview on the possible impact of these changes, see our LTS 2.138.4 upgrade guide.


A note on previously released changes related to this fix

In the Jenkins core security updates released in August and October,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.154 and LTS 2.150.1, that fix multiple security vulnerabilities.
Since 2.150.1 is the first release in the new LTS line, we also released 2.138.4, a security update for the previous LTS line.
This allows administrators to install today’s security fixes without having to upgrade to the new LTS line immediately.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-12-05&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.138/#upgrading-to-jenkins-lts-2-138-4&quot;&gt;LTS 2.138.4 upgrade guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-note-on-previously-released-changes-related-to-this-fix&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-note-on-previously-released-changes-related-to-this-fix&quot; /&gt;A note on previously released changes related to this fix&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Jenkins core security updates released in August and October, we also included security improvements that can be disabled by setting various system properties.
Those changes are an essential part of the SECURITY-595 fix, so we strongly recommend not disabling them for any reason.
Previously published documentation has been updated.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/11/13/martinda-gsoc-mentor-summit-experience/</id>
<title>Google Summer of Code Mentor Summit 2018</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-11-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/11/13/martinda-gsoc-mentor-summit-experience/" />
<author>
<name>martinda</name>
</author>
<category term='community'></category>
<category term='events'></category>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<summary>
This year, the Jenkins organization participated in the Google Summer of Code Mentor Summit
at the Google office in Sunnyvale on Oct 12, 13 and 14, 2018.
The GSoC Mentor Summit is where mentors of all organizations participating in the GSoC program are invited each year
to learn and network with mentors from other organization, and make GSoC a better program.
This is the second time Jenkins mentors have participated in the summit, the first time was in 2016.


Exceptionally, three Jenkins GSoC mentors were invited to the summit this year.
Normally only two mentors are invited, but when there are cancellations, Google draws a name...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right center&quot;&gt;
&lt;div class=&quot;content&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;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, the Jenkins organization participated in the Google Summer of Code Mentor Summit
at the Google office in Sunnyvale on Oct 12, 13 and 14, 2018.
The GSoC Mentor Summit is where mentors of all organizations participating in the GSoC program are invited each year
to learn and network with mentors from other organization, and make GSoC a better program.
This is the second time Jenkins mentors have participated in the summit, the first time was in 2016.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exceptionally, three Jenkins GSoC mentors were invited to the summit this year.
Normally only two mentors are invited, but when there are cancellations, Google draws a name at random from the waiting list,
and the Jenkins organization was lucky enough and sent an extra mentor this year!
The mentors participating this year were Oleg Nenashev, Jeff Pearce and Martin d’Anjou.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is worth mentioning that the Mentor Summit is not a typical conference where you go
sit and listen at what speakers have to say, quite the contrary. The Mentor Summit is an unconference
where participants are invited to fill empty time slots with their own topic of discussion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;friday-oct-12&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#friday-oct-12&quot; /&gt;Friday Oct 12&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;pre-conference-meeting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pre-conference-meeting&quot; /&gt;Pre-conference meeting&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The mentors had a short pre-conference meeting to reflect on the Jenkins participation in the 2018 GSoC program,
and to plan for 2019.
We were joined at this meeting by Lloyd Chang, whom we had met at Jenkins World 2018.
Thank you Lloyd for joining us! A few ideas we had for 2019 are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Move project proposals to individual Google Documents&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a template for project proposed by potential mentors and by project champions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create an Organization Administrator Guide for future Jenkins GSoC project admins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other preparations we agreed to work on include a review of the 2018 feedback and the creation
of an &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/54059&quot;&gt;Epic&lt;/a&gt; capturing the action items in preparation for 2019.
We are also planning on making progress on the GSoC Budget process described in &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/8&quot;&gt;JEP-8&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;summit-starts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summit-starts&quot; /&gt;Summit Starts!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The summit started by a welcoming dinner at the Google Cafeteria and an evening session
where we were explained how the unconference would work. We proposed a few topics:
dealing with CPT lost slots, motivating mentors, and Open Source Hardware ASIC/FPGA.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On thing to say is that everyone at the conference had heard of Jenkins, or was already using Jenkins.
Lots of people came to tell us their Jenkins experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I noticed this too - made me feel proud to be part of the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Jeff Pearce&lt;br&gt;
&lt;cite&gt;Jenkins GSoC mentor in 2018&lt;/cite&gt;
&lt;/br&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;saturday-oct-13&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#saturday-oct-13&quot; /&gt;Saturday Oct 13&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;imageblock left&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/conferences/gsoc-mentor-summit-2018-unconference.jpg&quot; alt=&quot;Unconference sessions&quot; width=&quot;250&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The morning started with a couple of announcements from Google.
The first one was that Google is thinking of creating a program called &quot;Google Season of Docs&quot; (GSoD for short),
where technical writers would be paired with Open Source Organizations to help them write documentation such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;High-impact tutorials&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set of How-To Guides&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contributor’s Guide&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation refactoring&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plain documentation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have additional details regarding this in the
&lt;a href=&quot;https://docs.google.com/document/d/1tN9fnnJw9aBYsDwfDOVL5URTyoOyS3UYH4ijMAUOl3A/edit#heading=h.ipkcylodrufe&quot;&gt;GSoC Mentor Summit Notes&lt;/a&gt;
and we quickly concluded that if this program comes to life, Jenkins should be a participating organization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The other announcement made by the GSoC administrators is that GSoC may take a different form in 2020.
However, not much more information has been made available at this time.
The program has been operating for 13 years, and in 2020 it will have been 15 years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The announcements were followed by a series of &lt;strong&gt;morning&lt;/strong&gt; lightning talks.
This is where organizations showcase what their students accomplished during the program.
This is when we had a bit of a surprise…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Oleg who had signed up for the &lt;strong&gt;evening&lt;/strong&gt; lightning talks, was watching the talks while casually preparing slides for his &lt;strong&gt;evening&lt;/strong&gt; presentation.
But something unusual happened: many talks were shorter than the 3-minute allotted, and suddenly we were ahead of schedule.
That’s when Oleg was called to the stage.
I had no idea whether his slides were ready or not since he had just leaned over to me to say that he wanted to talk about all 3 projects we had this year.
Not knowing how far he had gotten into refactoring the slides, this was going to be…​ interesting.
Being an experienced presenter, Oleg pulled it off brilliantly.
The slides were effectively ready (how he managed that I have no idea),
but you can see the slides of his lightning talk here:
&lt;a href=&quot;https://docs.google.com/presentation/d/1TYnH_hxRf_yFofJP_wl2kckj2GFLxYQK-4-FGhVX3-Q/edit#slide=id.p1&quot;&gt;Jenkins Remoting over Apache Kafka&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then there were the unconference sessions. Some of the sessions we attended are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attracting and retaining mentors (facilitated by Martin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Organizing and motivating volunteers and mentors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Getting students from coding/boot camps involved in open source&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Retaining students after GSoC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open Event management System&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GSoC Feedback&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;We have notes for all the session in &lt;a href=&quot;https://docs.google.com/document/d/1tN9fnnJw9aBYsDwfDOVL5URTyoOyS3UYH4ijMAUOl3A/edit#&quot;&gt;the main document&lt;/a&gt;.
Some sessions were captured in separated documents which are linked from the main document, or from this blog post.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were lots of good ideas in those sessions, and we will do what we can next year to implement some of them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some organizations have said that the key for student retention
is to give them responsibilities and tasks after the program is over.
We have certainly seen that this year, with one of our students asking for more responsibilities and wanting to know how
his plugin project could continue to grow within the Jenkins project (while at the same time help out on another GSoC plugin!).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the evening was the second round of lightning talks.
Jeff Pearce presented the &lt;a href=&quot;https://docs.google.com/presentation/d/1CyUM_m9poSGk25SqMvYNpWrALoG8Wklkga4TPsn8uwQ/edit#slide=id.p1&quot;&gt;Code Coverage API Plugin&lt;/a&gt; lightning talk,
(he was not caught by surprise).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/conferences/gsoc-mentor-summit-2018-chocolate-1.jpg&quot; alt=&quot;Chocolate table at the GSoC 2018 Mentor Summit&quot; width=&quot;200&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the lightning talks, we were invited to hang out at the cafeteria and on the patio, to exchange stickers,
network with mentors of other organizations, and enjoy late evening snacks, music and of course the chocolate table!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;sunday-oct-14&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sunday-oct-14&quot; /&gt;Sunday Oct 14&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On Sunday, the sessions continued. An interesting session was &quot;Beyond GSoC, What can Google do?&quot;.
One person got a big round of applause when he said: &quot;Cloud credits&quot;. It turns out the GSoC program admins
have been trying to get that for us for about 3 years. Google may be big and powerful, but some things
are hard and remain hard in the corporate world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An interesting suggestion was made by Oleg, and it would be to have a program with smaller, shorter term
commitments, something that would encourage more granular contributions but would not require a 4-month
long commitment. This was noted by the GSoC program admins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then we attended a number of sessions:&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://docs.google.com/document/d/1k1nhJptJPklbcUc2riBjnNVcayiSq7EMywf6QHFHIwM/edit#heading=h.ag29mes0pkan&quot;&gt;Open Hardware ASIC/FPGA&lt;/a&gt; (facilitated by Martin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Community Metrics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.outreachy.org/&quot;&gt;Outreachy&lt;/a&gt; (Jenkins is participating in this program)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1nLjZp-RRqLiB5ShegSjsACcPrU444OxyyI6nKLQUdmA/edit#heading=h.mnmo3qdv8jvc&quot;&gt;Failing a student&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Burnout (of mentors and org admins)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then the day came to an end with some last words by Google thanking all the mentors and volunteers who
run this program in their organizations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;return-trip&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#return-trip&quot; /&gt;Return trip&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would now like to add a personal note. After the summit, like many others I fly back home,
so I spend the evening at the SFO international terminal waiting for my late night flight.
That is where I get to meet more mentors, as some of us still wear our badges and T-Shirts,
and also recognize each other from being at the conference.
And funny enough, there are so many geeks at that terminal
that we may have recruited, among the passengers, a mentor to another org for next year!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;want-a-gsoc-student-to-work-on-your-project-in-2019&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#want-a-gsoc-student-to-work-on-your-project-in-2019&quot; /&gt;Want a GSoC student to work on your project in 2019?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have already started the preparations for GSoC 2019.
And we cannot do this without the participation of the Jenkins community.
We are already looking for:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mentors from the Jenkins Special Interest Groups&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors from any background and any provenance (being a Jenkins developer is NOT required)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Project proposals&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Students and their proposals&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lots of people are afraid that mentoring a student will take a lot of their time.
If you feel that way, you are not alone. It does take some time. In my case, I spend 5 to 8 hours per week on mentor tasks (more at the start, less at the end).
To make it easier on mentors who likely have full time jobs and life commitments, we define different mentor roles:&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;Project champion co-mentor&lt;/strong&gt;: this is the mentor who proposes the idea, but may not have all the Jenkins code expertise needed. This mentor works with the student to define the project and acts mostly as a &quot;customer&quot; of the project. This mentor usually know enough about coding to comment on pull-requests with regards to the over quality, style and features of the code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Technical co-mentor&lt;/strong&gt;: this is the mentor who knows enough about the Jenkins code to guide the student on coding, and to provide Jenkins specific code reviews on pull-requests, but has limited involvement outside the coding activity of the student.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is a third role which is:&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;Subject Matter Expert&lt;/strong&gt;: these individuals are not mentors, but we reach out to them 3-4 times during the project for advice and guidance, and sometimes complicated programming challenges.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have questions or are curious about the program,
contact us on the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_gsoc-sig:gitter.im&quot;&gt;GSoC Gitter SIG chat&lt;/a&gt;.&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;We would like to emphasize that project proposals are not limited to &quot;big projects&quot;.
For example, it is perfectly fine to have a proposal that is a collection of related Jira issues that aim to improve your project,
or a list of tasks that need to be done for your project.
Writing documentation is outside the scope of GSoC, but automating
documentation generation, as long as it is mostly about writing code, is within the scope of GSoC.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We look forward working with the Jenkins community on GSoC 2019!&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/2018/11/12/inspecting-binaries-with-jenkins/</id>
<title>The Silence of the Lambs: Inspecting binaries with Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-11-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/11/12/inspecting-binaries-with-jenkins/" />
<author>
<name>michaelhuettermann</name>
</author>
<category term='devops'></category>
<category term='devsecops'></category>
<category term='security'></category>
<category term='vulnerabilities'></category>
<category term='compliance'></category>
<category term='twistlock'></category>
<summary>
In a past blog post,
Delivery Pipelines, with Jenkins 2, SonarQube, and Artifactory,
we talked about pipelines which result in binaries for development versions, and in
Delivery pipelines, with Jenkins 2: how to promote Java EE and Docker binaries toward production,
we examined ways to consistently promote applications toward production. In this blog post, I continue on both by discussing more details on security related quality gates
and bringing this together with the handling of Docker images.


Use case: Foster security on given, containerized business application


Security is an overloaded term with varying meaning in different contexts. For this contribution, I consider security as the sum of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a past blog post,
&lt;a href=&quot;https://www.jenkins.io/blog/2017/04/18/continuousdelivery-devops-sonarqube/&quot;&gt;Delivery Pipelines, with Jenkins 2, SonarQube, and Artifactory&lt;/a&gt;,
we talked about pipelines which result in binaries for development versions, and in
&lt;a href=&quot;https://www.jenkins.io/blog/2017/07/05/continuousdelivery-devops-artifactory/&quot;&gt;Delivery pipelines, with Jenkins 2: how to promote Java EE and Docker binaries toward production&lt;/a&gt;,
we examined ways to consistently promote applications toward production. In this blog post, I continue on both by discussing more details on security related quality gates
and bringing this together with the handling of Docker images.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;use-case-foster-security-on-given-containerized-business-application&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-case-foster-security-on-given-containerized-business-application&quot; /&gt;Use case: Foster security on given, containerized business application&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Security is an overloaded term with varying meaning in different contexts. For this contribution, I consider security as the sum of rules regarding vulnerabilities
(Common Vulnerability and Exposure, CVE), in binaries. In a past blog post, we’ve identified SonarQube already, as a very helpful tool to identify flaws
in source code, particularly concerning reliability (bugs), vulnerabilities (security, e.g. CWE, that is common weakness enumeration, and OWASP, that is the Open Web Application Security Project), and
maintainability (code smells). Now it is a good time to add another tool to the chain, that is Twistlock, for inspection binaries for security issues.
Features of Twistlock include&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Compliance and vulnerability management, transitively&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runtime defense&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cloud-native CI/CD support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Broad coverage of supported artifact types and platforms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API, dashboards, and Jenkins integration, with strong configuration options&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The underlying use case can be derived from several real-world security initiatives, in enterprises, based on given containerized applications. In practice, it is not a surprise that after adding such new
quality gates, you identify historically grown issues. However, there are many good reasons to do so. You don’t need any Word documents to check any governance criteria manually, rather
execution and reporting are done automatically and also part of the actions are taken automatically. And above all, of course, your application is quality assured regarding known vulnerability issues, aligned with
the DevOps approach: development is interested in quick feedback whether their change would introduce any vulnerabilities, and operations is interested in insights whether and
how running applications are affected if a new CVE is discovered.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The term DevSecOps was coined to explicitly add security concerns to DevOps.
In my opinion, security is already inherent part of DevOps.
Thus, there is no strong reason to introduce a new word. Surely, new words are catchy.
But they have limits.
Or have you ever experienced NoDev, the variant of DevOps where features are suddenly falling from the sky and deployed to production automatically?&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Conceptually, container inspection is now part of the delivery pipeline and Twistlock processing is now triggered once we have produced our Docker images, see below, in order to get
fast feedback.&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/jenkins-devsecops/01.png&quot; alt=&quot;01&quot; title=&quot;The delivery pipeline, failing the quality gate of inspecting Docker image.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Software is staged over different environments by configuration, without rebuilding. All changes go through the entire staging process, although defined
exception routines may be in place, for details see Michael Hüttermann, &lt;em&gt;Agile ALM&lt;/em&gt; (Manning, 2012). The staged software consists of all artifacts which
make up the release, consistently, including the business application, test cases, build scripts, Chef cookbooks, Dockerfiles, Jenkins files to build all
that in a self-contained way, for details see Michael Hüttermann, &lt;em&gt;DevOps for Developers&lt;/em&gt; (Apress, 2012).&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;This blog post covers sample tools. Please note, that there are also alternative tools available, and the best target architecture is aligned with concrete requirements and given basic
conditions. Besides that, the sample toolchain is derived from couple of real world success stories, designed and implemented in the field. However, this blog post
simplifies and abstracts them in order to stay focussed while discussing the primitives of delivery units. For example, aggregating multiple Docker images with ASCII files, does not change the
underlying primitives and their handlings. For more information on all parts of the blog post, please consult the respective documentation, good books or attend fine conferences. Or go to the extremes: talk to your colleagues.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our sample process, we produce a web application that is packaged in a Docker image. The produced Docker images are distributed only if the dedicated quality gate passes.
A quality gate is a stage in the overall pipeline and a sum of defined commitments, often
called requirements, the unit of work must pass. In our case, the quality gate comprises inspection of produced binaries and it fails if vulnerabilities of severity &#39;critical&#39; are found.
We can configure Twistlock according to our requirements. Have a look how we’ve integrated it into our Jenkins pipeline, with focus on detecting vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile (excerpt): Twistlock inspection triggered&lt;/div&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;Twistlock: Analysis&#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;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
    &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;version.properties&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
    &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Scanning for version: ${version}&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;twistlockScan&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;ca:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;cert:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;compliancePolicy:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;critical&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;dockerAddress:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;unix:///var/run/docker.sock&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;ignoreImageBuildTime:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;key:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;logLevel:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;policy:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;critical&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;repository:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;huttermann-docker-local.jfrog.io/michaelhuettermann/alpine-tomcat7&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;
        &lt;span class=&quot;nl&quot;&gt;requirePackageUpdate:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tag:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;$version&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;timeout:&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;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;Twistlock: Publish&#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;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;
    &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;version.properties &#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Publishing scan results for version: ${version}&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;twistlockPublish&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;ca:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;cert:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;dockerAddress:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;unix:///var/run/docker.sock&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;key:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;logLevel:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;true&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;repository:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;huttermann-docker-local.jfrog.io/michaelhuettermann/alpine-tomcat7&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tag:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;$version&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;timeout:&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Twistlock inspection as part of the sequence of stages in Jenkinsfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nailing down the version of the to be inspected image, dynamically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Configuring analysis including vulnerability severity level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Publishing the inspection results to Twistlock console, that is the dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now let’s start with the first phase to bring our application in shape again, that is gaining insight about the security related flaws.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;phase-1-gain-insights-about-security-related-flaws&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-1-gain-insights-about-security-related-flaws&quot; /&gt;Phase 1: Gain insights about security related flaws&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After we’ve introduced the new quality gate, it failed, see image above. As integration with other tools, Jenkins is the automation engine and does provide helpful context information,
however, those cannot replace features and data the dedicated, triggered tool does offer. Thus, this is the moment to switch to the dedicated tool, that is Twistlock. Opening
the dashboard, we can navigate to the Jenkins build jobs, that is the specific run of the build, and the respective results of the Twistlock analysis. What we see now is a list
of vulnerabilities, and we need to fix those of severity &lt;em&gt;critical&lt;/em&gt; in order to pass the quality gate, and get our changes again toward production. The list shows entries of
type &lt;em&gt;jar&lt;/em&gt;, that is a finding in a binary as part of the Docker image, in our case the WAR file we’ve deployed to a web container (Tomcat), and of type &lt;em&gt;OS&lt;/em&gt;, those are issues of the underlying image itself, the
operating system, either part of the base image, or as a package added/changed in our Dockerfile.&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/jenkins-devsecops/02.png&quot; alt=&quot;02&quot; title=&quot;Twistlock findings: overview.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can now easily zoom in and examine the vulnerabilities of the Docker layers. This really helps to structure work and identify root causes. Since, typically,
a Docker image extends a Docker base image, the findings in the base image are shown on the top, see next screenshot, grouped by severity.&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/jenkins-devsecops/03.png&quot; alt=&quot;03&quot; title=&quot;Twistlock also displays the vulnerabilities according to Docker layers. Findings based on the base image are listed at the top.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other Docker layers were added to the base image, and those can add vulnerabilities too. In our case, the packaged WAR file obviously contains a vulnerability. The next image shows how we examine that finding, while this time
expanding the Twistlock wizard (that is the plus sign) to directly see the list of found vulnerabilities.&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/jenkins-devsecops/04.png&quot; alt=&quot;04&quot; title=&quot;Twistlock recursively inspects embedded binaries auch as the WAR with its libraries. Here the wizard is expanded showing all vulnerabilities of this layer. On the right side, we can move over the different sections of our Dockerfile.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finding and visualizing the issues are a very good first step, and we’ve even made those findings actionable, so we now have to take action and address them.&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-address-the-findings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2-address-the-findings&quot; /&gt;Phase 2: Address the findings&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To address the findings, we need to split our initiative into two parts:&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;Fixing the critical vulnerabilities related to the Docker image (in our case largely the base image)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixing the critical vulnerabilities related to the embedded deployment unit (in our case the WAR)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s proceed bottom up, first coping with the Docker base image.&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;This is an easy example covering multiple scenarios particularly identifying and fixing vulnerabilities in transitive binaries, i.e. binaries contained in
other binaries, e.g. a Docker image containing a WAR file that in turn contains libraries. To expand this vertical feasibility spike, you can easily add
more units of each layer, or add more abstractions, however, the idea can always be nailed down to the primitives, covered in this blog post.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s now have a look at the used Docker image by looking at the used Dockerfile.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Dockerfile: The Dockerfile based on Alpine, running OpenJDK 8&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;FROM openjdk:8-jre-alpine &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
LABEL maintainer &quot;michael@huettermann.net&quot;

# Domain of your Artifactory. Any other storage and URI download link works, just change the ADD command, see below.
ARG ARTI
ARG VER

# Expose web port
EXPOSE 8080

# Tomcat Version
ENV TOMCAT_VERSION_MAJOR 9 &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
ENV TOMCAT_VERSION_FULL  9.0.6

# Download, install, housekeeping
RUN apk add --update curl &amp;amp;&amp;amp;\  &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;
  apk add bash &amp;amp;&amp;amp;\
  #apk add -u libx11 &amp;amp;&amp;amp;\  &lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;
  mkdir /opt &amp;amp;&amp;amp;\
  curl -LO ${ARTI}/list/generic-local/apache/org/tomcat/tomcat-${TOMCAT_VERSION_MAJOR}/v${TOMCAT_VERSION_FULL}/bin/apache-tomcat-${TOMCAT_VERSION_FULL}.tar.gz &amp;amp;&amp;amp;\
  gunzip -c apache-tomcat-${TOMCAT_VERSION_FULL}.tar.gz | tar -xf - -C /opt &amp;amp;&amp;amp;\
  rm -f apache-tomcat-${TOMCAT_VERSION_FULL}.tar.gz &amp;amp;&amp;amp;\
  ln -s /opt/apache-tomcat-${TOMCAT_VERSION_FULL} /opt/tomcat &amp;amp;&amp;amp;\
  rm -rf /opt/tomcat/webapps/examples /opt/tomcat/webapps/docs &amp;amp;&amp;amp;\
  apk del curl &amp;amp;&amp;amp;\
  rm -rf /var/cache/apk/*

# Download and deploy the Java EE WAR
ADD http://${ARTI}/list/libs-release-local/com/huettermann/web/${VER}/all-${VER}.war /opt/tomcat/webapps/all.war &lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;(5)&lt;/b&gt;

RUN chmod 755 /opt/tomcat/webapps/*.war

# Set environment
ENV CATALINA_HOME /opt/tomcat

# Start Tomcat on startup
CMD ${CATALINA_HOME}/bin/catalina.sh run&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Base image ships OpenJDK 8, on Alpine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Defined version of web container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Applying some defined steps to configure Alpine, according to requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Updating package itself would address one vulnerability already&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Deploying the application&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By checking available versions of the official OpenJDK Alpine image, we see that there’s a newer version 8u181 which we could use.
We can zoom in and study release notes and contents, or we just pragmatically switch the base image to a more recent version. Often it is a good idea
to upgrade versions regularly, in defined intervals. This leads to the following change in the Dockerfile.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Dockerfile (excerpt): The Dockerfile based on Alpine, running OpenJDK 8u181&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;FROM openjdk:8u181-jre-alpine &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
LABEL maintainer &quot;michael@huettermann.net&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Base image is now OpenJDK 8u181, on Alpine&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are more options available to fix the issues, but let’s proceed to the second part, the vulnerabilities in the deployment unit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before we push this change to GitHub, we also address the vulnerability issue in the deployment unit, that is &lt;em&gt;jetty-io&lt;/em&gt;. Here we are a bit unsure about
why, in this specific use case, the library is used. To retrieve more information about dependencies, we run a &lt;em&gt;dependency:tree&lt;/em&gt; command on our Maven
based project. We now see that jetty-io is transitively referenced by &lt;em&gt;org.seleniumhq.selenium:htmlunit-driver&lt;/em&gt;. We can surely discuss why this is a compile
dependency and the libraries are shipped as part of the WAR, but let’s consider this to be given according to requirements, thus we must take special attention now
to version 2.29.0 of the specific library.&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/jenkins-devsecops/05.png&quot; alt=&quot;05&quot; title=&quot;Inspecting the dependency structure, with the used build tool&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also here we can browse release notes and content (particularly how those libs are built themselves), and come to the conclusion to
switch from the used version, that is &lt;em&gt;2.29.0&lt;/em&gt;, to a newer version of &lt;em&gt;htmlunit-driver&lt;/em&gt;, that is &lt;em&gt;2.31.1&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;pom.xml (excerpt): Build file&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;xml&quot;&gt;    &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.seleniumhq.selenium&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;selenium-java&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.14.0&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.seleniumhq.selenium&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;htmlunit-driver&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.31.1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;junit&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;junit&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;4.7&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Part of the underlying POM defining dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Definition of the dependency, causing the vulnerability finding; we use a newer version now&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;OK, now we are done. We push the changes to GitHub, and our GitHub webhook directly triggers the workflow. This time the quality gate passes, so it
looks like our fixes did address the root causes and eliminated those with the configured threshold severity.&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/jenkins-devsecops/06.png&quot; alt=&quot;06&quot; title=&quot;Part of the delivery pipeline, showing the quality gate passed and Docker image inspected without findings of severity CRITICAL&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, after running through our entire workflow, that is made up of different pipelines, our inspected and quality assured container does successfully
run in our production runtime environment, that is on Oracle Cloud.&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/jenkins-devsecops/07.png&quot; alt=&quot;07&quot; title=&quot;The quality assured Docker container runs in the Oracle Cloud.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Crisp, isn’t it?&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;This closes our quick walkthrough of how to inject security related quality gates into a Jenkins based delivery pipeline.
We’ve discussed some concepts and how this can look like with sample tools.
In the center of our efforts, we used Jenkins, the swiss army knife of automation.
We enriched our ecosystem by integrating couple of platforms and tools, above all Twistlock.
After this tasty appetizer you are ready to assess your own delivery pipelines,
concepts and tools, and to possibly invest even more attention to security.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&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;http://huettermann.net/alm/&quot;&gt;&#39;Agile ALM&#39;, Manning, 2011&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://huettermann.net/devops/&quot;&gt;&#39;DevOps for Developers&#39;, Apress, 2012&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker, the standard to develop and ship set of changes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/_/openjdk/&quot;&gt;Docker images, shipping OpenJDK&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.oracle.com/en_US/containers&quot;&gt;Oracle Cloud Infrastructure, for containers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://alpinelinux.org/&quot;&gt;Alpine Linux&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sonarqube.org/&quot;&gt;SonarQube, the language/platform agnostic Continuous Inspection tool&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.twistlock.com/&quot;&gt;Twistlock, the container security platform&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/michaelhuettermann/sandbox/tree/master/all/&quot;&gt;Sources on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange&quot;&gt;ASCII, commonly used standard to work on primitives, such as Docker (and their aggregations)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures&quot;&gt;Common Vulnerabilities and Exposures&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/jBGFjFc6Jf8?t=1427&quot;&gt;Holistic pipelines, Live 15-minute Jenkins Demos, Part 1, on YouTube&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/rS_pchiwGdM?t=95&quot;&gt;Holistic pipelines, Live 15-minute Jenkins Demos, Part 2, on YouTube&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2017/04/18/continuousdelivery-devops-sonarqube/&quot;&gt;Delivery Pipelines, with Jenkins 2, SonarQube, and Artifactory&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2017/07/05/continuousdelivery-devops-artifactory/&quot;&gt;Delivery pipelines, with Jenkins 2: how to promote Java EE and Docker binaries toward production&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/11/07/Validate-Jenkinsfile/</id>
<title>Validate your Jenkinsfile from within VS Code</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-11-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/11/07/Validate-Jenkinsfile/" />
<author>
<name>janjoerke</name>
</author>
<category term='jenkinsfile'></category>
<category term='validation'></category>
<category term='vscode'></category>
<category term='pipeline'></category>
<category term='pipeline authoring'></category>
<category term='development'></category>
<summary>
In my daily work I often have to create or modify Jenkinsfiles and more often than I would like, I make mistakes. It is a very tedious workflow when you make a change to your Jenkinsfile, create a commit, push the commit and wait for your Jenkins Server to tell you, that you have missed a bracket.


The Command-line Pipeline Linter does a great job of reducing the turnaround times when writing a Jenkinsfile, but its usage has its own inconveniences. You need tools like curl or ssh to make a connection to your Jenkins Server and you need to remember...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my daily work I often have to create or modify Jenkinsfiles and more often than I would like, I make mistakes. It is a very tedious workflow when you make a change to your Jenkinsfile, create a commit, push the commit and wait for your Jenkins Server to tell you, that you have missed a bracket.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/development/&quot;&gt;The Command-line Pipeline Linter&lt;/a&gt; does a great job of reducing the turnaround times when writing a Jenkinsfile, but its usage has its own inconveniences. You need tools like curl or ssh to make a connection to your Jenkins Server and you need to remember the correct command to validate your Jenkinsfile. I still did not like the solution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As VS Code is my daily driver, I started to look at writing extensions for it and out of it came a little extension which makes validating Jenkinsfiles just a little bit more comfortable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What the &#39;Jenkins Pipeline Linter Connector&#39; does is, that it takes the file that you have currently opened, pushes it to your Jenkins Server and displays the validation result in VS Code.&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/vscode-pipeline-linter/example1.gif&quot; alt=&quot;Jenkins Pipeline Linter Connector | Example 1&quot; width=&quot;800&quot;&gt;
&lt;/img&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/vscode-pipeline-linter/example2.gif&quot; alt=&quot;Jenkins Pipeline Linter Connector | Example 2&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;​You can find the extension from within the VS Code extension browser or at the following url: &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=janjoerke.jenkins-pipeline-linter-connector&quot; class=&quot;bare&quot;&gt;https://marketplace.visualstudio.com/items?itemName=janjoerke.jenkins-pipeline-linter-connector&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The extension adds four settings entries to VS Code which you have to use to configure the Jenkins Server you want to use for validation.&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;jenkins.pipeline.linter.connector.url&lt;/code&gt; is the endpoint at which your Jenkins Server expects the POST request, containing your Jenkinsfile which you want to validate. Typically this points to &lt;em&gt;&lt;a href=&quot;http://&amp;lt;your_jenkins_server:port&amp;gt;/pipeline-model-converter/validate&quot; class=&quot;bare&quot;&gt;http://&amp;lt;your_jenkins_server:port&amp;gt;/pipeline-model-converter/validate&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jenkins.pipeline.linter.connector.user&lt;/code&gt; allows you to specify your Jenkins username.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jenkins.pipeline.linter.connector.pass&lt;/code&gt; allows you to specify your Jenkins password.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jenkins.pipeline.linter.connector.crumbUrl&lt;/code&gt; has to be specified if your Jenkins Server has CRSF protection enabled. Typically this points to &lt;em&gt;&lt;a href=&quot;http://&amp;lt;your_jenkins_server:port&amp;gt;/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb&quot; class=&quot;bare&quot;&gt;http://&amp;lt;your_jenkins_server:port&amp;gt;/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb&lt;/a&gt;)&lt;/em&gt;.
​&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/10/18/contributor-summit-summary/</id>
<title>What to Expect at the Jenkins Contributor Summit</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-10-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/10/18/contributor-summit-summary/" />
<author>
<name>tracymiranda</name>
</author>
<category term='community'></category>
<category term='events'></category>
<category term='jenkins-world'></category>
<summary>
The Jenkins Contributor summit is where the current and future contributors of the Jenkins project get together.
This summit will be on Tuesday, October 23rd 2018 in Nice, France just before Jenkins World.
What should those planning on joining expect at the event?
Earlier this year in September we had a contributor summit in San Francisco which gave us a pretty good outline of what to expect.
First of all it was one of the biggest contributor summits ever with lots of first-time attendees.


Morning


There are plenty of exciting developments happening in the Jenkins community, which meant there was a packed program.
One of the most...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/conferences/contributor_summit_kk.jpg&quot; alt=&quot;Contributor Summit - Morning&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; width=&quot;200&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor summit is where the current and future contributors of the Jenkins project get together.
This summit will be on Tuesday, October 23rd 2018 in Nice, France just before &lt;a href=&quot;https://www.cloudbees.com/devops-world/nice&quot;&gt;Jenkins World&lt;/a&gt;.
What should those planning on joining expect at the event?
Earlier this year in September we had a contributor summit in San Francisco which gave us a pretty good outline of what to expect.
First of all it was one of the biggest contributor summits ever with lots of first-time attendees.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;morning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#morning&quot; /&gt;Morning&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are plenty of exciting developments happening in the Jenkins community, which meant there was a packed program.
One of the most anticipated updates was Kohsuke Kawaguchi speaking about &lt;a href=&quot;https://www.jenkins.io/blog/2018/08/31/shifting-gears&quot;&gt;Jenkins Shifting Gears&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were also updates on the &#39;5 Jenkins Superpower&#39; projects in active development:&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/2018/04/06/jenkins-essentials&quot;&gt;Jenkins Evergreen&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.praqma.com/stories/jenkins-configuration-as-code&quot;&gt;Configuration as Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Jenkins Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native&quot;&gt;Cloud Native Jenkins&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;As ever Jenkins is a community driven by its members so it was also great to get an update on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc&quot;&gt;Google Summer of Code&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;birds-of-a-feather-bof&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#birds-of-a-feather-bof&quot; /&gt;Birds-of-a-feather (BoF)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a packed morning of updates, it was time for a break and some lunch.
After lunch attendees divided up into groups and gathered around tables for unconference style discussions of specific areas.
Each table ran differently: some had demos, some did presentations, some hacked on code and others brainstormed ideas.
There was definitely alot of energy in the room and huge exchange of ideas.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ignite-talks-wrap-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ignite-talks-wrap-up&quot; /&gt;Ignite Talks &amp;amp; Wrap-up&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To finish off the session we had a set of ignite talks.
Attendees were invited to volunteer on the day - no easy task given the pressure involved- and many did.
Hats off to Liam Newman, Mandy Hubbard, Eric Smalling, Pui Chee Chan, Martin d’Anjou and Vishal Raina for getting out of their comfort zone and doing talks.
There were two surprise ignite talks, one for James Strachan and one for Kohsuke Kawaguchi which were highly entertaining gave the audience lots of laughs.
Someone even captured KK’s talk on video.  The sound isn’t great but it was a truly visionary talk:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;640&quot; src=&quot;https://www.youtube.com/embed/egFrqmENGDE?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally the event finished with swag presentations and a fun Kahoot quiz to wrap things up.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributor-appreciation-event&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributor-appreciation-event&quot; /&gt;Contributor Appreciation Event&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the summit, contributors were invited to join at the after party at Spin.
Spin was a unique venue in San Francisco where attendees could socialise and also play ping-pong!
While some took it seriously most enjoyed the relaxed way to get to know their fellow contributors.&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/conferences/contributor_summit_sf.jpg&quot; alt=&quot;contributor summit sf&quot; width=&quot;800&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;see-you-in-nice&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#see-you-in-nice&quot; /&gt;See you in Nice&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The event was a lot of fun and the contributor summit in Nice will follow a very similar structure.
All levels of contributor are welcome, there will be lots of opportunity for in-depth discussions and you can even do an ignite talk!
While we won’t be repeating the ping pong event there will be something equally unique to follow on from the summit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Attending is free, and no DevOps World | Jenkins World ticket is needed, but &lt;a href=&quot;https://www.eventbrite.com/e/contributor-summit-nice-tickets-48353733318&quot;&gt;RSVP&lt;/a&gt; if you are going to attend to help us plan.
See you there!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As long as you’re in Nice for the Contributor Summit,
join Tracy, Kohsuke, and hundreds of other Jenkins users at
&lt;a href=&quot;https://www.cloudbees.com/devops-world/nice&quot;&gt;DevOps World - Jenkins World&lt;/a&gt; on October 22-25.
Register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/2018/10/16/custom-war-packager/</id>
<title>Build your own Jenkins! Introducing Custom WAR/Docker Packager</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-10-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/10/16/custom-war-packager/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='tools'></category>
<category term='docker'></category>
<category term='jenkins-x'></category>
<category term='cloud-native'></category>
<summary>
I would like to introduce Custom WAR Packager -
a new tool for Jenkins administrators and developers.
This tool allows packaging custom Jenkins distributions as WAR files,
Docker images
and Jenkinsfile Runner bundles.
This tool allows packaging Jenkins, plugins, and configurations in a ready-to-fly distribution.
Custom WAR packager is a part of the Ephemeral Jenkins controller toolchain
which we presented in our A Cloud Native Jenkins blogpost.
This toolchain is already used in Jenkins X to package serverless images.


In this blogpost I will show some common use-cases for Custom WAR Packager.


History


As with Jenkins itself, Custom WAR Packager started as a small development tool.
For a long time it was...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to introduce &lt;a href=&quot;https://github.com/jenkinsci/custom-war-packager&quot;&gt;Custom WAR Packager&lt;/a&gt; -
a new tool for Jenkins administrators and developers.
This tool allows packaging custom Jenkins distributions as WAR files,
&lt;a href=&quot;https://github.com/jenkinsci/docker&quot;&gt;Docker images&lt;/a&gt;
and &lt;a href=&quot;https://github.com/jenkinsci/jenkinsfile-runner&quot;&gt;Jenkinsfile Runner&lt;/a&gt; bundles.
This tool allows packaging Jenkins, plugins, and configurations in a ready-to-fly distribution.
Custom WAR packager is a part of the Ephemeral Jenkins controller toolchain
which we presented in our &lt;a href=&quot;https://www.jenkins.io/blog/2018/09/12/speaker-blog-a-cloud-native-jenkins/&quot;&gt;A Cloud Native Jenkins&lt;/a&gt; blogpost.
This toolchain is already used in &lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt; to package &lt;a href=&quot;https://github.com/jenkins-x/jenkins-x-serverless&quot;&gt;serverless images&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blogpost I will show some common use-cases for Custom WAR Packager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;history&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#history&quot; /&gt;History&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As with Jenkins itself, Custom WAR Packager started as a small development tool.
For a long time it was a problem to run integration testing in Jenkins.
We have 3 main frameworks for it:
    &lt;a href=&quot;https://github.com/jenkinsci/jenkins-test-harness&quot;&gt;Jenkins Test Harness&lt;/a&gt;,
    &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness&quot;&gt;Acceptance Test Harness&lt;/a&gt;,
    and &lt;a href=&quot;https://github.com/jenkinsci/plugin-compat-tester&quot;&gt;Plugin Compatibility Tester&lt;/a&gt;.
All these frameworks require a Jenkins WAR file to be passed to them to run tests.
What if you want to run Jenkins tests in a custom environment like AWS?
Or what if you want to reuse existing Jenkins Pipeline tests and to run them against
&lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native/pluggable-storage/&quot;&gt;Pluggable Storage&lt;/a&gt; to ensure there are no regressions?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And it was not just an idle question.
There were major activities happening in the Jenkins project: Cloud-Native Jenkins, Jenkins Evergreen, and Jenkins X.
All these activities required a lot of integration testing  to enable Continuous Delivery flows.
In order to do this in existing test frameworks, we needed to package a self-configuring WAR file so that it would be possible to run integration tests in existing frameworks.
That is why Custom WAR Packager was created in April 2018.
Later it got support for packaging Docker images,
and in September 2018 it also got support for Jenkinsfile Runner
which was created by &lt;a href=&quot;https://github.com/kohsuke/&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;
and then improved by &lt;a href=&quot;https://github.com/ndeloof&quot;&gt;Nicolas de Loof&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;whats-inside&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-inside&quot; /&gt;What’s inside?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Custom WAR packager is a tool which is available as CLI Executable, Maven Plugin, or Docker package.
This tool takes input definitions and packages them as requested by the user.
Everything is managed by a YAML configuration file:&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/2018-10-16-cwp/cwp_flow.png&quot; alt=&quot;Custom WAR Packager build flow&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The tool supports various types of inputs.
The list of plugins can be passed via YAML itself, &lt;code&gt;pom.xml&lt;/code&gt;, or a BOM file from &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/309/README.adoc&quot;&gt;JEP-309&lt;/a&gt;.
Custom WAR Packager supports not only released versions,
but also builds deployed to the &lt;a href=&quot;https://www.jenkins.io/blog/2018/05/15/incremental-deployment/&quot;&gt;Incremental repository&lt;/a&gt; (CD flow for Jenkins core and plugins - &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/305/README.adoc&quot;&gt;JEP-305&lt;/a&gt;) and
even direct builds by Git or directory path specifications.
It allows building packages from any source, without waiting for official releases.
The builds are also pretty fast, because the plugin does caching in the local Maven repository by using commit IDs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Custom WAR packager also supports the following self-configuration options:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;YAML files for &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Jenkins Configuration as Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Groovy+Hook+Script&quot;&gt;Groovy Hooks&lt;/a&gt; (e.g. init hooks for pre-configuration)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;System properties&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;war-packaging&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#war-packaging&quot; /&gt;WAR Packaging&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;WAR packaging happens by default every time the repo is built.
Generally Custom WAR Packager repackages all inputs into a single WAR file by following conventions defined in the Jenkins core and the JCasC plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sample configuration:&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;bundle&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;groupId&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;io.jenkins.tools.war-packager.demo&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;artifactId&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;blogpost-demo&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;vendor&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;Jenkins&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;project&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;description&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;Just&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;demo&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;blogpost&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;war&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;groupId&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;org.jenkins-ci.main&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;artifactId&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;jenkins-war&quot;&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;2.138.2&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;plugins&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;groupId&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;io.jenkins&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;artifactId&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;configuration-as-code&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# Common release&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;1.0-rc2&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;groupId&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;io.jenkins&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;artifactId&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;artifact-manager-s3&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# Incrementals&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;1.2-rc259.c9d60bf2f88c&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;groupId&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;org.jenkins-ci.plugins.workflow&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;artifactId&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;workflow-job&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# Git&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;https://github.com/jglick/workflow-job-plugin.git&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;18d78f305a4526af9cdf3a7b68eb9caf97c7cfbc&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# etc.&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;systemProperties&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;jenkins.model.Jenkins.slaveAgentPort&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;9000&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;jenkins.model.Jenkins.slaveAgentPortEnforce&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;true&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;groovyHooks&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;type&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;init&quot;&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;initScripts&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;dir&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;src/main/groovy&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;casc&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;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;jcasc&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;dir&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;casc.yml&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;docker-packaging&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#docker-packaging&quot; /&gt;Docker packaging&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to do the Docker packaging, Custom WAR Packager uses the official
&lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins/&quot;&gt;jenkins/jenkins&lt;/a&gt;
Docker images or other images using the same format.
During the build the WAR file just gets replaced by the one built by the tool.
It means that &lt;strong&gt;ALL&lt;/strong&gt; image features are available for such custom builds: &lt;code&gt;plugins.txt&lt;/code&gt;, Java options, Groovy hooks, etc., etc.&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;## ...&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;## WAR configuration from above&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;## ...&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;buildSettings&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Base image&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;base&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;jenkins/jenkins:2.138.2&quot;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Tag to set for the produced image&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;tag&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;jenkins/custom-war-packager-casc-demo&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 example, &lt;a href=&quot;https://github.com/jenkinsci/custom-war-packager/tree/master/demo/external-logging-elasticsearch&quot;&gt;this demo&lt;/a&gt;
shows packaging of a Docker image with External Build Logging to Elasticsearch.
Although the implementations have been improved as a part of &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/207/README.adoc&quot;&gt;JEP-207&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/210/README.adoc&quot;&gt;JEP-210&lt;/a&gt;,
you can check out this demo to see how the Docker image does self-configuration, connects to a Elasicsearch, and then starts externally storing logs without changes in build log UIs.
A Docker Compose file for running the entire cluster is included.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkinsfile-runner-packaging&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsfile-runner-packaging&quot; /&gt;Jenkinsfile Runner packaging&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is probably the most tricky mode of Jenkinsfile Runner.
In March a new &lt;a href=&quot;https://github.com/jenkinsci/jenkinsfile-runner&quot;&gt;Jenkinsfile Runner&lt;/a&gt; project
&lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/gjz3CDhi-kk/1mwi_oa0AQAJ&quot;&gt;was announced&lt;/a&gt; in the developer mailing list.
The main idea is to support running Jenkins Pipeline in a single-shot controller mode when the instance just executes a single run and prints outputs to the console.
Jenkinsfile Runner runs as CLI or as a Docker image.
Custom WAR Packager is able to produce both, though only Docker run mode is recommended.
With Jenkinsfile Runner you can run Pipelines simply as…​&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;sh&quot;&gt;docker run &lt;span class=&quot;nt&quot;&gt;--rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$PWD&lt;/span&gt;/Jenkinsfile:/workspace/Jenkinsfile acmeorg/jenkinsfile-runner&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When we started working on Ephemeral (aka &quot;single-shot&quot;) controllers in the Cloud Native SIG,
there was an idea to use Custom WAR Packager and other existing tools (Jenkinsfile Runner, Jenkins Configuration as Code, etc.) to implement it.
It would be possible to just replace Jenkins core JAR and add plugins to Jenkinsfile Runner, but it is not enough.
To be efficient, Jenkinsfile Runner images should start up &lt;strong&gt;FAST&lt;/strong&gt;, really fast.
In the build flow implementation we used some experimental options available in Jenkins and Jenkinsfile Runner, including classloader precaching, plugin unarchiving, etc, etc.
With such patches Jenkins starts up in few seconds with configuration-as-code and dozens of bundled plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, how to build custom Jenkinsfile Runner images?
Although there is no release so far, it is not something which can stop us as you see above.&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;##...&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;## WAR Configuration from above&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;##...&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;buildSettings&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;jenkinsfileRunner&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;groupId&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;io.jenkins&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;artifactId&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-runner&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;noCache&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;https://github.com/jenkinsci/jenkinsfile-runner.git&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;commit&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;8ff9b1e9a097e629c5fbffca9a3d69750097ecc4&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;base&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;jenkins/jenkins:2.138.2&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;tag&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;onenashev/cwp-jenkinsfile-runner-demo&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;You can find a Demo of Jenkinsfile Runner packaging with Custom WAR Packager
&lt;a href=&quot;https://github.com/jenkinsci/custom-war-packager/tree/master/demo/jenkinsfile-runner&quot;&gt;here&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;more-info&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-info&quot; /&gt;More info&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are many other features which are not described in this blogpost.
For example, it is possible to alter Maven build settings or to add/replace libraries within the Jenkins core (e.g. Remoting).
Please see the &lt;a href=&quot;https://github.com/jenkinsci/custom-war-packager/blob/master/README.md&quot;&gt;Custom WAR Packager documentation&lt;/a&gt; for more information.
There are a number of demos available in the repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested to contribute to the repository,
please create pull requests and CC &lt;a href=&quot;https://github.com/oleg-nenashev/&quot;&gt;@oleg-nenashev&lt;/a&gt;
and &lt;a href=&quot;https://github.com/raul-arabaolaza&quot;&gt;Raul Arabaolaza&lt;/a&gt; who is the second maintainer now working on Jenkins test automation flows.&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;There are still many improvements that could be made to the tool to make it more efficient:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add upper bounds checks for transitive plugin dependencies so that the conflicts are discovered during the build&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allow passing all kinds of system properties and Java options via configuration YAML&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improve Jenkinsfile Runner to improve performance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integrate the tool into Jenkins Integration test flows
(see &lt;a href=&quot;https://github.com/jenkins-infra/pipeline-library/blob/master/vars/essentialsTest.groovy&quot;&gt;essentialsTest()&lt;/a&gt;
 in the Jenkins Pipeline library)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many other tasks could be implemented in Custom WAR Packager,
but even now it is available to all Jenkins users so that they can build their own Jenkins bundles with it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;want-to-know-more&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#want-to-know-more&quot; /&gt;Want to know more?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are going to &lt;a href=&quot;https://www.cloudbees.com/devops-world/nice&quot;&gt;DevOps World - Jenkins World in Nice&lt;/a&gt; on Oct 22-25,
I will be presenting Custom WAR Packager at the Community Booth during the lunch demo sessions.
We will be also repeating our &lt;a href=&quot;https://sched.co/FIox&quot;&gt;A Cloud Native Jenkins&lt;/a&gt; talk together with Carlos Sanchez where we will show how Ephemeral Jenkins works with Pluggable Storage.
Jenkins X team is also going to present their project using Custom WAR Packager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet Oleg and other Cloud Native SIG members at
&lt;a href=&quot;https://www.cloudbees.com/devops-world/nice&quot;&gt;DevOps World - Jenkins World&lt;/a&gt; on October 22-25 in Nice.
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/10/14/gsoc2018-results/</id>
<title>Jenkins in Google Summer of Code 2018 Results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-10-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/10/14/gsoc2018-results/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='community'></category>
<category term='events'></category>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<summary>
It has been a while since the last blogpost about Google Summer of Code in Jenkins.
GSoC 2018 has officially finished on August 23, and we had a Jenkins Online Meetup where we had final presentations of the GSoC projects.
It is never late to provide more context, so I would like to summarize the results and provide updates of what was happening in Jenkins GSoC Special Interest Group over last 2 months.
In this blogpost you can find project status overviews and updates from the Jenkins GSoC SIG.


But first of all, I would like to thank all our students, their mentors
and to...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It has been a while since the last blogpost about &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code&lt;/a&gt; in Jenkins.
GSoC 2018 has officially finished on August 23, and we had a &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/253577758/&quot;&gt;Jenkins Online Meetup&lt;/a&gt; where we had final presentations of the GSoC projects.
It is never late to provide more context, so I would like to summarize the results and provide updates of what was happening in &lt;a href=&quot;https://www.jenkins.io/sigs/gsoc&quot;&gt;Jenkins GSoC Special Interest Group&lt;/a&gt; over last 2 months.
In this blogpost you can find project status overviews and updates from the Jenkins &lt;a href=&quot;https://www.jenkins.io/sigs/gsoc&quot;&gt;GSoC SIG&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But first of all, I would like to thank all our students, their mentors
and to all other contributors who proposed project ideas, participated in student selection, community bonding and further reviews.
Google Summer of Code is a major effort which would not be possible without active participation of the Jenkins community&lt;/p&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;This year we started preparing for Google Summer of Code in early December.
14 project ideas and 12 potential mentors we published on our website,
and we got dozens of students reaching out to us during the application period.
After processing applications, we have selected 4 applications for GSoC.
Unfortunately one project got cancelled due to student eligibility issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, we had the following projects:
Code Coverage API plugin, Remoting over Apache Kafka, and Simple Pull-Request Job Plugin
(also known as &lt;em&gt;Pipeline as YAML&lt;/em&gt;).
All these projects have a significant value to the Jenkins community.
They were focused on areas which have been discussed in the community for a long time,
but which had no progress so far.
Google Summer of Code allowed us to kick-start these projects,
and to make significant progress there.
All projects have been released and made available in the Jenkins community (common or experimental update centers).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In total there were 9 blogposts about GSoC projects on jenkins.io,
and also 2 &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup&quot;&gt;Jenkins Online Meetups&lt;/a&gt;.
GSoC results have been also presented at DevOps World - Jenkins World conference and the contributor summit.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
  &lt;iframe src=&quot;https://docs.google.com/presentation/d/1YiN4nbc_uIt6L7iZ6VckF8sCPBAp1dqBkFexM7uAuiQ/embed?start=false&amp;amp;loop=false&amp;amp;delayms=60000&quot; frameborder=&quot;0&quot; width=&quot;720&quot; height=&quot;434&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;code-coverage-api-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-coverage-api-plugin&quot; /&gt;Code Coverage API Plugin&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;Student: &lt;a href=&quot;https://github.com/cizezsy&quot;&gt;Shenyu Zheng&lt;/a&gt;, Henan University, China&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors:
&lt;a href=&quot;https://github.com/jeffpearce&quot;&gt;Jeff Pearce&lt;/a&gt;,
&lt;a href=&quot;https://github.com/christ66&quot;&gt;Steven Christou&lt;/a&gt;,
&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Supun94&quot;&gt;Supun Wanniarachchi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/code-coverage-api-plugin/&quot;&gt;Project page&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;There are many code coverage plugins in Jenkins: Cobertura, JaCoCo, Emma, etc., etc.
The problem with these plugins is that each of them implements all code coverage features on their own.
So you get different feature sets, UIs, CLI commands and REST APIs.
The idea of this project was to unify the existing functionality and offer a new API plugin which other plugins could extend.
It would help to simplify existing plugin and to create new plugins for coverage tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project has started really well, and we had the first demo after a week of coding.
Then Shenyu continued extending the plugin’s functionality over coding periods.
Here is the list of the key features offered by the plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Flexible data structure for defining and storing coverage metrics within Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coverage charts and trends&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Source code navigation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;REST API for retrieving coverage stats and trends&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Report aggregation for parallel steps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extension points which allow integrating other plugins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the Code Coverage API Plugin,
Shenyu added integration to the &lt;a href=&quot;https://plugins.jenkins.io/cobertura&quot;&gt;Cobertura Plugin&lt;/a&gt; and also created a new &lt;a href=&quot;https://github.com/jenkinsci/llvm-cov-plugin&quot;&gt;llvm-cov plugin&lt;/a&gt; which is expected to be released soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After GSoC Shenyu continued contributing to the Jenkins project.
He works on the Code Coverage API plugin and also participates in the &lt;a href=&quot;https://www.jenkins.io/sigs/chinese-localization/&quot;&gt;Chinese Localization SIG&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;simple-pull-request-job-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#simple-pull-request-job-plugin&quot; /&gt;Simple Pull-Request Job Plugin&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;Student: &lt;a href=&quot;https://github.com/gautamabhishek46/&quot;&gt;Abhishek Gautam&lt;/a&gt;, Visvesvaraya National Institute of technology, India&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors:
&lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Jeff-Symphony&quot;&gt;Jeff Knurek&lt;/a&gt;,
&lt;a href=&quot;https://github.com/kwhetstone&quot;&gt;Kristin Whetstone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/simple-pull-request-job-plugin/&quot;&gt;Project page&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;This project focused on introducing a way to
easily define pull-request build job definitions in YAML.
This project has been shaped a lot during the application period and community bonding,
so that the project fit the existing Jenkins Ecosystem better.
Finally it was decided to build the new plugin on the top of &lt;a href=&quot;https://plugins.jenkins.io/workflow-multibranch&quot;&gt;Pipeline: Multi-Branch Plugin&lt;/a&gt;.
There was also an idea to offer extra syntax sugar, templating and automatic resolution for common flows,
so that users need less time to define Pipelines for common use-cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin allows defining Pipeline jobs as YAML being stored in SCM.
Original design presumed a new job type,
but during community bonding and Phase 1 prototyping it was decided to build the plugin on the top of the existing Pipeline ecosystem and extension points.
Currently the plugin generates Declarative Pipeline code from YAML so that it gets a lot of Pipeline features out-of-the box.
In addition to that, Simple Pull Request Job Plugin uses a an engine provided by the &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Configuration as Code plugin&lt;/a&gt; to convert YAML snippets
to Pipeline step definitions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin has been well described by Abhishek in his &lt;a href=&quot;https://www.jenkins.io/blog/2018/08/14/simple-pull-request-plugin-final-evaluation/&quot;&gt;Pipeline as YAML&lt;/a&gt; blogpost in August.
Currently it is available in the &lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/releasing-experimental-updates/&quot;&gt;Experimental Update Center&lt;/a&gt; as an alpha version.
Pham Vu Tuan, one of our GSoC students, have also joined the plugin team.
At the DevOps World - Jenkins World hackfest we had discussions with the Jenkins Pipeline team,
and we have a plan towards making this plugin available as an Incubated Pipeline project.
The final implementation may change,
but in any case the project gave us a working prototype and a lot of information about  obstacles we need to resolve.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;remoting-over-apache-kafka&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#remoting-over-apache-kafka&quot; /&gt;Remoting over Apache Kafka&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;Student: &lt;a href=&quot;https://github.com/pvtuan10&quot;&gt;Pham Vu Tuan&lt;/a&gt;, Nanyang Technological University, Singapore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors:
&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Supun94&quot;&gt;Supun Wanniarachchi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/remoting-over-message-bus/&quot;&gt;Project page&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;Last but not least, Remoting over Kafka is another challenging project we had.
To implement communication between its controllers and agents, Jenkins widely uses home-grown protocol implementations based on TCP
(&lt;a href=&quot;https://github.com/jenkinsci/remoting/blob/master/docs/protocols.md&quot;&gt;JNLP 1..4 protocols&lt;/a&gt;).
There are some performance and stability implementations,
and there have been discussions about using an industry-standard message bus or queue.
Pham Vu Tuan proposed to use Apache Kafka for it,
and after some experiments during community bonding and first coding phase we agreed to go forward with this implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During his project Vu Tuan extended Jenkins Core and Remoting to allow implementing an agent communication channel in a plugin.
Then he has created a new &lt;a href=&quot;https://plugins.jenkins.io/remoting-kafka&quot;&gt;Remoting over Kafka plugin&lt;/a&gt;
which is now available in the main Jenkins Update cente.
Once the plugin is installed, it is possible to connect to agents over Apache Kafka and execute all types of Jenkins jobs there.
There are also official &lt;a href=&quot;https://hub.docker.com/r/jenkins/remoting-kafka-agent/&quot;&gt;jenkins/remoting-kafka-agent&lt;/a&gt; images available on DockerHub.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vu Tuan continued contributing to the Jenkins project after GSoC, currently he maintains the Remoting over Kafka plugin.
He visited the &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;DevOps World - Jenkins World US&lt;/a&gt; conference in September, presented his GSoC project at the
&lt;a href=&quot;https://www.jenkins.io/blog/2018/07/25/contributor-summit/&quot;&gt;Jenkins Contributor Summit&lt;/a&gt;.
You can find his slides &lt;a href=&quot;https://docs.google.com/presentation/d/1drRIDNvDKdBE-VuuLFXlWRB0NhSFr1aWrg2p8qrF3co/edit?usp=sharing&quot;&gt;here&lt;/a&gt;.
After the conference he also participated in the hackfest where he helped to migrate Jenkins&#39; DNS services to Microsoft Azure.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-could-we-do-better&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-could-we-do-better&quot; /&gt;What could we do better?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the end of GSoC we had a &lt;a href=&quot;https://docs.google.com/document/d/1sJ9KIYHUoFWWE9HmoZC7HPDxm2i3uMFGQ2KKZ_1TTjk/edit?usp=sharing&quot;&gt;Retrospective&lt;/a&gt; with GSoC students and mentors.
We discussed the issues we encountered during the projects,
and ways to improve the student and mentor experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Main takeaways for us:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GSoC projects should be aligned with &lt;a href=&quot;https://www.jenkins.io/sigs&quot;&gt;Jenkins Special Interest Groups (SIGs)&lt;/a&gt; or &lt;a href=&quot;https://www.jenkins.io/projects&quot;&gt;subprojects&lt;/a&gt; in order to get a wider list of stakeholders
Projects should be aligned with SIG priorities when possible&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In addition to GSoC SIG meetings and Jenkins Online Meetups during student evaluation,
we should also run regular status updates within SIGs so that there more contributors involved in projects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We should invest more time into forming mentor teams before the application period starts.
This year there were changes in mentor teams after the community bonding started, and it complicated the work&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We should pay more attention to student eligibility.
This year we started from 4 projects, but unfortunately one project (EDA plugins for Jenkins) got cancelled due to the visa limitations the student had.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We should do regular office hours for mentors/students so that it is possible to exchange information between GSoC projects within the organization.
This year we cancelled them at the end of phase and relied only on regular project meetings and mailing lists, but this is not enough.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me personally the main takeaway is also to reduce direct involvement into the project as a mentor and technical advisor.
Doing org administration, logistics and mentorship is not good from a bus factor PoV,
and I believe I was pushing my vision too hard in few cases.
Will do my best to prevent it next year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to share your feedback and ideas,
please reach out to us using the &lt;a href=&quot;https://community.jenkins.io/&quot;&gt;forums&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;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;In order to improve GSoC organization in Jenkins,
we have have created a &lt;a href=&quot;https://www.jenkins.io/sigs/gsoc&quot;&gt;GSoC Special Interest Group&lt;/a&gt; which will be running non-stop as other SIGs in Jenkins.
The objective of the SIG is to organize GSoC, work with potential students/mentors,
and to help students stay involved in the community after GSoC ends.
In this SIG we will have monthly meetings to sync-up on GSoC.
If you are interested to contribute, please join the SIG.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;According to the &lt;a href=&quot;https://docs.google.com/document/d/1sJ9KIYHUoFWWE9HmoZC7HPDxm2i3uMFGQ2KKZ_1TTjk/edit?usp=sharing&quot;&gt;Retrospective&lt;/a&gt;, next year we plan to invest more
into communication with mentors.
We will also try to tie new project proposals to Jenkins
&lt;a href=&quot;https://www.jenkins.io/sigs&quot;&gt;Special Interest Groups&lt;/a&gt; so that the students become a part
of ongoing coordinated efforts.
This weekend Martin d’Anjou, Jeff Pearce and me are participating in the GSoC Mentor summit to share experiences and to study from other GSoC organizations.
On October 17 we will have a GSoC SIG meeting to discuss our experience and to discuss next steps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to that,
Jenkins Google Summer of Code will be presented at &lt;a href=&quot;https://www.cloudbees.com/devops-world/nice&quot;&gt;DevOps World - Jenkins World Nice&lt;/a&gt; and at the contributor summit.
If you plan to visit the conference and you are interested to participate in Google Summer of Code and other community activities,
please join us at the &lt;a href=&quot;https://www.jenkins.io/blog/2018/08/21/contributor-summit-nice/&quot;&gt;contributor summit&lt;/a&gt; or stop by at the community booth.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And, elephant in the room…​ GSoC 2019.
Of course we are going to apply, stay tuned for new announcements.
We have already started collecting project ideas for the next year.
If you are interested to participate as a student or mentor,
please reach out to us using the &lt;a href=&quot;https://community.jenkins.io/&quot;&gt;forums&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/2018/10/12/hackathons-in-october/</id>
<title>Jenkins Hackathons in October</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-10-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/10/12/hackathons-in-october/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='events'></category>
<category term='community'></category>
<category term='hacktoberfest'></category>
<summary>
Traditionally there are a lot of events happening in the Jenkins organization in Autumn.
I would like to share some information about the upcoming hackathons.


Online Event: Hacktoberfest


As you probably know, there is an ongoing Hacktoberfest event.
The Jenkins project is participating in it and everybody is welcome to contribute to Jenkins as a part of this event.
The event lasts from October 01 to October 31,
and you can can join it at any time.


See this blogpost for more information about Hacktoberfest in the Jenkins project.




Onsite Hackathons


Hacktoberfest is not the only event happening in the Jenkins community this month,
there are also a number of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Traditionally there are a lot of events happening in the Jenkins organization in Autumn.
I would like to share some information about the upcoming hackathons.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;online-event-hacktoberfest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#online-event-hacktoberfest&quot; /&gt;Online Event: Hacktoberfest&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you probably know, there is an ongoing &lt;a href=&quot;https://hacktoberfest.digitalocean.com/&quot;&gt;Hacktoberfest&lt;/a&gt; event.
The Jenkins project is participating in it and everybody is welcome to contribute to Jenkins as a part of this event.
The event lasts from October 01 to October 31,
and you can can join it at any time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.jenkins.io/blog/2018/10/01/hacktoberfest/&quot;&gt;this blogpost&lt;/a&gt; for more information about Hacktoberfest in the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;onsite-hackathons&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#onsite-hackathons&quot; /&gt;Onsite Hackathons&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hacktoberfest is not the only event happening in the Jenkins community this month,
there are also a number of upcoming on-site events:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Oct 19 - Copenhagen, Denmark&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Configuration as Code hackathon at
&lt;a href=&quot;https://www.code-conf.com/2018/day-of-jenkins-as-code/&quot;&gt;Day of Jenkins [as code&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Registration: all conference participants can attend&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oct 22 - Nice, France - Hackathon at
&lt;a href=&quot;https://www.cloudbees.com/devops-world/nice&quot;&gt;DevOps World - Jenkins World Nice&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RSVP &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/255555426/&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure to also attend the &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/253810578/&quot;&gt;Jenkins Contributor Summit&lt;/a&gt; on Oct 23 ;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oct 27 - Beijing, China&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RSVP &lt;a href=&quot;https://www.meetup.com/Beijing-Jenkins-Area-Meetup/events/255607288/&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oct 30 - Neuchatel, Switzerland - Hacktoberfest: Jenkins &amp;amp; Friends event (Swiss Jenkins Area meetup)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RSVP &lt;a href=&quot;https://www.meetup.com/Swiss-Jenkins-Area-Meetup/events/255345695/&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All contributions during these in-person events qualify as
&lt;a href=&quot;https://hacktoberfest.digitalocean.com/&quot;&gt;Hacktoberfest&lt;/a&gt; contributions as well. :)
More events will also be announced later in the year,
e.g. we traditionally do a hackfest in Brussels after FOSDEM in February.
Follow our developer mailing lists and social media to receive announcements.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/10/10/security-updates/</id>
<title>Important security updates for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-10-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/10/10/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.146 and 2.138.2, that fix multiple security vulnerabilities.


For an overview of what was fixed, see the security advisory.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our LTS upgrade guide.


Further improvements

In addition to the security fixes listed in the security advisory, we also applied multiple improvements that make future security vulnerabilities more difficult, or even impossible to exploit.


One such improvement concerns cross-site scripting vulnerabilities, and comes with a risk of regressions.


Jenkins uses a fork of Jelly for the vast majority of the views it renders.
Since 2011,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.146 and 2.138.2, that fix multiple security vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-10-10&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.138/#upgrading-to-jenkins-lts-2-138-2&quot;&gt;LTS upgrade guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;further-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#further-improvements&quot; /&gt;Further improvements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the security fixes listed in the security advisory, we also applied multiple improvements that make future security vulnerabilities more difficult, or even impossible to exploit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One such improvement concerns cross-site scripting vulnerabilities, and comes with a risk of regressions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins uses a fork of &lt;a href=&quot;https://commons.apache.org/proper/commons-jelly/&quot;&gt;Jelly&lt;/a&gt; for the vast majority of the views it renders.
Since 2011, it includes a feature that lets view authors opt in or out of automatic escaping of variable values for rendering in HTML, and since 2016, the plugin build tooling requires that views explicitly specify whether to apply this automatic escaping.
Details are available in &lt;a href=&quot;https://www.jenkins.io/doc/developer/security/xss-prevention/&quot;&gt;the developer documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Until now, if views do not declare whether to automatically escape, they were rendered without automatic escaping, and developers were expected to explicitly escape every variable reference that was not supposed to contain markup.
This has resulted in a number of cross-site scripting (XSS) vulnerabilities, most recently &lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-09-25/#SECURITY-1130&quot;&gt;SECURITY-1130 in Job Config History Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For that reason, we have decided to enable this automatic escaping by default if plugins do not specify a preference.
This can result in problems with some plugins if they need their output to remain unescaped.
We expect that those plugins will adapt pretty quickly to this change, as the fix is typically straightforward.
We track known affected plugins and their status on &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins+affected+by+2018-10-10+Stapler+security+hardening&quot;&gt;the Jenkins wiki&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the mean time, users can set the &lt;a href=&quot;https://www.jenkins.io/doc/book/managing/system-properties/&quot;&gt;system property&lt;/a&gt; &lt;code&gt;org.kohsuke.stapler.jelly.CustomJellyContext.escapeByDefault&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt; to disable this additional protection.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/10/09/telemetry/</id>
<title>Improving Jenkins Release Quality using Uplink Telemetry
</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-10-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/10/09/telemetry/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<summary>
One of the major strengths of Jenkins is its customizability and extensibility.
With its plugin ecosystem and long list of (possibly hidden) options, Jenkins can be used for a wide range of use cases.


The downside of all this flexibility is that, not knowing how people use Jenkins, we mostly rely on issues filed in our bug tracker to know when things go wrong.
And over the years, quite a few things have gone wrong.
The worst of these have been security fixes that have had unintended side effects.
Unlike regular changes, it&#8217;s not really feasible to roll back security fixes, so users have sometimes...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the major strengths of Jenkins is its customizability and extensibility.
With its plugin ecosystem and long list of (possibly hidden) options, Jenkins can be used for a wide range of use cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The downside of all this flexibility is that, not knowing how people use Jenkins, we mostly rely on issues filed in our bug tracker to know when things go wrong.
And over the years, quite a few things have gone wrong.
The worst of these have been security fixes that have had unintended side effects.
Unlike regular changes, it’s not really feasible to roll back security fixes, so users have sometimes had to choose between security and functionality.
But even changes developed in the open, such as the introduction of &lt;a href=&quot;https://www.jenkins.io/blog/2018/01/13/jep-200/&quot;&gt;JEP-200&lt;/a&gt;, haven’t gone as smoothly as we hoped.
&lt;a href=&quot;https://www.jenkins.io/blog/2018/08/31/shifting-gears/&quot;&gt;With big changes in the works&lt;/a&gt;, it’s more important than ever for us to have a better idea how Jenkins is used, so that we can deliver major changes safely.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/c0ba3cab7a7dfe398ec411d3271922bb98f04f8e/content/projects/evergreen/index.adoc&quot;&gt;Jenkins Evergreen&lt;/a&gt; solves this to some degree by being always connected to the Jenkins project and reporting back telemetry (mostly errors) allowing us to quickly react and provide fixes.
But that project is still pretty new, and its goal of being a more standardized Jenkins does not represent the breadth of configurations of the general user base.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;uplink-telemetry&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#uplink-telemetry&quot; /&gt;Uplink telemetry&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we recently extended the existing, very limited anonymous usage statistics by adding a simple, extensible telemetry reporting client.
We’re calling it &lt;em&gt;Uplink telemetry&lt;/em&gt;, based on the name of &lt;a href=&quot;https://github.com/jenkins-infra/uplink/&quot;&gt;the service it reports its data to&lt;/a&gt;.
It made its debut in Jenkins 2.143.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Uplink telemetry is designed to collect data in &lt;em&gt;trials&lt;/em&gt;, which are defined as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a well defined set of technical data with a specific purpose&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a start and end date of the collection&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Detailed information explaining the scope and purpose of currently active trials is available in the inline help for the usage statistics control in the global configuration.&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/2018-10-09/telemetry.png&quot; alt=&quot;Screenshot of detailed Uplink telemetry trial description in the Jenkins inline help&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, opting out of anonymous usage statistics there also disables the submission of Uplink telemetry.
And while Uplink trials report a per-instance UUID to help with collation (e.g. removal of duplicate submissions), that UUID is exclusively used for this purpose, and independent of all other properties of an instance.
This prevents us from correlating reported data with specific instances.
These measures are in place to strike a balance between the need to understand how Jenkins is used and respecting users&#39; privacy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;improving-jenkins-through-real-world-data&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#improving-jenkins-through-real-world-data&quot; /&gt;Improving Jenkins through real-world data&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re already created our first trial.
Jenkins 2.143 includes a trial to gather information about how common it is for instances to use Java system properties to disable (parts of) security fixes.
When we publish a security fix and we’re not completely certain it is safe to apply for everyone, we add another of these options — just in case.
As you can imagine, quite a few of these hidden options exist.
Until now, user feedback in our issue tracker was the only way we could estimate the need for any of these options.
With Uplink, Jenkins will report that information to us.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The trial is scheduled to run for the next six weeks, enough to hopefully gather this information from a large number of users of both LTS and weekly releases.
Our hope is that we will be able to remove some of these options entirely, as they might not be needed after all.
For others, we might need to consider elevating them to supported features, or finding better solutions obviating the need for them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the future, I will publish of some of what we have learned from the first trial running through Uplink telemetry.
I look forward to Jenkins continuing to improve with real-world data informing our future decisions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/10/01/hacktoberfest/</id>
<title>Hacktoberfest 2018. Contribute to Jenkins!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-10-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/10/01/hacktoberfest/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<category term='newcomer'></category>
<summary>
Once again October has arrived.
That means the regular Hacktoberfest event is back!
This year it will be the fifth installment.
During this one-month hackathon you can support open-source and earn a limited edition swag.


On behalf of the Jenkins project,
we invite you to participate in Hacktoberfest and to work on the project.
We welcome all contributors, regardless of their background and Jenkins experience.







Quick start




Sign-up to Hacktoberfest on the event website.


Everything is set, just start creating pull-requests!






Contributing to Jenkins


There are many ways to
contribute to Jenkins during Hacktoberfest.
Generally, any pull requests in GitHub may qualify.
You can&#8230;&#8203;




Code - Contribute to the code or automated tests



Jenkins project codebase...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once again October has arrived.
That means the regular &lt;a href=&quot;https://hacktoberfest.digitalocean.com&quot;&gt;Hacktoberfest&lt;/a&gt; event is back!
This year it will be the fifth installment.
During this one-month hackathon you can support open-source and earn a limited edition swag.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the Jenkins project,
we invite you to participate in Hacktoberfest and to work on the project.
We welcome all contributors, regardless of their background and Jenkins experience.&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/2018-hacktoberfest/social-card.png&quot; alt=&quot;Hacktoberfest&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;quick-start&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quick-start&quot; /&gt;Quick start&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;Sign-up to Hacktoberfest on &lt;a href=&quot;https://hacktoberfest.digitalocean.com&quot;&gt;the event website&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Everything is set, just start creating pull-requests!&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;contributing-to-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing-to-jenkins&quot; /&gt;Contributing to Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are many ways to
&lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;contribute&lt;/a&gt; to Jenkins during Hacktoberfest.
Generally, any pull requests in GitHub may qualify.
You can…​&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;Code&lt;/strong&gt; - Contribute to the code or automated tests&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins project codebase includes dozens of programming languages,
mostly Java, Groovy, and JavaScript + Go in Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can also find components in Ruby/Kotlin, and even native components in C/C++&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Document&lt;/strong&gt; - Improve documentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blog&lt;/strong&gt; - write &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc#adding-a-blog-post&quot;&gt;blogposts&lt;/a&gt; about Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Localize&lt;/strong&gt; -  &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Internationalization&quot;&gt;Localize&lt;/a&gt; Jenkins components&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Design&lt;/strong&gt; - &lt;a href=&quot;https://www.jenkins.io/artwork&quot;&gt;artwork&lt;/a&gt; and UI improvements also count!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Organize&lt;/strong&gt; - Organize a local meetup for Jenkins &amp;amp; Hacktoberfest (see below)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Contribute and Participate&lt;/a&gt; page for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;projects&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#projects&quot; /&gt;Projects&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project is spread across  several organizations on GitHub (jenkinsci, jenkins-x, jenkins-infra).
You are welcome contribute to &lt;strong&gt;any&lt;/strong&gt; repository in &lt;strong&gt;any&lt;/strong&gt; of those organizations,
however various components in Jenkins have differing review and delivery velocity.
Here is a list of Jenkins subprojects with maintainers who have committed to delivering quick reviews to Hackathon participants.&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;Project/component&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Ideas and links&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;&lt;a href=&quot;https://github.com/jenkinsci/jenkins&quot;&gt;Jenkins Core&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;There is always something to improve in Jenkins core itself.
  You can address various issues, improve the codebase,
  and add new features there.&lt;/p&gt;
&lt;p class=&quot;tableblock&quot;&gt;  &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/CONTRIBUTING.md&quot;&gt;Contributing&lt;/a&gt;,
  &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20JENKINS%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22%2C%20Reopened)%20AND%20labels%20in%20(newbie-friendly)%20AND%20component%20in%20(core)&quot;&gt;newbie-friendly issues&lt;/a&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;&lt;a href=&quot;https://www.jenkins.io/&quot;&gt;Jenkins Website&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Extend and improve Jenkins documentation, add your own blogpost.&lt;/p&gt;
&lt;p class=&quot;tableblock&quot;&gt;  &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc&quot;&gt;Contributing guidelines&lt;/a&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;&lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Try out the project and create new demos,
  extend documentation, and create new builders for your toolchains.&lt;/p&gt;
&lt;p class=&quot;tableblock&quot;&gt;  &lt;a href=&quot;https://jenkins-x.io/contribute/&quot;&gt;Contributing guidelines&lt;/a&gt;,
  &lt;a href=&quot;https://github.com/jenkins-x/jx/blob/master/docs/contributing/hacking.md&quot;&gt;Quick start&lt;/a&gt;,
  &lt;a href=&quot;https://jenkins-x.io/getting-started/create-custom-builder/&quot;&gt;creating custom builders&lt;/a&gt;,
  &lt;a href=&quot;https://github.com/jenkins-x/jx/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22&quot;&gt;newbie-friendly issues&lt;/a&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;&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Jenkins Configuration-as-Code Plugin&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Contribute to the fresh new plugin: improve the codebase,
  add demos and &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20JENKINS%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22%2C%20Reopened)%20AND%20labels%20in%20(jcasc-compatibility)&quot;&gt;plugin integrations&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;tableblock&quot;&gt;  &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin/blob/master/docs/CONTRIBUTING.md&quot;&gt;Contributing to JCasC&lt;/a&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;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/c0ba3cab7a7dfe398ec411d3271922bb98f04f8e/content/projects/evergreen/index.adoc&quot;&gt;Jenkins Evergreen&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Try and improve the recently released Evergreen project -
  an automatically updating rolling distribution system for Jenkins.&lt;/p&gt;
&lt;p class=&quot;tableblock&quot;&gt;  &lt;a href=&quot;https://github.com/jenkins-infra/evergreen/blob/master/HACKING.adoc&quot;&gt;Quick start&lt;/a&gt;,
  &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20JENKINS%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22%2C%20Reopened)%20AND%20labels%20in%20(newbie-friendly)%20AND%20component%20in%20(evergreen%2C%20evergreen-plugin)&quot;&gt;newbie-friendly issues&lt;/a&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;Java 11 support (&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/211/README.adoc&quot;&gt;JEP-211&lt;/a&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Contribute to Jenkins core and plugins to enable Java 11 in future releases.
  You can help to create new packaging, new features, testing flows, or cleanup issues
  &lt;a href=&quot;https://github.com/search?q=org%3Ajenkinsci+setAccessible%28true%29+path%3A%22src%2Fmain%22&amp;amp;type=Code&quot;&gt;Illegal Reflective Access&lt;/a&gt; in the code.&lt;/p&gt;
&lt;p class=&quot;tableblock&quot;&gt;  &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_platform-sig:gitter.im&quot;&gt;Gitter chat&lt;/a&gt;,
  &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20JENKINS%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22%2C%20Reopened)%20AND%20labels%20%3D%20newbie-friendly%20AND%20labels%20%3D%20java11&quot;&gt;newbie-friendly issues&lt;/a&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;Docker Packaging&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Add new features and improvements to Jenkins Docker packaging:
  &lt;a href=&quot;https://github.com/jenkinsci/docker&quot;&gt;Jenkins controller&lt;/a&gt;,
  &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent&quot;&gt;Agents&lt;/a&gt;,
  and other components.&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;&lt;a href=&quot;https://www.jenkins.io/sigs/chinese-localization/&quot;&gt;Chinese Localization SIG&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Contribute to the new &lt;a href=&quot;https://github.com/jenkins-infra/cn.jenkins.io&quot;&gt;Website&lt;/a&gt; and
  the &lt;a href=&quot;https://github.com/jenkinsci/localization-zh-cn-plugin&quot;&gt;Simplified Chinese Localization plugin&lt;/a&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;&lt;a href=&quot;https://www.jenkins.io/artwork&quot;&gt;Jenkins Artwork&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Create new images and logos for &lt;a href=&quot;https://www.jenkins.io/projects/jam/&quot;&gt;Jenkins area meetups&lt;/a&gt;,
  &lt;a href=&quot;https://www.jenkins.io/projects/&quot;&gt;subprojects&lt;/a&gt;, and plugins.
  You can also contribute new graphics to plugins.&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;Note that this is not a full list,
and the list will be extended depending on the interest from maintainers.
You are welcome to contribute to existing Jenkins plugins…​
and even to create new ones.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;local-events&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#local-events&quot; /&gt;Local events&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hacktoberfest is an online event,
but there are many events being organized by open-source communities.
You can join one of &lt;a href=&quot;https://hacktoberfest.digitalocean.com/#events&quot;&gt;these events&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also encourage &lt;a href=&quot;https://www.jenkins.io/projects/jam/&quot;&gt;Jenkins Area Meetup&lt;/a&gt; organizers to
run Jenkins-specific events in October (workshops, hackergartens).
If you are not a meetup organizer but want to host a meetup,
you can reach out to the organizers via meetup.com resources
(you can find a JAM &lt;a href=&quot;https://www.meetup.com/pro/jenkins&quot;&gt;here&lt;/a&gt;).
Check out the &lt;a href=&quot;https://hacktoberfest.digitalocean.com/eventkit&quot;&gt;Hacktoberfest Event Kit&lt;/a&gt;
for more info.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;faq&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#faq&quot; /&gt;FAQ&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find Hacktoberfest FAQ &lt;a href=&quot;https://hacktoberfest.digitalocean.com/faq&quot;&gt;here&lt;/a&gt;.
Below you can find answer to some Jenkins-specific questions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;q-i-am-new-to-jenkins-how-do-i-start&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#q-i-am-new-to-jenkins-how-do-i-start&quot; /&gt;Q: I am new to Jenkins, how do I start?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are new to Jenkins,
you could start by fixing some small and well described issues.
There are lists of such newbie-friendly issues, see the links in the table above.
You can also submit your own issue and propose a fix.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;q-i-want-to-work-on-my-own-plugin-is-it-fine&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#q-i-want-to-work-on-my-own-plugin-is-it-fine&quot; /&gt;Q: I want to work on my own plugin, is it fine?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, it is fine!
Any contributions count, your role in a repository does not matter.
Just make sure you create pull requests instead of direct pushes
(hint: it’s a best practice if you have a CI configured for your repository).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;q-how-to-find-documentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#q-how-to-find-documentation&quot; /&gt;Q: How to find documentation?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins project contains lots of materials about contributing to the project.
Here are some links which may help:&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/participate/&quot;&gt;Participate&lt;/a&gt; - landing page for newcomer contributors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2017/08/07/intro-to-plugin-development/&quot;&gt;Plugin Development Tutorials&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/&quot;&gt;Developer Documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jenkins:gitter.im&quot;&gt;Gitter channel&lt;/a&gt; for Q&amp;amp;A&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Projects in the table above also have their own documentation to help newcomers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;q-how-do-i-get-reviews&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#q-how-do-i-get-reviews&quot; /&gt;Q: How do I get reviews?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All projects in the list above are monitored by their maintainers,
and you will likely get a review within few days.
Reviews in other repositories and plugins may take longer.
In the case of delays, ping us in the &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_hacktoberfest:gitter.im&quot;&gt;hacktoberfest&lt;/a&gt; channel in Gitter.
Unmerged pull-requests also count in Hacktoberfest,
so merge delays won’t block you from getting prizes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;q-i-am-stuck-how-do-i-get-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#q-i-am-stuck-how-do-i-get-help&quot; /&gt;Q: I am stuck. How do I get help?&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For non-technical questions (process and general direction) use our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_hacktoberfest:gitter.im&quot;&gt;hacktoberfest&lt;/a&gt;
channel in Gitter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For technical questions please use the &lt;a href=&quot;https://www.jenkins.io/chat&quot;&gt;IRC chat&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;Developer mailing lists&lt;/a&gt;,
or the main &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jenkins:gitter.im&quot;&gt;jenkinsci/jenkins&lt;/a&gt; channel.
Many subprojects also have their own chats.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;q-does-jenkins-project-send-special-swag&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#q-does-jenkins-project-send-special-swag&quot; /&gt;Q: Does Jenkins project send special swag?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All participants will get swag from Hacktoberfest organizers if they create at least5 pull requests.
Jenkins project may also distribute some swag to top contributors,
depending on the budget and contributions.&lt;/p&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/2018/09/18/automatically-upgrading-with-evergreen/</id>
<title>Continuously delivering an easy-to-use Jenkins with Evergreen</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-09-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/09/18/automatically-upgrading-with-evergreen/" />
<author>
<name>rtyler</name>
</author>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<category term='evergreen'></category>
<summary>
When I first wrote about Jenkins
Evergreen, which was then referred to as "Jenkins Essentials", I mentioned a
number of future developments which in the subsequent months have become
reality. At this year&#8217;s DevOps World - Jenkins World in San Francisco, I will
be sharing more details on the philosophy behind Jenkins Evergreen, show off
how far we have come, and discuss where we&#8217;re going with this radical
distribution of Jenkins.





As discussed in my first blog post, and
JEP-300,
the first two pillars of Jenkins Evergreen have been the primary focus of our
efforts.


Automatically Updated Distribution

Perhaps unsurprisingly, implementing the mechanisms necessary for safely and
automatically updating a Jenkins distribution, which...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I first &lt;a href=&quot;https://www.jenkins.io/blog/2018/04/06/jenkins-essentials/&quot;&gt;wrote about Jenkins
Evergreen&lt;/a&gt;, which was then referred to as &quot;Jenkins Essentials&quot;, I mentioned a
number of future developments which in the subsequent months have become
&lt;em&gt;reality&lt;/em&gt;. At this year’s DevOps World - Jenkins World in San Francisco, I will
be sharing more details on the philosophy behind Jenkins Evergreen, show off
how far we have come, and discuss where we’re going with this radical
distribution of Jenkins.&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/logos/magician/256.png&quot; alt=&quot;Jenkins Evergreen&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As discussed in my first blog post, and
&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/300&quot;&gt;JEP-300&lt;/a&gt;,
the first two pillars of Jenkins Evergreen have been the primary focus of our
efforts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;automatically-updated-distribution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automatically-updated-distribution&quot; /&gt;Automatically Updated Distribution&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Perhaps unsurprisingly, implementing the mechanisms necessary for safely and
automatically updating a Jenkins distribution, which includes core and plugins,
was and continues to be a sizable amount of work. In
&lt;a href=&quot;https://www.jenkins.io/blog/2018/09/13/speaker-blog-evergreen-safely-upgrading/&quot;&gt;Baptiste’s talk&lt;/a&gt;
he will be speaking about the details which make Evergreen &quot;go&quot; whereas
I will be speaking about &lt;em&gt;why&lt;/em&gt; an automatically updating distribution is
important.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As continuous integration and continuous delivery have become more commonplace,
and fundamental to modern software engineering, Jenkins tends to live two
different lifestyles depending on the organization. In some organizations,
Jenkins is managed and deployed methodically with automation tools like Chef,
Puppet, etc. In many other organizations however, Jenkins is treated much more
like an &lt;em&gt;appliance&lt;/em&gt;, not unlike the office wireless router. Installed and so
long as it continues to do its job, people won’t think about it too much.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Evergreen’s distribution makes the &quot;Jenkins as an Appliance&quot; model much
better for everybody by ensuring the latest feature updates, bug and security
fixes are always installed in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, I believe Evergreen will serve another group we don’t adequately
serve at the moment: those who want Jenkins to behave much more like a
&lt;em&gt;service&lt;/em&gt;. We typically don’t consider &quot;versions&quot; of GitHub.com, we receive
incremental updates to the site and realize the benefits of GitHub’s on-going
development without ever thinking about an &quot;upgrade.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I believe Jenkins Evergreen can, and will provide that same experience.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;automatic-sane-defaults&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automatic-sane-defaults&quot; /&gt;Automatic Sane Defaults&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The really powerful thing about Jenkins as a platform is the broad variety of
patterns and practices different organizations may adopt. For newer users, or
users with common use-cases, that significant amount of flexibility can result
in a paradox of choice. With Jenkins Evergreen, much of the most common
configuration is automatically configured out of the box.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Included is Jenkins Pipeline and Blue Ocean, by default. We also removed some
legacy functionalities from Jenkins while we were at it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are also utilizing some of the fantastic
&lt;a href=&quot;https://www.jenkins.io/projects/jcasc/&quot;&gt;Configuration as Code&lt;/a&gt;
work, which recently had its 1.0 release, to automatically set sane defaults in
Jenkins Evergreen.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;status-quo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#status-quo&quot; /&gt;Status Quo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The effort has made significant strides thus far this year, and we’re really
excited for people to start trying out Jenkins Evergreen. As of today,
&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/c0ba3cab7a7dfe398ec411d3271922bb98f04f8e/content/projects/evergreen/index.adoc&quot;&gt;Jenkins Evergreen&lt;/a&gt;
is ready for &lt;em&gt;early adopters&lt;/em&gt;. We &lt;strong&gt;do not&lt;/strong&gt; yet recommend using Jenkins
Evergreen for a production environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re at DevOps World - Jenkins World in San Francisco please come see
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/event/F9Nn/safely-upgrading-jenkins-every-single-day&quot;&gt;Baptiste’s talk&lt;/a&gt; Wednesday at 3:45pm in Golden Gate Ballroom A. Or
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/event/F9Nf/continuously-delivering-an-easy-to-use-jenkins-with-jenkins-evergreen&quot;&gt;my talk&lt;/a&gt; at 11:15am in Golden Gate Ballroom B.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you can’t join us here in San Francisco, we hope to hear your feedback and thoughts in our
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkins-infra_evergreen:gitter.im&quot;&gt;Gitter channel&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/2018/09/17/jenkins-artwork/</id>
<title>Jenkins Artwork at the DevOps World | Jenkins World 2018 Community Booth</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-09-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/09/17/jenkins-artwork/" />
<author>
<name>ksenia-nenasheva</name>
</author>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<category term='artwork'></category>
<category term='community'></category>
<summary>
Hi all, this is my first blogpost on jenkins.io.
My name is Kseniia Nenasheva, I work as a Graphics Designer at CloudBees.
I have been using Jenkins since 2012 as a QA engineer, and I am happy to contribute to the project.
I have also submitted some patches to the core and plugins,
and probably you have seen some Jenkins logos created by me,
and some of you may even have them on your laptops.
By the way, Ron Burgundy is my favorite Jenkins logo.


This year I am going to DevOps World | Jenkins World in San Francisco.
During the conference I will be working at the...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/artwork&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/logos/san-diego/256.png&quot; alt=&quot;256&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hi all, this is my first blogpost on jenkins.io.
My name is Kseniia Nenasheva, I work as a Graphics Designer at CloudBees.
I have been using Jenkins since 2012 as a QA engineer, and I am happy to contribute to the project.
I have also submitted some patches to the core and plugins,
and probably you have seen some Jenkins logos &lt;a href=&quot;https://www.jenkins.io/artwork&quot;&gt;created by me&lt;/a&gt;,
and some of you may even have them on your laptops.
By the way, Ron Burgundy is my favorite Jenkins logo.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year I am going to DevOps World | Jenkins World in San Francisco.
During the conference I will be working at the Jenkins community booth
and creating exclusive pictures with conference visitors and one of the Jenkins heroes.
So, if you come to our booth and share your Jenkins story, you can get a special picture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested to get a logo for your &lt;a href=&quot;https://www.jenkins.io/projects/jam/&quot;&gt;Jenkins Area Meetup&lt;/a&gt;
or an open-source project (including Jenkins plugins, of course),
please also stop by at the booth and share your ideas.
After the conference I will try to implement the most interesting proposals.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also meet me at the contributor summit on September 17.&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/conferences/example-art.png&quot; alt=&quot;example art&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet Kseniia and other Jenkins contributors at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th in San Francisco and on October 22-25 in Nice.
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&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/2018/09/14/speaker-blog-jenkins-builds-jenkins/</id>
<title>Want to know how Jenkins builds Jenkins? Catch this session at DevOps World | Jenkins World next week in San Francisco!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-09-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/09/14/speaker-blog-jenkins-builds-jenkins/" />
<author>
<name>olblak</name>
</author>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<category term='azure'></category>
<category term='infrastructure'></category>
<summary>
Next week Olivier Vernin from CloudBees and Brian Benz from Microsoft will be presenting a session at DevOps World | Jenkins World about how Microsoft has been working with Jenkins to build Jenkins plugins and produce Jenkins on Microsoft Azure.
These plugins run Jenkins on Azure Linux and Windows VMs, Kubernetes, azure App service, as well as deploy artifacts to those Azure platforms and more.
All are open source and available on GitHub.


Here&#8217;s our session, where we&#8217;ll be sharing successes and challenges of getting the infrastructure up and running:


Tuesday, September 18


Session: Developing and Delivering Jenkins in the cloud
11:15am - 12:00pm Brian Benz...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next week &lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/olivier_vernin.71uu3o1&quot;&gt;Olivier Vernin&lt;/a&gt; from CloudBees and &lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/brian_benz.1yikcdif&quot;&gt;Brian Benz&lt;/a&gt; from Microsoft will be presenting a session at &lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World | Jenkins World&lt;/a&gt; about how Microsoft has been working with Jenkins to build Jenkins plugins and produce Jenkins on Microsoft Azure.
These plugins run Jenkins on Azure Linux and Windows VMs, Kubernetes, azure App service, as well as deploy artifacts to those Azure platforms and more.
All are open source and available on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s our session, where we’ll be sharing successes and challenges of getting the infrastructure up and running:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tuesday, September 18&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://sched.co/G4qe&quot;&gt;Session: Developing and Delivering Jenkins in the cloud&lt;/a&gt;&lt;/strong&gt;
11:15am - 12:00pm &lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/brian_benz.1yikcdif&quot;&gt;Brian Benz&lt;/a&gt; with &lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/olivier_vernin.71uu3o1&quot;&gt;Olivier Vernin&lt;/a&gt;, CloudBees&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this session, we’ll discuss the real-life implementation of Jenkins&#39; development and delivery infrastructure in the cloud as it has evolved from a mix of platforms to Microsoft Azure.
Expect a frank discussion of how issues that were encountered along the way were overcome, how the architecture has evolved, and what’s on the roadmap.
We’ll share important tips and tricks for implementing your own Jenkins infrastructure on any cloud, based on Jenkins&#39; own experience with their implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you in San Francisco!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet us at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World | Jenkins World 2018&lt;/a&gt; on September 16-19th in San Francisco.
We will be hanging out around the OSS space, eager to answer more questions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/09/14/kubernetes-and-secret-agents/</id>
<title>Jenkins and Kubernetes - Secret Agents in the Clouds</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-09-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/09/14/kubernetes-and-secret-agents/" />
<author>
<name>devmandy</name>
</author>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<category term='cloud-native'></category>
<category term='kubernetes'></category>
<summary>
At long last, the way we build and deploy software is finally changing and significantly so.
The days of the persnickety, prima donna build machine where monolithic applications were built, tested, and deployed are numbered.
And that is a "Good Thing (tm)" - a consequence of how we will meet the transformation goals of our businesses.
Modern applications consist of distributed services, often with multiple microservices that are developed and deployed independent of other services.
However, the only way to build these services with their own dependencies and schedules is to bake in continuous integration and delivery from the beginning.
And as usual, your Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At long last, the way we build and deploy software is finally changing and significantly so.
The days of the persnickety, prima donna build machine where monolithic applications were built, tested, and deployed are numbered.
And that is a &quot;Good Thing (tm)&quot; - a consequence of how we will meet the transformation goals of our businesses.
Modern applications consist of distributed services, often with multiple microservices that are developed and deployed independent of other services.
However, the only way to build these services with their own dependencies and schedules is to bake in continuous integration and delivery from the beginning.
And as usual, your Jenkins platform is your friend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But let’s take a moment and think about that in the context of microservices, especially if you’ve only used Jenkins for monolithic applications.
You’ll be creating a greater number of individual Jenkins jobs that each run multiple times a day.
This is a significant process change, and it’s important to acknowledge this and change our approach to managing Jenkins to accommodate these changes.
It’s well within Jenkins’ capabilities, but you will need to think a little differently, and invest to close those last-mile deployment gaps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;evolution-of-my-jenkins-environment&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#evolution-of-my-jenkins-environment&quot; /&gt;Evolution of my Jenkins Environment&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the biggest challenges I’ve faced as a DevOps practitioner is a long and evolving set of options to manage my Jenkins agent infrastructure.
With only a few large jobs you don’t really need to worry too much about your agents.
But when you’re orchestrating the CI/CD pipelines for dozens or even hundreds of services, optimizing efficiency and minimizing cost becomes important.
And that journey has allowed me to consider and test many different Jenkins build agent architectures over the years.
This journey may be familiar to you as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These are the types of Jenkins environments I’ve run over the years.&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;Execute all the builds on the controller.
Concentrate all the moving parts on one instance.
(I call this Hello Jenkins)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a Jenkins EC2 agent with all the required tools for building every service, and then clone it if I need to “scale” Jenkins.
(I call this the Monster Agent.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create an individual Jenkins EC2 agent for each service I need to build.
(I call this the Snowflake Agent.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run build steps in containers.
For example, launching agents in containers using the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Docker+Plugin&quot;&gt;Docker Plugin&lt;/a&gt; or using multi-stage Dockerfiles to encapsulate all the logic for building, testing and packaging an application.
They are both good first steps in container abstraction and allow you to easily copy artifacts from one container to another.
Of course, access to a Docker engine is required for either approach, and I’ve managed my Docker host(s) for running Jenkins agents several different ways:&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;Run the Docker engine inside my Jenkins controller container - Docker in Docker (DinD)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mount the Docker socket of the host on which my Jenkins controller container runs, allowing agents to run as sibling or sidecar containers - Docker outside of Docker (DooD)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure a single external EC2 Docker host for the Jenkins controller to use for launching builds in containers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dynamically launch agents using the EC2 plugin with an AMI that contains the Docker Engine and then run all the steps in a multi-stage Dockerfile&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All these approaches were attempts to get out of the business of curating and managing Jenkins agents and infrastructure, each with their own benefits and drawbacks.
But recently I begin working in a new Jenkins environment - Jenkins on Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you’ve come to view Jenkins, build agents and jobs as containerized services, migrating platforms becomes much more straightforward.
And total disclaimer here - I had never used Kubernetes in my life, not even for side projects - when I set out to do this.
That said, it was surprisingly simple to create a Kubernetes cluster in Google Cloud Platform’s (GCP) GKE, launch a Jenkins controller using a
&lt;a href=&quot;https://helm.sh/&quot;&gt;Helm&lt;/a&gt; chart and begin running build steps in Jenkins agents running in containers on my new Kubernetes cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;launch-agents-in-kubernetes-from-your-pipeline-scripts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#launch-agents-in-kubernetes-from-your-pipeline-scripts&quot; /&gt;Launch agents in Kubernetes from your pipeline scripts&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The focus of this post and my Jenkins World talk for 2018, is to show you how to configure Jenkins to launch agents in Kubernetes from your pipeline scripts.
My examples assume you are launching your agents in the same Kubernetes cluster where your Jenkins controller is running, but there are other options.
You’ll begin by installing the
&lt;a href=&quot;https://plugins.jenkins.io/kubernetes&quot;&gt;Kubernetes plugin&lt;/a&gt;.
As a bonus, when I installed Jenkins using the latest stable chart in the default Helm repository, the Kubernetes plugin was automatically installed for me.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you get the Jenkins controller running on your Kubernetes cluster, there are only a few configuration steps required and then you can begin launching ephemeral build agents on Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configure-the-jenkins-controller&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-the-jenkins-controller&quot; /&gt;Configure the Jenkins controller&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll first need to create a credentials set for the Jenkins controller to access the Kubernetes cluster.
To do this, perform the following steps:&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;In the Jenkins UI, click the &lt;em&gt;Credentials&lt;/em&gt; link in the left-hand navigation pane&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click the arrow next to &lt;em&gt;(global)&lt;/em&gt; in the &lt;em&gt;Stores scoped to Jenkins&lt;/em&gt; table (you have to hover next to the link to see the arrow)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;em&gt;Add Credentials&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under Kind, specify &lt;em&gt;Kubernetes Service Account&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Leave the scope set to &lt;em&gt;Global&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click OK.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s it! This configuration allows the Jenkins controller to use a Kubernetes service account to access the Kubernetes API.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;create-a-cloud-configuration-on-the-jenkins-controller&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#create-a-cloud-configuration-on-the-jenkins-controller&quot; /&gt;Create a Cloud Configuration on the Jenkins controller&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next step is to create a cloud configuration for your K8s cluster.
(When I use K8s instead of Kubernetes it’s because it is quicker to type, not just for coolness.)&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;In the Jenkins UI, go to &lt;em&gt;Manage Jenkins&lt;/em&gt; → &lt;em&gt;Configure System&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scroll down until you see &lt;em&gt;Cloud settings&lt;/em&gt; and click the &lt;em&gt;Add a new cloud box&lt;/em&gt; and select &lt;em&gt;kubernetes&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The following parameters must be set:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;: &amp;lt;your choice&amp;gt; - This defaults to &lt;code&gt;kubernetes&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kubernetes URL&lt;/strong&gt;: &lt;code&gt;https://kubernetes.default&lt;/code&gt; - This was automatically configured from the service account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kubernetes Namespace&lt;/strong&gt;: &lt;code&gt;default&lt;/code&gt; - Unless you are running your controller in another namespace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Credentials&lt;/strong&gt;:  Select the Kubernetes Service Account credentials you created in the previous step&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins URL&lt;/strong&gt;: &lt;code&gt;http://&amp;lt;your_jenkins_hostname&amp;gt;:8080&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins tunnel&lt;/strong&gt;: &lt;code&gt;&amp;lt;your_jenkins_hostname&amp;gt;:5555&lt;/code&gt; - This is the port that is used to communicate with an agent&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&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/2018-09-14-secret-agents/image1.png&quot; alt=&quot;Kubernetes Configuration&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These were the only parameters I had to set to launch an agent in my K8s cluster.
You can certainly modify other parameters to tweak your environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that you’ve configured your Jenkins controller so that it can access your K8s cluster, it’s time to define some pods.
A pod is the basic building block of Kubernetes and consists of one or more containers with shared network and storage.
Each Jenkins agent is launched as a Kubernetes pod.
It will always contain the default JNLP container that runs the Jenkins agent jar and any other containers you specify in the pod definition.
There are at least two ways to configure pod templates – in the Jenkins UI and in your pipeline script.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configure-a-pod-template-in-the-jenkins-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-a-pod-template-in-the-jenkins-ui&quot; /&gt;Configure a Pod Template in the Jenkins UI&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;In the Jenkins UI, go to &lt;em&gt;Manage Jenkins&lt;/em&gt; → &lt;em&gt;Configure Systems&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scroll down to the cloud settings you configured in the previous step&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click the &lt;em&gt;Add Pod Template&lt;/em&gt; button and select &lt;em&gt;Kubernetes Pod Template&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter values for the following parameters:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;&amp;lt;your choice&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Namespace&lt;/strong&gt;: &lt;code&gt;default&lt;/code&gt; - unless you configured a different namespace in the previous step&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Labels&lt;/strong&gt;: &lt;code&gt;&amp;lt;your choice&amp;gt;&lt;/code&gt; - this will be used to identify the agent pod from your Jenkinsfiles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;: Select &quot;&lt;em&gt;Use this node as much as possible&lt;/em&gt;&quot; if you would like for this pod to be your default node when no node is specified.
Select &quot;&lt;em&gt;Only build jobs with label matching expressions matching this node&lt;/em&gt;&quot; to use this pod only when its label is specified in the pipeline script&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The name of the pod template to inherit from&lt;/strong&gt; - you can leave this blank.
It will be useful once you gain experience with this configuration, but don’t worry about it for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Containers&lt;/strong&gt;: The containers you want to launch inside this pod.
This is described in detail below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;EnvVars&lt;/strong&gt;: The environment variables you would like to inject into your pod at runtime.
This is described in detail below.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Volumes&lt;/strong&gt;:  Any volumes you want to mount inside your pod.
This is described further below.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&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/2018-09-14-secret-agents/image2.png&quot; alt=&quot;Kubernetes Pod Template&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remember that a pod consists of one or more containers that live and die together.
The pod must always include a JNLP container, which is configured by default if you installed the controller using the Helm Chart.
However, you will want to add containers with the tool chains required to build your application.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;add-your-own-container-template&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#add-your-own-container-template&quot; /&gt;Add Your Own Container Template&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;In the Jenkins UI, return to the pod template you created in the last step&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click the &lt;em&gt;Add Container&lt;/em&gt; button and select &lt;em&gt;Container Template&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter values in the following fields:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Name&lt;/strong&gt;:  &lt;code&gt;&amp;lt;your choice&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker image&lt;/strong&gt;: any Docker image you’d like
For example, if you are building an application written in Go, you can enter &lt;code&gt;&#39;golang:1.11-alpine3.8&#39;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Label&lt;/strong&gt;: Enter any label strings you’d like to use to refer to this container template in your pipeline scripts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Always pull image&lt;/strong&gt;: - Select this option if you want the plugin to pull the image each time a pod is created.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&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/2018-09-14-secret-agents/image3.png&quot; alt=&quot;Container Template&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can leave the default values for the other parameters, but you can see that the plugin gives you fine-grained control over your pod and the individual containers that run within it.
Any values you might set in your Kubernetes pod configuration can be set via this plugin as well.
You can also inject your configuration data by entering raw YAML.
I encourage you not to get distracted by the sheer number of options you can configure in this plugin.
You only have to configure a small subset of them to get a working environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can click the &lt;em&gt;Add Environment Variable&lt;/em&gt; button in the container template to inject environment variables into a specific container.
You can click the &lt;em&gt;Add Environment Variable&lt;/em&gt; button in the pod template to inject environment variables into all containers in the pod.
The following environment variables are automatically injected into the default JNLP container to allow it to connect automatically to the Jenkins controller:&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;JENKINS_URL&lt;/code&gt;: Jenkins web interface url&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;JENKINS_JNLP_URL&lt;/code&gt;: url for the jnlp definition of the specific agent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;JENKINS_SECRET&lt;/code&gt;: the secret key for authentication&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;JENKINS_NAME&lt;/code&gt;: the name of the Jenkins agent&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you click the &lt;em&gt;Add Volume&lt;/em&gt; button in the pod template, you’ll see several options for adding volumes to your pod.
I use the &lt;em&gt;Host Path Volume&lt;/em&gt; option to mount the docker socket inside the pod.
I can then run a container with the Docker client installed and use the host Docker socket to build and push Docker images.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this point, we’ve created a cloud configuration for our Kubernetes cluster and defined a pod consisting of one or more containers.
Now, how do we use this to run Jenkins jobs? We simply refer to the pod and containers by label in our Jenkins pipeline script.
We use the label we gave to the pod in the node block and the label for the container we wish to use in the container block.
The examples in this post use scripted pipeline, but you can achieve the same outcome using the declarative pipeline syntax:&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;test-pod&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Checkout&#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;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&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;Build&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;go-agent&#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;c1&quot;&gt;// This is where we build our code.&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 class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;defining-the-pod-in-the-jenkinsfile&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#defining-the-pod-in-the-jenkinsfile&quot; /&gt;Defining the Pod in the Jenkinsfile&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Configuring a plugin through the UI is perfectly fine in a proof of concept.
However, it does not result in a software-defined infrastructure that can be versioned and stored right alongside your source code.
Luckily, you can create the entire pod definition directly in your Jenkinsfile.
Is there anything you can’t do in a Jenkinsfile???&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Any of the configuration parameters available in the UI or in the YAML definition can be added to the &lt;code&gt;podTemplate&lt;/code&gt; and &lt;code&gt;containerTemplate&lt;/code&gt; sections.
In the example below, I’ve defined a pod with two container templates.
The pod label is used in the node block to signify that we want to spin up an instance of this pod.
Any steps defined directly inside the node block but not in a container block with be run in the default JNLP container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;container&lt;/code&gt; block is used to signify that the steps inside the block should be run inside the container with the given label.
I’ve defined a container template with the label &lt;code&gt;&#39;golang&#39;&lt;/code&gt;, which I will use to build the Go executable that I will eventually package into a Docker image.
In the &lt;code&gt;volumes&lt;/code&gt; definition, I have indicated that I want to mount the Docker socket of the host, but I still need the Docker client to interact with it using the Docker API.
Therefore, I’ve defined a container template with the label &lt;code&gt;&#39;docker&#39;&lt;/code&gt; which uses an image with the Docker client installed.&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;podTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test-pod&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;label:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test-pod&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;containers:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;containerTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;golang&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;image:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;golang:1.9.4-alpine3.7&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;containerTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;docker&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;image:&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;trion/jenkins-docker-client&#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;nl&quot;&gt;volumes:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;hostPathVolume&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;mountPath:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;/var/run/docker.sock&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;hostPath:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;/var/run/docker.sock&#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;c1&quot;&gt;//node = the pod label&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;test-pod&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;//container = the container label&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;Build&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;golang&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
                    &lt;span class=&quot;c1&quot;&gt;// This is where we build our code.&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Build Docker Image&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;‘&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;’&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
                    &lt;span class=&quot;c1&quot;&gt;// This is where we build the Docker image&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;In my Docker-based pipeline scripts, I was building Docker images and pushing them to a Docker registry, and it was important to me to replicate that exactly with my new Kubernetes setup.
Once I accomplished that, I was ready to build my image using &lt;code&gt;gcloud&lt;/code&gt;, the Google Cloud SDK, and push that image to the Google Container Registry in anticipation of deploying to my K8s cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To do this, I specified a container template using a gcloud image and changed my docker command to a gcloud command.
It’s that simple!&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;podTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test-pod&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;label:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;test-pod&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;containers:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;containerTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;golang&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;image:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;golang:1.9.4-alpine3.7&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;containerTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;gcloud&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;image:&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;gcr.io/cloud-builders/gcloud&#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;c1&quot;&gt;//node = the pod label&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;test-pod&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;//container = the container label&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;Build&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;golang&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
                    &lt;span class=&quot;c1&quot;&gt;// This is where we build our code.&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Build Docker Image&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;‘&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gcloud&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;’&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
                    &lt;span class=&quot;c1&quot;&gt;//This is where we build and push our Docker image.&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;Standing up a Jenkins controller on Kubernetes, running ephemeral agents, and building and deploying a sample application only took me a couple of hours.
I spent another weekend really digging in to better understand the platform.
You can be up and running in a matter of days if you are a quick study.
There are a wealth of resources available on running Jenkins on Kubernetes, and I hope this blog post helps to further that knowledge.
Even better, come to
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/event/F9Ne/jenkins-and-kubernetes-secret-agents-in-the-cloud&quot;&gt;my session at Jenkins World&lt;/a&gt; and let’s talk in person.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, what else do you want to know?
Hit me up on Twitter.
I might even add your questions to my Jenkins World session.
I suppose next up is Mesos?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet Mandy and other Jenkins and Kubernetes experts at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/2018/09/13/speaker-blog-evergreen-safely-upgrading/</id>
<title>Speaker blogpost: Jenkins Evergreen At DevOps World | Jenkins World 2018</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-09-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/09/13/speaker-blog-evergreen-safely-upgrading/" />
<author>
<name>batmat</name>
</author>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<category term='evergreen'></category>
<summary>
Evergreen is a distribution of Jenkins we are working on that provides an easy to use and automatically upgrading experience.
This year at the conference, there will be not just one, but two talks to present Evergreen to the Jenkins community:




Continuously Delivering an Easy-to-Use Jenkins with Jenkins Evergreen, by R. Tyler Croy.


Safely Upgrading Jenkins Every Single Day, by Baptiste Mathus.




Tyler will present the overall Jenkins Evergreen architecture, its inception and how this aims at making it much simpler for people to just use Jenkins to build their projects, without having to become Jenkins admins.


On the last conference day, during my own...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2018/04/06/jenkins-essentials/&quot;&gt;Evergreen is a distribution of Jenkins we are working on that provides an easy to use and automatically upgrading experience&lt;/a&gt;.
This year at the conference, there will be not just one, but two talks to present Evergreen to the Jenkins community:&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://devopsworldjenkinsworld2018.sched.com/event/F9Nf/continuously-delivering-an-easy-to-use-jenkins-with-jenkins-essentials?iframe=no&amp;amp;w=100%&amp;amp;sidebar=yes&amp;amp;bg=no&quot;&gt;Continuously Delivering an Easy-to-Use Jenkins with Jenkins Evergreen&lt;/a&gt;, by R. Tyler Croy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/event/F9Nn/safely-upgrading-jenkins-every-single-day?iframe=no&amp;amp;w=100%&amp;amp;sidebar=yes&amp;amp;bg=no&quot;&gt;Safely Upgrading Jenkins Every Single Day&lt;/a&gt;, by Baptiste Mathus.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tyler will present the overall Jenkins Evergreen architecture, its inception and how this aims at making it much simpler for people to just use Jenkins to build their projects, without having to become Jenkins admins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the last conference day, during my own talk I will focus on the improved developer experience, and zoom into how we implemented some important features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will dig together into the Error Telemetry system put in place, allowing us to actually fix errors and warnings people see in production environments.
How instances are automatically reporting errors to the Evergreen backend, and how we then centralize and analyze them using Sentry.
We will explain how the &lt;a href=&quot;https://www.jenkins.io/blog/2018/05/15/incremental-deployment/&quot;&gt;&lt;em&gt;Incrementals&lt;/em&gt; system&lt;/a&gt; allows developers a very short roundtrip, between a merged pull-request and a release we can push out to all instances.
We will see concrete examples of issues we already fixed and released to Evergreen instances in just a few days after we opened an alpha version to the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I will show you how an instance starts up and gets upgraded by discussing with the backend it’s constantly connected to.
How the backend knows what it should instruct an instance to download and install, or how we trigger an automated data snapshot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will obviously see a demo of all this showing in particular how Evergreen can already run on a Docker host, or on AWS (more environments to come!), using some of the so-called &lt;em&gt;flavors&lt;/em&gt; for Jenkins Evergreen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet us at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World | Jenkins World 2018&lt;/a&gt; on September 16-19th in San Francisco.
We will be hanging out around the OSS space, eager to answer more questions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/09/12/speaker-blog-a-cloud-native-jenkins/</id>
<title>Speaker blogpost: A Cloud Native Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-09-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/09/12/speaker-blog-a-cloud-native-jenkins/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<category term='cloud-native'></category>
<category term='pluggable-storage'></category>
<category term='jenkinsfile-runner'></category>
<summary>
A few months ago I published a
blog post about
Cloud Native Special Interest Group (SIG)
and ongoing projects related to Cloud Native Jenkins.
Next week we will be presenting at DevOps World | Jenkins World together with Carlos Sanchez and Jesse Glick,
so I would like to provide a heads up for
our talk: “A Cloud Native Jenkins”.


In our talk, we will focus on the following topics: Pluggable Storage,
our ephemeral Jenkins controllers experiments,
and tools which may be used to implement single-shot controllers.


Pluggable Storage


Pluggable storage is one of the major areas we have been working on over the last few months.
There are a number of parallel...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few months ago I published a
&lt;a href=&quot;https://www.jenkins.io/blog/2018/07/30/introducing-cloud-native-sig/&quot;&gt;blog post&lt;/a&gt; about
&lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native/&quot;&gt;Cloud Native Special Interest Group (SIG)&lt;/a&gt;
and ongoing projects related to Cloud Native Jenkins.
Next week we will be presenting at DevOps World | Jenkins World together with Carlos Sanchez and Jesse Glick,
so I would like to provide a heads up for
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/event/F9NT/a-cloud-native-jenkins&quot;&gt;our talk: “A Cloud Native Jenkins”&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our talk, we will focus on the following topics: Pluggable Storage,
our ephemeral Jenkins controllers experiments,
and tools which may be used to implement single-shot controllers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;pluggable-storage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pluggable-storage&quot; /&gt;Pluggable Storage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pluggable storage is one of the major areas we have been working on over the last few months.
There are a number of parallel stories which are summarized on
&lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native/pluggable-storage/&quot;&gt;this page&lt;/a&gt;.
There has been significant progress in the areas of artifact storage, build logging and configuration storage.
A number of Jenkins Enhancement Proposals were submitted and accepted,
and there are plugin releases and prototypes for these stories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During our talk we will discuss the current status of these stories and future plans.
In particular, we will cover the following areas and reference implementations:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Storing all your artifacts transparently, e.g. in a cloud service blob store like AWS S3.&lt;/p&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/artifact-manager-s3&quot;&gt;Artifact Manager for S3 Plugin&lt;/a&gt; is an implementation we have recently released&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Providing credentials from an external location.&lt;/p&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/kubernetes-credentials-provider&quot;&gt;Kubernetes Credentials Provider&lt;/a&gt; is one of the existing implementations for Kubernetes secrets&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sending and retrieving the build logs from a cloud service.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We are working on reference implementations for &lt;a href=&quot;https://github.com/jenkinsci/pipeline-log-fluentd-cloudwatch-plugin&quot;&gt;AWS CloudWatch Logs&lt;/a&gt; and
&lt;a href=&quot;https://github.com/jenkinsci/external-logging-elasticsearch-plugin&quot;&gt;Elasticsearch&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Storing configuration data in external storage like Kubernetes Resources and SQL database&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Storing test results externally, e.g. in an SQL database or a specialized Test Management System&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are existing plugins for the areas above, but there is a difference in approach we have taken.
Instead of creating new custom steps we extend Jenkins architecture in a way that the storage becomes &lt;strong&gt;transparent&lt;/strong&gt; to users.
For example, with &lt;a href=&quot;https://plugins.jenkins.io/artifact-manager-s3&quot;&gt;Artifact Manager for S3 Plugin&lt;/a&gt; common &lt;em&gt;Archive Artifacts&lt;/em&gt; steps
work transparently with Remote storage, as well as Jenkins Pipeline’s &lt;code&gt;stash()&lt;/code&gt;/&lt;code&gt;unstash()&lt;/code&gt; steps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The reference implementations intentionally use different technologies so that we cover more scenarios.
We regularly discuss the implementations in the &lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native/&quot;&gt;Cloud Native SIG&lt;/a&gt;,
and we would appreciate your feedback.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ephemeral-jenkins-controllers-research&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ephemeral-jenkins-controllers-research&quot; /&gt;Ephemeral Jenkins controllers research&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Want something new?
Several days ago Kohsuke Kawaguchi, the creator of Jenkins, posted the
&lt;a href=&quot;https://www.jenkins.io/blog/2018/08/31/shifting-gears/&quot;&gt;Jenkins: Shifting Gears&lt;/a&gt; article to summarize the plan for Jenkins evolution.
Cloud Native Jenkins is a critical part of this plan, and it is not “just Jenkins X”.
There are various architectural changes in Jenkins required to make this vision happen,
and we plan to work on these changes in the Cloud Native SIG.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our presentation, we will talk about our experiment with ephemeral Jenkins and single-shot controllers.
In this story we are creating a headless single-shot controller which starts in a container,
executes a Pipeline build and pushes all the results to remote storage so that the container can just be deleted after completion.
Such a controller bundles plugins and self-configuration logic using “Configuration as Code”,
so that it can start executing Pipelines in just a few seconds.
Once packaged, it can be invoked from CLI as simply as…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;docker run --rm -v $PWD/demo/Jenkinsfile:/workspace/Jenkinsfile onenashev/cwp-jenkinsfile-runner-demo&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;or, in Kubernetes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;kubectl create configmap jenkinsfile --from-file=demo/Jenkinsfile
kubectl create -f demo/kubernetes.yaml&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Such a single-shot controller could also be made a part of a Cloud Native Jenkins system.
Standard event handlers like Prow can invoke the builds on webhooks and report results back,
so that the single-shot controller can be used to build pull requests or to run Continuous Delivery flows.
Extra agents could also be connected to the controller on-demand, using the Kubernetes plugin or sidecar containers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-09-12-cloud-native-jenkins/single-shot-master-schema.png&quot; alt=&quot;Single-shot controller concept&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;tools&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tools&quot; /&gt;Tools&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to make this experiment possible, we used a toolchain based on
Docker,
&lt;a href=&quot;https://github.com/kohsuke/jenkinsfile-runner&quot;&gt;Jenkinsfile Runner&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Configuration as Code Plugin&lt;/a&gt; (JCasC), and a
&lt;a href=&quot;https://github.com/jenkinsci/custom-war-packager&quot;&gt;Custom WAR Packager tool&lt;/a&gt; which glues all the things together.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Custom WAR Packager&lt;/strong&gt; is a new tool which takes various configurations (YAML specification defining core version, list of plugins, system properties, Groovy Hooks, JCasC YAMLs)…​
and then bundles everything as a ready-to-fly WAR file or Docker image.
Starting from version &lt;strong&gt;1.2&lt;/strong&gt;, Custom WAR Packager also supports packaging Jenkinsfile Runner images as an experimental feature.
I will do a separate blogpost about this new tool later,
but there is already some documentation a number of &lt;a href=&quot;https://github.com/jenkinsci/custom-war-packager#demo&quot;&gt;demos&lt;/a&gt; in the project’s repo.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;our-demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#our-demo&quot; /&gt;Our demo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, we will have a demo! We will show a single-shot controller running with Pluggable storage implementations for AWS environments (Amazon S3, AWS CloudWatch, EKS, etc.),
which executes Jenkins Pipelines for Maven projects and provisions agents in Kubernetes on-demand.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The demo has to be published yes, but you can already find a more simple Jenkinsfile Runner demo
&lt;a href=&quot;https://github.com/jenkinsci/custom-war-packager/tree/master/demo/jenkinsfile-runner&quot;&gt;here&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;want-to-know-more&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#want-to-know-more&quot; /&gt;Want to know more?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The upcoming &lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World | Jenkins World conferences&lt;/a&gt;
are heavily packed with talks related to Cloud Native Jenkins,
including war stories and presentations on projects like Jenkins X and Jenkins Evergreen.
It is a great chance to get more information about using Jenkins in cloud environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are a Jenkins contributor or just want to become a contributor,
also join the &lt;a href=&quot;https://www.jenkins.io/blog/2018/07/25/contributor-summit/&quot;&gt;Contributor Summit&lt;/a&gt; (Sep 17 in US and Oct 23 in Nice) or visit the Jenkins community booth in the Exhibition hall.
At the Contributor Summit on Sep 17 we will also have a face-to-face Cloud Native SIG meeting.
Feel free to contribute to the agenda &lt;a href=&quot;https://docs.google.com/document/d/1Hw1mpXSpH8BAe2YK5SrCfFuHQLRf__KnjDBK_SbhGls/edit&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet Carlos, Jesse, Oleg, and other Cloud Native SIG members at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th in San Francisco and on October 22-25 in Nice.
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/2018/09/12/2018-community-survey/</id>
<title>2018 DevOps|Jenkins Community Survey Now Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-09-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/09/12/2018-community-survey/" />
<author>
<name>bvdawson</name>
</author>
<category term='jenkins'></category>
<category term='devops'></category>
<category term='jenkinsworld2018'></category>
<summary>
Take the 5th Annual DevOps and Jenkins Community Survey


With DevOps World | Jenkins World San Francisco right around the corner, CloudBees is excited to sponsor the 2018 DevOps and Jenkins Community Survey. We want to capture the details of your DevOps experience in order to provide valuable insights to the Jenkins Community and beyond. Our community is stronger together - and this look at our collective experience will reveal the big picture and shine a light on key trends. This year, as the Jenkins project continues to evolve with Jenkins X , Configuration as Code and more, your input is...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;take-the-5th-annual-devops-and-jenkins-community-survey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#take-the-5th-annual-devops-and-jenkins-community-survey&quot; /&gt;Take the 5th Annual DevOps and Jenkins Community Survey&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With DevOps World | Jenkins World San Francisco right around the corner, CloudBees is excited to sponsor the &lt;a href=&quot;https://www.surveymonkey.com/r/DOCSurvey18&quot;&gt;2018 DevOps and Jenkins Community Survey&lt;/a&gt;. We want to capture the details of your DevOps experience in order to provide valuable insights to the Jenkins Community and beyond. Our community is stronger together - and this look at our collective experience will reveal the big picture and shine a light on key trends. This year, as the Jenkins project continues to evolve with Jenkins X , Configuration as Code and more, your input is more critical than ever.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Let’s look at what we learned in 2016 and 2017:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;In 2016 we found that:&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;Jenkins continued to hold the position as a company standard orchestration solution.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;29% of respondents companies use Jenkins on more than 50 projects&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In regards to SCM tools, Git continued the march to dominance:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Git usage increased to 85%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Subversion usage decreased to 35%&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When it comes to practices, Agile and CI seemed to be the standard, and CD adoption still had a ways to go:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;85% practiced Agile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;82% practiced CI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;61% practiced DevOps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;46% practiced CD&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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/2018-9-12-2018-community-survey/image_0.png&quot; alt=&quot;Agile, CD and DevOps practices&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;In 2017 respondents reported that:&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;Jenkins Pipeline gained widespread adoption with 89% of survey takers used pipeline or planned to use in 6 months or less.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Container technology was cemented as a key part of the CD/DevOps ecosystem, yet Kubernetes usage was just starting gain momentum at 20.15%:&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/2018-9-12-2018-community-survey/image_1.png&quot; alt=&quot;Container technology usage&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins, CD, and DevOps are getting more attention from Architects with 39% of respondents identified as Architects, nearly double the previous year&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git was the clear SCM of choice at 90%, increasing nearly 5% over last the previous year&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/2018-9-12-2018-community-survey/image_2.png&quot; alt=&quot;What SCM do you use?&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What will you and the community tell us this year?  Are more people practicing DevOps?  Is Kubernetes the leader in container orchestration?  Is pipeline the standard for creating workflows?  Take the survey and let’s find out!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As always, your personal information (name, email address and company) will NOT be used by CloudBees for sales or marketing and the survey results will be made publicly available to the Jenkins Community. We will also be publishing a blog series analyzing trends over the last 5 years and offering  predictions on the evolution of DevOps. If you’re curious about what insights your input will provide, &lt;a href=&quot;https://www.surveymonkey.com/results/SM-LCQQZWZK8/data-trends/&quot;&gt;see the results of last year’s 2017 survey&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As an added incentive to participate, CloudBees will enter &lt;strong&gt;&lt;em&gt;participants into a drawing for a free pass to DevOps World | Jenkins World 2019 (1st prize, $1,199.00 value) or a $100 Amazon gift card (2nd prize)!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The survey will close at the end of October so grab a cup of coffee &lt;a href=&quot;https://www.surveymonkey.com/r/DOCSurvey18&quot;&gt;get started&lt;/a&gt;. We promise the survey will be done before your latte is.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.surveymonkey.com/r/DOCSurvey18&quot;&gt;Take me to the survey.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are laws that govern prize giveaways and eligibility; CloudBees has compiled all those fancy &lt;a href=&quot;https://www.cloudbees.com/blog/2018-devops-jenkins-community-survey-fine-print&quot;&gt;terms and conditions here.&lt;/a&gt;&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/2018/09/11/speaker-blog-warnings-plugin/</id>
<title>Warnings Plugin 5.0 (White Mountain) Public Beta</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-09-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/09/11/speaker-blog-warnings-plugin/" />
<author>
<name>uhafner</name>
</author>
<category term='warnings'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<summary>
Jenkins' Warnings plugin collects compiler warnings or issues reported by static analysis tools and visualizes the
results. The plugin (and the associated static analysis plugin suite) has been part of the Jenkins plugin eco-system
for more than ten years now. In order to optimize user experience and support Pipeline, a major rewrite of
the whole set of plugins was necessary. This new version (code name White Mountain) is now available as a public
beta. Please download and install this new version and help us to identify problems before the API is sealed.


The new release is available in the
experimental update center.
It has built-in support for...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins&#39; &lt;a href=&quot;https://plugins.jenkins.io/warnings&quot;&gt;Warnings plugin&lt;/a&gt; collects compiler warnings or issues reported by static analysis tools and visualizes the
results. The plugin (and the associated static analysis plugin suite) has been part of the Jenkins plugin eco-system
for more than ten years now. In order to optimize user experience and support Pipeline, a major rewrite of
the whole set of plugins was necessary. This new version (code name &lt;strong&gt;White Mountain&lt;/strong&gt;) is now available as a public
beta. Please download and install this new version and help us to identify problems before the API is sealed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new release is available in the
&lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/releasing-experimental-updates/&quot;&gt;experimental update center&lt;/a&gt;.
It has built-in support for almost hundred static analysis tools (including several compilers), see the list of
&lt;a href=&quot;https://github.com/jenkinsci/warnings-plugin/blob/master/SUPPORTED-FORMATS.md&quot;&gt;supported report formats&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;features-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#features-overview&quot; /&gt;Features overview&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Warnings plugin provides the following features when added as a post build action (or step) to a job:&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 plugin scans the console log of a Jenkins build or files in the workspace of your job for any kind of issues.
There are almost one hundred
&lt;a href=&quot;https://github.com/jenkinsci/warnings-plugin/blob/master/SUPPORTED-FORMATS.md&quot;&gt;report formats&lt;/a&gt; supported.
Among the problems it can detect:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;errors from your compiler (C, C#, Java, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;warnings from a static analysis tool (CheckStyle, StyleCop, SpotBugs, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;duplications from a copy-and-paste detector (CPD, Simian, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vulnerabilities&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;open tasks in comments of your source files&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The plugin publishes a report of the issues found in your build, so you can navigate to a summary report from the
main build page. From there you can also dive into the details:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;distribution of new, fixed and outstanding issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;distribution of the issues by severity, category, type, module, or package&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;list of all issues including helpful comments from the reporting tool&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;annotated source code of the affected files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;trend charts of the issues&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the next sections, I’ll show the new and enhanced features in more detail.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;one-plugin-for-all-tools&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#one-plugin-for-all-tools&quot; /&gt;One plugin for all tools&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Previously the warnings plugin was part of the static analysis suite that provided the same set of features through
several plugins (CheckStyle, PMD, Static Analysis Utilities, Analysis Collector etc.).
In order to simplify the user experience and the development process, these
plugins and the core functionality have been merged into the warnings plugin. All other plugins are not required
anymore and will not be supported in the future. If you currently use one of these plugins you should migrate
to the new recorders and steps as soon as possible. I will still maintain the old code for a while,
but the main development effort will be spent into the new code base.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following plugins have been integrated into the beta version of the warnings plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Android-Lint Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CheckStyle Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CCM Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dry Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PMD Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FindBugs Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All other plugins still need to be integrated or need to be refactored to use the new API.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-pipeline-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-pipeline-support&quot; /&gt;New pipeline support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Requirements for using the Warnings plugin in Jenkins Pipeline can be complex and sometimes controversial.
In order to be as flexible as possible I decided to split the main step into two individual parts,
which could then be used independently from each other.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;simple-pipeline-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#simple-pipeline-configuration&quot; /&gt;Simple pipeline configuration&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The simple pipeline configuration is provided by the step &lt;code&gt;recordIssues&lt;/code&gt;. This step is automatically derived from the
FreeStyle job recorder: it scans for issues in a given set of files (or in the console log) and reports these issues
in your build. You can use the snippet generator to create a working snippet that calls this step. A typical example
of this step is shown in the following 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;recordIssues&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;enabledForFailure:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;pattern:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;*.log&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tool:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Java&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;filters:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;includeFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;MyFile.*.java&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;excludeCategory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;WHITESPACE&#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;In this example, the files &#39;*.log&#39; are scanned for &lt;strong&gt;Java&lt;/strong&gt; issues. Only issues with a file name matching the
pattern &#39;MyFile.*.java&#39; are included. Issues with category &#39;WHITESPACE&#39; will be excluded. The
step will be executed even if the build failed. The recorded report of warnings will be published under the fixed
URL &#39;https://[&lt;em&gt;your-jenkins&lt;/em&gt;]/job/[&lt;em&gt;your-job&lt;/em&gt;]/java&#39;. URL or name of the report can be changed if required.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;advanced-pipeline-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#advanced-pipeline-configuration&quot; /&gt;Advanced Pipeline Configuration&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes publishing and reporting issues using a single step is not sufficient. For instance, if you build your
product using several parallel steps and you want to combine the issues from all of these steps into
a single result. Then you need to split scanning and aggregation. Therefore, the plugin  provides the following
two steps that are combined by using an intermediate result object:&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;scanForIssues&lt;/code&gt;: this step scans a report file or the console log with a particular parser and creates an
intermediate report object that contains the report.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;publishIssues&lt;/code&gt;: this step publishes a new report in your build that contains the aggregated results
of one or several &lt;code&gt;scanForIssues&lt;/code&gt; steps.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can see the usage of these two steps in the following 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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;java&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scanForIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tool:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Java&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;javadoc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scanForIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tool:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;JavaDoc&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;publishIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;issues:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;javadoc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;filters:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;includePackage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;io.jenkins.plugins.analysis.*&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)]&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;checkstyle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scanForIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tool:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;CheckStyle&#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/checkstyle-result.xml&#39;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;publishIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;issues:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;checkstyle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pmd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scanForIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tool:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Pmd&#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/pmd.xml&#39;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;publishIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;issues:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pmd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;publishIssues&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;id:&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;analysis&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;White Mountains Issues&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;issues:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;checkstyle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pmd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;filters:&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;includePackage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;io.jenkins.plugins.analysis.*&#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&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;filtering-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#filtering-issues&quot; /&gt;Filtering issues&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The created report of issues can be filtered afterwards. You can specify an arbitrary number of include or exclude
filters. Currently, there is support for filtering issues by module name, package or namespace name, file name,
category or type.&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/2018-09-11/filter.png&quot; alt=&quot;Filtering&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An example pipeline that uses such a filter is shown in the following snippet:&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;recordIssues&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;pattern:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;*.log&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tool:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Java&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]],&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;filters:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;includeFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;MyFile.*.java&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;excludeCategory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;WHITESPACE&#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&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;quality-gate-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quality-gate-configuration&quot; /&gt;Quality gate configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can define several quality gates that will be checked after the issues have been reported. These quality gates
let you to modify Jenkins&#39; build status so that you immediately see if the desired quality of your product is met.
A build can be set to &lt;strong&gt;unstable&lt;/strong&gt; or &lt;strong&gt;failed&lt;/strong&gt; for each of these quality gates. All quality gates use a simple metric:
the maximum number of issues that can be found and still pass a given quality gate.&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/2018-09-11/quality-gate.png&quot; alt=&quot;Quality Gate&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An example pipeline that enables a quality gate for 10 warnings in total or 1 new warning is shown in the
following snippet:&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;recordIssues&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;pattern:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;*.log&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;tool:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Java&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]],&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unstableTotalHigh:&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;nl&quot;&gt;unstableNewAll:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&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;issues-history-new-fixed-and-outstanding-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues-history-new-fixed-and-outstanding-issues&quot; /&gt;Issues history: new, fixed, and outstanding issues&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One highlight of the plugin is the ability to categorize issues of subsequent builds as new, fixed and outstanding.&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/2018-09-11/trend.png&quot; alt=&quot;History&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using this feature makes it a lot easier to keep the quality of your project under control: you can focus
only on those warnings that have been introduced recently.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note: the detection of new warnings is based on a complex algorithm that tries to track the same warning in
two two different versions of the source code. Depending on the extend of the modification of the source code
it might produce some false positives, i.e., you might still get some new and fixed warnings even if there should
be none. The accuracy of this algorithm is still ongoing research and will be refined in the next couple of months.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;severities&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#severities&quot; /&gt;Severities&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin shows the distribution of the severities of the issues in a chart. It defines the
following default severities, but additional ones might be added by plugins that extend the warnings plugin.&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;Error&lt;/strong&gt;: Indicates an error that typically fails the build&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt; (High, Normal, Low): Indicates a warning of the given priority. Mapping to the priorities
is up to the individual parsers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that not every parser is capable of producing warnings with a different severity. Some of the parses simply
use the same severity for all issues.&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/2018-09-11/severities.png&quot; alt=&quot;Severities&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;build-trend&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-trend&quot; /&gt;Build Trend&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to see the trend of the analysis results, a chart showing the number of issues per build is also
shown. This chart is used in the details page as well as in the job overview. Currently, type and configuration
of the chart is fixed. This will be enhanced in future versions of the plugin.&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/2018-09-11/history.png&quot; alt=&quot;Trend Chart&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;issues-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues-overview&quot; /&gt;Issues Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can get a fast and efficient overview of the reported set of issues in several aggregation views.
Depending on the number or type of issues you will see the distribution of issues by&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Static Analysis Tool&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Module&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Package or Namespace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Severity&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Category&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Type&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each of these detail views are interactive, i.e. you can navigate into a subset of the categorized issues.&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/2018-09-11/packages.png&quot; alt=&quot;Packages Overview&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;issues-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#issues-details&quot; /&gt;Issues Details&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The set of reported issues is shown in a modern and responsive table. The table is loaded on demand using an Ajax
call. It provides the following features:&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;Pagination&lt;/strong&gt;: the number of issues is subdivided into several pages which can be selected by using the provided page
links. Note that currently the pagination is done on the client side, i.e. it may take some time to obtain the whole table of
issues from the server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sorting&lt;/strong&gt;: the table content can be sorted by clicking on one of the table columns.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Filtering, Searching&lt;/strong&gt;: you can filter the shown issues by entering some text in the search box.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Content Aware&lt;/strong&gt;: columns are only shown if there is something useful to display. I.e., if a tool does not report an
issues category, then the category will be automatically hidden.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Responsive&lt;/strong&gt;: the layout should adapt to the actual screen size.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Details&lt;/strong&gt;: the details message for an issue (if provided by the corresponding static analysis tool) is shown as
child row within the table.&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/2018-09-11/details.png&quot; alt=&quot;Details&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;remote-api&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#remote-api&quot; /&gt;Remote API&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin provides two REST API endpoints.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;summary-of-the-analysis-result&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-of-the-analysis-result&quot; /&gt;Summary of the analysis result&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can obtain a summary of a particular analysis report by using the URL &lt;code&gt;[tool-id]/api/xml&lt;/code&gt;
(or &lt;code&gt;[tool-id]/api/json&lt;/code&gt;). The summary contains the number of issues, the quality gate status, and all
info and error messages.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;details-of-the-analysis-result&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#details-of-the-analysis-result&quot; /&gt;Details of the analysis result&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The reported issues are also available as REST API. You can either query all issues or only the
new, fixed, or outstanding issues. The corresponding URLs are:&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;&lt;code&gt;[tool-id]/all/api/xml&lt;/code&gt;: lists all issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;[tool-id]/fixed/api/xml&lt;/code&gt;: lists all fixed issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;[tool-id]/new/api/xml&lt;/code&gt;: lists all new issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;[tool-id]/outstanding/api/xml&lt;/code&gt;: lists all outstanding issues&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;how-you-can-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-you-can-help&quot; /&gt;How You Can Help&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope these new features are useful for everyone! Please download or install this new release and test it in your jobs:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Convert some of your jobs to the new API and test the new (and old) features (based on your requirements).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read all labels carefully, I’m not a native speaker so some descriptions might be misleading or incorrect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the new URLs and names of the parsers, see list of
&lt;a href=&quot;https://github.com/jenkinsci/warnings-plugin/blob/master/SUPPORTED-FORMATS.md&quot;&gt;supported report formats&lt;/a&gt;. These
can’t be changed after the beta testing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you find a problem, incorrect phrase, typo, etc. please report a bug in Jira (or even better: file a PR in GitHub).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This has been a brief overview of the new features of the Warnings plugin in Jenkins. For more, be sure to check out my
&lt;a href=&quot;https://sched.co/F9NZ&quot;&gt;talk&lt;/a&gt; at &quot;DevOps World | Jenkins World&quot; where I show more details of the Warnings plugin!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come see Ullrich Hafner and many other Jenkins experts and contributors at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World | Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/09/10/scaling-network-connections/</id>
<title>Scaling Network Connections from the Jenkins Controller</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-09-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/09/10/scaling-network-connections/" />
<author>
<name>jglick</name>
</author>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<category term='cloud-native'></category>
<category term='performance'></category>
<category term='scalability'></category>
<category term='remoting'></category>
<summary>
Oleg Nenashev and I will be speaking at DevOps World | Jenkins World in San Francisco this year about
Scaling Network Connections from the Jenkins Controller.
Over the years there have been many efforts to analyze, optimize, and fortify the “Remoting channel”
that allows a controller to orchestrate agent activity and receive build results.
Techniques such as tuning the agent launcher can improve service,
but qualitative change can only come from fundamentally reworking what gets transmitted and how.


In March, JENKINS-27035 introduced a framework for inspecting the traffic on a Remoting channel at a high level.
Previously, developers could only use generic low-level tools such as Wireshark,
which...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Oleg Nenashev and I will be speaking at DevOps World | Jenkins World in San Francisco this year about
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/event/F9NP&quot;&gt;Scaling Network Connections from the Jenkins Controller&lt;/a&gt;.
Over the years there have been many efforts to analyze, optimize, and fortify the “Remoting channel”
that allows a controller to orchestrate agent activity and receive build results.
Techniques such as tuning the agent launcher can improve service,
but qualitative change can only come from fundamentally reworking what gets transmitted and how.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In March, &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-27035&quot;&gt;JENKINS-27035&lt;/a&gt; introduced a framework for inspecting the traffic on a Remoting channel at a high level.
Previously, developers could only use generic low-level tools such as Wireshark,
which cannot identify the precise piece of Jenkins code responsible for traffic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past few months, the
&lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native/&quot;&gt;Cloud Native SIG&lt;/a&gt;
has been making progress in addressing root causes.
The
&lt;a href=&quot;https://plugins.jenkins.io/artifact-manager-s3&quot;&gt;Artifact Manager on S3 plugin&lt;/a&gt;
has been released and integrated with Jenkins Evergreen,
allowing upload and download of large artifacts to happen entirely between the agent and Amazon servers.
Prototype plugins allow all build log content generated by an agent (such as in &lt;code&gt;sh&lt;/code&gt; steps)
to be streamed directly to external storage services such as AWS CloudWatch Logs.
Work has also begun on uploading JUnit-format test results, which can sometimes get big,
directly from an agent to database storage.
All these efforts can reduce the load on the Jenkins controller and local network
without requiring developers to touch their Pipeline scripts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other approaches are on the horizon.
While “one-shot” agents run in fresh VMs or containers greatly improve reproducibility,
they suffer from the need to transmit megabytes of Java code for every build,
so Jenkins features will need to be built to precache most or all of it.
Work is underway to use Apache Kafka to make channels more robust against network failures.
Most dramatically, the proposed
&lt;a href=&quot;https://www.jenkins.io/blog/2018/08/31/shifting-gears/#cloud-native-jenkins-mvp&quot;&gt;Cloud Native Jenkins MVP&lt;/a&gt;
would eliminate the bottleneck of a single Jenkins controller service handling hundreds of builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet Jesse, Oleg, and other Cloud Native SIG members at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/31/shifting-gears/</id>
<title>Jenkins: Shifting Gears</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/31/shifting-gears/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<summary>
Kohsuke here. This is a message for my fellow Jenkins developers.


Jenkins has been on an amazing run, but I believe we are trapped in a local optimum, and losing appeal to people who fall outside of our traditional sweet spot.
We need to take on new efforts to solve this. One is “cloud native Jenkins” that creates a flavor of Jenkins that runs well on Kubernetes.
The other is “gear shift”, where we take an evolutionary line from the current Jenkins 2, but with breaking changes in order to gain higher development speed.


I say it&#8217;s time we tackle these problems head on....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kohsuke here. This is a message for my fellow Jenkins developers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has been on an amazing run, but I believe we are trapped in a local optimum, and losing appeal to people who fall outside of our traditional sweet spot.
We need to take on new efforts to solve this. One is “cloud native Jenkins” that creates a flavor of Jenkins that runs well on Kubernetes.
The other is “gear shift”, where we take an evolutionary line from the current Jenkins 2, but with breaking changes in order to gain higher development speed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I say it’s time we tackle these problems head on. I’ve been talking to various folks, and I think we need to take on two initiatives.
One is what I call &quot;Cloud Native Jenkins,&quot; and the other is to insert a jolt in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of you have already seen the presentation I posted on the Jenkins YouTube channel.  In this post, I’ll expand on that with some additional details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkins: Shifting Gears Presentation (&lt;a href=&quot;https://drive.google.com/open?id=160LjRKw42XXuXT2n4j8BLCzsSL5z2m2_&quot;&gt;Slides&lt;/a&gt;)&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/CgasN3icZp0?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come hear more in Kohsuke’s keynote at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;our-amazing-success&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#our-amazing-success&quot; /&gt;Our Amazing Success&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our project has been an amazing success over the past 10+ years, thanks to you all. What started as my hobby project became a huge community that boasts thousands of contributors and millions of users.
When I think about what enabled this amazing journey, I can think of several magic sauces:&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;Extensible:&lt;/strong&gt;
the ability to take the system, or a portion of the system, then build on top of it to achieve what you need, without anyone else’s permission.
Here, I’m not talking about the specific technical mechanism of Guice, extension point, etc, but rather I’m talking more broadly about the governance, culture, distribution mechanism, and so on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;General purpose:&lt;/strong&gt;
At the base level, Jenkins can be used for any kind of automation around the area of software development.
This matched the reality of the software engineering world well.
Combined with extensibility, this general purpose system that is Jenkins can specialize into any domain, much like Linux and JetBrains IDEs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Community:&lt;/strong&gt;
Together we created a community where different people push envelopes in different directions and share the fruits with others.
This meant everyone can benefit from somebody else’s work, and great ideas and best practices spread more quickly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;our-challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#our-challenges&quot; /&gt;Our Challenges&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The way we set up our community meant that collectively we were able to work toward solving certain kinds of problems locally and organically, such as Android application development, new UX, more expressive pipeline description language, …​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But at the same time, the incremental, autonomous nature of our community made us demonstrably unable to solve certain kinds of problems.
And after 10+ years, these unsolved problems are getting more pronounced, and they are taking a toll — segments of users correctly feel that the community doesn’t get them, because we have shown an inability to address some of their greatest difficulties in using Jenkins.
And I know some of those problems, such as service instability, matter to all of us.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a way, we are stuck in a local optimum, and that is a dangerous place to be when there is growing competition from all sides.
So we must solve these problems to ensure our continued relevance and popularity in the space.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Solving those problems starts with correctly understanding them, so let’s look at those.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;service-instability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#service-instability&quot; /&gt;Service Instability&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;CI/CD service was once a novelty and a nice-to-have.
Today, it is very much a mission critical service, in no small part because of us!
Increasingly, people are running bigger and bigger workloads, loading up more and more plugins, and expect higher and higher availability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Admins today are unable to meet that heightened expectation using Jenkins easily enough.
A Jenkins instance, especially a large one, requires too much overhead just to keep it running.
It’s not unheard of that somebody restarts Jenkins every day.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Admins expect errors to be contained and not impact the entire service.
They expect Jenkins to defend itself better from issues such as pipeline execution problems, run-away processes, over resource consumption so that they don’t have to constantly babysit the service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every restart implies degraded service for the software delivery teams where they have to wait longer for their builds to start or complete.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;brittle-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#brittle-configuration&quot; /&gt;Brittle Configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every Jenkins admin must have been burnt at least once in the past by making changes that have caused unintended side effects.
By “changes,” I’m talking about installing/upgrading plugins, tweaking job settings, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a result, too many admins today aren’t confident that they can make changes safely.
They fear that their changes might cause issues for their software delivery teams, that those teams will notice regressions before they do, and that they may not be able to back out some changes easily.
It feels like touching a Jenga tower for them, even when a change is small.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Upgrading Jenkins and plugins is an important sub case of this, where admins often do not have understanding of the impact.
This decreases the willingness to upgrade, which in turn makes it difficult for the project to move forward more rapidly, and instead we get trapped with the long tail of compatibility burden.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;assembly-required&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#assembly-required&quot; /&gt;Assembly Required&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve often described Jenkins as a bucket full of LEGO blocks — you can build any car you want, but everyone first has to assemble their own car in order to drive one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As CI/CD has gone mainstream, this is no longer OK.
People want something that works out of the box, something that gets people to productivity within 5 clicks in 5 minutes.
Too many choices are confusing users, and we are not helping them toward “the lit path.”
Everyone feels uncertain if they are doing the right thing, contributors are spread thin, and the whole thing feels a bit like a Frankenstein.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is yet another problem we can’t solve by “writing more plugins.”&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reduced-development-velocity&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reduced-development-velocity&quot; /&gt;Reduced Development Velocity&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This one is a little different from others that our users face, but nonetheless a very important one, because it impacts our ability to expand and sustain the developer community, and influences how fast we can solve challenges that our users face.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of these problems are not structural and rather just a matter of doing it (for example, Java 11 upgrade), but there are some problems here that are structural.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I think the following ones are the key ones:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;As a contributor, a change that spans across multiple plugins is difficult.
Tooling gets in the way, users might not always upgrade a group of changes together, reviewing changes is hard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a contributor, the tests that we have do not give me enough confidence to ship code.
Not enough of them run automatically, coverage is shallow, and there just isn’t anything like production workload of real users/customers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These core problems create other downstream problems, for example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;As a non-regular contributor, what I think of as a small and reasonable change takes forever and a 100 comments going back &amp;amp; forth to get in. I get discouraged from ever doing it again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a regular contributor, I feel people are throwing crap over the wall, and if they cause problems after a release, I’m on the hook to clean up that mess.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a user, I get a half-baked change that wreaks havoc, which results in loss of their confidence to Jenkins, an even slower pace of change, etc. This is a vicious cycle as it makes us even more conservative, and slow down the development velocity.&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;path-forward&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#path-forward&quot; /&gt;Path Forward&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the past, my frustration and regret is that we couldn’t take on an effort of this magnitude.
But that is NO MORE!
As CTO of CloudBees, I’m excited that these challenges are important enough for CloudBees now that we want to solve these efforts within the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been talking to many of you, and there are a number of existing efforts going on that touch this space already.
From there, the vision emerged is that we organize around two key efforts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cloud Native Jenkins: a general purpose CI/CD engine that runs on Kubernetes, and embraces a fundamentally different architecture and extensibility mechanism.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jolt in Jenkins: continue the incremental trajectory of Jenkins 2 today, but with renegotiated “contract” with users to gain what we really need, such as faster pace of development and better stability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cloud-native-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cloud-native-jenkins&quot; /&gt;Cloud Native Jenkins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to solve these problems that we can’t solve incrementally,
I’m proposing the “Cloud Native Jenkins” sub-project in the context of the
&lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native/&quot;&gt;Cloud Native SIG&lt;/a&gt;
with Carlos, who is the leader of this SIG.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We don’t have all the answers, that’s something we’ll discuss and figure out collectively, but based on numerous conversations with various folks, I think there are many clear pieces of puzzles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;kubernetes-as-the-runtime&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#kubernetes-as-the-runtime&quot; /&gt;Kubernetes as the Runtime&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just like Java was the winning server application platform in the early 2000s, today, Kubernetes is the dominant, winning platform.
Cloud Native Jenkins should embrace the paradigm this new platform encourages. For example,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Serverless / function-as-a-service build execution (ala
&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/gjz3CDhi-kk&quot;&gt;Jenkinsfile runner&lt;/a&gt;)
that are isolated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Various pieces of functionalities deployed as separate microservices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Services interacting through
&lt;a href=&quot;https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/&quot;&gt;Kubernetes CRDs&lt;/a&gt;
in order to promote better reuse and composability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These are the design principles that enable highly desirable properties like infinite scalability, pay-as-you-go cost model, immutability, zero down time operability, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;new-extensibility-mechanism&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-extensibility-mechanism&quot; /&gt;New Extensibility Mechanism&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We need to introduce a new mechanism of extensibility in order to retain the magic sauces, and continue our incredible ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, microservice or container-based extensibility avoids the service instability problem (ala
&lt;a href=&quot;https://github.com/knative/docs/blob/master/docs/build/builder-contract.md&quot;&gt;Knative builder&lt;/a&gt;
and the
&lt;a href=&quot;https://github.com/jglick/jk--&quot;&gt;userspace-scm&lt;/a&gt; work.)
Pipeline shared libraries is another example that concretely shows how extensibility mechanism can go beyond plugin, though it hasn’t fully flourished as one just yet.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;data-on-cloud-managed-data-services&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#data-on-cloud-managed-data-services&quot; /&gt;Data on Cloud Managed Data Services&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The long-term data storage must be moved from the file system to data services backed by cloud managed services, in order to achieve high availability and horizontal scalability, without burdening admins with additional operational responsibilities.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;configuration-as-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-as-code&quot; /&gt;Configuration as Code&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/jcasc/&quot;&gt;Jenkins Configuration as Code&lt;/a&gt;
has been incredibly well received, in part because it helps to solve some of the brittle configuration problems.
In Cloud Native Jenkins, JCasC must play a more central role, which in turn also helps us reduce the surface area for Blue Ocean to cover by eliminating many configuration screens.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;evergreen&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#evergreen&quot; /&gt;Evergreen&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/300/README.adoc&quot;&gt;Jenkins Evergreen&lt;/a&gt;
is another well received effort that’s already underway, which aims to solve the brittleness problem and developer velocity problem. This is a key piece of the puzzle that allows us to move faster without throwing users under the bus.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;secure-by-default-design&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#secure-by-default-design&quot; /&gt;Secure by Default Design&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past years, we’ve learned that several different areas of Jenkins codebase, such as Remoting, are inherently prone to security vulnerabilities because of their design. Cloud Native Jenkins must address those problems by flipping those to “secure by design.”&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;following-footsteps-of-jenkins-x&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#following-footsteps-of-jenkins-x&quot; /&gt;Following Footsteps of Jenkins X&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt;
has been pioneering the use of Jenkins on Kubernetes for a while now, and it has been very well received, too.
So naturally, part of the aim of Cloud Native Jenkins is to grow and morph Jenkins into a shape that really works well for Jenkins X.
Cloud Native Jenkins will be the general purpose CI/CD engine that runs on Kubernetes, which Jenkins X uses to create an opinionated CD experience for developing cloud native apps.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;all-the-same-good-things-with-new-foundation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#all-the-same-good-things-with-new-foundation&quot; /&gt;All The Same Good Things, with New Foundation&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And then on top of these foundations, we need to rebuild or transplant all the good things that people love about Jenkins today, and all the good things people expect, such as:&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;Great “batteries included” onboarding experience&lt;/strong&gt;  for new users, where we are present in all the marketplaces, 5 clicks to get going and easy integration with key services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modern lovable UX&lt;/strong&gt; in the direction of front-end web apps that Blue Ocean pioneered.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;General purpose software&lt;/strong&gt; that is useful for all sorts of software development.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;cloud-native-jenkins-mvp&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cloud-native-jenkins-mvp&quot; /&gt;Cloud Native Jenkins MVP&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I wrote, a number of good efforts are already ongoing today. Thus in order to get this effort off the ground, I believe the first MVP that we aim toward is pretty clear, which is to build a function-as-a-service style Jenkins build engine  that can be used underneath Jenkins X.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cloud Native Jenkins MVP combines the spirits of Jenkins Pipeline, Jenkins Evergreen, Jenkinsfile Runner, and Jenkins Configuration as Code.
It consists of:&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;Webhook receiver:&lt;/strong&gt;
a service that receives webhooks from GitHub and triggers a build engine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build Engine:&lt;/strong&gt;
take Jenkinsfile Runner and evolve it so that it can run as a “function” that carries out a pipeline execution, with some CasC sprinkled together in order to control Jenkins configuration and plugins  used.
This way, Jenkinsfile works as-is for the most part.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuously delivered through Evergreen:&lt;/strong&gt;
It allows us to solve the combinatorial version explosion problem, allow us to develop changes that span multiple plugins faster, and develop changes more confidently.
Of all the projects out there, ours should be the community that believes in the value of Continuous Delivery and Evergreen is how we bring continuous delivery to the development of Cloud Native Jenkins itself.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This solves some of the key challenges listed above that are really hard to achieve today, so it’s already incredibly useful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The catch is that this MVP has no GUI. There’s no Blue Ocean UI to look at. No parsing of test reports, no build history. It uses no persistent volumes, it keeps no record of builds. The only thing permanent at the end of a build is whatever data is pushed out from Jenkins Pipeline, such as images pushed to a Docker registry, email notifications, and GitHub commit status updates.  Load of other features in Jenkins will not be available here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is not that far from how some sophisticated users are deploying Jenkins today. All in all, I think this is the right trade off for the first MVP. As you can see, we have most of the pieces already.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From here, the build engine will get continuously more polished and more cloud native, other services will get added to regain features that were  lost, new extensibility will get introduced to reduce the role of current in-VM plugins, and so on.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jolt-in-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jolt-in-jenkins&quot; /&gt;Jolt in Jenkins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cloud Native Jenkins is a major effort and in particular initially it’s not usable for everyone; it only targets a subset of Jenkins functionalities, and it requires a platform whose adoption is still limited today.
So in parallel, we need to continue the incremental evolution of Jenkins 2, but in an accelerated speed. Said differently, we need to continue to serve the majority of production workload on Jenkins 2 today, but we are willing to break some stuff to gain what we really need, such as faster pace of development and better stability, in ways that were previously not possible. This requires us injecting a jolt in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;release-model-change&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#release-model-change&quot; /&gt;Release Model Change&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The kind of jolts that we need will almost certainly means we need to renegotiate the expectation around new releases with our users.
My inspiration source is what happened to the development of Java SE. It changed the release model and started moving faster, by shedding off more pieces faster, in ways that they haven’t done before.
Again, Jenkins Evergreen is the key piece that achieves this without throwing users under a bus, for the reasons I described in the Cloud Native MVP above.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;compatibility&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#compatibility&quot; /&gt;Compatibility&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This jolt is aimed to put us on a different footing, one where our current “forever compatibility” expectation does not hold. If that requires us to use a new major version number, such as Jenkins 3, or new major version number every N months, I’m open to that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, whatever move we do has to make sense to users. The accelerated pace of value delivery needs to justify any inconvenience we put on users, such as migration, breaking changes, and so on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In practice, what that means is that we need to be largely compatible. We have to protect users’ investment into their existing job definitions as much as possible. We continue to run freestyle jobs, etc…​&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;ingredients&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ingredients&quot; /&gt;Ingredients&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other proposals CloudBees is putting forward with the intent to staff the effort 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;Configuration as Code:&lt;/strong&gt; accelerate that and make it a more central  part of Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Developer experience improvements&lt;/strong&gt; through buildpack style auto-detection of project types.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continued evolution of Jenkins Pipeline&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;There’s an effort going on to remove CPS execution of Pipeline and isolate any failures during pipeline execution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continue to evolve Jenkins Pipeline toward the sweet spot that works well with the Cloud Native Jenkins effort.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continued tactical bug-by-bug improvements of Pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evergreen:&lt;/strong&gt; I already talked about this above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plugin spring cleaning:&lt;/strong&gt; let’s actively guide users more toward the sweet spot of Jenkins and reduce our feature surface area, so that we can focus our contributors’ effort to important parts of Jenkins. I expect this to be a combination of governance and technical efforts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Table stakes service integration:&lt;/strong&gt; let’s look at what kind of tablestake tool/service integrations today’s user need, and
&lt;a href=&quot;https://www.dropbox.com/s/uvrx79d4wqbbv9i/JW%20contributor%20summit%20vision%20pitch.pptx?dl=0&quot;&gt;see if we are meeting/exceeding the competition&lt;/a&gt;.
Where we fall short, let’s add/reimplement what are needed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;ui-effort&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ui-effort&quot; /&gt;UI Effort&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Web UI will be likely done differently in Cloud Native Jenkins, as its own app and not a plugin in Jenkins. JCasC will also play a bigger role in Cloud Native Jenkins, reducing UI surface area from Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Given that, CloudBees will reconsider where to spend its effort in Blue Ocean. The current work where parts of Blue Ocean are made reusable as NPM modules is one example that aligns well with this new vision.&lt;/p&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;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;This document lays out the key directions and approaches in a broad stroke, which I discussed with a number of you in the past. Hopefully, this gives you the big picture of how I envision where to move Jenkins forward, not just as the creator of Jenkins but as the CTO of CloudBees, who employs a number of key contributors to the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet Kohsuke and chat with him about the direction of Jenkins at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/30/speaker-blog-kubernetes-plugin/</id>
<title>Effectively using Kubernetes plugin with Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/30/speaker-blog-kubernetes-plugin/" />
<author>
<name>tanskann</name>
</author>
<category term='kubernetes'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<summary>
This is a guest blog by Niklas Tanskanen, consultant at
Eficode.










Kubernetes, the container orchestration platform is rapidly becoming popular. There are more and more workloads that you can run on top of Kubernetes. It&#8217;s becoming an enabling layer of your Hyper-convergenced infrastructure.


If you set up Kubernetes as a Cloud provider in Jenkins, you&#8217;ll get a very powerful couple for running your workloads.
To do that, you can simply install
Kubernetes plugin.
Kubernetes is able to run your Jenkins workloads as long as they are run in container.
And containers are an awesome way if your workload is a build, because you can pack all your...
</summary>
<content type='html'>
&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;
This is a guest blog by Niklas Tanskanen, consultant at
&lt;a href=&quot;https://eficode.com&quot;&gt;Eficode&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/jenkins-x/logo.svg&quot; alt=&quot;Jenkins X&quot; width=&quot;200&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io&quot;&gt;Kubernetes&lt;/a&gt;, the container orchestration platform is rapidly becoming popular. There are more and more workloads that you can run on top of Kubernetes. It’s becoming an enabling layer of your Hyper-convergenced infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you set up Kubernetes as a Cloud provider in Jenkins, you’ll get a very powerful couple for running your workloads.
To do that, you can simply install
&lt;a href=&quot;https://plugins.jenkins.io/kubernetes&quot;&gt;Kubernetes plugin&lt;/a&gt;.
Kubernetes is able to run your Jenkins workloads as long as they are run in container.
And containers are an awesome way if your workload is a build, because you can pack all your application and OS dependencies in a container and then run it anywhere!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s imagine that you have been running a Kubernetes cluster setup in your organisation for a while now.
First it was all about proof of concept but now its becoming more popular within your developers and you have to think about scaling and orchestration.
Resource quotas are a part of that and every responsible operator should set those up both in both development and production clusters.
Otherwise people will be lazy and just reserve all the resources of your cluster without actually using those resources for anything.
By introducing quotas into your cluster, you can control how many resources should each namespace have.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quotas are a mature feature of Kubernetes already.
You have the possibility to create very fine grained quotas for different hardware resources, whenever it’s fast disk, GPUs or CPU time.
You can also specify multiple scopes of quota per one namespace.
For example, you can have a quota for workloads that are to be run to the infinity like web servers or databases.
Or have quota for workloads that are short lived like builds or test automation runs.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;caption class=&quot;title&quot;&gt;Table 1. Scopes&lt;/caption&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;Scope&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Description&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;&lt;code&gt;Terminating&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Match pods where &lt;code&gt;.spec.activeDeadlineSeconds &amp;gt;= 0&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;&lt;code&gt;NotTerminating&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Match pods where &lt;code&gt;.spec.activeDeadlineSeconds is nil&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;&lt;code&gt;BestEffort&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Match pods that have best effort quality of service.&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;&lt;code&gt;NotBestEffort&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Match pods that do not have best effort quality of service.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;different-scopes-of-kubernetes-quota&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#different-scopes-of-kubernetes-quota&quot; /&gt;Different scopes of Kubernetes quota&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since Jenkins is all about running short workloads, you should aim for the &lt;code&gt;Terminating&lt;/code&gt; scope of quota.
But how do you specify workloads in Jenkins so that correct scope is used?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you were to do this in Kubernetes, you have to specify &lt;code&gt;.spec.activeDeadlineSeconds&lt;/code&gt;.
The same field can also be specified by the Kubernetes plugin when you are specifying a Pod Template.&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/2018-08-30/time-deadline.png&quot; alt=&quot;time deadline&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Specifying &lt;code&gt;.spec.activeDeadlineSeconds&lt;/code&gt; in the Kubernetes plugin&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Same configuration is available in the &lt;code&gt;Jenkinsfile&lt;/code&gt; as well if you don’t like static configurations.&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;podTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;label:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;maven&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;activeDeadlineSeconds:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;180&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;containers:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;containerTemplate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;maven&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;image:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;maven:3.5.4-jdk-10-slim&#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;c1&quot;&gt;// maven magic&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;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was just a small sample of features of the Kubernetes plugin in Jenkins. For more, be sure to check out our
&lt;a href=&quot;https://sched.co/FD6E&quot;&gt;talk&lt;/a&gt; where we share more of how you can utilise Kubernetes with Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come see Niklas Tanskanen and many other Jenkins experts and contributors at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/29/day-of-jenkins-and-other-chances-to-meet-jcasc/</id>
<title>Day of Jenkins, and other chances to meet JCasC</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/29/day-of-jenkins-and-other-chances-to-meet-jcasc/" />
<author>
<name>ewelinawilkosz</name>
</author>
<category term='jenkins'></category>
<category term='jcasc'></category>
<category term='configuration as code'></category>
<summary>
The Jenkins Configuration as Code plugin is reaching a stage when it is almost ready to be used in a production environment.
As a matter of fact, I know some living-on-the-edge users are already doing that.
The first release candidates are out and the official 1.0 is just around the corner.


I’d like to use this chance to invite you to meet us and contribute to the plugin.
There will be plenty of opportunities this autumn.


Jenkins Configuration as Code (also called "JCasC") is a Jenkins plugin that allows you to store and maintain all your Jenkins configuration in yaml file.
It’s like Pipeline or Job...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Configuration as Code plugin is reaching a stage when it is almost ready to be used in a production environment.
As a matter of fact, I know some living-on-the-edge users are already doing that.
The first release candidates are out and the official 1.0 is just around the corner.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d like to use this chance to invite you to meet us and contribute to the plugin.
There will be plenty of opportunities this autumn.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Configuration as Code (also called &quot;JCasC&quot;) is a Jenkins plugin that allows you to store and maintain all your Jenkins configuration in yaml file.
It’s like Pipeline or Job DSL but for managing Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In one of my blogposts,
&lt;a href=&quot;https://www.praqma.com/stories/jenkins-configuration-as-code/&quot;&gt;Jenkins Configuration as Code - Automating an automation server&lt;/a&gt;,
I provide a longer explanation of the plugin, and answer questions like
“why did we decided to develop it?” and “why you may want to use it?”.
I recommend you to read that one if you’re not familiar with the project yet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin has been presented at a number of meetups - by me but also other contributors.
This is the first open source project that I’ve actively participated in and I’m quite shocked - positively - to see how many people decided to join the effort and actively develop the plugin with us.
Now it’s time to take it to the bigger stage and broader audience.
So together with Nicolas de Loof I’m gonna present the plugin at &lt;strong&gt;DevOps World | Jenkins World&lt;/strong&gt; in &lt;em&gt;San Francisco&lt;/em&gt; (19th of September)  and in &lt;em&gt;Nice&lt;/em&gt; (24th of October) - yes, Jenkins World is coming to Europe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But that’s not all!
&lt;a href=&quot;https://www.praqma.com/&quot;&gt;Praqma&lt;/a&gt; - the company I work for -
has organised a number of “Day of Jenkins” events around Scandinavia in past years.
This October they have decided to bring the events back with a theme: Day of Jenkins 2018 is
&lt;a href=&quot;https://www.code-conf.com/2018/day-of-jenkins-as-code/&quot;&gt;&lt;strong&gt;Day of Jenkins [as code]&lt;/strong&gt;&lt;/a&gt;.
It’s a two track one day event with presentations and hands-on sessions for users and a hackathon for contributors - in that specific case Configuration as Code Plugin’s contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Detailed agenda is available on the
&lt;a href=&quot;https://www.code-conf.com/2018/day-of-jenkins-as-code/&quot;&gt;event page&lt;/a&gt; -
Jenkins X, Jenkins Evergreen, Jenkins Configuration as Code and more waiting for you!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I really can’t wait to hear what Kohsuke has to say and to introduce you to the plugin during the hands-on session I’ll run.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hope to see you at least at one of those events!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet the Configuration as Code contributors, Nicolas de Loof and Ewelina Wilkosz at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/23/speaker-blog-casc-part-1/</id>
<title>Jenkins Configuration-as-Code: Look ma, no hands</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/23/speaker-blog-casc-part-1/" />
<author>
<name>ndeloof</name>
</author>
<category term='configuration-as-code'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<summary>
This blog post is part 1 of a Configuration-as-Code series





Jenkins is highly flexible and is today the de facto standard for implementing CI/CD, with an active community to maintain plugins for almost any combination of tools and use-cases.
But flexibility has a cost: in addition to Jenkins core, many plugins require some system-level configuration to be set so they can do their job.


In some circumstances, "Jenkins Administrator" is a full time position.
One person is responsible for both maintaining the infrastructure, and also pampering a huge Jenkins controller with hundred installed plugins and thousands hosted jobs.
Maintaining up-to-date plugin versions is a challenge...
</summary>
<content type='html'>
&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;
This blog post is part 1 of a Configuration-as-Code series
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is highly flexible and is today the de facto standard for implementing CI/CD, with an active community to maintain plugins for almost any combination of tools and use-cases.
But flexibility has a cost: in addition to Jenkins core, many plugins require some system-level configuration to be set so they can do their job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In some circumstances, &quot;Jenkins Administrator&quot; is a full time position.
One person is responsible for both maintaining the infrastructure, and also pampering a huge Jenkins controller with hundred installed plugins and thousands hosted jobs.
Maintaining up-to-date plugin versions is a challenge and failover is a nightmare.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is like years ago when system administrators had to manage dedicated machines per service.
In 2018, everything is managed as code using infrastructure automation tools and virtualization.
Need a fresh new application server as staging environment for your application? Just deploy a Docker container.
Infrastructure is missing resources? Apply a Terraform recipe to allocate more on your favourite Cloud.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What about the Jenkins administrator role in this context? Should they still spend hours in the web UI, clicking checkboxes on web forms? Maybe they already adopted some automation, relying on Groovy script voodoo, or some home-made XML templating?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Early this year we announced the first alpha release of “Jenkins Configuration-as-Code” (JCasC), a fresh new approach to Jenkins configuration management, based on YAML configuration files and automatic model discovery.
“JCasC” has been promoted as a
&lt;a href=&quot;https://www.jenkins.io/projects/&quot;&gt;top-level&lt;/a&gt; Jenkins project, and the corresponding
&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/201/&quot;&gt;Jenkins Enhancement Proposal&lt;/a&gt; has been accepted.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-can-jcasc-do-for-our-jenkins-administrator&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-can-jcasc-do-for-our-jenkins-administrator&quot; /&gt;What can JCasC do for our Jenkins Administrator?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JCasC allows us to apply a set of YAML files on our Jenkins controller at startup or on-demand via the web UI.
Those configuration files are very concise and human readable compared to verbose XML files the Jenkins uses to actually store configuration.
The files also have user-friendly naming conventions making it easy for administrators to configure all Jenkins components.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s an 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;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
 &lt;span class=&quot;na&quot;&gt;systemMessage&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;Jenkins&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;managed&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;by&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Configuration&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Code&quot;&lt;/span&gt;

 &lt;span class=&quot;na&quot;&gt;securityRealm&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
   &lt;span class=&quot;na&quot;&gt;ldap&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
     &lt;span class=&quot;na&quot;&gt;configurations&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;server&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ldap.acme.com&lt;/span&gt;
         &lt;span class=&quot;na&quot;&gt;rootDN&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dc=acme,dc=fr&lt;/span&gt;
         &lt;span class=&quot;na&quot;&gt;managerPasswordSecret&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${LDAP_PASSWORD}&lt;/span&gt;
     &lt;span class=&quot;na&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
       &lt;span class=&quot;na&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;100&lt;/span&gt;
       &lt;span class=&quot;na&quot;&gt;ttl&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;
     &lt;span class=&quot;na&quot;&gt;userIdStrategy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;CaseInsensitive&lt;/span&gt;
     &lt;span class=&quot;na&quot;&gt;groupIdStrategy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;CaseSensitive&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 you can see, you don’t need long explanation to understand how this YAML file will setup your Jenkins controller.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;benefits&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#benefits&quot; /&gt;Benefits&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The most immediate benefit of JCasC is reproducibility.
An administrator can now bootstrap a new Jenkins controller with the exact same configuration with a trivial setup.
This allows them to create a test instance and check the impact of plugin upgrades in a sandboxed environment.
This also lets them be more confident with failover and disaster recovery scenarios.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Further benefits come when administrators start managing their Jenkins’ YAML configuration files in source control, like they do with Terraform configuration.
Doing so gives them auditing and reversibility of their Jenkins controller configuration.
Theycan establish a sane configuration change workflow that runs a test Jenkins instance and ensures configuration is healthy before actually applying any change to their production Jenkins controller.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last but not least, with ability to quickly setup Jenkins controllers and control them from a set of shared YAML configuration files, administrators can now offer per-team Jenkins instances, with more flexibility on installed plugins.
A controller becomes more or less a transient piece of infrastructure for your team, as long as they also manage build definition with Jenkinsfiles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Configuration-as-Code we can stop having to treat our Jenkins controller like a pet we need to pamper, and start managing Jenkins controllers as cattle you can replace without effort nor impacts.
Welcome in the “as-code” world.&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/2018-casc/image4.jpg&quot; alt=&quot;Cattle not pets&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. They are still cute though, right?&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ok-so-whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ok-so-whats-next&quot; /&gt;Ok, so what’s next?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can read more about the Jenkins Configuration-as-Code plugin on the project’s
&lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;github repository&lt;/a&gt;.
To chat with the community and contributors join our
link:https://app.gitter.im/#/room/#jenkinsci_configuration-as-code-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;gitter channel&lt;/a&gt;,
or come see us in person at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; to discuss the JCasC project and its future!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also don’t miss next post from the Configuration-as-Code series, where we’ll look at how JCasC works with sensitive data like passwords and other credentials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come meet the Configuration as Code contributors, Nicolas de Loof and Ewelina Wilkosz at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/21/contributor-summit-nice/</id>
<title>Join us at the Jenkins Contributor Summit Nice, Tuesday 23 October 2018</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/21/contributor-summit-nice/" />
<author>
<name>tracymiranda</name>
</author>
<category term='community'></category>
<category term='events'></category>
<category term='jenkins-world'></category>
<summary>
The Jenkins Contributor summit is where the current and future contributors of the Jenkins project get together.
This summit will be on Tuesday, October 23rd 2018 in Nice, France just before Jenkins World.
The summit brings together community members to learn, meet and help shape the future of Jenkins.
In the Jenkins community we value all types and sizes of contributions and love to welcome new participants.
It is free to join, just register here.


Topics


There are plenty of exciting developments happening in the Jenkins community.
The summit will feature a 'State of the Project' update including updates from the Jenkins officers.
We will also have updates...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-cs-Nice.jpg&quot; alt=&quot;devops world cs Nice&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor summit is where the current and future contributors of the Jenkins project get together.
This summit will be on Tuesday, October 23rd 2018 in Nice, France just before &lt;a href=&quot;https://www.cloudbees.com/devops-world/nice&quot;&gt;Jenkins World&lt;/a&gt;.
The summit brings together community members to learn, meet and help shape the future of Jenkins.
In the Jenkins community we value all types and sizes of contributions and love to welcome new participants.
It is free to join, just register &lt;a href=&quot;https://www.eventbrite.com/e/contributor-summit-nice-tickets-48353733318&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;topics&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#topics&quot; /&gt;Topics&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are plenty of exciting developments happening in the Jenkins community.
The summit will feature a &#39;State of the Project&#39; update including updates from the Jenkins officers.
We will also have updates on the &#39;Big 5&#39; projects in active development:&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/2018/04/06/jenkins-essentials&quot;&gt;Jenkins Evergreen&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.praqma.com/stories/jenkins-configuration-as-code&quot;&gt;Configuration as Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Jenkins Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native&quot;&gt;Cloud Native Jenkins&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;Plus we will feature a &lt;a href=&quot;https://www.jenkins.io/projects/gsoc&quot;&gt;Google Summer of Code&lt;/a&gt; update, &lt;a href=&quot;https://www.jenkins.io/sigs&quot;&gt;Special Interest Group&lt;/a&gt; updates and more!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;agenda&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#agenda&quot; /&gt;Agenda&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agenda is shaping up well and here is the outline so far.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;9:00am Kickoff &amp;amp; Welcome with coffee/pastries&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;10:00am Project Updates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;12:00pm Lunch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1.00pm BoF/Unconference&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.00pm Break&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.30pm Ignite Talks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5.00pm Wrap-up&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;6.00pm Contributor Dinner&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The BoF (birds-of-a-feather) session will be an opportunity for in depth discussions, hacking or learning more about any of the big 5.
Bring your laptop, come prepared with questions and ideas, and be ready for some hacking too if you want.
Join in, hear the latest and get involved in any project during the BoF sessions.
If you want to share anything there will be an opportunity to do a 5-min ignite talk at the end.
Attending is free, and no DevOps World | Jenkins World ticket is needed, but &lt;a href=&quot;https://www.eventbrite.com/e/contributor-summit-nice-tickets-48353733318&quot;&gt;RSVP&lt;/a&gt; if you are going to attend to help us plan.
See you there!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/17/speaker-blog-brent-laster/</id>
<title>Using the Docker Global Variable in Your Jenkins Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/17/speaker-blog-brent-laster/" />
<author>
<name>brentlaster</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<category term='pipeline'></category>
<category term='docker'></category>
<summary>
More and more today, continuous delivery (CD) pipelines are making use of containers.
In many implementations, the primary workflow/orchestration tool for CD pipelines is Jenkins.
And the primary container orchestration tool is Docker.
Together these two applications provide a powerful, yet simple to understand and use, model for leveraging containers in your CD pipeline.


When creating a pipeline script in Jenkins, there are multiple ways to incorporate Docker into your CD pipeline.
They include:




Manually running a predefined Docker image as a separate Jenkins agent


Automatically provisioning a Docker image, when needed, as a part of a “cloud” configuration


Referencing a “docker” global variable that can be invoked...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More and more today, continuous delivery (CD) pipelines are making use of containers.
In many implementations, the primary workflow/orchestration tool for CD pipelines is Jenkins.
And the primary container orchestration tool is Docker.
Together these two applications provide a powerful, yet simple to understand and use, model for leveraging containers in your CD pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When creating a pipeline script in Jenkins, there are multiple ways to incorporate Docker into your CD pipeline.
They include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Manually running a predefined Docker image as a separate Jenkins agent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatically provisioning a Docker image, when needed, as a part of a “cloud” configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Referencing a “docker” global variable that can be invoked via the Jenkins DSL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Calling the Docker executable directly via a shell call in the Jenkins DSL&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this article, we’ll focus on the third item in this list given that it provides the most flexibility and convenience for Docker use in the pipeline.
More details on the other three can be found in the upcoming “Continuous Delivery and Containerization” workshop at Jenkins World/DevOps World 2018.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, we’ll provide some background on a couple of terms for those who may not be familiar with Jenkins 2.
If you already are familiar with it, feel free to skip ahead to the Global Variables section.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When we talk about Jenkins here, we’re referring to “Jenkins 2” - a name we use to generally refer to the 2.0 and beyond versions of Jenkins.
Jenkins 2 offers a powerful evolution of Jenkins over prior versions.
In particular, it provides full integration for “pipeline-as-code” (PAC).
PAC refers to being able to write your pipeline in a scripting language, much like source code for any program.
The code you write becomes the program that defines your pipeline.
It is also the code that gets executed when your pipeline is initiated.
Listing 1 shows a simple example pipeline.
Notice that this is very different from the classic way of creating pipelines in Jenkins.
Here you are writing code - rather than the more traditional approaches, such as filling in web forms to configure a Freestyle job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: true&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;node(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;worker&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Source&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) { &lt;span style=&quot;color:#777&quot;&gt;// Get code&lt;/span&gt;
        &lt;span style=&quot;color:#777&quot;&gt;// Get code from our git repository&lt;/span&gt;
        git &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;git@diyvb2:/home/git/repositories/workshop.git&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Compile&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) { &lt;span style=&quot;color:#777&quot;&gt;// Compile and do unit testing&lt;/span&gt;
        &lt;span style=&quot;color:#777&quot;&gt;// Run gradle to execute compile and unit testing&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;gradle clean compileJava test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Listing 1: Example Jenkins 2 pipeline&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The language that we write the Jenkins pipeline code in is a Domain-Specific Language (DSL).
You can think of it as the “programming language” for Jenkins pipelines.
There are two variants of it.
The style we saw in figure 1 is called “scripted syntax”.
It is a mixture of elements from the Groovy programming language and special Jenkins “steps”.
The Jenkins steps are provided by the plugins that are installed in the current system.
A built-in tool called the Snippet Generator provides a wizard interface to allow users to pick the step and options they want.
Then, the user can click on a button to have Jenkins automatically generate the correct DSL code in the large text box (figure 1).
The DSL code can be copied from there and pasted into the pipeline script.&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/2018-08-17/figure1.png&quot; alt=&quot;The Snippet Generator&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. The Snippet Generator&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A second type of syntax is called “declarative syntax.”  We won’t go into detail on it here.
But it is a much more structured syntax that focuses on having users declare what they want in a pipeline, rather than writing the logic to make it happen.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;global-variables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#global-variables&quot; /&gt;Global Variables&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the steps that are provided by plugins, additional functionality for pipelines can be provided by global variables.
The simplest way to think of a global variable is as an object with methods that can be invoked on it.
Several of these are built in to Jenkins, such as the Docker global variable.
Others can be created by users as part of the structure of a shared source code repository called a “shared pipeline library.”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To get a list of the global variables that are currently available to your Jenkins instance, you can go to the Snippet Generator screen.
Immediately below the box for the generated pipeline script is a section titled Global Variables.
There, within the small print, is a link to get to the actual section (figure 2).&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/2018-08-17/figure2.png&quot; alt=&quot;Link to Global Variables Reference section&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Link to Global Variables Reference section.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Clicking on that link takes us to a list of currently available Global Variables.
If you have the Docker Pipeline Plugin installed, you will see one at the top for Docker. (Figure 3).&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/2018-08-17/figure3.png&quot; alt=&quot;Docker global variable specifics&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. Docker global variable specifics.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Broadly, the docker global variable includes methods that can be applied to the Docker application, Docker images, and Docker containers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll focus first on a couple of the Docker image methods as shown in figure 4.&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/2018-08-17/figure4.png&quot; alt=&quot;Key methods for getting a Docker image&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. Key methods for getting a Docker image.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are multiple ways you can use these methods to create a new image.
Listing 2 shows a basic example of assigning and pulling an image using the image method.&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;myImage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;bclaster/jenkins-node:1.0&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;myImage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;pull&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;Listing 2: Assigning a image to a variable and pulling it down.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This can also be done in a single statement as shown in listing 3.&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;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;bclaster/jenkins-node:1.0&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;pull&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;Listing 3: Shorthand version of previous call.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also download a Dockerfile and build an image based on it.(See listing 4.)&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;node&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;myImg&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Build image&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;c1&quot;&gt;// download the dockerfile to build from&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;git@diyvb:repos/dockerResources.git&#39;&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// build our docker image&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;myImg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;my-image:snapshot&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Listing 4: Pipeline code to download a Dockerfile and build an image from it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Figure 5 shows the actual output from running that “Build image” stage.
Note that the docker.build step was translated into an actual Docker build command.&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/2018-08-17/figure5.png&quot; alt=&quot;Actual Docker output from running the download and build&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 5. Actual Docker output from running the download and build&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-inside-command&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-inside-command&quot; /&gt;The Inside Command&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another powerful method available for the Docker global variable is the inside method.
When executed, this method will do the following:&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;Get an agent and a workspace to execute on&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the Docker image is not already present, pull it down&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the container with that image&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mount the workspace from Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Execute the build steps&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mounting the workspace means that the Jenkins workspace will appear as a volume inside the container.
And it will have the same file path.
So, things running in the container will have direct access to the same location.
However, this can only be done if the container is running on the same underlying system - such that it can directly access the path.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In terms of executing the build steps, the inside method acts as a scoping method.
This means that the environment it sets up is in effect for any statement that happens within its scope (within the block under it bounded by {}).
The practical application here is that any pipeline “sh” steps (a call to the shell to execute something) are automatically run in the container.
Behind the scenes, this is done by wrapping the calls with “docker exec”.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When executed, the calls with the global variable are translated (by Jenkins) into actual Docker call invocations.
Listing 5 shows an example of using this in a script, along with the output from the first invocation of the “inside” method.
You can see in the output the docker commands that are generated from the inside method call.&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;s2&quot;&gt;&quot;Get Source&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;c1&quot;&gt;// run a command to get the source code download&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;myImg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;inside&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;-v /home/git/repos:/home/git/repos&#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;s2&quot;&gt;&quot;rm -rf gradle-greetings&quot;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;git clone --branch test /home/git/repos/gradle-greetings.git&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;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Run Build&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;n&quot;&gt;myImg&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;inside&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;s2&quot;&gt;&quot;cd gradle-greetings &amp;amp;&amp;amp; gradle -g /tmp clean build -x test&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Listing 5: Example inside method usage.&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/2018-08-17/figure6.png&quot; alt=&quot;Example inside method Docker command output&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 6. Example inside method Docker command output.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once completed, the inside step will stop the container,
get rid of the storage, and create a record that this image was used for the build.
That record facilitates image traceability, updates, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, the combination of using the Docker “global variable” and its “inside” method provide a simple and powerful way to spin up and work with containers in your pipeline.
In addition, since you are not having to make the direct Docker calls, you can invoke steps like sh within the scope of the inside method, and have them executed by Docker transparently.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we mentioned, this is only one of several ways you can interact with Docker in your pipeline code.
To learn about the other methods and get hands-on practice, join me at DevOps World/Jenkins World in San Francisco or Nice for the workshop
&quot;&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/event/FYjP/creating-a-deployment-pipeline-with-jenkins-2&quot;&gt;Creating a Deployment Pipeline with Jenkins 2&lt;/a&gt;&quot;.
Hope to see you there!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join the Jenkins project at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/17/code-coverage-api-plugin-1/</id>
<title>Code Coverage API plugin: 1.0 Release</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/17/code-coverage-api-plugin-1/" />
<author>
<name>shenyu_zheng</name>
</author>
<category term='plugins'></category>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<summary>
I am happy to announce availability of Code Coverage API. These plugins have been recently released as 1.0, and they are now available in the Jenkins Update Center. In this blogpost I will introduce the features and project structure of Code Coverage API plugin.


My name is Shenyu Zheng, and I am an undergraduate student in Computer Science and Technology at Henan University from China.


Overview

Code Coverage API plugin is one of GSoC 2018 Jenkins projects.


There are a lot of plugins which currently implement code coverage; however, they all use similar config, charts, and content. So it would be much better if...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am happy to announce availability of Code Coverage API. These plugins have been recently released as 1.0, and they are now available in the Jenkins Update Center. In this blogpost I will introduce the features and project structure of Code Coverage API plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My name is Shenyu Zheng, and I am an undergraduate student in Computer Science and Technology at Henan University from China.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Code Coverage API plugin is one of &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;GSoC 2018 Jenkins projects&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are a lot of plugins which currently implement code coverage; however, they all use similar config, charts, and content. So it would be much better if we could have an API plugin which does the most repeated work for those plugins and offers a unified API which can be consumed by other plugins and external tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My mentors are &lt;a href=&quot;https://github.com/christ66&quot;&gt;Steven Christou&lt;/a&gt;, &lt;a href=&quot;https://github.com/Supun94&quot;&gt;Supun Wanniarachchi&lt;/a&gt;, &lt;a href=&quot;https://github.com/jeffpearce&quot;&gt;Jeff Pearce&lt;/a&gt; and &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;supported-coverage-formats&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#supported-coverage-formats&quot; /&gt;Supported Coverage Formats&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Embedded&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JaCoCo&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Other plugins as an Extension of Code Coverage API plugin&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cobertura (&lt;a href=&quot;https://github.com/jenkinsci/cobertura-plugin&quot;&gt;Cobertura Plugin&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;llvm-cov (&lt;a href=&quot;https://github.com/jenkinsci/llvm-cov-plugin&quot;&gt;llvm-cov Plugin&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#features&quot; /&gt;Features&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Modernized coverage chart&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coverage trend&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Source code navigation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Parallel pipeline support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reports combining&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;REST API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Failed conditions and flexible threshold setting&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Other small features&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;modernized-coverage-chart&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#modernized-coverage-chart&quot; /&gt;Modernized Coverage Chart&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the summary chart we can see the coverage summary of current coverage metric.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-06-13-code-coverage-api-plugin/summary-chart.gif&quot; alt=&quot;summary chart&quot; title=&quot;Summary Chart&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the child summary chart, we can see the coverage summary of each child, also, we can use the range handler to filter item we want to see to reduce the chart size. If we want to see coverage details of the child, we can click the child name to see more information.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-06-13-code-coverage-api-plugin/child-summary-chart.gif&quot; alt=&quot;child summary chart&quot; title=&quot;Child Summary Chart&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;coverage-trend&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coverage-trend&quot; /&gt;Coverage Trend&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also support coverage trend to show coverage metrics changing between builds.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-06-13-code-coverage-api-plugin/trend-chart.gif&quot; alt=&quot;trend chart&quot; title=&quot;Trend Chart&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;source-code-navigation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#source-code-navigation&quot; /&gt;Source Code Navigation&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can enable source code navigation by specifying Source File Storing Level to save last build source files (enable source files navigation in current and last build) or save all build source files (enable source files navigation in all builds).
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/code-coverage-api/source-files-config.png&quot; alt=&quot;source files config&quot; title=&quot;Source File Navigation Configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can see source file with coverage information on File level coverage page.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/code-coverage-api/source-files-result.png&quot; alt=&quot;source files result&quot; title=&quot;Source File Navigation Result&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;parallel-pipeline-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#parallel-pipeline-support&quot; /&gt;Parallel Pipeline Support&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We support parallel pipeline. You can call the Code Coverage API plugin in different branches like 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;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parallel&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;firstBranch:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;publishCoverage&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;adapters:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jacocoAdapter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&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;nl&quot;&gt;secondBranch:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;publishCoverage&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;adapters:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jacocoAdapter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;reports-combining&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reports-combining&quot; /&gt;Reports Combining&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can add tag on &lt;code&gt;publishCoverage&lt;/code&gt; and Code Coverage API plugin will combine reports have same tag&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;node {
    parallel firstBranch: {
        publishCoverage adapters: [jacocoAdapter(&#39;target/site/jacoco/jacoco.xml&#39;)], tag: ‘t’
}, secondBranch: {
        publishCoverage adapters: [jacocoAdapter(&#39;jacoco.xml&#39;)], tag: ‘t’
    }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;rest-api&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#rest-api&quot; /&gt;REST API&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We provide a REST API to retrieve coverage data:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Coverage result: &lt;code&gt;…​/{buildNumber}/coverage/…​/result/api/\{json|xml\}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trend result: &lt;code&gt;…​/{buildNumber}/coverage/…​/trend/api/\{json|xml\}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coverage result of last build: &lt;code&gt;…​/{buildNumber}/coverage/…​/last/result/api/\{json|xml\}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trend result of last build: &lt;code&gt;…​/{buildNumber}/coverage/…​/last/trend/api/\{json|xml\}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;failed-conditions-and-flexible-threshold-setting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#failed-conditions-and-flexible-threshold-setting&quot; /&gt;Failed Conditions and Flexible Threshold Setting&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can set different failed conditions and thresholds to control build result.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/code-coverage-api/thresholds-config.png&quot; alt=&quot;thresholds config&quot; title=&quot;Thresholds Configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the thresholds satisfy the failed conditions, it will fail the build.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/code-coverage-api/thresholds-result.png&quot; alt=&quot;thresholds result&quot; title=&quot;Thresholds Result&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;other-small-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-small-features&quot; /&gt;Other Small Features&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also have other small features like auto detecting reports, coverage filters, etc. You can find more information about these features in the plugin documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;architecture&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#architecture&quot; /&gt;Architecture&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This API plugin will mainly do these things:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Find coverage reports according to the user’s config.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use adapters to convert reports into the our standard format.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Parse standard format reports, and aggregate them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Show parsed result in a chart.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, we can implement code coverage publishing by simply writing an adapter, and such adapter only needs to do one thing - convert a coverage report into the standard format. The implementation is based on extension points, so new adapters can be created in separate plugins. In order to simplify conversion for XML reports, there is also an abstraction layer which allows creating XSLT-based converters.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;The below diagram show the architecture of Code Coverage API plugin&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/code-coverage-api/architecture.png&quot; alt=&quot;architecture&quot; title=&quot;Code Coverage API Plugin Architecture&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;implementing-a-new-coverage-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementing-a-new-coverage-plugin&quot; /&gt;Implementing a New Coverage Plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can implement a coverage plugin by implementing CoverageReportAdapter extension point. For example, by using the provided abstract layer, we can implement JaCoCo simple like 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;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JacocoReportAdapter&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JavaXMLCoverageReportAdapter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@DataBoundConstructor&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;JacocoReportAdapter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&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;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&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;cm&quot;&gt;/**
     * {@inheritDoc}
     */&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getXSL&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;jacoco-to-standard.xsl&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;cm&quot;&gt;/**
     * {@inheritDoc}
     */&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getXSD&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&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;nd&quot;&gt;@Symbol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jacoco&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@Extension&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JacocoReportAdapterDescriptor&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JavaCoverageReportAdapterDescriptor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

        &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;JacocoReportAdapterDescriptor&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;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;JacocoReportAdapter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&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;nd&quot;&gt;@NonNull&lt;/span&gt;
        &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getDisplayName&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Messages&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;JacocoReportAdapter_displayName&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;All we need is to extend an abstract layer for XML-based Java report and provide an XSL file to convert the report to our standard format. There are also other extension points which are under development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want implement a new coverage format that we did not provide abstract layer, you need to register `CoverageElement`s and implement an simple parser. See &lt;a href=&quot;https://github.com/jenkinsci/llvm-cov-plugin&quot;&gt;llvm-cov Plugin&lt;/a&gt; to get more details.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;future-tasks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-tasks&quot; /&gt;Future Tasks&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Support more coverage tools (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52467&quot;&gt;JENKINS-52467&lt;/a&gt;, &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52469&quot;&gt;JENKINS-52469&lt;/a&gt; and etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make the UI extensible (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51738&quot;&gt;JENKINS-51738&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improve performance (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52982&quot;&gt;JENKINS-52982&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;phase-3-presentation-slides&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-3-presentation-slides&quot; /&gt;Phase 3 Presentation Slides&lt;/h3&gt;
&lt;center&gt;
&lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vThjuFZCChtXhHOKINDxuC4Sfbv0JtHDN9GqWZFe7DfmbEOPZOk-t8DYZJSDEMeMWFpLeTqOAZgj0pB/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;720&quot; height=&quot;434&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-3-presentation-video&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-3-presentation-video&quot; /&gt;Phase 3 Presentation Video&lt;/h3&gt;
&lt;center&gt;
  &lt;iframe width=&quot;720&quot; height=&quot;434&quot; src=&quot;https://www.youtube.com/embed/GGEtN4nbtng&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_code-coverage-api-&quot; class=&quot;bare&quot;&gt;https://app.gitter.im/#/room/#jenkinsci_code-coverage-api-&lt;/a&gt;&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/code-coverage-api-plugin.svg&quot; alt=&quot;title: &amp;quot;Gitter&amp;quot;&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/span&gt;
&lt;/a&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project+%3D+JENKINS+AND+component+%3D+code-coverage-api-plugin&quot;&gt;JIRA Component&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/code-coverage-api-plugin/&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/jenkinsci/code-coverage-api-plugin&quot;&gt;Project Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/16/dwjw-2018-is-almost-here/</id>
<title>DevOps World | Jenkins World 2018 is Almost Here</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/16/dwjw-2018-is-almost-here/" />
<author>
<name>lnewman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2018'></category>
<summary>
DevOps World | Jenkins World 2018 in San Francisco is only a month away.
It is shaping up to be a great event including the Contributor Summit,
the "Ask the Experts" desk at the Jenkins booth, several days of training and certifications,
and tons of informative presentation and demos.


To give you a taste of what you&#8217;ll see this year at DevOps World | Jenkins World 2018,
we&#8217;ve lined up a series of guest blog posts by a number of this years speakers,
starting in the next week with posts from Tracy Miranda, Brent Laster, and Nicholas De Loof.
For now, let&#8217;s take a look at last...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;DevOps World | Jenkins World 2018&quot; /&gt;&lt;/a&gt;
DevOps World | Jenkins World 2018 in San Francisco is only a month away.
It is shaping up to be a great event including the Contributor Summit,
the &quot;Ask the Experts&quot; desk at the Jenkins booth, several days of training and certifications,
and tons of informative presentation and demos.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To give you a taste of what you’ll see this year at DevOps World | Jenkins World 2018,
we’ve lined up a series of guest blog posts by a number of this years speakers,
starting in the next week with posts from Tracy Miranda, Brent Laster, and Nicholas De Loof.
For now, let’s take a look at last year’s keynote from Kohsuke Kawaguchi.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/gPxSwb1gQ7U?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join the Jenkins project at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;Jenkins World&lt;/a&gt; on September 16-19th,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/15/security-updates/</id>
<title>Jenkins 2.121.3 and 2.138 security updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/15/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.138 and 2.121.3, that fix multiple security vulnerabilities.


For an overview of what was fixed, see the security advisory.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our LTS upgrade guide.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.138 and 2.121.3, that fix multiple security vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-08-15&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.121/#upgrading-to-jenkins-lts-2-121-3&quot;&gt;LTS upgrade guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/14/simple-pull-request-plugin-final-evaluation/</id>
<title>alpha-3 release Pipeline as YAML (Simple pull request plugin)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/14/simple-pull-request-plugin-final-evaluation/" />
<author>
<name>abhishek_gautam</name>
</author>
<category term='gsoc2018'></category>
<category term='plugin'></category>
<category term='pipeline'></category>
<category term='yaml'></category>
<summary>
About me

I am Abhishek Gautam, 3rd year student from Visvesvaraya National Institute of
technology, India, Nagpur. I was a member of ACM Chapter and Google student developer club of my
college. I am passionate about automation.



Project Summary

This is a GSoC 2018 project.


This project aims to develop a pull request Job Plugin. Users should be able to
configure job type using YAML file placed in root directory of the
Git repository being the subject of the pull request. The plugin should interact with various
platforms like Bitbucket, Github, Gitlab, etc whenever a pull request is created or updated.


Plugin detects the presence of certain types of reports...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-me&quot; /&gt;About me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am Abhishek Gautam, 3rd year student from Visvesvaraya National Institute of
technology, India, Nagpur. I was a member of ACM Chapter and Google student developer club of my
college. I am passionate about automation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-summary&quot; /&gt;Project Summary&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a GSoC 2018 project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project aims to develop a pull request Job Plugin. Users should be able to
configure job type using YAML file placed in root directory of the
Git repository being the subject of the pull request. The plugin should interact with various
platforms like Bitbucket, Github, Gitlab, etc whenever a pull request is created or updated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugin detects the presence of certain types of reports at conventional locations,
and publish them automatically. If the reports are not present at their respective conventional
location, the location of the report can be configured in the YAML file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My mentors are
&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; (Org Admin),
&lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;,
&lt;a href=&quot;https://github.com/kwhetstone&quot;&gt;Kristin Whetstone&lt;/a&gt;,
&lt;a href=&quot;https://github.com/grandvizier&quot;&gt;Jeff Knurek&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;project-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-repository&quot; /&gt;Project Repository&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/simple-pull-request-job-plugin&quot;&gt;Project repository&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;code-changes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-changes&quot; /&gt;Code changes&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All the pull requests made can be found &lt;a href=&quot;https://github.com/jenkinsci/simple-pull-request-job-plugin/pulls?q=is%3Apr+is%3Aclosed&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;list-of-major-pull-requests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#list-of-major-pull-requests&quot; /&gt;List of major pull requests.&lt;/h4&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;phase-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-1&quot; /&gt;Phase 1&lt;/h5&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/simple-pull-request-job-plugin/pull/5&quot;&gt;PR-5&lt;/a&gt;: Git wrappers like clone, pull, checkout,
pullChangesOfPullrequest, merge, deleteBranch and merge added.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/simple-pull-request-job-plugin/pull/6&quot;&gt;PR-6&lt;/a&gt;: Yaml to Declarative Pipeline code generation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please see &lt;a href=&quot;https://www.jenkins.io/blog/2018/06/15/simple-pull-request-plugin/&quot;&gt;Phase 1 blog post&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;phase-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2&quot; /&gt;Phase 2&lt;/h5&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/simple-pull-request-job-plugin/pull/11&quot;&gt;PR-11&lt;/a&gt;: Implemented StepConfigurator
using Jenkins configuration as code plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/simple-pull-request-job-plugin/pull/19&quot;&gt;PR-19&lt;/a&gt;: Unit tests created for agent and yaml to pipeline generation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please see &lt;a href=&quot;https://www.jenkins.io/blog/2018/07/17/simple-pull-request-plugin/&quot;&gt;Phase 2 blog post&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;phase-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-3&quot; /&gt;Phase 3&lt;/h5&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/simple-pull-request-job-plugin/pull/25&quot;&gt;PR-25&lt;/a&gt;: Declarative pipeline code generator code
exported to extensions for extensibility and support of custom sections&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;sect2&quot;&gt;
&lt;h3 id=&quot;jenkinsfile-yaml-example&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsfile-yaml-example&quot; /&gt;Jenkinsfile.yaml example&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Documentation of Jenkinsfile.yaml and yaml format can be found &lt;a href=&quot;https://github.com/jenkinsci/simple-pull-request-job-plugin/tree/master/yamlExamples&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tasks-completed-in-coding-phase-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tasks-completed-in-coding-phase-3&quot; /&gt;Tasks completed in Coding Phase 3&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Add unit tests, JenkinsRule tests &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52495&quot;&gt;JENKINS-52495&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Refactor snippet generator to extensions (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52491&quot;&gt;JENKINS-52491&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin overview (Present in &lt;a href=&quot;https://github.com/jenkinsci/simple-pull-request-job-plugin/blob/master/README.md&quot;&gt;README.md&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;future-tasks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-tasks&quot; /&gt;Future tasks&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52452&quot;&gt;Phase 3 Jira Epic&lt;/a&gt;&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;Release 1.0 (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52519&quot;&gt;JENKINS-52519&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support the “when” Declarative Pipeline directive (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52520&quot;&gt;JENKINS-52520&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice2have: Support hierarchical report types (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52521&quot;&gt;JENKINS-52521&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Acceptance Test Harness tests &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52496&quot;&gt;JENKINS-52496&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic Workspace Cleanup when PR is closed (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51897&quot;&gt;JENKINS-51897&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test Multi-Branch Pipeline features support:&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;Support for webhooks (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51941&quot;&gt;JENKINS-51941&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check if trusted people have approved a pull request and start build accordingly (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52517&quot;&gt;JENKINS-52517&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finalize documentation (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52518&quot;&gt;JENKINS-52518&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test the integration with various platforms Bitbucket, Gitlab, Github.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-3-evaluation-presentation-video&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-3-evaluation-presentation-video&quot; /&gt;Phase 3 evaluation presentation video&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Video: &lt;a href=&quot;https://www.youtube.com/watch?v=GGEtN4nbtng&quot;&gt;Link to video evaluation&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
  &lt;iframe width=&quot;720&quot; height=&quot;400&quot; src=&quot;https://www.youtube.com/embed/GGEtN4nbtng?start=250&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-3-evaluation-presentation-slides&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-3-evaluation-presentation-slides&quot; /&gt;Phase 3 evaluation presentation slides&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/player/46e467bc5e364cb08c39b9e4b69bdef2&quot;&gt;Link to presentation slides&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
    &lt;iframe width=&quot;720&quot; height=&quot;400&quot; frameborder=&quot;0&quot; src=&quot;https://speakerdeck.com/player/46e467bc5e364cb08c39b9e4b69bdef2&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;my-gsoc-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#my-gsoc-experience&quot; /&gt;My GSoC experience&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Student applications started on March 12 16:00 UTC and ended on March 27 16:00 UTC. Application period allowed me to explore
many new technology and platforms that are making peoples life easy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before starting of the application
period I did not know anything about Jenkins. I found Jenkins organisation on the &lt;a href=&quot;https://summerofcode.withgoogle.com/organizations/&quot;&gt;GSoC organisations page&lt;/a&gt;
and came to know that I is a CI/CD platform that is used automate various things related to software development. I studied
about Jenkins online and went through the &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/gsoc2018-project-ideas/&quot;&gt;problem statements provided by some mentors&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I decided that to work on &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/gsoc2018-project-ideas/#simple-pull-request-job-plugin&quot;&gt;Simple Pull-Request Job Plugin&lt;/a&gt; project.
Then I wrote a draft proposal for this project and received many comments to refactor the proposal and enhance its quality from the mentors,
then finally I submitted my &lt;a href=&quot;https://summerofcode.withgoogle.com/serve/5141186688319488/&quot;&gt;final proposal&lt;/a&gt; to Google.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I was able to complete most of the tasks decided in Phase 1 and 2. After Phase 2 I was not able to give time to the project because
of the placement season in the my college. I modified the code so that other plugin developers can contribute to it by Jenkins extensions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All the mentors made themselves available for most of the weekly calls and provided many valuable suggestions during the
entire period of GSoC. Sometimes I was not able to communicate effectively. As communication is the key while working remotely, mentors
suggested to communicate more thorough gitter chat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My overall experience of GSoC was good and all the mentors helped me as they can all times. This project allowed me to explore
Jenkins and the services offered by it. I am allowed to work on the project after GSoC ends (This is a good thing).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-reach-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-reach-me&quot; /&gt;How to reach me&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Email: &lt;a href=&quot;mailto:gautamabhishek46@gmail.com&quot;&gt;gautamabhishek46@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gitter room: &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_simple-pull-request-job-&quot; class=&quot;bare&quot;&gt;https://app.gitter.im/#/room/#jenkinsci_simple-pull-request-job-&lt;/a&gt;&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot; /&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;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&lt;/h3&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/simple-pull-request-job-plugin&quot;&gt;Project repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/simple-pull-request-job-plugin/&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;link:https://app.gitter.im/#/room/#jenkinsci_simple-pull-request-job-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter chat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20Jenkins%20AND%20component%20%3D%20simple-pull-request-job-plugin&quot;&gt;Bug Tracker&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gautamabhishek46/dummy&quot;&gt;Demo Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/08/06/serverless-cicd-jenkins/</id>
<title>Building a Serverless CI/CD Pipeline with Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-08-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/08/06/serverless-cicd-jenkins/" />
<author>
<name>tracymiranda</name>
</author>
<category term='serverless'></category>
<category term='pipeline'></category>
<summary>
Everyone is talking about serverless.


As with any new hyped-technology the term 'serverless' is often overloaded with different meanings.
Sometimes serverless is oversimplified to mean function-as-a-service(faas).
But there is more to it than that.
Also, not many people are talking about doing CI/CD with serverless,
even though where there is code there still in need of continuous integration and continuous delivery.
So I was excited to hear about this talk by
Anubhav Mishra on
Building a CI/CD Pipeline for Serverless Applications.


In the talk Anubhav proposes a new definition for serverless:


""
Serverless is a technology pattern that provides services and concepts to minimize operational overhead that comes with managing servers.
It...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://speakerdeck.com/anubhavmishra/building-a-serverless-continuous-integration-and-delivery-pipeline&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/pipeline/serverless_pipeline.png&quot; alt=&quot;serverless pipeline&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kelseyhightower/status/902525728725405697&quot;&gt;Everyone is&lt;/a&gt; &lt;a href=&quot;https://twitter.com/tracymiranda/status/1019883767937339392&quot;&gt;talking&lt;/a&gt; &lt;a href=&quot;https://twitter.com/IamStan/status/1018755075827814400&quot;&gt;about serverless.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As with any new hyped-technology the term &#39;serverless&#39; is often overloaded with different meanings.
Sometimes serverless is oversimplified to mean function-as-a-service(faas).
But there is more to it than that.
Also, not many people are talking about doing CI/CD with serverless,
even though where there is code there still in need of continuous integration and continuous delivery.
So I was excited to hear about this talk by
&lt;a href=&quot;https://twitter.com/anubhavm&quot;&gt;Anubhav Mishra&lt;/a&gt; on
&lt;a href=&quot;https://speakerdeck.com/anubhavmishra/building-a-serverless-continuous-integration-and-delivery-pipeline&quot;&gt;Building a CI/CD Pipeline for Serverless Applications&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the talk &lt;a href=&quot;https://twitter.com/anubhavm&quot;&gt;Anubhav&lt;/a&gt; proposes a new definition for serverless:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;&quot;
Serverless is a technology pattern that provides services and concepts to minimize operational overhead that comes with managing servers.
It is a powerful abstraction when used can result in an increased focus on business value.
&quot;&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The talk then goes on to demo Jenkins on AWS Fargate (a platform for running containers without managing servers or clusters).
The main focus is on increased elasticity/scaling.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The advantages of this approach are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No nodes/servers to manage&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Launch 10,000+ builds/containers in seconds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No cost for idle time&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The real headline is the cost saving, which is 2 orders of magnitude better with serverless.
A cost comparison is done based on 1 vCPU &amp;amp; 2GB memory:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;With Jenkins on Fargate: 100 builds * 5 mins = $0.633/month&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With Jenkins on EC2 Instances: ~50/month&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This huge potential cost saving is one of the things that makes serverless incredibly compelling.
Not to mention you don’t have to think much upfront about scaling the system.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But there are drawbacks with this approach, noted as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cold starts - slower boot times for clients&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Large container images (~1G)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No root access&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ephemeral storage (default)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is an area where Jenkins can continue to evolve to make the most of serverless architectures.
I highly recommend you check out the
&lt;a href=&quot;https://speakerdeck.com/anubhavmishra/building-a-serverless-continuous-integration-and-delivery-pipeline&quot;&gt;slides&lt;/a&gt; for yourself.
The best part is that, in the true spirit of open source, Anubvha shared the code
&lt;a href=&quot;https://github.com/anubhavmishra/hello-oscon&quot;&gt;here&lt;/a&gt;.
So you can give it a try yourself and build your own serverless CI/CD pipeline with Jenkins.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/30/introducing-cloud-native-sig/</id>
<title>Introducing Jenkins Cloud Native SIG</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/30/introducing-cloud-native-sig/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='community'></category>
<category term='sig'></category>
<category term='cloud-native'></category>
<category term='cloud-native-sig'></category>
<summary>
On large-scale Jenkins instances controller disk and network I/O become bottlenecks in particular cases.
Build logging and artifact storage were one for the most intensive I/O consumers,
hence it would be great to somehow redirect them to an external storage.
Back in 2016 there were active discussions about such Pluggable Storage for Jenkins.
At that point we created several prototypes, but then other work took precedence.
There was still a high demand in Pluggable Storage for large-scale instances,
and these stories also become a major obstacle for cloud native Jenkins setups.


I am happy to say that the Pluggable Storage discussions are back online.
You may have seen...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On large-scale Jenkins instances controller disk and network I/O become bottlenecks in particular cases.
Build logging and artifact storage were one for the most intensive I/O consumers,
hence it would be great to somehow redirect them to an external storage.
Back in 2016 there were active discussions about such Pluggable Storage for Jenkins.
At that point we created several prototypes, but then other work took precedence.
There was still a high demand in Pluggable Storage for large-scale instances,
and these stories also become a major obstacle for cloud native Jenkins setups.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am happy to say that the Pluggable Storage discussions are back online.
You may have seen changes in the Core for Artifact Storage
(&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/202/README.adoc&quot;&gt;JEP-202&lt;/a&gt;)
and a new &lt;a href=&quot;https://plugins.jenkins.io/artifact-manager-s3&quot;&gt;Artifact Manager for S3 plugin&lt;/a&gt;.
We have also created a number of JEPs for External Logging
and created a new &lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native&quot;&gt;Cloud Native Special Interest Group (SIG)&lt;/a&gt;
to offer a venue for discussing changes and to keep them as open as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tomorrow &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; and I will be
presenting the current External Logging designs at the
Cloud Native SIG online meeting,
you can find more info about the meeting &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkins-cloud-native-sig/rvc4qfl8Ks4&quot;&gt;here&lt;/a&gt;.
I decided that it is a good time to write about the new SIG.
In this blogpost I will try to provide my vision of the SIG and its purpose.
I will also summarize the current status of the activities in the group.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-are-special-interest-groups&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-are-special-interest-groups&quot; /&gt;What are Special Interest Groups?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you follow the developer mailing list,
you may have seen the discussion about introducing SIGs
in the Jenkins project.
The SIG model has been proposed by
&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt;,
and it largely follows the successful
&lt;a href=&quot;https://github.com/kubernetes/community/blob/master/sig-list.md&quot;&gt;Kubernetes SIG&lt;/a&gt; model.
The objective of these SIGs is to make the community more transparent to contributors
and to offer venues for specific discussions.
The idea of SIGs and how to create them is documented in
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/4/README.adoc&quot;&gt;JEP-4&lt;/a&gt;.
JEP-4 is still in Draft state, but a few SIGs have been already created using that process:
&lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Platform SIG&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/sigs/gsoc&quot;&gt;GSoC SIG&lt;/a&gt; and, finally,
&lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native&quot;&gt;Cloud Native SIG&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;SIGs are a big opportunity to the Jenkins project,
offering a new way to onboard contributors who are interested only in particular aspects of Jenkins.
With SIGs they can subscribe to particular topics without
following the entire Developer mailing list which can become pretty buzzy nowadays.
It also offers company contributors a clear way how to join community and participate in specific areas.
This is great for larger projects which cannot be done by a single contributor.
Like JEPs, SIGs help focus and coordinate efforts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And, back to major efforts…​
Lack of resources among core contributors was one of the reasons
why we did not deliver on Pluggable Storage stories back in 2016.
I believe that SIGs can help fix that in Jenkins,
making it easier to find groups with the same interests and
reach out to them in order to organize activity.
Regular meetings are also helpful to get such efforts moving.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Points above are the main reasons why I joined the Cloud Native SIG.
Similarly, that’s why I decided to create a &lt;a href=&quot;https://www.jenkins.io/sigs/platform&quot;&gt;Platform SIG&lt;/a&gt;
to deliver on major efforts like Java 10+ support in Jenkins.
I hope that more SIGs get created soon so that contributors could focus on areas of their interest.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;cloud-native-sig&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cloud-native-sig&quot; /&gt;Cloud Native SIG&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the original proposal &lt;a href=&quot;https://github.com/csanchez&quot;&gt;Carlos Sanchez&lt;/a&gt;,
the Cloud Native SIG chair, has described the purpose of the SIG well.
There has been great progress this year in cloud-native-minded projects like Jenkins X and Jenkins Evergreen,
but the current Jenkins architecture does not offer particular
features which could be utilized there:
Pluggable Storage, High Availability, etc.
There are ways to achieve it using Jenkins plugins and some infrastructure tweaks,
but it is far from the out-of-the-box experience.
It complicates Jenkins management and slows down development of new cloud-native solutions for Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, what do I expect from the SIG?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Define roadmap towards Cloud-Native Jenkins architecture
which will help the project to stay relevant for Cloud Native installations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide a venue for discussion of critical Jenkins architecture changes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Act as a steering committee for Jenkins Enhancement Proposals in the area of
Cloud-Native solutions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, coordinate efforts between contributors and get new
contributors onboard&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;whats-next-in-the-sig&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next-in-the-sig&quot; /&gt;What’s next in the SIG?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The SIG agenda is largely defined by the SIG participants.
If you are interested to discuss particular topics,
just propose them in the SIG mailing list.
As the current &lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native&quot;&gt;SIG page&lt;/a&gt; describes,
there are several areas defined as initial topics:
&lt;em&gt;Artifact Storage&lt;/em&gt;,
&lt;em&gt;Log Storage&lt;/em&gt;,
&lt;em&gt;Configuration Storage&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All these topics are related to the Pluggable Storage Area,
and the end goal for them is to ensure that all data is externalized
so that replication becomes possible.
In addition to the mentioned data types,
discussed at the &lt;a href=&quot;https://docs.google.com/document/d/1sE6BxkUpKCbII-lV-tC_rE97Qqi7jUF_7QJpX0lRZ2Q/edit#heading=h.2yu40cilzo7z&quot;&gt;Jenkins World 2016 summit&lt;/a&gt;,
we will need to externalize other data types:
&lt;em&gt;Item and Run storage&lt;/em&gt;,
&lt;em&gt;Fingerprints&lt;/em&gt;,
&lt;em&gt;Test and coverage results&lt;/em&gt;,
etc.
There is some foundation work being done for that.
For example, &lt;a href=&quot;https://github.com/cizezsy&quot;&gt;Shenyu Zheng&lt;/a&gt; is working on a
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/code-coverage-api-plugin/&quot;&gt;Code Coverage API plugin&lt;/a&gt;
which would allow to unify the code coverage storage formats in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the Pluggable Storage stories are done the next steps are true High Availability, rolling or canary upgrades and zero downtime.
At that point other foundation stories like &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/remoting-over-message-bus/&quot;&gt;Remoting over Kafka&lt;/a&gt;
by &lt;a href=&quot;https://github.com/pvtuan10&quot;&gt;Pham Vu Tuan&lt;/a&gt;
might be integrated into the Cloud Native architecture to make Jenkins more robust against outages within the cluster.
It will take some time to get to this state, but it can be done incrementally.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let me briefly summarize current state of the 3 focuses listed in the Cloud Native SIG.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;artifact-storage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#artifact-storage&quot; /&gt;Artifact Storage&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are many existing plugins allowing to upload and download artifacts from external storage
(e.g. S3, Artifactory, Publish over SFTP, etc., etc.),
but there are no plugins which can do it transparently without using
new steps.
In many cases the artifacts also get uploaded through the controller,
and it increases load on the system.
It would be great if there was a layer which would allow storing artifacts externally
when using common steps like &lt;em&gt;Archive Artifacts&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Artifact storage work was started this spring by Jesse Glick, Carlos Sanchez and
&lt;a href=&quot;https://github.com/kuisathaverat&quot;&gt;Ivan Fernandez Calvo&lt;/a&gt;
before the Cloud Native SIG was actually founded.
Current state:&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/jep/blob/master/jep/202/README.adoc&quot;&gt;JEP-202 &quot;External Artifact Storage&quot;&lt;/a&gt;
has been proposed in the Jenkins community.
This JEP defines API changes in the Jenkins core which are needed to
support External artifact managers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Pipeline has been updated to support external artifact storages
for &lt;code&gt;archive&lt;/code&gt;/&lt;code&gt;unarchive&lt;/code&gt; and &lt;code&gt;stash&lt;/code&gt;/&lt;code&gt;unstash&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New &lt;a href=&quot;https://plugins.jenkins.io/artifact-manager-s3&quot;&gt;Artifact Manager for S3 plugin&lt;/a&gt;
reference implementation of the new API.
The plugin is available in main Jenkins update centers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A number of plugins has been updated in order to support
external artifact storage&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Artifact Manager API is available in Jenkins LTS starting from 2.121.1,
so it is possible to create new implementations using the provided API and
existing implementations.
This new feature is fully backward compatible with the default Filesystem-based storage,
but there are known issues for plugins explicitly relying on artifact locations in &lt;code&gt;JENKINS_HOME&lt;/code&gt;
(you can find a list of such plugins
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/202/README.adoc#file-oriented-artifact-reference&quot;&gt;here&lt;/a&gt;).
It will take a while to get all plugins supported,
but the new API in the core should allow migrating plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope we will revisit the External Artifact Storage at the SIG meetings at some point.
It would be a good opportunity to do a retrospective and to understand how to improve the process
in SIG.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;log-storage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#log-storage&quot; /&gt;Log storage&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Log storage is a separate big story.
Back in 2016 External logging was one of the key Pluggable Storage stories we defined at the contributor summit.
We created an EPIC for the story (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/38313&quot;&gt;JENKINS-38313&lt;/a&gt;)
and after that created a number of prototypes together with
&lt;a href=&quot;https://github.com/xyan0607&quot;&gt;Xing Yan&lt;/a&gt; and Jesse Glick.
One of these prototypes for Pipeline has recently been updated and published
&lt;a href=&quot;https://github.com/jenkinsci/custom-war-packager/tree/master/demo/external-logging-elasticsearch&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jesse Glick and Carlos Sanchez
are returning to this story and plan to discuss it within the Cloud Native SIG.
There are a number of Jenkins Enhancement proposals which have been submitted recently:&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/jep/blob/master/jep/207/README.adoc&quot;&gt;JEP-207&lt;/a&gt; -
External Build Logging support in the Jenkins Core&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/210/README.adoc&quot;&gt;JEP-210&lt;/a&gt; -
External log storage for Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/212/README.adoc&quot;&gt;JEP-212&lt;/a&gt; -
External Logging API Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/206/README.adoc&quot;&gt;JEP-206&lt;/a&gt; -
Use UTF-8 for Pipeline build logs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the linked documents you can find references to current reference implementations.
So far we have a working prototype for the new design.
There are still many bits to fix before the final release,
but the designs are ready for review and feedback.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This Tuesday (Jul 31) we are going to have a SIG meeting in order to present the current state and to discuss the proposed designs and JEPs.
The meeting will happen at 3PM UTC.
You can watch the broadcast using &lt;a href=&quot;https://www.youtube.com/watch?v=9lTOtC9wA_I&quot;&gt;this link&lt;/a&gt;.
Participant link will be posted in the SIGs Gitter channel 10 minutes before the meeting.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configuration-storage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-storage&quot; /&gt;Configuration storage&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is one of the future stories we would like to consider.
Although configurations are not big, externalizing them is a critical task
for getting highly-available or disposable Jenkins controllers.
There are many ways to store configurations in Jenkins,
but 95% of cases are covered by the &lt;code&gt;XmlFile&lt;/code&gt; layer which
serializes objects to disk and reads them using the XStream library.
Externalizing these &lt;code&gt;XmlFile&lt;/code&gt;s would be a great step forward.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are several prototypes for externalizing configurations,
e.g. in DotCI.
There are also other implementations which could be upstreamed to the Jenkins core:&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/deep&quot;&gt;Alex Nordlund&lt;/a&gt; has recently proposed a
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/3393&quot;&gt;pull request&lt;/a&gt;
to Jenkins Core, which should make the XML Storage pluggable&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jstrachan&quot;&gt;James Strachan&lt;/a&gt; has implemented similar engine
for Kubernetes in the &lt;a href=&quot;https://github.com/jstrachan/jenkins/tree/kubeify&quot;&gt;kubeify&lt;/a&gt; prototype&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I also did some experiments with externalizing XML Storages back in 2016&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next steps for this story would be to aggregate implementations into a single JEP.
I have it in my queue, and I hope to write up a design once we get more clarity on the External logging stories.&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;conclusions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusions&quot; /&gt;Conclusions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special Interest Groups are a new format for collaboration and discussion in the Jenkins community.
Although we have had some work groups before (Infrastructure, Configuration-as-Code, etc.),
introduction of SIGs sets a new bar in terms of the project transparency and consistency.
Major architecture changes in Jenkins are needed to ensure its future in the new environments,
and SIGs will help to boost visibility and participation around these changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to know more about the Cloud Native SIG,
all resources are listed on the &lt;a href=&quot;https://www.jenkins.io/sigs/cloud-native&quot;&gt;SIG’s page on jenkins.io&lt;/a&gt;.
If you want to participate in the SIG’s activities, just do the following:&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;Subscribe to the &lt;a href=&quot;https://groups.google.com/g/jenkins-cloud-native-sig&quot;&gt;mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Join our &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_cloud-native-sig:gitter.im&quot;&gt;Gitter channel&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Join our public meetings&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am also working on organizing a face-to-face Cloud Native SIG meeting at the
&lt;a href=&quot;https://www.jenkins.io/blog/2018/07/25/contributor-summit/&quot;&gt;Jenkins Contributor Summit&lt;/a&gt;,
which will happen on September 17 during
&lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;DevOps World | Jenkins World&lt;/a&gt; in San Francisco.
If you come to DevOps World | Jenkins World,
please feel free to join us at the contributor summit or to meet us at the community booth.
Together with Jesse and Carlos we are also going to present some bits of our work at the
&lt;a href=&quot;https://sched.co/F9NT&quot;&gt;A Cloud Native Jenkins&lt;/a&gt; talk.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for more updates and demos on the Cloud-Native Jenkins fronts!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/25/contributor-summit/</id>
<title>Join us at the Jenkins Contributor Summit San Francisco, Monday 17 September 2018</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/25/contributor-summit/" />
<author>
<name>tracymiranda</name>
</author>
<category term='community'></category>
<category term='events'></category>
<category term='jenkins-world'></category>
<summary>
The Jenkins Contributor summit is where the current and future contributors of the Jenkins project get together.
This summit will be on Monday, September 17th 2018 in San Francisco, just before DevOps World | Jenkins World.
The summit brings together community members to learn, meet and help shape the future of Jenkins.
In the Jenkins community we value all types and sizes of contributions and love to welcome new participants.
Register here.


Topics


There are plenty of exciting developments happening in the Jenkins community.
The summit will feature a 'State of the Project' update including updates from the Jenkins officers.
We will also have updates on the 'Big...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-cs-2018.jpg&quot; alt=&quot;devops world cs 2018&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Contributor summit is where the current and future contributors of the Jenkins project get together.
This summit will be on Monday, September 17th 2018 in San Francisco, just before &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco&quot;&gt;DevOps World | Jenkins World&lt;/a&gt;.
The summit brings together community members to learn, meet and help shape the future of Jenkins.
In the Jenkins community we value all types and sizes of contributions and love to welcome new participants.
Register &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-contributor-summit-san-francisco-tickets-48285340754&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;topics&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#topics&quot; /&gt;Topics&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are plenty of exciting developments happening in the Jenkins community.
The summit will feature a &#39;State of the Project&#39; update including updates from the Jenkins officers.
We will also have updates on the &#39;Big 5&#39; projects in active development:&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/2018/04/06/jenkins-essentials&quot;&gt;Jenkins Evergreen&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.praqma.com/stories/jenkins-configuration-as-code&quot;&gt;Configuration as Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Jenkins Pipeline&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;Plus we will feature a &lt;a href=&quot;https://www.jenkins.io/projects/gsoc&quot;&gt;Google Summer of Code&lt;/a&gt; update, and more!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;agenda&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#agenda&quot; /&gt;Agenda&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agenda is shaping up well and here is the outline so far.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;9:00am Kickoff &amp;amp; Welcome with coffee/pastries&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;10:00am Project Updates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;12:00pm Lunch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1.00pm BoF/Unconference&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.00pm Break&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.30pm Ignite Talks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5.00pm Wrap-up&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;6.00pm Contributor Dinner&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The BoF (birds-of-a-feather) session will be an opportunity for in depth discussions, hacking or learning more about any of the big 5.
Bring your laptop, come prepared with questions and ideas, and be ready for some hacking too if you want.
Join in, hear the latest and get involved in any project during the BoF sessions.
If you want to share anything there will be an opportunity to do a 5-min ignite talk at the end.
Attending is free, and no DevOps World | Jenkins World ticket is needed, but &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-contributor-summit-san-francisco-tickets-48285340754&quot;&gt;RSVP&lt;/a&gt; if you are going to attend to help us plan.
See you there!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/23/remoting-kafka-plugin-1/</id>
<title>Remoting Kafka Plugin 1.0: A new method to connect agents</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/23/remoting-kafka-plugin-1/" />
<author>
<name>pvtuan10</name>
</author>
<category term='plugins'></category>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<category term='remoting'></category>
<category term='kafka'></category>
<summary>
I am very excited to announce that we have recently released 1.0 version of Remoting Kafka Plugin under Jenkins Plugin. You can check the CHANGELOG to see the features included in this release.


About me

My name is Pham Vu Tuan, I am a final year undergraduate student from Singapore. This is the first time I participate in Google Summer of Code and contribute to an open-source organization.



Mentors

I have GSoC mentors who help me in this project Oleg Nenashev and Supun Wanniarachchi. Besides that, I also receive great support from developers in remoting project Devin Nusbaum and Jeff Thompson.



Overview

Current versions of Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am very excited to announce that we have recently released 1.0 version of &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;Remoting Kafka Plugin&lt;/a&gt; under &lt;a href=&quot;https://plugins.jenkins.io/remoting-kafka&quot;&gt;Jenkins Plugin&lt;/a&gt;. You can check the &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin/blob/master/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt; to see the features included in this release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-me&quot; /&gt;About me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My name is Pham Vu Tuan, I am a final year undergraduate student from Singapore. This is the first time I participate in Google Summer of Code and contribute to an open-source organization.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mentors&quot; /&gt;Mentors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have GSoC mentors who help me in this project &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; and &lt;a href=&quot;https://github.com/Supun94&quot;&gt;Supun Wanniarachchi&lt;/a&gt;. Besides that, I also receive great support from developers in remoting project &lt;a href=&quot;https://github.com/dwnusbaum&quot;&gt;Devin Nusbaum&lt;/a&gt; and &lt;a href=&quot;https://github.com/jeffret-b&quot;&gt;Jeff Thompson&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Current versions of Jenkins Remoting are based on the TCP protocol. If it fails, the agent connection and the build fails as well. There are also issues with traffic prioritization and multi-agent communications, which impact Jenkins stability and scalability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project aims to develop a plugin in order to add support of a popular message queue/bus technology (Kafka) as a fault-tolerant communication layer in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;benefits-to-the-community&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#benefits-to-the-community&quot; /&gt;Benefits to the community&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Provide a new method to connect agent to controller using Kafka besides existing methods such as JNLP or &lt;a href=&quot;https://plugins.jenkins.io/ssh-slaves&quot;&gt;SSH Build Agents plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help to resolve the existing issues with the TCP protocol between controller and agent communication in Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help to resolve traffic prioritization and multi-agent communications issue in Jenkins.&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;why-kafka&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-kafka&quot; /&gt;Why Kafka?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When planning for this project, we want to use traditional message queue system such as &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;ActiveMQ&lt;/a&gt; or &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;RabbitMQ&lt;/a&gt;. However, after some discussion, we decided to have a try with &lt;a href=&quot;https://kafka.apache.org/&quot;&gt;Kafka&lt;/a&gt; with more suitable features with this project:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kafka itself is not a queue like ActiveMQ or RabbitMQ, it is a distributed, replicated commit log. This helps to remove message delivery complexity we have in traditional queue system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We need to support data streaming as a requirement, and Kafka is good at this aspect, which RabbitMQ is lack of.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kafka is said to have a better scalability and good support from the development community.&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;architecture-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#architecture-overview&quot; /&gt;Architecture Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project consists of multiple components:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kafka Client Library - new command transport implementation, producer and consumer client logic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remoting Kafka Plugin - plugin implementation with KafkaGlobalConfiguration, KafkaComputerLauncher and KafkaSecretManager.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remoting Kafka Agent - A custom JAR agent with remoting JAR packaged together with a custom Engine implementation to setup a communication channel with Kafka. The agent is also packaged as a &lt;a href=&quot;https://hub.docker.com/r/jenkins/remoting-kafka-agent/&quot;&gt;Docker image&lt;/a&gt; in DockerHub.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All the components are packaged together with Docker Compose.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The below diagram is the overview of the current architecture:
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/remoting-kafka/remoting-kafka-architecture.png&quot; alt=&quot;remoting kafka architecture&quot; title=&quot;Remoting Kafka Plugin Current Architecture&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this design, controller is not communicating with agent using direct TCP communication anymore, all the communication commands are transferred with Kafka.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#features&quot; /&gt;Features&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project is now under the third coding phase and we have some features available in 1.0 release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1-kafka-global-configuration-with-support-of-credentials-plugin-to-store-secrets&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-kafka-global-configuration-with-support-of-credentials-plugin-to-store-secrets&quot; /&gt;1. Kafka Global Configuration with support of credentials plugin to store secrets.&lt;/h4&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/remoting-kafka/remoting-kafka-configuration.png&quot; alt=&quot;remoting kafka configuration&quot; title=&quot;Remoting Kafka Plugin Global Configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;2-launch-agent-with-kafka-launcher&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-launch-agent-with-kafka-launcher&quot; /&gt;2. Launch agent with Kafka Launcher.&lt;/h4&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/remoting-kafka/launch-agent-kafka.png&quot; alt=&quot;launch agent kafka&quot; title=&quot;Launch agent with Kafka Launcher&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;3-launch-agent-from-cli-using-agent-jar-with-secret-provided-to-ensure-security&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-launch-agent-from-cli-using-agent-jar-with-secret-provided-to-ensure-security&quot; /&gt;3. Launch agent from CLI using agent JAR with secret provided to ensure security.&lt;/h4&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/remoting-kafka/agent-cli.png&quot; alt=&quot;agent cli&quot; title=&quot;Command to run agent in CLI&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;4-run-jobs-pipeline-using-kafka-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#4-run-jobs-pipeline-using-kafka-agent&quot; /&gt;4. Run jobs, pipeline using Kafka agent.&lt;/h4&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/remoting-kafka/demo-jobs.png&quot; alt=&quot;demo jobs&quot; title=&quot;Run jobs, pipeline using Kafka agent&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;5-kafka-communication-between-controller-and-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#5-kafka-communication-between-controller-and-agent&quot; /&gt;5. Kafka communication between controller and agent.&lt;/h4&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/remoting-kafka/kafka-commands.png&quot; alt=&quot;kafka commands&quot; title=&quot;Kafka communication between controller and agent&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remoting operations are being executed over Kafka. In the log you may see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Command execution (SlaveInstallerFactoryImpl.isWindows())&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Classloading (Classloader.fetch())&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Log streaming (Pipe.chunk())&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-run-demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-run-demo&quot; /&gt;How to run demo&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have setup a ready-to-fly demo for this plugin. You can try to run a demo of the plugin by following this &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin#how-to-run-demo-of-the-plugins&quot;&gt;instruction&lt;/a&gt;.
Features in the demo:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker Compose starts preconfigured controller and agent instance, they connect automatically using Kafka launcher.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kafka is secured and encrypted with SSL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There few demo jobs in the instance so that a user can launch a job on the agent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kafka Manager supported in localhost:9000 to support monitoring of Kafka cluster.&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;phase-2-presentation-slides&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2-presentation-slides&quot; /&gt;Phase 2 Presentation Slides&lt;/h3&gt;
&lt;center&gt;
    &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vTEeVbYmkmbxN4atC1W3SdkqgLxo5iBhO_VqfMkkBzE63jW2_a6l0e6pQe_VrFIsEogUIJ9mdtVDYzx/embed?start=false&amp;amp;loop=false&amp;amp;delayms=60000&quot; frameborder=&quot;0&quot; width=&quot;720&quot; height=&quot;434&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-2-presentation-video&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2-presentation-video&quot; /&gt;Phase 2 Presentation Video&lt;/h3&gt;
&lt;center&gt;
  &lt;iframe width=&quot;720&quot; height=&quot;434&quot; src=&quot;https://www.youtube.com/embed/tuTODhJOTBU?start=1599&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_remoting:gitter.im&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/remoting.svg&quot; alt=&quot;title: &amp;quot;Gitter&amp;quot;&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Remoting+Kafka+Plugin&quot;&gt;Wiki&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/remoting-kafka&quot;&gt;Plugin Site&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/remoting-over-message-bus/&quot;&gt;Project Info&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/18/remoting-over-message-bus/&quot;&gt;Introduction Blogpost&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1GxkI17lZYQ6_pyAOR9sXNXq1K3LwkqjigXdxxf81VkE/edit?usp=sharing&quot;&gt;Phase 1 Evaluation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1TW31N-opvoFwSkD-FChhjCsXNWmeDjkecxJv8Lb6X-A/edit?usp=sharing&quot;&gt;Phase 2 Evaluation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/qWHM8S0fzUw&quot;&gt;Phase 1 Evaluation Video&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/tuTODhJOTBU&quot;&gt;Phase 2 Evaluation Video&lt;/a&gt;&lt;/p&gt;
&lt;/li&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/2018/07/23/javadoc-service-improvements/</id>
<title>Jenkins Javadoc: Service Improvements</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/23/javadoc-service-improvements/" />
<author>
<name>olblak</name>
</author>
<category term='javadoc'></category>
<category term='azure'></category>
<category term='infrastructure'></category>
<category term='kubernetes'></category>
<summary>
Jenkins infrastructure is continuously improving.
The latest service to get some attention and major improvement is the Jenkins javadoc.


There were a number of issues affecting that service:




Irregular updates -
Developers wouldn’t find the latest java documentation because of inadequate update frequency.


Broken HTTPS support -
when users would go to the Javadoc site they would get an unsafe site warning and then an incorrect redirection.


Obsolete content - Javadoc was not cleaned up correctly and plenty of obsolete pages remained which confused end users.




As Jenkins services
migrate to Azure infrastructure,
something that needed to be done was to move the javadoc service there as a standalone service.
I...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins infrastructure is continuously improving.
The latest service to get some attention and major improvement is the Jenkins javadoc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were a number of issues affecting that service:&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://issues.jenkins.io/browse/INFRA-1600&quot;&gt;Irregular updates&lt;/a&gt; -
Developers wouldn’t find the latest java documentation because of inadequate update frequency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-1387&quot;&gt;Broken HTTPS support&lt;/a&gt; -
when users would go to the Javadoc site they would get an unsafe site warning and then an incorrect redirection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Obsolete content - Javadoc was not cleaned up correctly and plenty of obsolete pages remained which confused end users.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Jenkins services
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/18/announcing-azure-partnership&quot;&gt;migrate to Azure infrastructure&lt;/a&gt;,
something that needed to be done was to move the javadoc service there as a standalone service.
I took the same approach as jenkins.io, putting data on an azure file storage, using a nginx proxy in front of it and running on kubernetes.
This approach brings multiple benefits:&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;We store static files on an azure file storage which brings data reliability, redundancy, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We use Kubernetes Ingress to configure HTTP/HTTPS endpoint&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We use Kubernetes Service to provide load balancing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We use Kubernetes deployment to deploy default nginx containers with azure file storage volume.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;HTTP/HTTPS workflow&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;  +----------------------+     goes on     +------------------------------+
  |  Jenkins Developer   |----------------&amp;gt;+  https://javadoc.jenkins.io  |
  +----------------------+                 +------------------------------+
                                                                      |
  +-------------------------------------------------------------------|---------+
  | Kubernetes Cluster:                                               |         |
  |                                                                   |         |
  | +---------------------+     +-------------------+     +-----------v------+  |
  | | Deployment: Javadoc |     | Service: javadoc  &amp;lt;-----| Ingress: javadoc |  |
  + +---------------------+     +-------------------+     +------------------+  |
  |                                           |                                 |
  |                          -----------------+                                 |
  |                          |                |                                 |
  |                          |                |                                 |
  | +------------------------v--+    +--------v------------------+              |
  | | Pod: javadoc              |    | Pod: javadoc              |              |
  | | container: &quot;nginx:alpine&quot; |    | container: &quot;nginx:alpine&quot; |              |
  | | +-----------------------+ |    | +-----------------------+ |              |
  | | | Volume:               | |    | | Volume:               | |              |
  | | | /usr/share/nginx/html | |    | | /usr/share/nginx/html | |              |
  | | +-------------------+---+ |    | +----+------------------+ |              |
  | +---------------------|-----+    +------|--------------------+              |
  |                       |                 |                                   |
  +-----------------------|-----------------|-----------------------------------+
                          |                 |
                          |                 |
                       +--+-----------------+-----------+
                       |   Azure File Storage: javadoc  |
                       +--------------------------------+&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The javadoc static files are now generated by a Jenkins
&lt;a href=&quot;https://ci.jenkins.io/job/Infra/job/javadoc/&quot;&gt;job&lt;/a&gt; regularly and then published from a trusted jenkins instance.
We only update what has changed and remove obsolete documents.
More information can be find
&lt;a href=&quot;https://github.com/jenkins-infra/javadoc/blob/master/Jenkinsfile&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next thing in continuously improving is also to look at the user experience of the javadoc to make it easier to discover javadoc for other components or versions.
(&lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-1717&quot;&gt;Help Needed&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These changes all go towards improving the developer experience for those using javadocs and making life easier for core and plugin developers.
See the new and improved javadoc service here
&lt;a href=&quot;https://www.jenkins.io/doc/developer/javadoc/&quot;&gt;Jenkins Javadoc&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/20/devops-world-jenkins-world-2018-agenda-is-live/</id>
<title>DevOps World-Jenkins World 2018 Agenda is Live</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/20/devops-world-jenkins-world-2018-agenda-is-live/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkins-world'></category>
<summary>
This year the Jenkins project introduced a few exciting efforts:
Configuration as Code, Jenkins X, Jenkins Evergreen, Blue Ocean and Pipeline.
With DevOps World-Jenkins World San Francisco and Nice only a few short months away,
we’ve made sure to include plenty of sessions related to these exciting efforts on the agenda.
With that said, the agenda for both cities is now live and will include workshops and deep dive
sessions on these efforts and much more.
Project contributors for these efforts will be present at both conferences as well, come say ‘hello’.
Here’s a glimpse of what’s on the agenda:


Workshops




Building Continuous Delivery for Microservices with Jenkins X


Creating...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/conferences/devops-world-2018.jpg&quot; alt=&quot;devops world 2018&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year the Jenkins project introduced a few exciting efforts:
Configuration as Code, Jenkins X, Jenkins Evergreen, Blue Ocean and Pipeline.
With DevOps World-Jenkins World San Francisco and Nice only a few short months away,
we’ve made sure to include plenty of sessions related to these exciting efforts on the agenda.
With that said, the agenda for both cities is now live and will include workshops and deep dive
sessions on these efforts and much more.
Project contributors for these efforts will be present at both conferences as well, come say ‘hello’.
Here’s a glimpse of what’s on the agenda:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;workshops&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#workshops&quot; /&gt;Workshops&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;Building Continuous Delivery for Microservices with Jenkins X&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating a Deployment Pipeline with Jenkins 2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Administration Fundamentals&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Pipeline Fundamentals&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And more&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;sessions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sessions&quot; /&gt;Sessions&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;Common Pitfalls in Jenkins Security and How to Avoid Them –
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/oleg_nenashev.1y7uhbhe&quot;&gt;Oleg Nenashev&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Habits, Tips and Tricks to Efficiently Automate Tasks with Jenkins -
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/michael_pailloncy.70v69iv&quot;&gt;Michael Paillloncy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Safely Upgrading Jenkins Everyday - Baptiste Mathus -
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/baptiste_mathus.1y8j4rd6&quot;&gt;Baptiste Mathus&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Running Jenkins at Scale on Kubernetes – Guillermo Palacio -
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/guillermo_palacio.1y8j74is&quot;&gt;Guillermo Palacio&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continuously Delivering an Easy-to-Use Jenkins with Jenkins Evergreen –
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/r_tyler_croy.1y8j4r5l&quot;&gt;Tyler Croy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“Look ma, no hands” – Manage Configuration as Code
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/ewelina_wilkosz.1y8j4r8y&quot;&gt;Ewelina Wilkosz&lt;/a&gt; &amp;amp;
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/nicolas_de_loof.1y8j4r55&quot;&gt;Nicolas De Loof&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate Testing in Your Container Platform with Jenkins –
&lt;a href=&quot;https://devopsworldjenkinsworld2018.sched.com/speaker/eleanor_mehlenbacher.1y8nqn3d&quot;&gt;Eleanor Mehlenbacher&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;much more&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;See the full agenda for both cities here:&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;DevOps World – Jenkins World 2018 &lt;a href=&quot;https://www.cloudbees.com/devops-world/san-francisco/schedule&quot;&gt;San Francisco Agenda&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DevOps World – Jenkins World 2018 &lt;a href=&quot;https://www.cloudbees.com/devops-world/nice/schedule&quot;&gt;Nice Agenda&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;You can plan on this to be highly educational, wildly engaging… overall an excellent space for collaborative conversations with project maintainers, contributors, and active community members.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you there!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
If you need more persuasion, use the code &lt;strong&gt;JWFOSS&lt;/strong&gt; to get 30% discount off your pass.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/19/jenkins-x-accelerate/</id>
<title>Accelerate with Jenkins X</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/19/jenkins-x-accelerate/" />
<author>
<name>jrawlings</name>
</author>
<category term='jenkinsx'></category>
<category term='developer'></category>
<category term='kubernetes'></category>
<summary>
Jenkins X uses Capabilities identified by the "Accelerate:  The Science Behind Devops"


Jenkins X is a reimagined CI/CD implementation for the Cloud which is heavily influence by the
State of DevOps reports and more recently the book
"Accelerate: The Science Behind Devops" by
Nicole Forsgren,
Jez Humble and
Gene Kim


Years of gathering data from real world teams and organisations which has been analyzed by inspiring thought leaders and data
scientists from the DevOps world, "Accelerate" recommends a number of capabilities that Jenkins X is implementing so
users gain the scientifically proven benefits, out of the box. We’ve started documenting the capabilities that are available
today and will continue...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/jenkins-x/accelerate/book.jpg&quot; alt=&quot;Accelerate&quot; width=&quot;300&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-x-uses-capabilities-identified-by-the-accelerate-the-science-behind-devops&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-x-uses-capabilities-identified-by-the-accelerate-the-science-behind-devops&quot; /&gt;Jenkins X uses Capabilities identified by the &quot;Accelerate:  The Science Behind Devops&quot;&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://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt; is a reimagined CI/CD implementation for the Cloud which is heavily influence by the
&lt;a href=&quot;https://puppet.com/resources/whitepaper/state-of-devops-report&quot;&gt;State of DevOps reports&lt;/a&gt; and more recently the book
&quot;Accelerate: The Science Behind Devops&quot; by
&lt;a href=&quot;https://twitter.com/nicolefv&quot;&gt;Nicole Forsgren&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/jezhumble&quot;&gt;Jez Humble&lt;/a&gt; and
&lt;a href=&quot;https://twitter.com/RealGeneKim&quot;&gt;Gene Kim&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Years of gathering data from real world teams and organisations which has been analyzed by inspiring thought leaders and data
scientists from the DevOps world, &quot;Accelerate&quot; recommends a number of capabilities that Jenkins X is implementing so
users gain the scientifically proven benefits, out of the box. We’ve started documenting the capabilities that are available
today and will continue as more become available.&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/jenkins-x/accelerate/JenkinsX_capabilities.png&quot; alt=&quot;Jenkins X Capabilities&quot; width=&quot;400&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Credit: thanks to tracymiranda for the image&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;use-version-control-for-all-artifacts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-version-control-for-all-artifacts&quot; /&gt;Use version control for all artifacts&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Weaveworks folks coined the term GitOps which we love.  Any change to an environment, whether it be a new application,
version upgrade, resource limit change or simple application configuration should be raised as a Pull Request to Git, have
checks run against it like a form of CI for environments and approved by a team that has control over what goes into the
related environment.  We can now enable governance and have full traceability for any change to an environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Related Accelerate capability:  Use version control for all production artifacts&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;automate-your-deployment-process&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automate-your-deployment-process&quot; /&gt;Automate your deployment process&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;environments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#environments&quot; /&gt;Environments&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X will automatically create Git backed environments during installation and makes it easy to add new ones using
&lt;code&gt;jx create environment&lt;/code&gt;.  Additionally when creating new applications via a quickstart (&lt;code&gt;jx create quickstart&lt;/code&gt;), Java based
SpringBoot (&lt;code&gt;jx create spring&lt;/code&gt;) or importing existing applications (&lt;code&gt;jx import&lt;/code&gt;), Jenkins X will both automatically add
CI / CD pipelines and setup the jobs, git repos and webhooks to enable an automated deployment process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Out of the box Jenkins X creates Staging and Production (this is customisable) permanent environments as well as temporary
environments for preview applications from Pull Requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;previews-environments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#previews-environments&quot; /&gt;Previews Environments&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are trying to move as much testing, security, validation and experimentation for a change before it’s merged to master.
With the use of temporary dynamically created Preview Environments any pull request can have a preview version built and
deployed, including libraries that feed into a downstream deployable application.  This means we can code review, test,
collaborate better with all teams that are involved in agreeing that change can go live.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ultimately Jenkins X wants to provide a way that developers, testers, designers and product managers can be as sure as they
can that when a change is merged to master it works as expected.  We want to be confident the proposed change does not
negatively affect any service or feature as well as deliver the value it is intended to.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Where Preview Environments get really interesting is when we are able to progress a PR through various stages of maturity and
confidence where we begin to direct a percentage of real production traffic like beta users to it.  We can then analyse the
value of the proposed change and possible run multiple automated experiments over time using Hypothesis Driven Development.
This helps give us better understanding of how the change will perform when released to all users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Related Accelerate capability: Foster and enable team experimentation&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using preview environments is a great way to introduce better test automation.  While Jenkins X enables this we don’t yet
have examples of automated tests being run against a preview environment.  A simple test would be to ensure the application
starts ok and Kubernetes liveness check pass for an amount of time. This relates to&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Related Accelerate capability: Implement Test Automation&lt;/em&gt;
&lt;em&gt;Related Accelerate capability: Automate your deployment process&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;permanent-environments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#permanent-environments&quot; /&gt;Permanent Environments&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In software development we’re used to working with multiple environments in the lead up to a change being promoted to a live
production environment.  Whilst this seems business as usual it can cause significant delays to other changes if for any
reason that it is deemed not fit via some process that didn’t happen pre merge to master.  Subsequent commits then become
blocked and can cause delay of urgent changes being promoted to production.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As above Jenkins X wants any changes and experiments to be validated before it is merged to master.  We would like changes in
a staging environment to be held there for a short amount of time before being promoted, ideally in an automated fashion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The default Jenkins X pipelines provide deployment automation via environments.  These are customisable to suite your own
CI / CD pipeline requirements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X recommends Staging should act as a near as possible reflection on production, ideally with real production data
shadowed to it using a service mesh to understand the behaviour.  This also helps when developing changes in preview where we
can link to non production services in staging.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Related Accelerate capability: Automate your deployment process&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;use-trunk-based-development&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-trunk-based-development&quot; /&gt;Use trunk-based development&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Accelerate book found that teams which use trunk based development with short lived branches performed better.  This has
always worked for the Jenkins X core team members so this was an easy capability for Jenkins X to implement when setting up
Git repositories and CI/CD jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;implement-continuous-integration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implement-continuous-integration&quot; /&gt;Implement Continuous Integration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X sees CI as the effort of validating a proposed change via pull requests before it is merged to controller.  Jenkins X
will automatically configure source code repositories, Jenkins and Kubernetes to provide Continuous Integration of the box.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;implement-continuous-delivery&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implement-continuous-delivery&quot; /&gt;Implement Continuous Delivery&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X sees CD as the effort of taking that change after it’s been merged to controller through to running in a live
environment.  Jenkins X automates many parts in a release pipeline:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X advocates the use of semantic versioning.  We use git tags to calculate the next release version which means we
don’t need to store the latest release version in the controller branch.  Where release systems do store the last or next version
in Git repos it means CD becomes hard, as a commit in a release pipeline back to controller triggers a new release.  This results
in a recursive release trigger.  Using a Git tag helps avoid this situation which Jenkins X completely automates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X will automatically create a released version on &lt;em&gt;every&lt;/em&gt; merge to master which can then potentially progress
through to production.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;use-loosely-coupled-architecture&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-loosely-coupled-architecture&quot; /&gt;Use loosely coupled architecture&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By targeting Kubernetes users of Jenkins X can take advantage of many of the cloud features that help design and develop
loosely coupled solutions.  Service discovery, fault tolerance, scalability, health checks, rolling upgrades, container
scheduling and orchestration to name just a few examples of where Kubernetes helps.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;architect-for-empowered-teams&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#architect-for-empowered-teams&quot; /&gt;Architect for empowered teams&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X aims to help polyglot application developers.  Right now Jenkins X has quickstarts and automated CI/CD setup with
language detection for Golang, Java, NodeJS, .Net, React, Angular, Rust, Swift and more to come.  What this also does is
provide a consistent Way of Working so developers can concentrate on developing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X also provides many addons, for example Grafana and Prometheus for automated metrics collection and visualisation.
In this example centralised metrics help understand how your applications behave when built and deployed on Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/developing/devpods&quot;&gt;DevPods&lt;/a&gt; are another feature which enables developers to edit source code in their
local IDE, behind the scenes it is then synced to the cloud and rapidly built and redeployed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X believes providing developers automation that helps them experiment in the cloud, with different technologies and
feedback empowers them to make the best decisions - 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;fancy-a-closer-look&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fancy-a-closer-look&quot; /&gt;Fancy a closer look?&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://twitter.com/jdrawlings&quot;&gt;Myself&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/jstrachan/&quot;&gt;James Strachan&lt;/a&gt; and
&lt;a href=&quot;https://twitter.com/rajdavies&quot;&gt;Rob Davies&lt;/a&gt; are going to be presenting and running workshops at
&lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World  | Jenkins World&lt;/a&gt;.  We’ll also be hanging out at the Jenkins X demo
area so come and say hello and see what’s the latest cool and exiting things to come out of Jenkins X.  Use &lt;strong&gt;JWFOSS&lt;/strong&gt; for 30%
discount off registration&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;want-to-get-involved&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#want-to-get-involved&quot; /&gt;Want to get involved?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X is open source, the community mainly hangs out in the
&lt;a href=&quot;https://jenkins-x.io/community/&quot;&gt;Jenkins X Kubernetes slack channels&lt;/a&gt; and for tips on being more involved with Jenkins X
take a look at our &lt;a href=&quot;https://jenkins-x.io/contribute&quot;&gt;contributing docs&lt;/a&gt;.  We’ve been helping lots of folks get into open source, learn
new technologies and languages like golang.  Why not get involved?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demo&quot; /&gt;Demo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve not already seen it here’s a video showing a spring boot quickstart with automatic CI/CD pipelines and preview environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/kPes3rvT1UM?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&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/18/security-updates/</id>
<title>Security updates for Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/18/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.133 and 2.121.2, that fix multiple security vulnerabilities.


For an overview of what was fixed, see the security advisory.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our LTS upgrade guide.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.133 and 2.121.2, that fix multiple security vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-07-18&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.121/#upgrading-to-jenkins-lts-2-121-2&quot;&gt;LTS upgrade guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/17/simple-pull-request-plugin/</id>
<title>Pipeline as YAML: Alpha release</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/17/simple-pull-request-plugin/" />
<author>
<name>abhishek_gautam</name>
</author>
<category term='gsoc2018'></category>
<category term='plugin'></category>
<category term='pipeline'></category>
<category term='yaml'></category>
<summary>
About me

I am Abhishek Gautam, 3rd year student from Visvesvaraya National Institute of
technology, India, Nagpur. I was a member of ACM Chapter and Google student developer club of my
college. I am passionate about automation.



Project Summary

This is a GSoC 2018 project.


This project aims to develop a pull request Job Plugin. Users should be able to
configure job type using YAML file placed in root directory of the
Git repository being the subject of the pull request. The plugin should interact with various
platforms like Bitbucket, Github, Gitlab, etc whenever a pull request is created or updated.


Plugin detects the presence of certain types of reports...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-me&quot; /&gt;About me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am Abhishek Gautam, 3rd year student from Visvesvaraya National Institute of
technology, India, Nagpur. I was a member of ACM Chapter and Google student developer club of my
college. I am passionate about automation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-summary&quot; /&gt;Project Summary&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a GSoC 2018 project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project aims to develop a pull request Job Plugin. Users should be able to
configure job type using YAML file placed in root directory of the
Git repository being the subject of the pull request. The plugin should interact with various
platforms like Bitbucket, Github, Gitlab, etc whenever a pull request is created or updated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugin detects the presence of certain types of reports at conventional locations,
and publish them automatically. If the reports are not present at their respective conventional
location, the location of the report can be configured in the YAML file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My mentors are
&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; (Org Admin),
&lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;,
&lt;a href=&quot;https://github.com/kwhetstone&quot;&gt;Kristin Whetstone&lt;/a&gt;,
&lt;a href=&quot;https://github.com/grandvizier&quot;&gt;Jeff Knurek&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;benefits-to-the-community&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#benefits-to-the-community&quot; /&gt;Benefits to the community&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Project administrators will be able to handle pull request builds more easily.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build specifications for pull requests can be written in a concise declarative format.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build reports will be automatically published to Github, Bitbucket, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build status updates will be sent to git servers automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Users will not have to deal with pipeline code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If there will be no merge conflicts or build failures, the PR can be merged into target branch.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-1-blog-post&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-1-blog-post&quot; /&gt;Phase 1 blog post&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please see &lt;a href=&quot;https://www.jenkins.io/blog/2018/06/15/simple-pull-request-plugin/&quot;&gt;Phase 1 blog post&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;implementations-till-now&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementations-till-now&quot; /&gt;Implementations till now&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alpha version of the plugin is released. It supports all features of Multi-Branch Pipeline and offers the following features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build description is defined via YAML file stored within the SCM repo. This plugin
will depend on GitHub plugin, Bitbucket plugin, Gitlab plugin if users will be
using respective platforms for their repositories.&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;Conversion of YAML to Declarative Pipeline: A class YamlToPipeline
is written which will load the &quot;Jenkinsfile.yaml&quot; and make use of PipelineSnippetGenerator class
to generate Declarative pipeline code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reporting of results, only xml report types is supported for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use of Yaml file (Jenkinsfile.yaml) from target branch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git Push step: To push the changes of pull request to the target branch. This is implemented
using git-plugin, PushCommand is used for this from git-plugin. credentialId,
branch name and repository url for interacting with Github, Bitbucket, etc
will be taken automatically from &quot;Branch-Source&quot; (Users have to fill this
details of branch source in job configuration UI). (You can see
&lt;a href=&quot;https://github.com/Jenkinsci/simple-pull-request-job-plugin/blob/master/README.md&quot;&gt;How to run the demo&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;StepConfigurator: To generate pipeline code for all supported steps in Jenkins. This is using
Jenkins configuration-as-code plugin (JCasC plugin) to configure a particular step object and
then that step object is passed to &lt;code&gt;Snippetizer.object2Groovy()&lt;/code&gt; method to generate the script of that step.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkinsfile-yaml-example&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsfile-yaml-example&quot; /&gt;Jenkinsfile.yaml example&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the phase 1 prototype demonstration, the following yaml file was used.
Note that this format is subject to change in the next phases of the project,
as we formalise the yaml format definition.&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;#  Docker image agent example&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;agent&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
 &lt;span class=&quot;na&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;my_label&lt;/span&gt;
 &lt;span class=&quot;na&quot;&gt;customWorkspace&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;path_to_workspace&lt;/span&gt;
 &lt;span class=&quot;na&quot;&gt;dockerImage&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;maven:3-alpine&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;s&quot;&gt;-v /tmp:/tmp&lt;/span&gt;

  &lt;span class=&quot;s&quot;&gt;tools&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;maven &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;maven_3.0.1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;jdk &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;jdk8&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;configuration&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# Push PR changes to the target branch if the build succeeds.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# default value is false&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;pushPrOnSuccess&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Trusted user to approve pull requests&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;prApprovers&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;s&quot;&gt;username1&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;username2&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;username3&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;variables&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;variable_1&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;value_1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;variable_2&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;value_2&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Credentials contains only two fields. credentialId must be present in the Jenkins Credentials&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;credentials&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;credentialId &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;fileCredentialId&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;variable &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;FILE&lt;/span&gt;

      &lt;span class=&quot;c1&quot;&gt;# In user scripts Username and Password can be accessed by LOGIN_USR and LOGIN_PSW&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;# respectively as environment variables&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;credentialId &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dummyGitRepo&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;variable &lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;LOGIN&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;stages&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;stage1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;agent&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;any&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;steps&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;sh&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;scripts/hello&quot;&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;unit&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;SECONDS&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;junit&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;testResults&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;target/**.xml&quot;&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;allowEmptyResults&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;testDataPublishers&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;s&quot;&gt;AutomateTestDataPublisher&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;JunitResultPublisher&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;na&quot;&gt;urlOverride&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;urlOverride&quot;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Post section for &quot;stage1&quot;. All Conditions which are available in Jenkins&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# declarative pipeline are supported&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;failure&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;sh&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;scripts/hello&quot;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Outer post section. Just like declarative pipeline.&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;always&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;sh&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;scripts/hello&quot;&lt;/span&gt;&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;coding-phase-2-plans-completed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coding-phase-2-plans-completed&quot; /&gt;Coding Phase 2 plans (Completed)&lt;/h3&gt;
&lt;div class=&quot;ulist checklist&quot;&gt;
&lt;ul class=&quot;checklist&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;i class=&quot;fa fa-check-square-o&quot; /&gt; Decide a proper YAML format to use for Jenkinsfile.yaml&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;i class=&quot;fa fa-check-square-o&quot; /&gt; Create Step Configurator for SPRP plugin. &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51637&quot;&gt;JENKINS-51637&lt;/a&gt;.
This will enable users to use Pipeline steps in Jenkinsfile.yaml.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;i class=&quot;fa fa-check-square-o&quot; /&gt; Automatic indentation generation in the generated PipelineSnippetGenerator class.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;i class=&quot;fa fa-check-square-o&quot; /&gt; Write tests for the plugin.&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;coding-phase-3-plans&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coding-phase-3-plans&quot; /&gt;Coding Phase 3 plans&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Test Multi-Branch Pipeline features support:&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;Support for webhooks (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51941&quot;&gt;JENKINS-51941&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check if trusted people have approved a pull request and start build accordingly (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52517&quot;&gt;JENKINS-52517&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finalize documentation (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52518&quot;&gt;JENKINS-52518&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release 1.0 (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52519&quot;&gt;JENKINS-52519&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin overview blog post&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;coding-phase-3-plans-after-release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coding-phase-3-plans-after-release&quot; /&gt;Coding Phase 3 plans after release&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Support the “when” Declarative Pipeline directive (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52520&quot;&gt;JENKINS-52520&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice2have: Support hierarchical report types (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52521&quot;&gt;JENKINS-52521&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add unit tests, JenkinsRule tests, and ATH tests (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52495&quot;&gt;JENKINS-52495&lt;/a&gt;, &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52496&quot;&gt;JENKINS-52496&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic Workspace Cleanup when PR is closed (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51897&quot;&gt;JENKINS-51897&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Refactor snippet generator to extensions (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52491&quot;&gt;JENKINS-52491&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52452&quot;&gt;Phase 3 Jira Epic&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-2-evaluation-presentation-video&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2-evaluation-presentation-video&quot; /&gt;Phase 2 evaluation presentation video&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Video:&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
  &lt;iframe width=&quot;720&quot; height=&quot;400&quot; src=&quot;https://www.youtube.com/embed/tuTODhJOTBU?start=3229&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-2-evaluation-presentation-slides&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-2-evaluation-presentation-slides&quot; /&gt;Phase 2 evaluation presentation slides&lt;/h3&gt;
&lt;center&gt;
    &lt;iframe width=&quot;720&quot; height=&quot;400&quot; frameborder=&quot;0&quot; src=&quot;https://speakerdeck.com/player/e7073ad74ee941b0b604d403462da1d3&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-reach-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-reach-me&quot; /&gt;How to reach me&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Email: &lt;a href=&quot;mailto:gautamabhishek46@gmail.com&quot;&gt;gautamabhishek46@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gitter room: &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_simple-pull-request-job-&quot; class=&quot;bare&quot;&gt;https://app.gitter.im/#/room/#jenkinsci_simple-pull-request-job-&lt;/a&gt;&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot; /&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;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&lt;/h3&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/simple-pull-request-job-plugin&quot;&gt;Project repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/simple-pull-request-job-plugin/&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;link:https://app.gitter.im/#/room/#jenkinsci_simple-pull-request-job-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter chat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20Jenkins%20AND%20component%20%3D%20simple-pull-request-job-plugin&quot;&gt;Bug Tracker&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gautamabhishek46/dummy&quot;&gt;Demo Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tuTODhJOTBU&amp;amp;t=3229s&quot;&gt;Phase 2 Presentation video&lt;/a&gt;(July 12, 2018)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.slideshare.net/AbhishekGautam185/yaml-as-pipeline-gsoc-218-phase-2-evaluation&quot;&gt;Phase 2 Presentation Slides&lt;/a&gt;(July 12, 2018)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/13/jenkins-user-conference-china/</id>
<title>Jenkins User Conference China Beijing Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/13/jenkins-user-conference-china/" />
<author>
<name>fjing</name>
</author>
<category term='event'></category>
<category term='juc'></category>
<summary>
On June 30, 2018 in sunny Beijing, the capital of China, we welcomed over 200 attendees to Jenkins User Conference China (JUCC). This is the first JUCC in Beijing and we are overwhelmed by the interest and love for Jenkins. The conference had sessions in DevOps, Continuous Delivery, Jenkins X, Pipeline, and Container. The GreatOps community, event host, invited John Willis, a thought leader of DevOps to deliver the keynote speech. John’s topic was "DevOps: Almost 10 years - What A  Strange Long Trip It’s Been." It was very insightful to learn of the history of DevOps and John&#8217;s...
</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/2018-07-13/697401A7-21B5-4E10-A931-EBF00064951C.jpg&quot; alt=&quot;697401A7 21B5 4E10 A931 EBF00064951C&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On June 30, 2018 in sunny Beijing, the capital of China, we welcomed over 200 attendees to Jenkins User Conference China (JUCC). This is the first JUCC in Beijing and we are overwhelmed by the interest and love for Jenkins. The conference had sessions in DevOps, Continuous Delivery, Jenkins X, Pipeline, and Container. The GreatOps community, event host, invited John Willis, a thought leader of DevOps to deliver the keynote speech. John’s topic was &quot;DevOps: Almost 10 years - What A  Strange Long Trip It’s Been.&quot; It was very insightful to learn of the history of DevOps and John’s point of view on the practice.&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/2018-07-13/776B4887-1CA6-45E8-A34A-AF2C798844E3.jpg&quot; alt=&quot;776B4887 1CA6 45E8 A34A AF2C798844E3&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lily Lin from Micro Focus presented, &quot;How to practice CI/CD for large-scale micro service based on Jenkins Pipeline.&quot;&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/2018-07-13/10B1F2C4-5557-4932-9289-263B5ADC3041.jpg&quot; alt=&quot;10B1F2C4 5557 4932 9289 263B5ADC3041&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;James Rawlings, one of the core Jenkins X contributors traveled from the United Kingdom to present, &quot;Jenkins X for the future, Easy CI/CD for Kubernetes.&quot;&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/2018-07-13/B43935A0-8146-4E9F-8EBB-1038D9EF14A5.jpg&quot; alt=&quot;B43935A0 8146 4E9F 8EBB 1038D9EF14A5&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After James’ presentation, there were many questions about Jenkins X, Jenkins users in China are very interested in Jenkins X. We all posed Jenkins &quot;X&quot; gesture.&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/2018-07-13/79DD49AF-F548-4AC6-9A47-43E51F1B1661.jpg&quot; alt=&quot;79DD49AF F548 4AC6 9A47 43E51F1B1661&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also invite Shuwei Hao from Alibaba, Michael Hüttermann who is the author of DevOps for Developers, Xiang Lu from CPI.&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/2018-07-13/92D64F56-2762-4031-B58D-6030BC53C924.jpg&quot; alt=&quot;92D64F56 2762 4031 B58D 6030BC53C924&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mr Huaqiang Li and Xiaojie Zhao ran a workshop for help attendees master Jenkins Pipeline and Jenkins X in the cloud environment.&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/2018-07-13/EAD67E78-1C86-4A5B-96C6-92431F26240E.jpg&quot; alt=&quot;EAD67E78 1C86 4A5B 96C6 92431F26240E&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are additional pictures from our event&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/2018-07-13/53C9990A-4859-423C-929E-CC0D15E94CC5.jpg&quot; alt=&quot;53C9990A 4859 423C 929E CC0D15E94CC5&quot; width=&quot;800&quot;&gt;
&lt;/img&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/2018-07-13/C4526E0F-5CA7-4B7D-8A66-942F3ADDB905.jpg&quot; alt=&quot;C4526E0F 5CA7 4B7D 8A66 942F3ADDB905&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special THANKS to BC who is the co-organizer of JUCC to host the main track and Alyssa and Maxwell for your help with our event.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next up, Jenkins User Conference China Shenzhen in November.
Let’s Jenkins X and DevOps!&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/10/jenkins-essentials-on-aws/</id>
<title>Jenkins Essentials flavor for AWS</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/10/jenkins-essentials-on-aws/" />
<author>
<name>batmat</name>
</author>
<category term='jenkinsevergreen'></category>
<category term='evergreen'></category>
<summary>
Jenkins Essentials has been renamed to Jenkins Evergreen since this was written.








Jenkins Essentials is about providing a distribution of Jenkins in less than five minutes and five clicks.
One of the main ideas to make this a reality is that Jenkins will be autoconfigured with sane defaults for the environment it is running in.


We are happy to report we recently merged the change that provides this feature for AWS.
We use an AWS CloudFormation template to provision a working version of Jenkins Essentials, automatically configured to:




dynamically provision EC2 agents, using the EC2 plugin;


use the Artifact Manager on S3 plugin, so that artifacts...
</summary>
<content type='html'>
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;em&gt;Jenkins Essentials&lt;/em&gt; has been renamed to &lt;em&gt;Jenkins &lt;strong&gt;Evergreen&lt;/strong&gt;&lt;/em&gt; since this was written.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/logos/magician/256.png&quot; alt=&quot;Jenkins Essentials&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Essentials is about providing a &lt;a href=&quot;https://www.jenkins.io/blog/2018/04/06/jenkins-essentials/&quot;&gt;distribution of Jenkins in less than five minutes and five clicks&lt;/a&gt;.
One of the main ideas to make this a reality is that Jenkins will be autoconfigured with sane defaults for the environment it is running in.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to report we recently merged the &lt;a href=&quot;https://github.com/jenkins-infra/evergreen/pull/128&quot;&gt;change that provides this feature for AWS&lt;/a&gt;.
We use an &lt;em&gt;&lt;a href=&quot;https://aws.amazon.com/cloudformation&quot;&gt;AWS CloudFormation template&lt;/a&gt;&lt;/em&gt; to provision a working version of &lt;em&gt;Jenkins Essentials&lt;/em&gt;, automatically configured to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;dynamically provision EC2 agents, using the &lt;a href=&quot;https://plugins.jenkins.io/ec2&quot;&gt;EC2 plugin&lt;/a&gt;;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;use the &lt;a href=&quot;https://plugins.jenkins.io/artifact-manager-s3&quot;&gt;Artifact Manager on S3&lt;/a&gt; plugin, so that artifacts are not stored anymore on the controller’s file system, but directly in an S3 bucket.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I recorded a short demo video last week showing the basics of this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/966OiFW2gow?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While there are still many items to complete to provide a usable version for end-users, we are making steady progress towards it.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can learn more about Jenkins Essentials from the
&lt;a href=&quot;https://github.com/jenkins-infra/evergreen&quot;&gt;GitHub repository&lt;/a&gt;, or join us
on our
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkins-infra_evergreen:gitter.im&quot;&gt;Gitter channel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/05/remoting-over-message-bus-alpha-release/</id>
<title>GSoC Project Update: Alpha release of Remoting Kafka Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/05/remoting-over-message-bus-alpha-release/" />
<author>
<name>pvtuan10</name>
</author>
<category term='plugins'></category>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<category term='remoting'></category>
<category term='alpha-release'></category>
<summary>
I am happy to announce that we have recently released an alpha version of Remoting Kafka Plugin to the Experimental Update Center. You can check the CHANGELOG to see the features included in this initial release.


Overview

Current versions of Jenkins Remoting are based on the TCP protocol. If it fails, the agent connection and the build fails as well. There are also issues with traffic prioritization and multi-agent communications, which impact Jenkins stability and scalability.


Remoting Kafka Plugin is a plugin developed under Jenkins Google Summer of Code 2018. The plugin is developed to add support of a popular message queue/bus technology...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am happy to announce that we have recently released an alpha version of &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;Remoting Kafka Plugin&lt;/a&gt; to the &lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/releasing-experimental-updates/#configuring-jenkins-to-use-experimental-update-center&quot;&gt;Experimental Update Center&lt;/a&gt;. You can check the &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin/blob/master/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt; to see the features included in this initial release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Current versions of Jenkins Remoting are based on the TCP protocol. If it fails, the agent connection and the build fails as well. There are also issues with traffic prioritization and multi-agent communications, which impact Jenkins stability and scalability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;Remoting Kafka Plugin&lt;/a&gt; is a plugin developed under &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;Jenkins Google Summer of Code 2018&lt;/a&gt;. The plugin is developed to add support of a popular message queue/bus technology (Kafka) as a fault-tolerant communication layer in Jenkins. A quick introduction of the project can be found in this  &lt;a href=&quot;https://www.jenkins.io/blog/2018/06/18/remoting-over-message-bus/&quot;&gt;introduction blogpost&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-use-the-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-use-the-plugin&quot; /&gt;How to use the plugin?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The instructions to run the plugin in alpha version are written &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin#how-to-use-the-plugin-in-alpha-version&quot;&gt;here&lt;/a&gt;. Feel free to have a try and let us know your feedback on &lt;a href=&quot;https://app.gitter.im/&amp;lt;mark&amp;gt;/room/#jenkinsci_remoting:gitter.im&quot;&gt;Gitter&lt;/a&gt; or the &lt;a href=&quot;https://groups.google.com/forum/?nomobile=true&amp;lt;/mark&amp;gt;!forum/jenkinsci-dev&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&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/remoting-kafka-plugin/blob/master/CHANGELOG.md#100-alpha-1&quot;&gt;Alpha Changelog&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/18/remoting-over-message-bus/&quot;&gt;Introduction Blogpost&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_remoting:gitter.im&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/remoting.svg&quot; alt=&quot;title: &amp;quot;Gitter&amp;quot;&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/remoting-over-message-bus/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/qWHM8S0fzUw&quot;&gt;Phase 1 Presentation Video&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1GxkI17lZYQ6_pyAOR9sXNXq1K3LwkqjigXdxxf81VkE/edit?usp=sharing&quot;&gt;Phase 1 Presentation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/</id>
<title>What&#39;s New in Declarative Pipeline 1.3: Sequential Stages</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/" />
<author>
<name>abayer</name>
</author>
<category term='pipeline'></category>
<summary>
We recently released version 1.3 of Declarative Pipelines, which includes a couple significant new features. We&#8217;re
going to cover these features in separate blog posts. The next post will show the new ability to restart a completed
Pipeline run starting from a stage partway through the Pipeline, but first, let&#8217;s look at the new sequential stages
feature.


Sequential Stages


In Declarative 1.2, we added the ability to define stages to run in parallel
as part of the Declarative syntax. Now in Declarative 1.3, we&#8217;ve added another way to specify stages nested within other
stages, which we&#8217;re calling "sequential stages".


Running Multiple Stages in a Parallel Branch

One common use...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We recently released version 1.3 of Declarative Pipelines, which includes a couple significant new features. We’re
going to cover these features in separate blog posts. The next post will show the new ability to restart a completed
Pipeline run starting from a stage partway through the Pipeline, but first, let’s look at the new sequential stages
feature.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;sequential-stages&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sequential-stages&quot; /&gt;Sequential Stages&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Declarative 1.2, we added &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax#parallel&quot;&gt;the ability to define stages to run in parallel&lt;/a&gt;
as part of the Declarative syntax. Now in Declarative 1.3, we’ve added another way to specify stages nested within other
stages, which we’re calling &quot;sequential stages&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;running-multiple-stages-in-a-parallel-branch&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-multiple-stages-in-a-parallel-branch&quot; /&gt;Running Multiple Stages in a Parallel Branch&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One common use case is running build and tests on multiple platforms. You could already do that with &lt;code&gt;parallel&lt;/code&gt; stages,
but now you can run multiple stages in each &lt;code&gt;parallel&lt;/code&gt; branch giving you more visibility into the progress of your
Pipeline without having to check the logs to see exactly which step is currently running where, etc.&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/2018-07-02/sequential_stages.png&quot; alt=&quot;sequential stages&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also
use stage directives, including &lt;code&gt;post&lt;/code&gt;, &lt;code&gt;when&lt;/code&gt;, &lt;code&gt;agent&lt;/code&gt;, and all the others covered in the
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax&quot;&gt;Pipeline Syntax reference&lt;/a&gt;
in your sequential stages, letting you control behavior for different parts of each &lt;code&gt;parallel&lt;/code&gt; branch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the example below, we are running builds on both Windows and Linux, but only want to deploy if we’re on the master branch.&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;none&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;s2&quot;&gt;&quot;build and deploy on Windows and Linux&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;n&quot;&gt;parallel&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;s2&quot;&gt;&quot;windows&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;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;windows&quot;&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;s2&quot;&gt;&quot;build&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;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                                &lt;span class=&quot;n&quot;&gt;bat&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;run-build.bat&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;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;deploy&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;n&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                                &lt;span class=&quot;n&quot;&gt;branch&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;master&quot;&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;bat&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;run-deploy.bat&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;span class=&quot;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;linux&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;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;linux&quot;&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;s2&quot;&gt;&quot;build&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;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;./run-build.sh&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;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;deploy&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;n&quot;&gt;when&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                                 &lt;span class=&quot;n&quot;&gt;branch&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;master&quot;&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;./run-deploy.sh&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;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 class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;running-multiple-stages-with-the-same-agent-or-environment-or-options&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-multiple-stages-with-the-same-agent-or-environment-or-options&quot; /&gt;Running Multiple Stages with the Same &lt;code&gt;agent&lt;/code&gt;, or &lt;code&gt;environment&lt;/code&gt;, or &lt;code&gt;options&lt;/code&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the sequential stages feature was originally driven by users wanting to have multiple stages in &lt;code&gt;parallel&lt;/code&gt; branches,
we’ve found that being able to group multiple stages together with the same &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;environment&lt;/code&gt;, &lt;code&gt;when&lt;/code&gt;, etc has a lot
of other uses. For example, if you are using multiple agents in your Pipeline, but would like to be sure that stages using
the same agent use the same workspace, you can use a parent &lt;code&gt;stage&lt;/code&gt; with an &lt;code&gt;agent&lt;/code&gt; directive on it, and then all the stages
inside its &lt;code&gt;stages&lt;/code&gt; directive will run on the same executor, in the same workspace. Another example is that until now, you
could only set a timeout for the entire Pipeline or an individual stage. But by using a parent &lt;code&gt;stage&lt;/code&gt; with nested &lt;code&gt;stages&lt;/code&gt;,
you can define a timeout in the parent’s &lt;code&gt;options&lt;/code&gt; directive, and that timeout will be applied for the execution of the
parent, including its nested stages. You may also want to conditionally control the execution of multiple stages. For example,
your deployment process may be spread across multiple stages, and you don’t want to run any of those stages unless you’re on
a certain branch or some other criteria is satisfied. Now you can group all those related stages together in a parent
&lt;code&gt;stage&lt;/code&gt;, within its &lt;code&gt;stages&lt;/code&gt; directive, and have a single &lt;code&gt;when&lt;/code&gt; condition on that parent, rather than having to copy an
identical &lt;code&gt;when&lt;/code&gt; condition to each of the relevant stages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of my favorite use cases is shown in the example below. In Declarative 1.2.6, we added the &lt;code&gt;input&lt;/code&gt; directive for stages.
This will pause the execution of the Pipeline until a user confirms that the Pipeline should continue, using the Scripted
Pipeline &lt;code&gt;input&lt;/code&gt; step. The &lt;code&gt;input&lt;/code&gt; directive is evaluated before the stage enters its agent, if it has one specified, and
before the stage’s &lt;code&gt;when&lt;/code&gt; condition, if specified, is evaluated. But if you’re using a top-level agent for most of your
stages, you’re still going to be using that agent’s executor while waiting for input, which can be a waste of resources.
With sequential stages, you can instead use &lt;code&gt;agent none&lt;/code&gt; at the top-level of the Pipeline, and group the stages using a common
agent and running before the stage with the &lt;code&gt;input&lt;/code&gt; directive together under a parent &lt;code&gt;stage&lt;/code&gt; with the required &lt;code&gt;agent&lt;/code&gt;
specified. Then, when your Pipeline reaches the stage with &lt;code&gt;input&lt;/code&gt;, it will no longer be using an agent’s executor.&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;none&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;s2&quot;&gt;&quot;build and test the project&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;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;our-build-tools-image&quot;&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;s2&quot;&gt;&quot;build&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;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;./build.sh&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;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;test&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;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;./test.sh&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;n&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;stash&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;artifacts&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;includes:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;artifacts/**/*&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;n&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;deploy the artifacts if a user confirms&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;n&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Should we deploy the project?&quot;&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;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;our-deploy-tools-image&quot;&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;./deploy.sh&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;These are just a few example of the power of the new sequential stages feature in Declarative 1.3.
This new feature adds another set of significant use cases that can be handled smoothly using Declarative Pipeline.
In my next post, I’ll show the another highly requested feature - the new ability to restart a Pipeline run from any stage in that Pipeline.&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/2018/07/02/new-api-token-system/</id>
<title>Security Hardening: New API token system in Jenkins 2.129+</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-07-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/07/02/new-api-token-system/" />
<author>
<name>wadeck</name>
</author>
<category term='community'></category>
<category term='core'></category>
<category term='security'></category>
<category term='upgrade'></category>
<summary>
About API tokens


Jenkins API tokens are an authentication mechanism that allows a tool (script, application, etc.) to impersonate a user
without providing the actual password for use with the Jenkins API or CLI.
This is especially useful when your security realm is based on a central directory, like Active Directory or LDAP,
and you don&#8217;t want to store your password in scripts.
Recent versions of Jenkins also make it easier to use the remote API when using API tokens to authenticate,
as no CSRF tokens need to be provided even with CSRF protection enabled.
API tokens are not meant to&#8201;&#8212;&#8201;and cannot&#8201;&#8212;&#8201;replace the regular password for the...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;about-api-tokens&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-api-tokens&quot; /&gt;About API tokens&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins API tokens are an authentication mechanism that allows a tool (script, application, etc.) to impersonate a user
without providing the actual password for use with the Jenkins API or CLI.
This is especially useful when your security realm is based on a central directory, like Active Directory or LDAP,
and you don’t want to store your password in scripts.
Recent versions of Jenkins also make it easier to use the remote API when using API tokens to authenticate,
as no CSRF tokens need to be provided even with CSRF protection enabled.
API tokens are not meant to — and cannot — replace the regular password for the Jenkins UI.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;previous-problems&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#previous-problems&quot; /&gt;Previous problems&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We addressed two major problems with the existing API token system in Jenkins 2.129:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, reported in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/32442&quot;&gt;JENKINS-32442&lt;/a&gt;,
user accounts in Jenkins have an automatically generated API token by default.
As these tokens can be used to authenticate as a given user, they increase the attack surface of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second problem was reported in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/32776&quot;&gt;JENKINS-32776&lt;/a&gt;:
The tokens were previously stored on disk in an encrypted form.
This meant that they could be decrypted by unauthorized users by leveraging another security vulnerability,
or obtained, for example, from improperly secured backups, and used to impersonate other users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-approach&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-approach&quot; /&gt;New approach&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main objective of this new system is to provide API tokens that are stored in a unidirectional way on the disk,
i.e. using a hashing algorithm (in this particular case SHA-256).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While this means that you will not be able to see the actual API tokens anymore after you’ve created them,
several features were added to mitigate this potential problem:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can have multiple active API tokens at the same time.
If you don’t remember an API token’s value anymore, just revoke it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can name your tokens to know where they are used (and rename them after creation if desired).
We recommend that tokens use a name that indicates where (for example the application, script, or host) where it will be used.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can track the usage of your tokens.
Every token keeps a record of the number of uses and the date of the last use.
This will allow you to better know which tokens are really used and which are no longer actively required.
Jenkins also encourages users to rotate old API tokens by highlighting their creation date in orange after six months, and in red after twelve months.
The goal is to remind the user that tokens are more secure when you regenerate them often:
The longer a token is around, perhaps passed around in script files and stored on shared drives,
the greater the chance it’s going to be accessed by someone not authorized to use it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/token_usage.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/token_usage.png&quot; alt=&quot;token usage&quot; width=&quot;800&quot; /&gt;
&lt;/a&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Token usage tracking&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can revoke API tokens.
When you know that you are not using a given token anymore, you can revoke it to reduce the risk of it getting used by unauthorized users.
Since you can have multiple API tokens, this allows fine-grained control over which scripts, hosts, or applications are allowed to use Jenkins as a given user.&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;migrating-to-new-api-tokens&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#migrating-to-new-api-tokens&quot; /&gt;Migrating to new API tokens&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To help administrators migrate their instances progressively, the legacy behavior is still available, while new system is also usable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the user configuration page, the legacy token is highlighted with a warning sign,
explaining that users should revoke it and generate a new one (if needed) to increase security.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/legacy_renewal.gif&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/legacy_renewal.gif&quot; alt=&quot;legacy renewal&quot; width=&quot;800&quot; /&gt;
&lt;/a&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Legacy token renewal still possible&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-options-for-administrators&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-options-for-administrators&quot; /&gt;New options for administrators&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to let administrators control the pace of migration to the new API token system,
we added two global configuration options in the &quot;Configure Global Security&quot; page in the brand new &quot;API Token&quot; section:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An option to disable the creation of legacy API tokens on user creation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An option to disable the recreation of legacy API tokens by users, forcing them to only use the new, unrecoverable API tokens.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both options are disabled by default for new installations (the safe default), while they’re enabled when Jenkins is upgraded from before 2.129.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/security_configuration_options.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/security_configuration_options.png&quot; alt=&quot;security configuration options&quot; /&gt;
&lt;/a&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. Security Configuration options&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/legacy_removal.gif&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/legacy_removal.gif&quot; alt=&quot;legacy removal&quot; width=&quot;800&quot; /&gt;
&lt;/a&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. Remove legacy token and disable the re-creation&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;new-administrator-warnings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-administrator-warnings&quot; /&gt;New administrator warnings&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When upgrading to Jenkins 2.129, an administrative monitor informs admins about the new options described above, and recommend disabling them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another administrative warnings shows up if at least one user still has a legacy API token.
It provides central control over legacy tokens still configured in the Jenkins instance, and allows revoking them all.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/monitor_screen.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-07-02-new-api-token-system/monitor_screen.png&quot; alt=&quot;monitor screen&quot; width=&quot;800&quot; /&gt;
&lt;/a&gt;
&lt;div class=&quot;title&quot;&gt;Figure 5. Legacy token monitoring page&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;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;Jenkins API tokens are now much more flexible: They allow and even encourage better security practices.
We recommend you revoke legacy API tokens as soon as you can, and only use the newly introduced API tokens.&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/2018/06/27/new-login-page/</id>
<title>New design, UX and extensibility digest for login page et. al.</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/27/new-login-page/" />
<author>
<name>scherler</name>
</author>
<category term='core'></category>
<category term='developer'></category>
<category term='ux'></category>
<summary>
This blog post gives an introduction to the new design for the login and signup forms and Jenkins is (re)starting pages introduced in Jenkins 2.128.
The first part of the blog post is an introduction to the new design and UX for Jenkins users.
The later part is talking about extensibility in a more technical manner, aimed at plugin developers.


Overview


The recent changes to some core pages provide new design and UX and further dropping all external dependencies to prevent
any possible malicious javascript introduced by third party libraries.
To be clear, this never was an issue with previous releases of Jenkins, but having read...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post gives an introduction to the new design for the login and signup forms and Jenkins is (re)starting pages introduced in Jenkins 2.128.
The first part of the blog post is an introduction to the new design and UX for Jenkins users.
The later part is talking about extensibility in a more technical manner, aimed at plugin developers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The recent changes to some core pages provide new design and UX and further dropping all external dependencies to prevent
any possible malicious javascript introduced by third party libraries.
To be clear, this never was an issue with previous releases of Jenkins, but having read &lt;a href=&quot;https://hackernoon.com/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8cb347c5b5&quot;&gt;this article&lt;/a&gt;, this author believes that the article has good points and leading by example may raise awareness of data protection.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This meant to drop the usage of the jelly layout lib (aka &lt;code&gt;xmlns:l=&quot;/lib/layout&quot;&lt;/code&gt;) and as well the page decorators it
supported. However there is a new &lt;code&gt;SimplePageDecorator&lt;/code&gt; extension point (discussed below) which can be used to modify the look and feel for the login and sign up page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following pages have given a new design:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins is (re)starting pages&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/2018-06-27-JENKINS-50447/JENKINS-50447_1_a.png&quot; alt=&quot;JENKINS 50447 1 a&quot; /&gt;&lt;/span&gt;
&lt;/p&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/2018-06-27-JENKINS-50447/JENKINS-50447_1_b.png&quot; alt=&quot;JENKINS 50447 1 b&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Login&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/2018-06-27-JENKINS-50447/JENKINS-50447_2.png&quot; alt=&quot;JENKINS 50447 2&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sign up&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/2018-06-27-JENKINS-50447/JENKINS-50447_3.png&quot; alt=&quot;JENKINS 50447 3&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;ux-enhancement&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ux-enhancement&quot; /&gt;UX enhancement&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Form validation has changed to give inline feedback about data validation errors in the same form.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Login&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/2018-06-27-JENKINS-50447/JENKINS-50447_4.png&quot; alt=&quot;JENKINS 50447 4&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sign up&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/2018-06-27-JENKINS-50447/JENKINS-50447_5.png&quot; alt=&quot;JENKINS 50447 5&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The above image shows that the validation is now done on all input fields instead of before breaking on the
first error found, which should lead to fewer retry cycles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of forcing the user to repeat the password, the new UX introduces the possibility to display the password in
clear text. Further a basic password strength meter indicates password strength to the user while she enters the password.&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/2018-06-27-JENKINS-50447/JENKINS-50447_6.png&quot; alt=&quot;JENKINS 50447 6&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;customizing-the-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#customizing-the-ui&quot; /&gt;Customizing the UI&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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;
The re-/starting screens do not support the concept of decorators very well, hence the decision to not support them for these pages.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The SimplePageDecorator is the key component for customization and uses three different files to
allow overriding the look and feel of the login and signup pages.&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;simple-head.jelly&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;simple-header.jelly&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;simple-footer.jelly&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;All of the above &lt;code&gt;SimplePageDecorator&lt;/code&gt; Jelly files are supported in the &lt;strong&gt;login&lt;/strong&gt; page. The following snippet is a minimal excerpt
of the login page, showing how it makes use of &lt;code&gt;SimplePageDecorator&lt;/code&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;html&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:st=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:stapler&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;j:new&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;var=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;h&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;className=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hudson.Functions&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- css styling, will fallback to default implementation --&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;st:include&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;it=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${h.simpleDecorator}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;page=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;simple-head.jelly&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;optional=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;simple-page&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;role=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;st:include&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;it=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${h.simpleDecorator}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;page=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;simple-header.jelly&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;optional=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;footer&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;st:include&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;it=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${h.simpleDecorator}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;page=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;simple-footer.jelly&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;optional=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;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;strong&gt;sign-up&lt;/strong&gt; page only supports the simple-head.jelly:&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;html&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:st=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:stapler&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;j:new&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;var=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;h&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;className=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hudson.Functions&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- css styling, will fallback to default implementation --&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;st:include&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;it=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${h.simpleDecorator}&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;page=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;simple-head.jelly&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;optional=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;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;simplepagedecorator-custom-implementations&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#simplepagedecorator-custom-implementations&quot; /&gt;SimplePageDecorator - custom implementations&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&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;
Have a look at &lt;a href=&quot;https://plugins.jenkins.io/login-theme&quot;&gt;Login Theme Plugin&lt;/a&gt;, which allows you to
configure your own custom content to be injected into the new login/sign-up page.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To allow easy customisation the decorator only implements one instance by the principal &quot;first-come-first-serve&quot;.
If jenkins finds an extension of the &lt;code&gt;SimplePageDecorator&lt;/code&gt; it will use the Jelly files provided by that plugin.
Otherwise Jenkins will fall back to the default implementation.&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;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@Extension&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MySimplePageDecorator&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SimplePageDecorator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getProductName&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;MyJenkins&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;/code&gt;&lt;/pre&gt;
&lt;/div&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;
The above will take override over the default because the default implementation has a very low ordinal (&lt;code&gt;@Extension(ordinal=-9999)&lt;/code&gt;)
If you have competing plugins implementing &lt;code&gt;SimplePageDecorator&lt;/code&gt;, the implementation with the highest ordinal will be used.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a simple example, to customize the logo we display in the login page, create a &lt;code&gt;simple-head.jelly&lt;/code&gt; with the following content:&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;html&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${resURL}/css/simple-page.css&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/css&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${resURL}/css/simple-page.theme.css&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/css&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;.simple-page&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;.logo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;background-image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;url(&#39;${resURL}/plugin/YOUR_PLUGIN/icons/my.svg&#39;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;background-repeat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;no-repeat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;background-position&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;50%&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;130px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${resURL}/css/simple-page-forms.css&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/css&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;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;To customize the login page further, create a &lt;code&gt;simple-header.jelly&lt;/code&gt; like 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;html&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;loginIntro&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;logo&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;h1&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;productName&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Welcome to ${it.productName}!&lt;span class=&quot;nt&quot;&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;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;For example, I used this technique to create a prototype of a login page for a CloudBees product I am working on:&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/2018-06-27-JENKINS-50447/JENKINS-50447_7.png&quot; alt=&quot;JENKINS 50447 7&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;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;We hope you like the recent changes to some core pages and as well the new design and UX. We further hope you feel enabled to
customize the look and feel to adopt your needs with the &lt;code&gt;SimplePageDecorator&lt;/code&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/06/27/lessons-java10-hackathon/</id>
<title>What I learned from the Jenkins &amp; Java 10+ Hackathon</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/27/lessons-java10-hackathon/" />
<author>
<name>tracymiranda</name>
</author>
<category term='events'></category>
<category term='community'></category>
<category term='developer'></category>
<category term='java10'></category>
<category term='java11'></category>
<summary>
Last week I participated in the
Jenkins &amp; Java 10 Online Hackathon.
It was my first Jenkins hackathon and I roped in
Jonah Graham to do some pair-programming.
The hackathon featured JDK Project Jigsaw committers Mandy Chung and Paul Sandoz,
as well as Jenkins creator Kohsuke Kawaguchi.
It was a great opportunity for me to learn a lot about Jenkins and Java 10.


Why Java 10?

With the
Java 8 EoL data looming,
the focus was on the current available version of Java, Java 10.
Java 10 offers some nice new features and APIs, not least
improved docker container integration.
We learned from Paul of a number of projects with Java 10 migration...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week I participated in the
&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/08/jenkins-java10-hackathon/&quot;&gt;Jenkins &amp;amp; Java 10 Online Hackathon&lt;/a&gt;.
It was my first Jenkins hackathon and I roped in
&lt;a href=&quot;https://github.com/jonahgraham&quot;&gt;Jonah Graham&lt;/a&gt; to do some pair-programming.
The hackathon featured JDK Project Jigsaw committers Mandy Chung and Paul Sandoz,
as well as Jenkins creator Kohsuke Kawaguchi.
It was a great opportunity for me to learn a lot about Jenkins and Java 10.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-java-10&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-java-10&quot; /&gt;Why Java 10?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the
&lt;a href=&quot;https://www.oracle.com/technetwork/java/eol-135779.html&quot;&gt;Java 8 EoL data looming&lt;/a&gt;,
the focus was on the current available version of Java, Java 10.
Java 10 offers some nice new features and APIs, not least
&lt;a href=&quot;https://blog.docker.com/2018/04/improved-docker-container-integration-with-java-10/&quot;&gt;improved docker container integration&lt;/a&gt;.
We learned from Paul of a number of projects with Java 10 migration success stories including Elasticsearch, Kafka &amp;amp; Netty.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the beginning of the hackathon week, the Jenkins Pipeline feature would crash out when using Java 10.
This was resolved with a number of fixes including the upgrade of the
&lt;a href=&quot;https://asm.ow2.io/&quot;&gt;ASM library&lt;/a&gt;.
Then it was nice to see things
&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/19/jenkins-java10-hackathon-day2/&quot;&gt;up and running with Java 10&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;getting-up-running&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-up-running&quot; /&gt;Getting up &amp;amp; running&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first steps were to do some exploratory testing using
&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/17/running-jenkins-with-java10-11&quot;&gt;Jenkins with Java 10 via Docker&lt;/a&gt;, thanks to
&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg&lt;/a&gt; for providing clear instructions.
This was boringly straightforward as most things worked and we only found one
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/52069&quot;&gt;issue&lt;/a&gt; to report.
Next to try to get some patches in, we needed to set-up a dev environment.
The live session gave us what we needed to set up a
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+tutorial&quot;&gt;plugin&lt;/a&gt; or
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/CONTRIBUTING.md&quot;&gt;core&lt;/a&gt; dev environment.
One open question we had was whether Jenkins has semantic versioning and
&lt;a href=&quot;https://help.eclipse.org/oxygen/index.jsp?topic=%2Forg.eclipse.pde.doc.user%2Ftasks%2Fapi_tooling_setup.htm&quot;&gt;API tools&lt;/a&gt;
to help identify when you might be breaking backwards compatibility.
Overall it was straightforward to get a dev environment up and running.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;java-10-new-apis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-10-new-apis&quot; /&gt;Java 10 New APIs&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next step was to find an issue which we could help resolve.
Many of the Java 10 issues were related to &#39;Illegal reflective access&#39; from various plugins or third-party libraries.
However after investigating a couple, removing these warnings required a good architectural knowledge of the plugin or core code itself.
In the end we decided that messing around with classloaders or attempting to upgrade version of jdom was not one for the newbies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead we looked at
&lt;a href=&quot;https://github.com/jenkinsci/parameterized-scheduler-plugin/pull/10&quot;&gt;removing reflection&lt;/a&gt;
in cases of isAccessible calls.
We found the
&lt;a href=&quot;https://www.javaworld.com/article/3176874/java-language/java-9s-other-new-enhancements-part-3.html&quot;&gt;&lt;code&gt;ProcessHandle&lt;/code&gt;&lt;/a&gt;
api very useful and a good replacement for some misuse of reflection, and even better it made the code work on Windows too.
Mandy also pointed us to look at the
&lt;a href=&quot;https://docs.oracle.com/javase/9/docs/api/java/lang/invoke/MethodHandles.Lookup.html&quot;&gt;&lt;code&gt;Lookup&lt;/code&gt; api&lt;/a&gt;
as possible alternate to findClass calls.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;multi-release-jar-builds&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#multi-release-jar-builds&quot; /&gt;Multi-Release JAR Builds&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using new APIs is all well and good but presents a problem when you want to maintain backwards compatibility with Java 8.
Hence the need for some sort of multi-jar solution -
&lt;a href=&quot;https://github.com/ndeloof&quot;&gt;Nicolas De loof&lt;/a&gt; proposed one such solution for
&lt;a href=&quot;https://blog.loof.fr/2018/06/multi-release-jar-with-maven.html&quot;&gt;multi-release jars with Maven&lt;/a&gt; for this case.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;sun-misc-signal&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sun-misc-signal&quot; /&gt;sun.misc.Signal&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Java Signal API is being deprecated, but so far &lt;a href=&quot;https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool&quot;&gt;no replacement APIs&lt;/a&gt;
are available for signal handling.
Jenkins makes use of the Signal APIs so a big question for the Jigsaw team was whether this would be replaced going forward.
Kohsuke pointed out how it is important for Java to maintain this UNIX like behaviour as it shouldn’t matter to end users that Jenkins is written in Java.
It seems these APIs will be replaced in due course, they just
&lt;a href=&quot;https://bugs.openjdk.java.net/browse/JDK-8087286&quot;&gt;aren’t there right now&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;collaboration-collaboration-collaboration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#collaboration-collaboration-collaboration&quot; /&gt;Collaboration, Collaboration, Collaboration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was great to have the discussions with the Jigsaw team.
They reminded us how they need to know the Java use cases out there and how their team uses these to feed into their development process.
In turn, the hackathon had Jenkins community members participate, for instance
&lt;a href=&quot;https://github.com/gmacario/easy-jenkins&quot;&gt;easy-jenkins&lt;/a&gt; was up and running with Java 10 by the end of the week.
The hackathon had a great feeling of community spirit and was a reminder why collaborations with communities and also between different communities can be powerful and fun for all involved.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the end of the week Jonah and I were both happy that we made our first Jenkins contributions (which were reviewed and merged quickly).
Thanks to all who participated and made it highly enjoyable, especially Oleg for great organization.
I look forward to the next one!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/06/26/jenkins-essentials-at-eclipsecon-france/</id>
<title>Presenting Jenkins Essentials at EclipseCon France</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/26/jenkins-essentials-at-eclipsecon-france/" />
<author>
<name>rtyler</name>
</author>
<category term='jenkinsevergreen'></category>
<category term='evergreen'></category>
<summary>
Jenkins Essentials has been renamed to Jenkins Evergreen since this was written.





It&#8217;s been far too long since we posted an update on
Jenkins Essentials. While it&#8217;s not
quite ready for users to start trying it out, we
continue hacking away on all
manner of changes to support the safe and automatic upgrades of a running
Jenkins environment. In the meantime, Jenkins contributor
Baptiste Mathus took some time to introduce and
demonstrate Jenkins Essentials at the recently held
EclipseCon France,





From the talk&#8217;s abstract:


The Jenkins Project is working on providing its users with a brand new,
strongly opinionated, and continuously delivered distribution of Jenkins:
Jenkins Essentials. Constantly self-updating, including auto-rollback, with
an aggressive...
</summary>
<content type='html'>
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;em&gt;Jenkins Essentials&lt;/em&gt; has been renamed to &lt;em&gt;Jenkins &lt;strong&gt;Evergreen&lt;/strong&gt;&lt;/em&gt; since this was written.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been far too long since we posted an update on
&lt;a href=&quot;https://www.jenkins.io/blog/2018/04/06/jenkins-essentials/&quot;&gt;Jenkins Essentials&lt;/a&gt;. While it’s not
quite ready for users to start trying it out, we
continue &lt;a href=&quot;https://github.com/jenkins-infra/evergreen&quot;&gt;hacking away&lt;/a&gt; on all
manner of changes to support the safe and automatic upgrades of a running
Jenkins environment. In the meantime, Jenkins contributor
&lt;a href=&quot;https://github.com/batmat&quot;&gt;Baptiste Mathus&lt;/a&gt; took some time to introduce and
&lt;em&gt;demonstrate&lt;/em&gt; Jenkins Essentials at the recently held
&lt;a href=&quot;https://www.eclipsecon.org&quot;&gt;EclipseCon&lt;/a&gt; France,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/logos/magician/256.png&quot; alt=&quot;Jenkins Essentials&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the talk’s abstract:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;The Jenkins Project is working on providing its users with a brand new,
strongly opinionated, and continuously delivered distribution of Jenkins:
Jenkins Essentials. Constantly self-updating, including auto-rollback, with
an aggressive subset of verified plugins.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;In this talk, we will detail how this works: how we run and upgrade Jenkins
itself. How instances are continuously sending health data back to help
automated decision-making about the quality of given new release, and decide to
generalize a given version of Jenkins to the whole fleet, or roll it back.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;We will end giving an overview of the status of the project: how it’s managed
in a fully open manner, from design to code and its infrastructure, and all the
radical solutions to imagine and the upcoming challenges for the next months.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope you enjoy the video&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/RmngK8tc-94?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can learn more about Jenkins Essentials from
&lt;a href=&quot;https://github.com/jenkins-infra/evergreen&quot;&gt;GitHub repository&lt;/a&gt;, or join us
on our
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkins-infra_evergreen:gitter.im&quot;&gt;Gitter channel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/06/21/jenkins-x-devpods/</id>
<title>Using Jenkins X DevPods for development</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/21/jenkins-x-devpods/" />
<author>
<name>michaelneale</name>
</author>
<category term='jenkinsx'></category>
<category term='developer'></category>
<summary>
I use macOS day to day, and often struggle to keep my devtools up to date.
This isn&#8217;t any fault of packaging or tools, more just that I get tired of seeing the beachball:





The demands on dev machines grow, developers are now working across a more diverse
set of technologies than just a JVM or a single scripting language these days.


This keeping up to date is a drag on time (and thus money).
There are lots of costs involved with development, and I
have written about
about the machine cost for development (how using something like GKE can be much
cheaper than buying a new machine)...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I use macOS day to day, and often struggle to keep my devtools up to date.
This isn’t any fault of packaging or tools, more just that I get tired of seeing the beachball:&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/2018-06-21-devpods/beachball.png&quot; alt=&quot;beachball&quot; title=&quot;beachball&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The demands on dev machines grow, developers are now working across a more diverse
set of technologies than just a JVM or a single scripting language these days.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This keeping up to date is a drag on time (and thus money).
There are lots of costs involved with development, and I
&lt;a href=&quot;https://www.cloudbees.com/blog/dont-install-kubernetes&quot;&gt;have written about&lt;/a&gt;
about the machine cost for development (how using something like GKE can be much
cheaper than buying a new machine) but there is also the cost of a developer’s time.
Thankfully, there are ways to apply the same smarts here to save time as well as money.
 And time is money, or money is time?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Given all the work done in automating the detection and installation of required
tools, environments, and libraries that goes on when you run ‘jx import’ in
&lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt;,
it makes sense to also make those available for development time,
and the concept of “DevPods” was born.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;The &lt;code&gt;pod&lt;/code&gt; part of the name comes from the Kubernetes concept of pods (but you don’t have to know about Kubernetes or pods to use Jenkins X. There is a lot to Kubernetes but Jenkins X aims to provide a developer experience that doesn’t require you to understand it).&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why not use Jenkins X from code editing all the way to production,
before you even commit the code or open a pull request?
All the tools are there, all the environments are there, ready to use (as they are used at CI time!).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This rounds out the picture: Jenkins X aims to deal with the whole lifecycle for you,
from ideas/issues, change requests, testing, CI/CD, security and compliance verification,
rollout and monitoring. So it totally makes sense to include the actual dev time tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have an existing project, you can create a DevPod by running (with the jx 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;bash&quot;&gt;jx create devpod&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will &lt;em&gt;detect&lt;/em&gt; what type of project is (using build packs) and create a DevPod
for you with all the tools pre-installed and ready to go.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Obviously, at this point you want to be able to make changes to your app and try it out.
Either run unit tests in the DevPod, or perhaps see some dev version of the app running in your browser (if it is a web app).
Web-based code editors have been a holy grail for some time, but never have quite taken off in the mainstream of developers (despite there being excellent ones out there, most developers prefer to develop on their desktop).
Ironically, the current crop of popular editors are based around
&lt;a href=&quot;https://github.com/electron/electron&quot;&gt;“electron”&lt;/a&gt; which is actually a web technology stack,
but it runs locally (Visual Studio Code is my personal favourite at the moment),
in fact Visual Studio Code has a Jenkins X extension (but you don’t have to use it):&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/2018-06-21-devpods/jx-tools.png&quot; alt=&quot;jx tools&quot; title=&quot;jx tools&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To get your changes up to the Dev Pod, in a fresh shell run (and leave it running):&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;jx &lt;span class=&quot;nb&quot;&gt;sync&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 will watch for any changes locally (say you want to edit files locally on your desktop)
and sync them to the Dev Pod.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, you can have the Dev Pod automatically deploy an “edit” version of the
app on every single change you make in your editor:&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;jx create devpod &lt;span class=&quot;nt&quot;&gt;--sync&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--reuse&lt;/span&gt;
./watch.sh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first command will create or reuse an existing Dev Pod and open a shell to it,
then the &lt;em&gt;watch&lt;/em&gt; command will pick up any changes, and deploy them to your “edit” app.
You can keep this open in your browser, make a change, and just refresh it.
You don’t need to run any dev tools locally, or any manual commands in the Dev Pod to do this, it takes care of that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can have many DevPods running (jx get devpods), and you could stop them at the end of the day (jx delete devpod), start them at the beginning, if you like (or as I say: keep them running in the hours between coffee and beer). A pod uses resources on your cluster, and as the Jenkins X project fleshes out its support for dev tools (via things like VS Code extensions) you can expect even these few steps to be automated away in the near future, so many of the above instructions will not be needed!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;end-to-end-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#end-to-end-experience&quot; /&gt;End-to-end experience&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So bringing it all together, let me show a very wide (you may need to zoom out) screen shot of this workflow:&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/2018-06-21-devpods/end-end.png&quot; alt=&quot;end end&quot; title=&quot;end to end&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From &lt;code&gt;Left&lt;/code&gt; to &lt;code&gt;Right&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I have my editor (if you look closely, you can see the Jenkins X extension showing the state of apps,
pipelines and the environments it is deployed to).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the middle I have jx sync running, pushing changes up to the cloud from the editor,
and also the ‘watch’ script running in the DevPod. This means every change I make in my editor,
a temporary version of the app (and its dependencies are deployed).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the right is my browser open to the “edit” version of the app.
Jenkins X automatically creates an “edit” environment for live changes,
so if I make a change to my source on the left, the code is synced,
build/tested and updated so I can see the change on the right
(but I didn’t build anything locally, it all happens in the DevPod on Jenkins X).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;On visual studio code: The Jenkins X extension for visual studio code can automate the creation of devpods and syncing for you. Expect richer support soon for this editor and others.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;explaining-things-with-pictures&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#explaining-things-with-pictures&quot; /&gt;Explaining things with pictures&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To give a big picture of how this hangs together:&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/2018-06-21-devpods/picture.png&quot; alt=&quot;picture&quot; title=&quot;big picture&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my example, GitHub is still involved, but I don’t push any changes back to it until I am happy with the state of my “edit app” and changes.
I run the editor on my local workstation and jx takes care of the rest.
This gives a tight feedback loop for changes. Of course, you can use any editor you like,
and build and test changes locally (there is no requirement to use DevPods to make use of Jenkins X).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X comes with some ready to go environments: development, staging and production (you can add more if you like).
These are implemented as Kubernetes namespaces to avoid the wrong app things talking to the wrong place.
The development environment is where the dev tools live: and this is also where the DevPods can live!
This makes sense as all the tools are available, and saves the hassle of you having slightly different
versions of tools on your local workstation than what you are using in your pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;DevPods are an interesting idea, and at the very least a cool name!
There will be many more improvements/enhancements in this area, so keep an eye out for them.
They are a work in progress, so do check the documentation page for better ways to use them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some more reading:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docs on &lt;a href=&quot;https://jenkins-x.io/developing/devpods/&quot;&gt;DevPods&lt;/a&gt; on jenkins-x.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkins-x/vscode-jx-tools&quot;&gt;Visual Studio Code extension&lt;/a&gt;
for Jenkins X (what a different world: an open source editor by Microsoft!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;James Strachan’s &lt;a href=&quot;https://jenkins-x.io/demos/devoxx-uk-2018/&quot;&gt;great intro&lt;/a&gt;
to Jenkins X talk at Devoxx-UK also   includes a DevPod demo&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/2018/06/20/anchore-image-scanning/</id>
<title>Securing your Jenkins CI/CD Container Pipeline with Anchore (in under 10 minutes)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/20/anchore-image-scanning/" />
<author>
<name>michaelneale</name>
</author>
<category term='community'></category>
<category term='developer'></category>
<category term='security'></category>
<summary>
(adapted from this blog post by Daniel Nurmi)


As more and more Jenkins users ship docker containers, it is worth thinking about the security implications of this model, where the variance in software being included by developers has increased dramatically from previous models. Security implications in this context include what makes up the image, but also the components of the app that get bundled into your image. Docker images are increasingly becoming a “unit of deployment”, and if you look at a typical app (especially if it is a microservice), much of the components, libraries, and system are someone else’s code.


Anchore...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(adapted from this &lt;a href=&quot;https://anchore.com/blog/securing-jenkins-cicd-container-pipeline-anchore-10-minutes/&quot;&gt;blog post&lt;/a&gt; by Daniel Nurmi)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As more and more Jenkins users ship docker containers, it is worth thinking about the security implications of this model, where the variance in software being included by developers has increased dramatically from previous models. Security implications in this context include what makes up the image, but also the components of the app that get bundled into your image. Docker images are increasingly becoming a “unit of deployment”, and if you look at a typical app (especially if it is a microservice), much of the components, libraries, and system are someone else’s code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/anchore/anchore-engine&quot;&gt;Anchore&lt;/a&gt; exists to provide technology to act as a last line of defense, verifying the contents of these new deployable units against user specified policies to enforce security and compliance requirements. In this blog you will get a quick tour of this capability, and how to add the open-source Anchore Engine API service into your pipeline to validate that the flow of images you are shipping comply with your specific requirements, from a security point of view.&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/2018-06-15-anchore/anchore-pipeline.png&quot; alt=&quot;anchore pipeline&quot; width=&quot;350&quot; title=&quot;Sample Failure&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Key among the fundamental tenets of agile development is the notion of “fail fast, fail often”, which is where CI/CD comes in: A developer commits code into the source code repository, such as git, that automatically triggers Jenkins to perform a build of the application that is then run through automated tests. If these tests fail the developer is notified immediately and can quickly correct the code. This level of automation increases the overall quality of code and speeds development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While some may feel that “fail fast” sounds rather negative (especially regarding security), you could better describe this process as “learn fast” as mistakes are found earlier in the development cycle and can be easily corrected. The increased use of CI/CD platforms such as Jenkins has helped to improve the efficiency of development teams and streamlined the testing process. We can leverage the same CI/CD infrastructure to improve the security of our container deployments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For many organizations the last step before deploying an application is for the security team to perform an audit. This may entail scanning the image for vulnerable software components (like outdated packages that contain known security vulnerabilities) and verifying that the applications and OS are correctly configured. They may also check that the organization’s best practices and compliance policies have been correctly implemented.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this post we walk through adding security and compliance checking into the CI/CD process so you can “learn fast” and correct any security or compliance issues early in the development cycle. This document will outline the steps to deploy Anchore’s open source security and compliance scanning engine with Jenkins to add analytics, compliance and governance to your CI/CD pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anchore has been designed to plug seamlessly into the CI/CD workflow, where a developer commits code into the source code management system, which then triggers Jenkins to start a build that creates a container image. In the typical workflow this container image is then run through automated testing. If an image does not meet your organization’s requirements for security or compliance then it makes little sense to invest the time required to perform automated tests on the image, it would be better to “learn fast” by failing the build and returning the appropriate reports back to the developer to allow the issue to be addressed.&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/2018-06-15-anchore/anchore-flow.png&quot; alt=&quot;anchore flow&quot; width=&quot;600&quot; title=&quot;Anchore process&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anchore has published a &lt;a href=&quot;https://plugins.jenkins.io/anchore-container-scanner&quot;&gt;plugin&lt;/a&gt; for Jenkins which, along with Anchore’s open source engine or Enterprise offering, allows container analysis and governance to be added quickly into the CI/CD process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;requirements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#requirements&quot; /&gt;Requirements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This guide presumes the following prerequisites have been met:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins 2.x installed and running on a virtual machine or physical server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Anchore-Engine installed and running, with accessible engine API URL (later referred to as &amp;lt;anchore_url&amp;gt;) and credentials (later referred to as &amp;lt;anchore_user&amp;gt; and &amp;lt;anchore_pass&amp;gt;) available - see &lt;a href=&quot;https://anchore.freshdesk.com/support/home&quot;&gt;Anchore Engine overview and installation&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;Anchore’s Jenkins plugin can work with single node installations or installations with multiple worker nodes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-1-install-the-anchore-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-1-install-the-anchore-plugin&quot; /&gt;Step 1: Install the Anchore plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Anchore plugin has been published in the Jenkins plugin registry and is available for installation on any Jenkins server. From the main Jenkins menu select &lt;em&gt;Manage Jenkins&lt;/em&gt;, then &lt;em&gt;Manage Plugins&lt;/em&gt;, select the Available tab, select and install &lt;em&gt;Anchore Container Image Scanner&lt;/em&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/2018-06-15-anchore/installing.png&quot; alt=&quot;installing&quot; width=&quot;500&quot; title=&quot;installation&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-2-configure-anchore-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-2-configure-anchore-plugin&quot; /&gt;Step 2: Configure Anchore Plugin.&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the Anchore Container Image Scanner plugin is installed - select &lt;em&gt;Manage Jenkins&lt;/em&gt; menu click &lt;em&gt;Configure System&lt;/em&gt;, and locate the &lt;em&gt;Anchore Configuration&lt;/em&gt; section.  Select and enter the following parameters in this section:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Click Enable Anchore Scanning&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select Engine Mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter your &amp;lt;anchore_url&amp;gt; in the Engine URL text box - for example: &lt;a href=&quot;http://your-anchore-engine.com:8228/v1&quot; class=&quot;bare&quot;&gt;http://your-anchore-engine.com:8228/v1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enter your &amp;lt;anchore_user&amp;gt; and &amp;lt;anchore_pass&amp;gt; in the Engine Username and Engine Password fields, respectively&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click Save&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An example of a filled out configuration section is below, where we’ve used “http://192.168.1.3:8228/v1” as &amp;lt;anchore_url&amp;gt;, “admin” as &amp;lt;anchore_user&amp;gt; and “foobar” as &amp;lt;anchore_pass&amp;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/2018-06-15-anchore/config.png&quot; alt=&quot;config&quot; width=&quot;500&quot; title=&quot;configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this point the Anchore plugin is configured on Jenkins, and is available to be accessed by any project to perform Anchore security and policy checks as part of your container image build pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-3-add-anchore-image-scanning-to-a-pipeline-build&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-3-add-anchore-image-scanning-to-a-pipeline-build&quot; /&gt;Step 3: Add Anchore image scanning to a pipeline build.&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Pipeline model the entire build process is defined as code. This code can be created, edited and managed in the same way as any other artifact of your software project, or input via the Jenkins UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline builds can be more complex including forks/joins and parallelism. The pipeline is more resilient and can survive the controller node failure and restarts. To add an Anchore scan you need to add a simple code snippet to any existing pipeline code that first builds an image and pushes it to a docker registry. Once the image is available in a registry accessible by your installed Anchore Engine, a pipeline script will instruct the Anchore plugin to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Send an API call to the Anchore Engine to add the image for analysis&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait for analysis of the image to complete by polling the engine&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Send an API call to the Anchore Engine service to perform a policy evaluation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Retrieve the evaluation result and potentially fail the build if the plugin is configured to fail the build on policy evaluation STOP result (by default it will)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide a report of the policy evaluation for review&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below is an example end-to-end script that will make a Dockerfile, use the docker plugin to build and push the a docker container image to dockerhub, perform an Anchore image analysis on the image and the result, and cleanup the built container.  In this example, we’re using a pre-configured &lt;code&gt;docker-exampleuser&lt;/code&gt; named dockerhub credential for dockerhub access, and &lt;code&gt;exampleuser/examplerepo:latest&lt;/code&gt; as the image to build and push.  These values would need to be changed to reflect your own local settings, or you can use the below example to extract the &lt;code&gt;analyze&lt;/code&gt; stage to integrate an anchore scan into any pre-existing pipeline script, any time after a container image is built and is available in a docker registry that your anchore-engine service can access.&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;pipeline {
    agent any
    stages {
        stage(&#39;build&#39;) {
            steps {
                sh&#39;&#39;&#39;
                    echo &#39;FROM debian:latest’ &amp;gt; Dockerfile
                    echo ‘CMD [&quot;/bin/echo&quot;, &quot;HELLO WORLD....&quot;]&#39; &amp;gt;&amp;gt; Dockerfile
                &#39;&#39;&#39;
                script {
                    docker.withRegistry(&#39;https://index.docker.io/v1/&#39;, &#39;docker-exampleuser&#39;) {
                        def image = docker.build(&#39;exampleuser/examplerepo:latest&#39;)
                        image.push()
                    }
                }
            }
        }
        stage(&#39;analyze&#39;) {
            steps {
                sh &#39;echo &quot;docker.io/exampleuser/examplerepo:latest `pwd`/Dockerfile&quot; &amp;gt; anchore_images&#39;
                anchore name: &#39;anchore_images&#39;
            }
        }
        stage(&#39;teardown&#39;) {
            steps {
                sh&#39;&#39;&#39;
                    for i in `cat anchore_images | awk &#39;{print $1}&#39;`;do docker rmi $i; done
                &#39;&#39;&#39;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This code snippet writes out the anchore_images file that is read by the plugin to determine which image is to be added to Anchore Engine for scanning.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This code snippet can be crafted by hand or built using the Jenkins UI, for any &lt;em&gt;Pipeline&lt;/em&gt; project. In the project configuration, select &lt;em&gt;Pipeline Syntax&lt;/em&gt; from the Project.&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/2018-06-15-anchore/pipe1.png&quot; alt=&quot;pipe1&quot; width=&quot;600&quot; title=&quot;pipe editor&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will launch the &lt;em&gt;Snippet Generator&lt;/em&gt; where you can enter the available plugin parameters and press the &lt;em&gt;Generate Pipeline Script&lt;/em&gt; button which will produce a snippet that you can use as a starting point.&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/2018-06-15-anchore/snippet.png&quot; alt=&quot;snippet&quot; width=&quot;600&quot; title=&quot;snippet&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using our example from above, next we save the project:&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/2018-06-15-anchore/pipe2.png&quot; alt=&quot;pipe2&quot; width=&quot;600&quot; title=&quot;pipeline script&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that once you are happy with your script, you could also check it into a &lt;code&gt;Jenkinsfile&lt;/code&gt;, alongside the source code.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;step-4-run-the-build-and-review-the-results&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-4-run-the-build-and-review-the-results&quot; /&gt;Step 4: Run the build and review the results.&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, we run the build, which will generate a report.  In the below screenshots, we’ve scanned the image &lt;code&gt;docker.io/library/debian:latest&lt;/code&gt; to demonstrate some example results.  Once the build completes, the final build report will have some links that will take you to a page that describes the result of the Anchore Engine policy evaluation and security scan:&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/2018-06-15-anchore/result.png&quot; alt=&quot;result&quot; width=&quot;500&quot; title=&quot;result&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this case, since we left the &lt;em&gt;Fail build on policy STOP&lt;/em&gt; result as its default (True), the build has failed due to anchore-engine reporting a policy violation.  In order to see the results, click the &lt;em&gt;Anchore Report (STOP)&lt;/em&gt; link:&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/2018-06-15-anchore/report.png&quot; alt=&quot;report&quot; width=&quot;500&quot; title=&quot;report&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here, we can see that there is a single policy check that has generated a ‘STOP’ action, which triggered due to a high severity vulnerability being found against a package installed in the image.  If there were only ‘WARN’ or ‘GO‘ check results here, they would also be displayed, but the build would have succeeded.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the combination of Jenkins pipeline project capabilities, plus the Anchore scanner plugin, it’s quick and easy to add container image security scanning and policy checking to your Jenkins project.  In this example, we provide the mechanism for adding scanning to a Jenkins pipeline project using a simple policy that is doing an OS package vulnerability scan, but there are many more policy options that can be configured and loaded into Anchore Engine ranging from security checks to your own site-specific best practice checks (software licenses, package whitelist/blacklist, dockerfile checks, and many more).  For more information about the breadth of Anchore policies, you can find information about Anchore Engine configuration and usage &lt;a href=&quot;https://anchore.freshdesk.com/support/home&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information on Jenkins Pipelines and Anchore Engine, check out the following information sources:&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://anchore.com/&quot; class=&quot;bare&quot;&gt;https://anchore.com/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://anchore.com/opensource/&quot; class=&quot;bare&quot;&gt;https://anchore.com/opensource/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/anchore/anchore-engine&quot; class=&quot;bare&quot;&gt;https://github.com/anchore/anchore-engine&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://anchore.freshdesk.com/support/home&quot; class=&quot;bare&quot;&gt;https://anchore.freshdesk.com/support/home&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://anchore.com/opensource/#slack&quot;&gt;Chat on Anchore open source slack&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/06/19/jenkins-java10-hackathon-day2/</id>
<title>Jenkins &amp; Java 10+ Online Hackathon. Day 2 Update</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/19/jenkins-java10-hackathon-day2/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='events'></category>
<category term='community'></category>
<category term='developer'></category>
<category term='java10'></category>
<category term='java11'></category>
<summary>
This week we have a
Jenkins &amp; Java 10 Online Hackathon.
This is an open online event, where we work together on Jenkins core and plugins in order
to find and fix compatibility issues, share experiences and have some fun.
Everybody is welcome to join, independently of their Jenkins experience and amount of time they have available.


After the kick off on Monday
Jenkins contributors have been working on Java 10 and Java 11 support in Jenkins.
We have already received contributions from 12 hackathon participants, and the number keeps growing.
There are still 3 days ahead, but we have already achieved some important results we want to...
</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/logos/formal/256.png&quot; alt=&quot;Jenkins Java&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week we have a
&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/08/jenkins-java10-hackathon/&quot;&gt;Jenkins &amp;amp; Java 10 Online Hackathon&lt;/a&gt;.
This is an open online event, where we work together on Jenkins core and plugins in order
to find and fix compatibility issues, share experiences and have some fun.
Everybody is welcome to join, independently of their Jenkins experience and amount of time they have available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the &lt;a href=&quot;https://youtu.be/1HrgWs0l0e8&quot;&gt;kick off&lt;/a&gt; on Monday
Jenkins contributors have been working on Java 10 and Java 11 support in Jenkins.
We have already received contributions from 12 hackathon participants, and the number keeps growing.
There are still 3 days ahead, but we have already achieved some important results we want to share.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkins-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-pipeline&quot; /&gt;Jenkins Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of our major efforts over last 2 days was to get Jenkins Pipeline working on
Java 10+.
When the hackathon started Jenkins Pipeline was not working at all,
and it was a major blocker for Java support and for exploratory testing in particular.
We’ve been working together with Sam van Oort and Devin Nusbaum to fix the libraries in
the Jenkins core, Pipeline: Support plugin and Docker packaging.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just to summarize the result of two days in one screenshot…​&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/2018-06-19-java10-hackathon-day-2/successful-pipeline.png&quot; alt=&quot;Successful Pipeline on Java 10&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, we have got it running!
Over two days we have got from the &quot;Pipeline Crashes Immediately&quot;
state to the situation when the most of key Pipeline features are operational,
including Scripted and Declarative Pipeline, Blue Ocean, shared libraries and
dozens of plugins being used in the Jenkins plugin build flow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is still a lot of work to do to get the changes finalized,
but Jenkins Pipeline is available for testing on Java 10 and 11 now.
If you want to try it out, you can use a new &lt;code&gt;jenkins/jenkins-experimental:blueocean-jdk10&lt;/code&gt;
image we have created.
It bundles all the required patches, so you can just run the following command to get started:&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;docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins-experimental:blueocean-jdk10&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to try more complex scenarios, see the
&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/17/running-jenkins-with-java10-11/&quot;&gt;Running Jenkins with Java 10 and 11 blogpost&lt;/a&gt;
and &lt;a href=&quot;https://docs.google.com/document/d/1ed6wFOlq4cWrSL6UkCSzFbaY80AT-sk8ncB4Fz5QXyM/edit#heading=h.8lwu94cr28ig&quot;&gt;List of Required patches&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-else&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-else&quot; /&gt;What else?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although Pipeline is the most visible change,
there are other ongoing activities:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Devin Nusbaum explored plugin startup issues we had with JDK 11ea+17
and confirmed that we need to upgrade our images to JDK 11ea+18&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gianpaolo Macario is working on adopting the Java 10 experimental images in his
&lt;a href=&quot;https://github.com/gmacario/easy-jenkins&quot;&gt;easy-jenkins&lt;/a&gt; project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sam van Oort and Devin Nusbaum are working on getting plugin build and test flows
when using JDK 10 with Maven&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nicolas de Loof is working on cleaning up Illegal reflective access warnings in Jenkins components,
using the new &lt;a href=&quot;https://github.com/ndeloof/fields&quot;&gt;Fields&lt;/a&gt; micro-library&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Olivier Lamy and Nicolas de Loof are updating the
&lt;a href=&quot;https://www.mojohaus.org/animal-sniffer/&quot;&gt;Animal Sniffer&lt;/a&gt; plugin for Maven
to make it compatible with Java 9 and above&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kohsuke Kawaguchi has released a repackaged version of &lt;a href=&quot;https://asm.ow2.io/&quot;&gt;ASM 6.2&lt;/a&gt; we use in the project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Last but not least, Liam Newman and Tracy Miranda helped us a lot to run the meetings
and to get this hackathon organized&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are also other contributors working on exploratory testing and reporting
defects they discover.
See &lt;a href=&quot;https://docs.google.com/document/d/1ed6wFOlq4cWrSL6UkCSzFbaY80AT-sk8ncB4Fz5QXyM/edit#heading=h.g8c0opr42807&quot;&gt;our status doc&lt;/a&gt;
for the full list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s next?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tomorrow we will have 2 sessions:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;At 8AM UTC we will have a sync-up.
According to the requests from hackathon participants, we will have an intro session to Jenkins development for newcomers&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=B65oEsK7gLM&quot;&gt;YouTube link&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At 4PM UTC we will have a meeting with key JDK Project Jigsaw committers&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mark Reinhold, Mandy Chung and Paul Sandoz will join us to talk about
Java 10/11 adoption&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ns5eieSR9WE&quot;&gt;YouTube link&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will also post participant links in &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jenkins:gitter.im&quot;&gt;our Gitter channel&lt;/a&gt;
15 minutes before the meetings.
If you have any questions, please join the meetings or raise questions in the chat during the call.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;can-i-still-join-the-hackathon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#can-i-still-join-the-hackathon&quot; /&gt;Can I still join the hackathon?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, you can!
It is possible to hop in and hop off at any time.
Just respond to the &lt;a href=&quot;https://docs.google.com/forms/d/1ReYyuyCGC0PIz2quh6XehnjpH2K52inx-veHLPlNreE/edit&quot;&gt;registration form&lt;/a&gt;,
join &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_jenkins:gitter.im&quot;&gt;our Gitter channel&lt;/a&gt; and start hacking/testing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also have a number of
&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=labels%20%3D%20java10_hackathon%20and%20labels%20%3D%20newbie-friendly%20and%20assignee%20is%20EMPTY&quot;&gt;newbie-friendly issues&lt;/a&gt;
you can start from.
See our &lt;a href=&quot;https://youtu.be/1HrgWs0l0e8&quot;&gt;Kick-off session&lt;/a&gt; and
&lt;a href=&quot;https://docs.google.com/presentation/d/1w_pp6mFxT-JTOTnhkdIB2NDTOI12sudYWck_o-g1riY/edit&quot;&gt;slides&lt;/a&gt; for quick start guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/FdCvQlscl_I&quot;&gt;Developer mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1ed6wFOlq4cWrSL6UkCSzFbaY80AT-sk8ncB4Fz5QXyM/edit&quot;&gt;Hackathon sync-up document&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/17/running-jenkins-with-java10-11/&quot;&gt;Running Jenkins with Java 10 and 11&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/ru-RU/Jenkins-online-meetup/events/251804751/&quot;&gt;Jenkins Online Meetup page&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/2018/06/18/remoting-over-message-bus/</id>
<title>GSoC Project Intro: Jenkins Remoting over Message Bus/Queue</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/18/remoting-over-message-bus/" />
<author>
<name>pvtuan10</name>
</author>
<category term='plugins'></category>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<category term='remoting'></category>
<summary>
About me

My name is Pham Vu Tuan, I am a final year undergraduate student from Singapore. This is the first time I participate in Google Summer of Code and contribute to an open-source organization. I am very excited to contribute this summer.



Mentors

I have GSoC mentors who help me in this project Oleg Nenashev and Supun Wanniarachchi. Besides that, I also receive great support from developers in remoting project Devin Nusbaum and Jeff Thompson.



Overview

Current versions of Jenkins Remoting are based on the TCP protocol. If it fails, the agent connection and the build fails as well. There are also issues with...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-me&quot; /&gt;About me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My name is Pham Vu Tuan, I am a final year undergraduate student from Singapore. This is the first time I participate in Google Summer of Code and contribute to an open-source organization. I am very excited to contribute this summer.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mentors&quot; /&gt;Mentors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have GSoC mentors who help me in this project &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; and &lt;a href=&quot;https://github.com/Supun94&quot;&gt;Supun Wanniarachchi&lt;/a&gt;. Besides that, I also receive great support from developers in remoting project &lt;a href=&quot;https://github.com/dwnusbaum&quot;&gt;Devin Nusbaum&lt;/a&gt; and &lt;a href=&quot;https://github.com/jeffret-b&quot;&gt;Jeff Thompson&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Current versions of Jenkins Remoting are based on the TCP protocol. If it fails, the agent connection and the build fails as well. There are also issues with traffic prioritization and multi-agent communications, which impact Jenkins stability and scalability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project aims to develop a plugin in order to add support of a popular message queue/bus technology (Kafka) as a fault-tolerant communication layer in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;why-kafka&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-kafka&quot; /&gt;Why Kafka?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When planning for this project, we want to use traditional message queue system such as &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;ActiveMQ&lt;/a&gt; or &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;RabbitMQ&lt;/a&gt;. However, after some discussion, we decided to have a try with &lt;a href=&quot;https://kafka.apache.org/&quot;&gt;Kafka&lt;/a&gt; with more suitable features with this project:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kafka itself is not a queue like ActiveMQ or RabbitMQ, it is a distributed, replicated commit log. This helps to remove message delivery complexity we have in traditional queue system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We need to support data streaming as a requirement, and Kafka is good at this aspect, which RabbitMQ is lack of.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kafka is said to have a better scalability and good support from the development community.&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;current-state&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-state&quot; /&gt;Current State&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project is reaching the end of the first phase and here are things we have achieved so far:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Setup project as a set of Docker Compose components: Kafka cluster, Jenkins controller (with plugin) and a custom agent (JAR).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a PoC with new command transport implementation to support Kafka, which involves of command invocation, RMI, classloading and data streaming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make necessary changes in Remoting and Jenkins core to make them extensible for the use of this project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Decide to use Kafka as a suitable final implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We planned to release an alpha version of this plugin by the end of this phase, but decided to move this release to the second phase because we need to wait for remoting and core patches to be released.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;architecture-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#architecture-overview&quot; /&gt;Architecture Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project consists of multiple components:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kafka Client Library - new command transport implementation, producer and consumer client logic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remoting Kafka Plugin - plugin implementation with KafkaGlobalConfiguration and KafkaComputerLauncher.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remoting Kafka Agent - A custom JAR agent with remoting JAR packaged together with a custom Engine implementation to setup a communication channel with Kafka.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All the components are packaged together with Docker Compose.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The below diagram is the overview of the current architecture:
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/remoting-kafka-intro/remoting-kafka-architecture.png&quot; alt=&quot;remoting kafka architecture&quot; title=&quot;Remoting Kafka Plugin Current Architecture&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this design, controller is not communicating with agent using direct TCP communication anymore, all the communication commands are transferred with Kafka.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#features&quot; /&gt;Features&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;1-kafka-global-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-kafka-global-configuration&quot; /&gt;1. Kafka Global Configuration&lt;/h4&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/remoting-kafka-intro/kafka-global-config.png&quot; alt=&quot;kafka global config&quot; title=&quot;Remoting Kafka Global Configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;2-custom-agent-start-up-as-a-jar&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-custom-agent-start-up-as-a-jar&quot; /&gt;2. Custom agent start up as a JAR&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;User can start running an agent with the following command:
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/remoting-kafka-intro/start-agent.png&quot; alt=&quot;start agent&quot; title=&quot;Command to start an agent&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;3-launch-agents-with-kafka&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-launch-agents-with-kafka&quot; /&gt;3. Launch agents with Kafka&lt;/h4&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/remoting-kafka-intro/launch-agent-kafka.png&quot; alt=&quot;launch agent kafka&quot; title=&quot;Launch agent with Kafka&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;4-commands-transferred-between-controller-and-agent-over-kafka&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#4-commands-transferred-between-controller-and-agent-over-kafka&quot; /&gt;4. Commands transferred between controller and agent over Kafka&lt;/h4&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/remoting-kafka-intro/kafka-commands.png&quot; alt=&quot;kafka commands&quot; title=&quot;controller-agent communication with Kafka&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remoting operations are being executed over Kafka. In the log you may see:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Classloading (Classloader.fetch())&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Log streaming (Pipe.chunk())&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;5-run-jobs-with-remoting-kafka&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#5-run-jobs-with-remoting-kafka&quot; /&gt;5. Run jobs with remoting Kafka&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is possible to run jobs on Agents connected over Kafka
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/remoting-kafka-intro/remoting-kafka-run-job.png&quot; alt=&quot;remoting kafka run job&quot; title=&quot;Job run with Remoting Kafka Plugin&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;next-phase-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-phase-plan&quot; /&gt;Next Phase Plan&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are the tasks planned for the next phase:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Support security for controller-agent connection:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kafka authentication/authorization (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51472&quot;&gt;JENKINS-51472&lt;/a&gt;, &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51473&quot;&gt;JENKINS-51473&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agent secrets (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51470&quot;&gt;JENKINS-51470&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improve Kafka producer-consumer model to ensure reliability (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51942&quot;&gt;JENKINS-51942&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bug fixing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Release alpha version and address feedback (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51713&quot;&gt;JENKINS-51713&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;how-to-run-demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-run-demo&quot; /&gt;How to run demo&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can try to run a demo of the plugin by following the &lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin/#plugin-demo-instructions&quot;&gt;instruction&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_remoting:gitter.im&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/remoting.svg&quot; alt=&quot;title: &amp;quot;Gitter&amp;quot;&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/remoting-kafka-plugin&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/remoting-over-message-bus/&quot;&gt;Project Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/qWHM8S0fzUw&quot;&gt;Phase 1 Presentation Video&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1GxkI17lZYQ6_pyAOR9sXNXq1K3LwkqjigXdxxf81VkE/edit?usp=sharing&quot;&gt;Phase 1 Presentation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&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/2018/06/17/running-jenkins-with-java10-11/</id>
<title>Running Jenkins with Java 10 and 11 (experimental support)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/17/running-jenkins-with-java10-11/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='core'></category>
<category term='developer'></category>
<category term='java10'></category>
<category term='java11'></category>
<summary>
Please refer to Installing Jenkins documentation to have the up-to-date details on how to run Jenkins on Java 11.













Guidelines in this blogpost are rendered obsolete by the Java 11 Support Preview Availability
announcement on Dec 13, 2018 and by the Java 11 GA release on Sep 25, 2018.
Refer to Java support page
for up-to-date information about running Jenkins with Java 11.
The Jenkins project also no longer ships preview versions for Java 10.






As you probably know, we will have a
Jenkins and Java 10+ online hackathon this week.
In order to enable early adopters to try out Jenkins with new Java versions,
we have updated Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please refer to &lt;a href=&quot;https://www.jenkins.io/doc/book/installing/&quot;&gt;Installing Jenkins&lt;/a&gt; documentation to have the up-to-date details on how to run Jenkins on Java 11.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Guidelines in this blogpost are rendered obsolete &lt;a href=&quot;https://www.jenkins.io/blog/2018/12/14/java11-preview-availability/&quot;&gt;by the Java 11 Support Preview Availability
announcement&lt;/a&gt; on Dec 13, 2018 and by the Java 11 GA release on Sep 25, 2018.
Refer to &lt;a href=&quot;https://www.jenkins.io/doc/book/platform-information/support-policy-java/&quot;&gt;Java support page&lt;/a&gt;
for up-to-date information about running Jenkins with Java 11.
The Jenkins project also no longer ships preview versions for Java 10.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you probably know, we will have a
&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/08/jenkins-java10-hackathon/&quot;&gt;Jenkins and Java 10+ online hackathon&lt;/a&gt; this week.
In order to enable early adopters to try out Jenkins with new Java versions,
we have updated Jenkins core and Docker packages.
Starting from &lt;a href=&quot;https://www.jenkins.io/changelog/#v2.127&quot;&gt;Jenkins 2.127&lt;/a&gt;,
weekly releases can be launched with Java 10 and Java 11 (preview).
Although there are some known compatibility issues,
the packages are ready for evaluation and exploratory testing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This article explains how to run Jenkins with Java 10 and 11 using Docker images and WAR files.
It also lists known issues and provides contributor guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;running-in-docker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-in-docker&quot; /&gt;Running in Docker&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to simplify testing, we have created a new
&lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins-experimental/&quot;&gt;jenkins/jenkins-experimental&lt;/a&gt;
repository on DockerHub.
This repository includes various Jenkins Core images, including Java 10 and Java 11 images.
We have also set up development branches and continuous delivery flows for Jenkins core,
so now we can deliver patches for these images without waiting for weekly releases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can run the image simply as:&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;docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins-experimental:latest-jdk11&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following tags are available:&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;2.127-jdk10&lt;/code&gt;, &lt;code&gt;2.128-jdk10&lt;/code&gt; - Weekly releases packaged with Java 10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;2.127-jdk11&lt;/code&gt;, &lt;code&gt;2.128-jdk11&lt;/code&gt; - Weekly releases packaged with Java 11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;latest-jdk10&lt;/code&gt; - Jenkins core build from the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/tree/java10-support&quot;&gt;java10-support&lt;/a&gt; branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;latest-jdk11&lt;/code&gt; - Automatic build from the core’s &lt;a href=&quot;https://github.com/jenkinsci/jenkins/tree/java11-support&quot;&gt;java11-support&lt;/a&gt; branch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;blueocean-jdk10&lt;/code&gt;, &lt;code&gt;blueocean-jdk11&lt;/code&gt; - Experimental build, which bundles all Jenkins Pipeline and
Blue Ocean patches required to run on Java 11.
If you want to try Pipeline, use this image&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 10/11 images are fully compatible with the official
&lt;a href=&quot;https://github.com/jenkinsci/docker/blob/master/README.md&quot;&gt;jenkins/jenkins&lt;/a&gt;
Docker image documentation,
e.g. you can use &lt;code&gt;plugins.txt&lt;/code&gt; to install plugins, mount volumes and pass extra options via environment variables.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;running-jenkins-without-docker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-jenkins-without-docker&quot; /&gt;Running Jenkins without Docker&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;java-10&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-10&quot; /&gt;Java 10&lt;/h4&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Download Jenkins WAR for 2.127 or above
(or build the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/tree/java10-support&quot;&gt;experimental branch&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run WAR with the following command:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JAVA10_HOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/bin/java &lt;span class=&quot;nt&quot;&gt;--add-modules&lt;/span&gt; java.xml.bind &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; jenkins.war &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;--enable-future-java&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--httpPort&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;8080 &lt;span class=&quot;nt&quot;&gt;--prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;java-11&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-11&quot; /&gt;Java 11&lt;/h4&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Download Jenkins WAR for 2.127 or above
(or build the &lt;a href=&quot;https://github.com/jenkinsci/jenkins/tree/java11-support&quot;&gt;experimental branch&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download the following libraries to the same directory as jenkins.war&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://central.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.0/jaxb-api-2.3.0.jar&quot;&gt;jaxb-api-2.3.0.jar&lt;/a&gt; (save as jaxb-api.jar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://central.maven.org/maven2/com/sun/xml/bind/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar&quot;&gt;jaxb-core-2.3.0.1.jar&lt;/a&gt; (save as jaxb-core.jar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://central.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.0.1/jaxb-impl-2.3.0.1.jar&quot;&gt;jaxb-impl-2.3.0.1.jar&lt;/a&gt; (save as jaxb-impl.jar)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/javaee/activation/releases/download/JAF-1_2_0/javax.activation.jar&quot;&gt;javax.activation v.1.2.0&lt;/a&gt;  (save as javax.activation.jar)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the following command:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;Run Jenkins with &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JAVA11_HOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/bin/java &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; jaxb-api.jar:javax.activation.jar &lt;span class=&quot;nt&quot;&gt;--add-modules&lt;/span&gt; java.xml.bind,java.activation &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-cp&lt;/span&gt; jaxb-core.jar:jaxb-impl.jar &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; jenkins.war &lt;span class=&quot;nt&quot;&gt;--enable-future-java&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--httpPort&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;8080 &lt;span class=&quot;nt&quot;&gt;--prefix&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/jenkins&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-state&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-state&quot; /&gt;Current state&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of June 17, we have achieved the following state:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins 2.127+ starts up successfully with
&lt;a href=&quot;https://www.oracle.com/technetwork/java/javase/10-0-1-relnotes-4308875.html&quot;&gt;OpenJDK 10.0.1&lt;/a&gt; and
OpenJDK 11+17-Debian-2 (preview)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is possible to configure and run simple Freestyle jobs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins agents are able to start on Java 10, to connect to the controller and to execute Freestyle jobs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agents can be connected using &lt;a href=&quot;https://plugins.jenkins.io/docker-plugin&quot;&gt;Docker Plugin&lt;/a&gt; and &lt;a href=&quot;https://plugins.jenkins.io/yet-another-docker-plugin&quot;&gt;Yet Another Docker Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/job-dsl&quot;&gt;Job DSL plugin&lt;/a&gt; works well on demo projects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/maven-plugin&quot;&gt;Maven Integration plugin&lt;/a&gt; can build
&lt;a href=&quot;https://github.com/jenkinsci/plugin-pom&quot;&gt;plugin-pom&lt;/a&gt;-based
Jenkins plugins when running on agents with JDK 8&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is possible to create &lt;a href=&quot;https://plugins.jenkins.io/cloudbees-folder&quot;&gt;Folders&lt;/a&gt; and manage items in them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is possible to configure Jenkins using &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Configuration-as-Code plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins is able to execute Groovy scripts in &lt;em&gt;Script Console&lt;/em&gt; and
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Groovy+Hook+Script&quot;&gt;Groovy Hooks&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;known-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#known-issues&quot; /&gt;Known issues&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So far we know about the following issues:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pipeline crashes immediately on Java 10 and 11 (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/46602&quot;&gt;JENKINS-46602&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Workaround: &lt;em&gt;Pipeline: Support&lt;/em&gt; plugin should be updated to version 3.0-java11-alpha-1-rc684.d802f5d9aeed from the Incrementals repo
(&lt;a href=&quot;https://repo.jenkins-ci.org/incrementals/org/jenkins-ci/plugins/workflow/workflow-support/2.19-rc295.e017dc58c0a3/&quot;&gt;download&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FIXED&lt;/strong&gt; - Git Client plugin 2.7.2 cannot be installed when running with Java 11 build 18ea&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are many warnings about Illegal reflective access during execution
(linked in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40689&quot;&gt;JENKINS-40689&lt;/a&gt;).&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In current Java 10 and 11 releases it does not lead to failures,
but we want to cleanup these warnings anyway&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FIXED&lt;/strong&gt; - &lt;a href=&quot;https://github.com/jenkinsci/configuration-as-code-plugin&quot;&gt;Configuration-as-Code plugin&lt;/a&gt; fails to export configurations on Java 10
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51991&quot;&gt;JENKINS-51991&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;We anticipate to discover and report more issues during the hackathon this week.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributing&quot; /&gt;Contributing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you discover incompatibilities in plugins, please
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/How+to+report+an+issue&quot;&gt;report issues in our bugtracker&lt;/a&gt;.
We have &lt;code&gt;java10&lt;/code&gt; and &lt;code&gt;java11&lt;/code&gt; labels for such issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested to try out Jenkins with Java 10 and 11 before June 22nd,
you may be interested to sign-up to the &lt;a href=&quot;https://www.jenkins.io/blog/2018/06/08/jenkins-java10-hackathon/&quot;&gt;Jenkins and Java 10+ online hackathon&lt;/a&gt;.
Everybody is welcome to join, independently of their Jenkins experience and amount of time they have available.
Exploratory testing is also within the hackathon’s scope.
During this event, please also use the &lt;code&gt;java10_hackathon&lt;/code&gt; label.
It will help us to track contributions and send folks some small &quot;thank you&quot; gifts for participating (details will be figured out during the hackathon).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to contribute patches to the core,
please submit pull requests to &lt;a href=&quot;https://github.com/jenkinsci/jenkins/tree/java10-support&quot;&gt;java10-support&lt;/a&gt; or
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/tree/java11-support&quot;&gt;java11-support&lt;/a&gt; branches.
If the patches are compatible with Java 8, we will try to upstream them to weekly releases.
For plugin patches please create pull requests against main branches and then follow guidelines from plugin maintainers.
If you need additional reviews and you are a member of the &lt;code&gt;jenkinsci&lt;/code&gt; organization,
feel free to mention the &lt;code&gt;@jenkinsci/java10-support&lt;/code&gt; team in your PRs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/jenkins/jenkins-experimental/tags/&quot;&gt;Docker: jenkins/jenkins-experimental images&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40689&quot;&gt;JIRA: Java 10 compatibility&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51805&quot;&gt;JIRA: Java 11 compatibility&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/08/jenkins-java10-hackathon/&quot;&gt;Jenkins and Java 10+ online hackathon&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/06/15/simple-pull-request-plugin/</id>
<title>GSoC Project Intro: Pipeline as YAML</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/15/simple-pull-request-plugin/" />
<author>
<name>abhishek_gautam</name>
</author>
<category term='gsoc2018'></category>
<category term='gsoc'></category>
<category term='plugin'></category>
<category term='pipeline'></category>
<category term='yaml'></category>
<summary>
About me

I am Abhishek Gautam, 3rd year student from Visvesvaraya National Institute of
technology, India, Nagpur. I was a member of ACM Chapter and Google student developer club of my
college. I am passionate about automation.



Mentors



Oleg Nenashev (Org Admin)


Martin d&#8217;Anjou


Kristin Whetstone


Jeff Knurek





Project Summary

This is a GSoC 2018 project.


This project aims to develop a pull request Job Plugin. Users should be able to
configure job type using YAML file placed in root directory of the
Git repository being the subject of the pull request. The plugin should interact with various
platforms like Bitbucket, Github, Gitlab, etc whenever a pull request is created or updated.


Plugin detects the...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-me&quot; /&gt;About me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am Abhishek Gautam, 3rd year student from Visvesvaraya National Institute of
technology, India, Nagpur. I was a member of ACM Chapter and Google student developer club of my
college. I am passionate about automation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;mentors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mentors&quot; /&gt;Mentors&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; (Org Admin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kwhetstone&quot;&gt;Kristin Whetstone&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/grandvizier&quot;&gt;Jeff Knurek&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;project-summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-summary&quot; /&gt;Project Summary&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a GSoC 2018 project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project aims to develop a pull request Job Plugin. Users should be able to
configure job type using YAML file placed in root directory of the
Git repository being the subject of the pull request. The plugin should interact with various
platforms like Bitbucket, Github, Gitlab, etc whenever a pull request is created or updated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugin detects the presence of certain types of the report at conventional locations,
and publish them automatically. If the reports are not present at conventional location,
can specify the location using the YAML file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;benefits-to-the-community&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#benefits-to-the-community&quot; /&gt;Benefits to the community&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Project administrators will be able to handle builds for pull requests more easily.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build specifications for pull request can be written in a concise declarative format.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build reports will be automatically published to Github, Bitbucket, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build status updates will be sent to git servers automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Users will not have to deal with pipeline code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If there will be no merge conflicts or build failures, the PR can be merged into target branch.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;prior-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#prior-work&quot; /&gt;Prior work&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot; start=&quot;1&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Jenkinsci/travis-yml-plugin&quot;&gt;Travis YML Plugin&lt;/a&gt;:
Designed to run .travis.yml as Jenkins pipeline job.
Travis-CI does not support external pull requests. Jenkins environment
is different than Travis and does not always make sense to use configurations
defined for other environment in Jenkins. Also maintenance of this is slowed
down and last commit for this plugin was on 14 Nov 2016.
&lt;a href=&quot;https://github.com/Jenkinsci/travis-yml-plugin/commits/master&quot;&gt;Click here&lt;/a&gt; to check.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ndeloof/codeship-plugin&quot;&gt;CodeShip Plugin&lt;/a&gt;:
This plugin is designed to convert codeship &quot;steps.yaml&quot; and
&quot;services.yaml&quot; to scripted pipeline code. This plugin has never been released.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/constantcontact/jenkins_pipeline_builder&quot;&gt;Jenkins pipeline builder&lt;/a&gt;:
This is a external non-Java-based tool, which cannot be easily converted to a Jenkins plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;design&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#design&quot; /&gt;Design&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin will be developed on the top of the MultiBranch Pipeline plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For now the plugin is building branches and Pull request both using Jenkinsfile.yaml,
but this plugin is inclined to use for pull requests. This will be fixed in next coding phase.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin is following below steps for now:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;clone target repo&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;checkout to target branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fetch the source branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;merge source-branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;call user call user script to build the repo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;push changes of pull request to target branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;publish test reports&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugin will start above steps if and only if the pull request is
mergeable, to avoid merge conflicts while merging the source branch to target
branch. Pull request’s payload contains information if the pull request changes
are mergeable or not hence, the pull request is mergebale or not can also be
decided by the payload of webhook also.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-run-the-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-run-the-plugin&quot; /&gt;How to run the Plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;https://github.com/Jenkinsci/simple-pull-request-job-plugin/blob/master/README.md&quot;&gt;How to run the demo&lt;/a&gt;
and set credentials, owner and repository on your own and you will be good to go.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;example-branch-source-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#example-branch-source-configuration&quot; /&gt;Example branch-source configuration.&lt;/h4&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/gsoc-simple-pull-request-plugin/branch-source-configuration.png&quot; alt=&quot;branch source configuration&quot; title=&quot;Jenkinsfile.yaml&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;phase-1-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#phase-1-features&quot; /&gt;Phase 1 features&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Users are able to select the Jenkinsfile.yaml file as the source for the Pipeline configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git Push step&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;harvest results and reports (and post in the pull request)&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;code&gt;junit()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;findbugs()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;archiveArtifacts()&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Basic interface to parse and get build specifications from YAML file.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;things-decided&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#things-decided&quot; /&gt;Things decided&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;To build the plugin on the top of multibranch pipeline plugin. As that plugin has implementation of&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;Nice interface to show different branch and pull requests build separately with use of suitable plugins like Github, Bitbucket.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Detect trusted revisions in a repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Publishing of build status to the repository.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Convert the YAML configuration to declarative pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User will provide path to the script relative to the root directory of the repository
without extension (.sh or .bat) in the YAML file. The plugin will generate pipeline script to detect the
platform and call .sh or .bat script.&lt;/p&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;Example:
  Path provided: ./scripts/hello
  a. On UNIX machine “./scripts/hello.sh” will be called
  b. On non-UNIX machine “./scripts/hello.bat” will be called.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;implementations-till-now&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementations-till-now&quot; /&gt;Implementations till now&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A first prototype of the plugin is ready. It supports all features of Multi-Branch Pipeline and offers the following features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Build description is defined via YAML file stored within the SCM repo. This plugin
will depend on GitHub plugin, Bitbucket plugin, Gitlab plugin if users will be
using respective paltfroms for their repositories.&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;Basic conversion of YAML to Declarative Pipeline: A class YamlToPipeline
is written which will load the &quot;Jenkinsfile.yaml&quot; and make use of PipelineSnippetGenerator class
to generate Declarative pipeline code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reporting of results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin is using Yaml from target branch right now. (Maybe this needs some discussion, example:
what if pull request contains changes in Jenkinsfile.yaml)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git Push step: To push the changes of pull request to the target branch. This is implemented
using git-plugin, PushCommand is used for this from git-plugin. credentialId,
branch name and repository url for intracting with Github, Bitbucket, etc
will be taken automatically from &quot;Branch-Source&quot; (Users have to fill the
details of branch source in job configuration UI). (You can see
&lt;a href=&quot;https://github.com/Jenkinsci/simple-pull-request-job-plugin/blob/master/README.md&quot;&gt;How to run the demo&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkinsfile-yaml-example&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsfile-yaml-example&quot; /&gt;Jenkinsfile.yaml example&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the phase 1 prototype demonstration, the following yaml file was used.
Note that this format is subject to change in the next phases of the project,
as we formalise the yaml format definition.&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;agent&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;dockerImage&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;maven:3.5.3-jdk-8&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;s&quot;&gt;-v /tmp:/tmp&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;testResultPaths&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;s&quot;&gt;target/surefire-reports/*.xml&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;findBugs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;target/*.xml&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;stages&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;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;First&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;scripts&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;s&quot;&gt;./scripts/hello&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Build&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;scripts&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;s&quot;&gt;./scripts/build&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Tests&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;scripts&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;s&quot;&gt;./scripts/test&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;archiveArtifacts&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;s&quot;&gt;Jenkinsfile.yaml&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;scripts/hello.sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;from-the-yaml-file-shown-above-the-plugin-generates-the-following-pipeline-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#from-the-yaml-file-shown-above-the-plugin-generates-the-following-pipeline-code&quot; /&gt;From the yaml file shown above, the plugin generates the following pipeline code:&lt;/h4&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;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;maven:3.5.3-jdk-8&#39;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;-v /tmp:/tmp&#39;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;alwaysPull&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;reuseNode&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;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;First&#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;script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isUnix&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;./scripts/hello.sh&#39;&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;bat&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./scripts/hello.bat&#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;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;Build&#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;script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isUnix&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;./scripts/build.sh&#39;&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;bat&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./scripts/build.bat&#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;pipeline&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;success&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;archiveArtifacts&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;artifacts:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/target/*.jar&#39;&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;archiveArtifacts&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;artifacts:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Jenkinsfile.yaml&#39;&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;archiveArtifacts&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;artifacts:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;scripts/hello.sh&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Tests&#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;script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isUnix&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;./scripts/test.sh&#39;&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;bat&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./scripts/test.bat&#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;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;success&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;target/surefire-reports/*.xml&#39;&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;n&quot;&gt;findbugs&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;pattern:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;target/*.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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;pipeline-view-in-jenkins-instance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-view-in-jenkins-instance&quot; /&gt;Pipeline view in Jenkins instance&lt;/h4&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/gsoc-simple-pull-request-plugin/pipeline-view.png&quot; alt=&quot;pipeline view&quot; title=&quot;Jenkinsfile.yaml&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;coding-phase-2-plans&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coding-phase-2-plans&quot; /&gt;Coding Phase 2 plans&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Decide a proper YAML format to use for Jenkinsfile.yaml&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create Step Configurator for SPRP plugin. &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51637&quot;&gt;Jenkins-51637&lt;/a&gt;.
This will enable users to use Pipeline steps in Jenkinsfile.yaml.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic indentation generation in the generated Pipeline SnipperGenerator class.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write tests for the plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51809&quot;&gt;Jira Epic&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-reach-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-reach-me&quot; /&gt;How to reach me&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Email: &lt;a href=&quot;mailto:gautamabhishek46@gmail.com&quot;&gt;gautamabhishek46@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gitter room: &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_simple-pull-request-job-&quot; class=&quot;bare&quot;&gt;https://app.gitter.im/#/room/#jenkinsci_simple-pull-request-job-&lt;/a&gt;&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot; /&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;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1cuC0AvQG3e4GCjIoCwK3J0tcJVAz1eNDKV8d_zXxlO8/edit&quot;&gt;Initial proposal of the project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Jenkinsci/simple-pull-request-job-plugin&quot;&gt;Project repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/simple-pull-request-job-plugin/&quot;&gt;Project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;link:https://app.gitter.im/#/room/#jenkinsci_simple-pull-request-job-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter chat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20Jenkins%20AND%20component%20%3D%20simple-pull-request-job-plugin&quot;&gt;Bug Tracker&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gautamabhishek46/dummy&quot;&gt;Demo Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=qWHM8S0fzUw&quot;&gt;Phase 1 Presentation video&lt;/a&gt;(June 14, 2018)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1R63XK4Nmd5EBmMdF2rkevV1iZxjTom19XFHdgjY9qeA/edit?usp=sharing&quot;&gt;Phase 1 Presentation Slides&lt;/a&gt;(June 14, 2018)&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/2018/06/13/code-coverage-api-plugin/</id>
<title>GSoC Project Intro: Code Coverage API Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/13/code-coverage-api-plugin/" />
<author>
<name>shenyu_zheng</name>
</author>
<category term='plugins'></category>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<summary>
About me

My name is Shenyu Zheng, and I am an undergraduate student in Computer Science and Technology at Henan University from China.


I am very excited that I can participate in GSoC to work on Code Coverage API plugin with the Jenkins community and to contribute to the open source world. It is my greatest pleasure to write a plugin that many developers will use.


My mentors are Steven Christou, Supun Wanniarachchi, Jeff Pearce and Oleg Nenashev.



Abstract

There are a lot of plugins which currently implement code coverage, however, they all use similar config, charts, and content. So it will be much better...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-me&quot; /&gt;About me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My name is Shenyu Zheng, and I am an undergraduate student in Computer Science and Technology at Henan University from China.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am very excited that I can participate in GSoC to work on Code Coverage API plugin with the Jenkins community and to contribute to the open source world. It is my greatest pleasure to write a plugin that many developers will use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My mentors are &lt;a href=&quot;https://github.com/christ66&quot;&gt;Steven Christou&lt;/a&gt;, &lt;a href=&quot;https://github.com/Supun94&quot;&gt;Supun Wanniarachchi&lt;/a&gt;, &lt;a href=&quot;https://github.com/jeffpearce&quot;&gt;Jeff Pearce&lt;/a&gt; and &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;abstract&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#abstract&quot; /&gt;Abstract&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are a lot of plugins which currently implement code coverage, however, they all use similar config, charts, and content. So it will be much better if we can have an API plugin which does the most repeated work for those plugins and offers a unified APIs which can be consumed by other plugins and external tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This API plugin will mainly do these things:&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;Find coverage reports according to the user’s config.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use adapters to convert reports into the our standard format.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Parse standard format reports, and aggregate them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Show parsed result in a chart.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, we can implement code coverage publishing by simply writing an adapter, and such adapter only needs to do one thing — convert a coverage report into the standard format. The implementation is based on extension points, so new adapters can be created in separate plugins. In order to simplify conversion for XML reports, there is also an abstraction layer which allows creating XSLT-based converters.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-progress-alpha-version&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-progress-alpha-version&quot; /&gt;Current Progress - Alpha Version&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have developed an alpha version for this plugin. It currently integrates two different coverage tools - Cobertura and Jacoco. Also, it implements many basic functionalities like threshold, auto-detect, trend chart and so on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;configuration-page&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-page&quot; /&gt;Configuration Page&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;config plugin&lt;/strong&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-06-13-code-coverage-api-plugin/configuration-page.png&quot; alt=&quot;configuration page&quot; title=&quot;Code Coverage API Plugin Configuration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can input the path pattern for auto detect, so that plugin will automatically find reports and group them using a corresponding converter. That makes config simpler and the user doesn’t need to fully specify the report name. Also, if we want, we can manually specify each coverage report.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also have global and per-report threshold configurations, which makes the plugin more flexible than existing plugins (e.g. global threshold for a multi-language project that has several reports).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;pipeline-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-support&quot; /&gt;Pipeline Support&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to configuring the Code Coverage API plugin from the UI page, we also have pipeline support.&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;publishCoverage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;autoDetectPath:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/*.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;adapters:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jacoco&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;path:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;jacoco.xml&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)],&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;globalThresholds:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;thresholdTarget:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;GROUPS&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unhealthyThreshold:&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;20.0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unstableThreshold:&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.0&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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;report-defects&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#report-defects&quot; /&gt;Report Defects&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we can see in Configuration page, we can set healthy threshold and stable threshold for each metric. The Code Coverage API plugin will report healthy score according to the healthy threshold we set.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;threshold config&lt;/strong&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-06-13-code-coverage-api-plugin/threshold-config.png&quot; alt=&quot;threshold config&quot; title=&quot;Threshold Config&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;result&lt;/strong&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-06-13-code-coverage-api-plugin/health-report.png&quot; alt=&quot;health report&quot; title=&quot;Result&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, we have a group of options which can fail the build if coverage falls below a particular threshold.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;coverage-result-page&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coverage-result-page&quot; /&gt;Coverage Result Page&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The coverage result page now has a modernized UI which shows coverage results more clearly.
The result page includes three parts - Trend chart, Summary chart, Child Summary chart.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;trend-chart&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#trend-chart&quot; /&gt;Trend Chart&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Trend chart, we can see the coverage trend of the selected coverage metrics.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-06-13-code-coverage-api-plugin/trend-chart.gif&quot; alt=&quot;trend chart&quot; title=&quot;Trend Chart&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;summary-chart&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-chart&quot; /&gt;Summary Chart&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the summary chart we can see the coverage summary of current coverage metric.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-06-13-code-coverage-api-plugin/summary-chart.gif&quot; alt=&quot;summary chart&quot; title=&quot;Summary Chart&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;child-summary-chart&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#child-summary-chart&quot; /&gt;Child Summary Chart&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Child summary chart, we can see the coverage summary of each child, also, we can use the range handler to filter item we want to see to reduce the chart size.
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-06-13-code-coverage-api-plugin/child-summary-chart.gif&quot; alt=&quot;child summary chart&quot; title=&quot;Child Summary Chart&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By using those more modernized chart components, we can easily focus on the information we want to know.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;extensibility&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#extensibility&quot; /&gt;Extensibility&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We provide several extension points to make our plugin more extensible and flexible. Also, we have a series of abstract layers to help us implementing these extension points much easier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;coveragereportadapter&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coveragereportadapter&quot; /&gt;CoverageReportAdapter&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can implement a coverage tool by implementing CoverageReportAdapter extension point. For example, by using the provided abstract layer, we can implement Jacoco simple like 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;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JacocoReportAdapter&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JavaXMLCoverageReportAdapter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@DataBoundConstructor&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;JacocoReportAdapter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&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;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&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;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getXSL&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;jacoco-to-standard.xsl&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;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getXSD&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&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;nd&quot;&gt;@Symbol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jacoco&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@Extension&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JacocoReportAdapterDescriptor&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CoverageReportAdapterDescriptor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;CoverageReportAdapter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

        &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;JacocoReportAdapterDescriptor&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;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;JacocoReportAdapter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;jacoco&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;All we need is to extend an abstract layer for XML-based Java report and provide an XSL file to convert the report to our Java standard format. There are also other extension points which are under development.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;other-extension-points&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-extension-points&quot; /&gt;Other Extension points&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also plan to provide extension points for coverage threshold and report detector. Once it completed, we can have more control over our coverage report process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;next-phase-plan&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#next-phase-plan&quot; /&gt;Next Phase Plan&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Alpha version now has many parts which still need to be implemented before the final release. So in next phase, I will mainly do those things.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;APIs which can be used by others&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Integrate Cobertura Plugin with Code Coverage API &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51424&quot;&gt;(JENKINS-51424)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide API for getting coverage information. E.g. summary information about coverage (percentages, trends) &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51422&quot;&gt;(JENKINS-51422)&lt;/a&gt;, &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51423&quot;&gt;(JENKINS-51423)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Implementing abstract layer for other report formats like JSON. &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51732&quot;&gt;(JENKINS-51732)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supporting converters for non-Java languages. &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51924&quot;&gt;(JENKINS-51924)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supporting combining reports within a build(e.g. after parallel() execution in Pipeline) &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51926&quot;&gt;(JENKINS-51926)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding source code navigation in Coverage Result Page &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51988&quot;&gt;(JENKINS-51988)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Refactoring the configuration page to make it more user-friendly &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51927&quot;&gt;(JENKINS-51927)&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;how-to-try-it-out&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-try-it-out&quot; /&gt;How to Try It Out&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, I have released the Alpha version in the &lt;a href=&quot;https://www.jenkins.io/doc/developer/publishing/releasing-experimental-updates/#configuring-jenkins-to-use-experimental-update-center&quot;&gt;Experimental Update Center&lt;/a&gt;. If you can give me some of your valuable advice about it, I will very appreciate.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_code-coverage-api-&quot; class=&quot;bare&quot;&gt;https://app.gitter.im/#/room/#jenkinsci_code-coverage-api-&lt;/a&gt;&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/code-coverage-api-plugin.svg&quot; alt=&quot;title: &amp;quot;Gitter&amp;quot;&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/span&gt;
&lt;/a&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project+%3D+JENKINS+AND+component+%3D+code-coverage-api-plugin&quot;&gt;JIRA Component&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/code-coverage-api-plugin/&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/jenkinsci/code-coverage-api-plugin&quot;&gt;Project Repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=qWHM8S0fzUw&quot;&gt;Phase 1 Presentation Video&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/141gvnLeNem-2SdiIEM4ZN-nzDmhVJUrUYv-r6a482R8/edit?usp=sharing&quot;&gt;Phase 1 Presentation Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&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/2018/06/08/jenkins-java10-hackathon/</id>
<title>Jenkins &amp; Java 10+ Online Hackathon (Jun 18-22)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-06-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/06/08/jenkins-java10-hackathon/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='events'></category>
<category term='community'></category>
<category term='developer'></category>
<category term='java10'></category>
<category term='java11'></category>
<summary>
On behalf of the Jenkins Events Team,
I would like to invite you to the “Jenkins &amp; Java 10 Online Hackathon” which will take place from June 18th to 22nd.
We will be working together on Jenkins core and plugins in order
to find and fix compatibility issues, share experiences and have some fun.
Everybody is welcome to join, independently of their Jenkins experience and amount of time they have available.


If you are interested in participating in the hackathon, please sign-up in
this form.


Background

Java 9 has recently been end-of-lifed, Java 10 is in GA, and Java 11 is in early beta.
Jenkins project currently requires Java...
</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/logos/formal/256.png&quot; alt=&quot;Jenkins Java&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the Jenkins Events Team,
I would like to invite you to the “Jenkins &amp;amp; Java 10 Online Hackathon” which will take place from June 18th to 22nd.
We will be working together on Jenkins core and plugins in order
to find and fix compatibility issues, share experiences and have some fun.
Everybody is welcome to join, independently of their Jenkins experience and amount of time they have available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested in participating in the hackathon, please sign-up in
&lt;a href=&quot;https://docs.google.com/forms/d/1ReYyuyCGC0PIz2quh6XehnjpH2K52inx-veHLPlNreE/edit&quot;&gt;this form&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java 9 has recently been end-of-lifed, Java 10 is in GA, and Java 11 is in early beta.
Jenkins project currently requires Java 8 to run reliably,
and there are some known compatibility issues with higher Java versions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the Jenkins World 2017 Hackathon,
&lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt; and
&lt;a href=&quot;https://github.com/batmat&quot;&gt;Baptiste Mathus&lt;/a&gt; spent some time exploring Java 9 compatibility in Jenkins.
We are currently tracking compatibility issues in the
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40689&quot;&gt;JENKINS-40689&lt;/a&gt; EPIC,
but there are likely many unknown issues in Jenkins core, plugins and in libraries we use in the project.
We would like to continue their effort and work on Java 10+ support.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;objectives-and-scope&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#objectives-and-scope&quot; /&gt;Objectives and Scope&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I have said above,
the goals are to explore/fix compatibility issues, share experiences and have fun.
We &lt;strong&gt;DO NOT&lt;/strong&gt; plan to make Jenkins fully compatible with Java 10+
during the hackathon,
but we will try to integrate fixes and make them available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the announcement of the Hackathon in the mailing list,
we have got a number of registrations from contributors working on several project areas.
We will split our work to several areas:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins core and Remoting&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline Engine&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugins (e.g. Git plugin or any plugin you want to work on)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exploratory testing for Java 10 and beyond&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to organize the effort, we have created a
&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=labels%20%3D%20java10_hackathon&quot;&gt;java10_hackathon&lt;/a&gt; label
in Jenkins JIRA.
If you are interested in particular tasks,
please assign them to yourself and add the label.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;organization&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#organization&quot; /&gt;Organization&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently the event is in the planning stage.
We will be using the &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/FdCvQlscl_I&quot;&gt;Developer mailing list&lt;/a&gt;
for synchronization before the event.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What will we have?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Communications in &lt;a href=&quot;https://www.jenkins.io/chat&quot;&gt;&lt;mark&gt;jenkins-hackhouse IRC&lt;/mark&gt; and in the
&lt;a href=&quot;https://app.gitter.im/&amp;lt;/mark&amp;gt;/room/#jenkinsci_jenkins:gitter.im&quot;&gt;Jenkins Gitter channel&lt;/a&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Daily recorded sync-up calls in Hangouts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Knowledge transfer sessions during the event&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also want to prepare some special swag for active participants.
If you have reached this part of the blogpost,
you have probably seen the logo ;)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/forms/d/1ReYyuyCGC0PIz2quh6XehnjpH2K52inx-veHLPlNreE/edit&quot;&gt;Registration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/FdCvQlscl_I&quot;&gt;Developer mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1ed6wFOlq4cWrSL6UkCSzFbaY80AT-sk8ncB4Fz5QXyM/edit&quot;&gt;Hackathon sync-up document&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2018/06/17/running-jenkins-with-java10-11/&quot;&gt;Running Jenkins with Java 10 and 11&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40689&quot;&gt;JIRA: Java 10 compatibility&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/51805&quot;&gt;JIRA: Java 11 compatibility&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=labels%20%3D%20java10_hackathon&quot;&gt;JIRA: Hackathon tasks&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/2018/05/17/tracymiranda-intro/</id>
<title>Introducing Tracy Miranda as the CloudBees Open Source Program Lead</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-05-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/05/17/tracymiranda-intro/" />
<author>
<name>tracymiranda</name>
</author>
<category term='community'></category>
<summary>
I’m Tracy Miranda, and I’m really excited to have joined CloudBees this month leading the open source program. CloudBees’ contributions to Jenkins include developing Pipeline and Blue Ocean, staffing the infrastructure team, advocacy and events work, as well as security efforts. My focus is on making sure there is a great relationship between the Jenkins community and CloudBees, which means strong communication, help get traction on things the community wants, and generally working to make Jenkins and the community thrive and stay awesome in an ever-changing tech landscape.


Here’s a little background on me: I come from an electronics/EDA background but...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m Tracy Miranda, and I’m really excited to have joined CloudBees this month leading the open source program. CloudBees’ contributions to Jenkins include developing Pipeline and Blue Ocean, staffing the infrastructure team, advocacy and events work, as well as security efforts. My focus is on making sure there is a great relationship between the Jenkins community and CloudBees, which means strong communication, help get traction on things the community wants, and generally working to make Jenkins and the community thrive and stay awesome in an ever-changing tech landscape.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a little background on me: I come from an electronics/EDA background but switched to software early in my career when I first got involved with open source software. I’ve been part of the Eclipse community for around 15 years, definitely from before git was even a thing. I love being involved with all levels: project committer, conference chair, steering committee for working groups and more recently board of directors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On a personal note, I …&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Live in the UK with my husband and 2 young kids&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Grew up in Kenya&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enjoy playing badminton, love good food &amp;amp; am always first at any buffets&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am looking forward to getting to know the Jenkins community well, and really getting a feel for your Jenkins stories, good and bad. Please feel free to let me know:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;What you love about the Jenkins community &amp;amp; how you are using Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What you’re working on doing with Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What you don’t like and want improved&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find me on the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;mailing lists&lt;/a&gt; or via:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Twitter &lt;a href=&quot;https://twitter.com/tracymiranda&quot;&gt;@tracymiranda&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Email: &lt;a href=&quot;mailto:tmiranda@cloudbees.com&quot;&gt;tmiranda@cloudbees.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IRC: tracymiranda&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also I’ll be at the upcoming events:  &lt;a href=&quot;https://www.cloudbees.com/devops-world&quot;&gt;DevOps World - Jenkins World&lt;/a&gt; in San Francisco, California and Nice, France so if you plan to attend do come and say hi. The Jenkins community is the real force behind Jenkins. And in turn Jenkins powers so much of the software out there. It is an honour to be joining this wonderful community.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/05/16/pipelines-with-git-tags/</id>
<title>When using tags in Jenkins Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-05-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/05/16/pipelines-with-git-tags/" />
<author>
<name>rtyler</name>
</author>
<category term='pipeline'></category>
<category term='git'></category>
<summary>
One common pattern for automated releases I have seen and used relies on Git
tags as the catalyst for a release process. The immutable nature of releases
and the immutable nature of tags can definitely go hand in hand, but up until
few months ago Jenkins Pipeline was not able to trigger effectively off of Git
tags.


In this post I want to briefly share how to use tags to drive behaviors in
Jenkins Pipeline. Consider the following contrived Jenkinsfile, which
contains the three basic stages of Build, Test, and Deploy:



pipeline {
    agent any
    stages {
     ...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One common pattern for automated releases I have seen and used relies on Git
tags as the catalyst for a release process. The immutable nature of releases
and the immutable nature of tags can definitely go hand in hand, but up until
few months ago Jenkins Pipeline was not able to trigger effectively off of Git
tags.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this post I want to briefly share how to use tags to drive behaviors in
Jenkins Pipeline. Consider the following contrived &lt;code&gt;Jenkinsfile&lt;/code&gt;, which
contains the three basic stages of Build, Test, and Deploy:&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;Build&#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;s1&quot;&gt;&#39;make package&#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;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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make check&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Deploy&#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;tag&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;release-*&quot;&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;Deploying only because this commit is tagged...&#39;&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make deploy&#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 class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of particular note is the
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#when&quot;&gt;&lt;code&gt;when&lt;/code&gt;&lt;/a&gt;
condition on the &quot;Deploy&quot; stage which is applying the &lt;code&gt;tag&lt;/code&gt; criteria. This
means the stage would only execute when the Pipeline has been triggered from a
tag in Git matching the &lt;code&gt;release-*&lt;/code&gt; Ant-style wildcard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In practice, this means that all pull requests, and branch-based Pipeline Runs
result in the stage being skipped:&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/pipeline-tags/not-deployed.png&quot; alt=&quot;Not Deployed!&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I push a &lt;code&gt;release-1.0&lt;/code&gt; tag, the Pipeline will then be triggered and run the
&quot;Deploy&quot; stage:&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/pipeline-tags/deployed.png&quot; alt=&quot;Deployed!&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Out of the box, Pipelines won’t trigger off of the presence of tags, which
means that a Multibranch Pipeline must have a configuration update to know that
it must Discover Tags.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;configuring&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuring&quot; /&gt;Configuring&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the configuration screen of a Multibranch Pipeline (or GitHub Organization
Folder), Discovering tags can be enabled by adding the appropriate &quot;Behavior&quot;
to the Branch Source configuration:&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/pipeline-tags/branch-source.png&quot; alt=&quot;Configuring the Multibranch Pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With these changes, the &lt;code&gt;Jenkinsfile&lt;/code&gt; in the tagged versions of my source
repository can now drive distinct deployment behavior which is not otherwise
enabled in the Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&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/2018/05/15/incremental-deployment/</id>
<title>Automatic deployment of “incremental” commits to Jenkins core and plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-05-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/05/15/incremental-deployment/" />
<author>
<name>jglick</name>
</author>
<category term='evergreen'></category>
<category term='developer'></category>
<summary>
A couple of weeks ago, Tyler mentioned some
developer improvements in Essentials
that had been recently introduced:
the ability for
ci.jenkins.io
builds to get deployed automatically to an “Incrementals” Maven repository,
as described in
JEP-305.
For a plugin maintainer, you just need to
turn on this support
and you are ready to both deploy individual Git commits from your repository
without the need to run heavyweight traditional Maven releases,
and to depend directly on similar commits of Jenkins core or other plugins.
This is a stepping stone toward continuous delivery, and ultimately deployment, of Jenkins itself.


Here I would like to peek behind the curtain a bit at how we did this,
since the solution...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A couple of weeks ago, Tyler mentioned some
&lt;a href=&quot;https://www.jenkins.io/blog/2018/04/27/essentials-versions-are-numbered/#developer-improvements&quot;&gt;developer improvements in Essentials&lt;/a&gt;
that had been recently introduced:
the ability for
&lt;a href=&quot;https://ci.jenkins.io/&quot;&gt;ci.jenkins.io&lt;/a&gt;
builds to get deployed automatically to an “Incrementals” Maven repository,
as described in
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/305/README.adoc&quot;&gt;JEP-305&lt;/a&gt;.
For a plugin maintainer, you just need to
&lt;a href=&quot;https://github.com/jenkinsci/incrementals-tools/blob/master/README.md#enabling-incrementals-the-easy-way&quot;&gt;turn on this support&lt;/a&gt;
and you are ready to both deploy individual Git commits from your repository
without the need to run heavyweight traditional Maven releases,
and to depend directly on similar commits of Jenkins core or other plugins.
This is a stepping stone toward continuous delivery, and ultimately deployment, of Jenkins itself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here I would like to peek behind the curtain a bit at how we did this,
since the solution turns out to be very interesting for people thinking about security in Jenkins.
I will gloss over the Maven arcana required to get the project version to look like &lt;code&gt;1.40-rc301.87ce0dd8909b&lt;/code&gt;
(a real example from the
&lt;a href=&quot;https://repo.jenkins-ci.org/incrementals/org/jenkins-ci/plugins/copyartifact/1.40-rc301.87ce0dd8909b/&quot;&gt;Copy Artifact plugin&lt;/a&gt;)
rather than the usual &lt;code&gt;1.40-SNAPSHOT&lt;/code&gt;, and why this format is even useful.
Suffice it to say that if you had enough permissions, you could run&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;mvn &lt;span class=&quot;nt&quot;&gt;-Dset&lt;/span&gt;.changelist &lt;span class=&quot;nt&quot;&gt;-DskipTests&lt;/span&gt; clean deploy&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;from your laptop to publish your latest commit.
Indeed as
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/305/README.adoc#automated-deployment-to-the-incrementals-repository&quot;&gt;mentioned in the JEP&lt;/a&gt;,
the most straightforward server setup would be to run more or less that command
from the &lt;code&gt;buildPlugin&lt;/code&gt; function called from a typical &lt;code&gt;Jenkinsfile&lt;/code&gt;,
with some predefined credentials adequate to upload to the Maven repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, that simple solution did not look very secure.
If you offer deployment credentials to a Jenkins job,
you need to trust anyone who might configure that job (here, its &lt;code&gt;Jenkinsfile&lt;/code&gt;)
to use those credentials appropriately.
(The &lt;code&gt;withCredentials&lt;/code&gt; step will mask the password from the log file, to prevent &lt;em&gt;accidental&lt;/em&gt; disclosures.
It in no way blocks &lt;em&gt;deliberate&lt;/em&gt; misuse or theft.)
If your Jenkins service runs inside a protected network and works with private repositories,
that is probably good enough.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this project, we wanted to permit incremental deployments from any pull request.
Jenkins will refuse to run &lt;code&gt;Jenkinsfile&lt;/code&gt; modifications from people
who would not normally be able to merge the pull request or push directly,
and those people would be more or less trustworthy Jenkins developers,
but that is of no help if a pull request changes &lt;code&gt;pom.xml&lt;/code&gt;
or other source files used by the build itself.
If the server administrator exposes a secret to a job,
and it is bound to an environment variable while running some open-ended command like a Maven build,
there is no practical way to control what might happen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The lesson here is that the unit of access control in Jenkins is the job.
You can control who can configure a job, or who can edit files it uses,
but you have no control over what the job &lt;em&gt;does&lt;/em&gt; or how it might use any credentials.
For JEP-305, therefore, we wanted a way to perform deployments from builds considered as black boxes.
This means a division of responsibility:
the build produces some artifacts, however it sees fit;
and another process picks up those artifacts and deploys them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This worked was tracked in
&lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-1571&quot;&gt;INFRA-1571&lt;/a&gt;.
The idea was to create a “serverless function” in Azure
that would retrieve artifacts from Jenkins at the end of a build,
perform a set of validations to ensure that the artifacts follow an expected repository path pattern,
and finally deploy them to Artifactory using a trusted token.
I prototyped this in Java, Tyler
&lt;a href=&quot;https://github.com/jenkins-infra/community-functions/blob/master/incrementals-publisher/README.adoc&quot;&gt;rewrote it in JavaScript&lt;/a&gt;,
and together we brought it into production.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The crucial bit here is what information (or misinformation!) the Jenkins build can send to the function.
All we actually need to know is the build URL, so the
&lt;a href=&quot;https://github.com/jenkins-infra/pipeline-library/blob/442485fc03101d4f52856ea48825a4d45acece7e/vars/infra.groovy#L227-L245&quot;&gt;call site from Jenkins&lt;/a&gt;
is quite simple.
When the function is called with this URL,
it starts off by performing input validation:
it knows what the Jenkins base URL is,
and what a build URL from inside an organization folder is supposed to look like:
&lt;code&gt;&lt;a href=&quot;https://ci.jenkins.io/job/Plugins/job/git-plugin/job/PR-582/17/&quot; class=&quot;bare&quot;&gt;https://ci.jenkins.io/job/Plugins/job/git-plugin/job/PR-582/17/&lt;/a&gt;&lt;/code&gt;, for example.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next step is to call back to Jenkins and ask it for some metadata about that build.
While we do not trust the &lt;em&gt;build&lt;/em&gt;, we trust the server that ran it to be properly configured.
An obstacle here was that the &lt;code&gt;ci.jenkins.io&lt;/code&gt; server had been configured to disable the Jenkins REST API;
with Tyler’s guidance I was able to amend this policy to permit API requests from registered users
(or, in the case of the Incrementals publisher, a bot).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to try this at home, get an
&lt;a href=&quot;https://ci.jenkins.io/me/configure&quot;&gt;API token&lt;/a&gt;,
pick a build of an “incrementalified” plugin or Jenkins core,
and run something like&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;curl &lt;span class=&quot;nt&quot;&gt;-igu&lt;/span&gt; &amp;lt;login&amp;gt;:&amp;lt;token&amp;gt; &lt;span class=&quot;s1&quot;&gt;&#39;https://ci.jenkins.io/job/Plugins/job/git-plugin/job/PR-582/17/api/json?pretty&amp;amp;tree=actions[revision[hash,pullHash]]&#39;&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;You will see a &lt;code&gt;hash&lt;/code&gt; or &lt;code&gt;pullHash&lt;/code&gt; corresponding to the &lt;em&gt;main commit&lt;/em&gt; of that build.
(This information was added to the Jenkins REST API to support this use case in
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/50777&quot;&gt;JENKINS-50777&lt;/a&gt;.)
The main commit is selected when the build starts
and always corresponds to the version of &lt;code&gt;Jenkinsfile&lt;/code&gt; in the repository for which the job is named.
While a build might &lt;code&gt;checkout&lt;/code&gt; any number of repositories,
&lt;code&gt;checkout scm&lt;/code&gt; always picks “this” repository in “this” version.
Therefore the deployment function knows for sure which commit the sources came from,
and will refuse to deploy artifacts named for some other commit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next it looks up information about the Git repository at the folder level (again from JENKINS-50777):&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;curl &lt;span class=&quot;nt&quot;&gt;-igu&lt;/span&gt; &amp;lt;login&amp;gt;:&amp;lt;token&amp;gt; &lt;span class=&quot;s1&quot;&gt;&#39;https://ci.jenkins.io/job/Plugins/job/git-plugin/api/json?pretty&amp;amp;tree=sources[source[repoOwner,repository]]&#39;&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 Git repository now needs to be correlated to a list of Maven artifact paths that this component is expected to produce.
The
&lt;a href=&quot;https://github.com/jenkins-infra/repository-permissions-updater&quot;&gt;repository-permissions-updater&lt;/a&gt;
(RPU) tool already had a list of artifact paths used to perform permission checks on regular release deployments to Artifactory; in
&lt;a href=&quot;https://issues.jenkins.io/browse/INFRA-1598&quot;&gt;INFRA-1598&lt;/a&gt;
I extended it to also record the GitHub repository name, as can be seen
&lt;a href=&quot;https://ci.jenkins.io/job/Infra/job/repository-permissions-updater/job/master/lastSuccessfulBuild/artifact/json/github.index.json&quot;&gt;here&lt;/a&gt;.
Now the function knows that the CI build in this example may legitimately create artifacts in the &lt;code&gt;org/jenkins-ci/plugins/git/&lt;/code&gt; namespace
including &lt;code&gt;38c569094828&lt;/code&gt; in their versions.
The build is expected to have produced artifacts in the same structure as &lt;code&gt;mvn install&lt;/code&gt; sends to the local repository,
so the function downloads everything associated with that commit hash:&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;curl &lt;span class=&quot;nt&quot;&gt;-sg&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;https://ci.jenkins.io/job/Plugins/job/git-plugin/job/PR-582/17/artifact/**/*-rc*.38c569094828/*-rc*.38c569094828*/*zip*/archive.zip&#39;&lt;/span&gt; | jar t&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When all the artifacts are indeed inside the expected path(s),
and at least one POM file is included (here &lt;code&gt;org/jenkins-ci/plugins/git/3.9.0-rc1671.38c569094828/git-3.9.0-rc1671.38c569094828.pom&lt;/code&gt;),
then the ZIP file looks good—ready to send to Artifactory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One last check is whether the commit has already been deployed (perhaps this is a rebuild).
If it has not, the function uses the Artifactory REST API to atomically upload the ZIP file
and uses the GitHub Status API to associate a message with the commit
so that you can see right in your pull request that it got deployed:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-05-15/incrementals-status.png&quot; alt=&quot;incrementals status&quot; width=&quot;1104&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One more bit of caution was required.
Just because we successfully published some bits from some PR does not mean they should be &lt;em&gt;used&lt;/em&gt;!
We also needed a tool which lets you select the newest published version of some artifact
&lt;em&gt;within a particular branch&lt;/em&gt;, usually &lt;code&gt;master&lt;/code&gt;.
This was tracked in
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/50953&quot;&gt;JENKINS-50953&lt;/a&gt;
and is available to start with as a Maven command operating on a &lt;code&gt;pom.xml&lt;/code&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;mvn incrementals:update&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will check Artifactory for updates to relevant components.
When each one is found, it will use the GitHub API to check whether the commit has been merged to the selected branch.
Only matches are offered for update.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Putting all this together, we have a system for continuously delivering components
from any of the hundreds of Jenkins Git repositories
triggered by the simple act of filing a pull request.
Securing that system was a lot of work
but highlights how boundaries of trust interact with CI/CD.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/05/09/security-advisory/</id>
<title>Security updates for Jenkins core and plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-05-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/05/09/security-advisory/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='plugins'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.121 and 2.107.3, that fix multiple security vulnerabilities.


Additionally, we announce previously published security issues and corresponding fixes in these plugins:




Black Duck Hub


Groovy Postbuild


Gitlab Hook (fix unreleased)




For an overview of what was fixed, see the security advisory.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our LTS upgrade guide.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.121 and 2.107.3, that fix multiple security vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, we announce previously published security issues and corresponding fixes in these plugins:&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/blackduck-hub&quot;&gt;Black Duck Hub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/groovy-postbuild&quot;&gt;Groovy Postbuild&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/gitlab-hook&quot;&gt;Gitlab Hook&lt;/a&gt; (fix unreleased)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-05-09&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.107/#upgrading-to-jenkins-lts-2-107-3&quot;&gt;LTS upgrade guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/05/08/jenkins-x-anchore/</id>
<title>Jenkins X: Announcing CVE docker image analysis with Anchore</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-05-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/05/08/jenkins-x-anchore/" />
<author>
<name>jrawlings</name>
</author>
<category term='jenkins-x'></category>
<category term='kubernetes'></category>
<category term='pipeline'></category>
<summary>
Anchore provides docker image analysis for user defined acceptance policies to allow automated image validation and acceptance.


As developers we would like to know if a change we are proposing introduces a
Common Vulnerability and Exposure (CVE).
As operators we would like to know what running applications are affected if a new CVE is discovered.


Now in Jenkins X pipelines, if we find an
Anchore engine service running we will add the preview and release images to be analyzed.
This means we can look at any environment including previews (created from Pull Requests)
to see if your application contains a CVE.


Upgrade


Start by checking your current Jenkins X...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://anchore.io/&quot;&gt;Anchore&lt;/a&gt; provides docker image analysis for user defined acceptance policies to allow automated image validation and acceptance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As developers we would like to know if a change we are proposing introduces a
&lt;a href=&quot;https://en.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures&quot;&gt;Common Vulnerability and Exposure (CVE)&lt;/a&gt;.
As operators we would like to know what running applications are affected if a new CVE is discovered.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now in Jenkins X pipelines, if we find an
&lt;a href=&quot;https://anchore.com/engine/&quot;&gt;Anchore engine&lt;/a&gt; service running we will add the preview and release images to be analyzed.
This means we can look at any environment including previews (created from Pull Requests)
to see if your application contains a CVE.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;upgrade&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade&quot; /&gt;Upgrade&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Start by checking your current Jenkins X version:&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;jx version&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your Jenkins X platform is older than 0.0.903, then first you will need to upgrade to at least 0.0.922:&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;jx upgrade cli
jx upgrade platform&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;install-addon&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#install-addon&quot; /&gt;Install addon&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can install the
&lt;a href=&quot;https://hub.kubeapps.com/charts/stable/anchore-engine&quot;&gt;Anchore engine addon&lt;/a&gt;
when you are in your Jenkins X team &lt;code&gt;home&lt;/code&gt; environment.&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;jx &lt;span class=&quot;nb&quot;&gt;env &lt;/span&gt;dev
jx create addon anchore&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will install the engine in a separate &lt;code&gt;anchore&lt;/code&gt; namespace
and create a service link in the current team &lt;code&gt;home&lt;/code&gt; environment
so our pipeline builds can add docker images to Anchore for analysis.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;create-an-application&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#create-an-application&quot; /&gt;Create an application&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can now create a new quickstart:&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;jx create quickstart&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;list-any-cves&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#list-any-cves&quot; /&gt;List any CVEs&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the build has run you will be able to check for CVEs in any environment including previews created for pull requests.&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;jx get cve &lt;span class=&quot;nt&quot;&gt;--environment&lt;/span&gt; staging&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;demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demo&quot; /&gt;Demo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a 4 minute video that demonstrates the steps above:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/rB8Sw0FqCQk?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;upgrading-existing-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrading-existing-pipelines&quot; /&gt;Upgrading existing pipelines&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have an existing application pipeline and and want enable image analysis you can update your Jenkinsfile,
in the &lt;code&gt;preview&lt;/code&gt; stage after the skaffold step add the line&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;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;jx step validate --min-jx-version 1.2.36&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;jx step post build --image \$JENKINS_X_DOCKER_REGISTRY_SERVICE_HOST:\$JENKINS_X_DOCKER_REGISTRY_SERVICE_PORT/$ORG/$APP_NAME:$PREVIEW_VERSION&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;In the &lt;code&gt;master&lt;/code&gt; stage the add this line after the skaffold step&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;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;jx step validate --min-jx-version 1.2.36&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;jx step post build --image \$JENKINS_X_DOCKER_REGISTRY_SERVICE_HOST:\$JENKINS_X_DOCKER_REGISTRY_SERVICE_PORT/$ORG/$APP_NAME:\$(cat VERSION)&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 any questions please find us - we mainly hang out on Slack at
&lt;a href=&quot;https://kubernetes.slack.com/messages/C9LTHT2BB&quot;&gt;#jenkins-x-dev&lt;/a&gt; - or see
&lt;a href=&quot;https://jenkins-x.io/community/&quot;&gt;jenkins-x.io/community&lt;/a&gt; for other channels.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/05/01/gsoc2018-projects-announcement/</id>
<title>Welcome Google Summer of Code 2018 students!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-05-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/05/01/gsoc2018-projects-announcement/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
On behalf of the Jenkins GSoC team and mentors,
I would like to welcome
Shenyu Zheng,
Udara De Silva,
Pham Vu Tuan and
Abhishek Gautam.
They will be working on Google Summer of Code projects in the Jenkins organization,
and they have already done some contributions.


This year we have the following projects:




Code Coverage API Plugin -
create a new API Plugin to unify existing Code Coverage plugins and provide new features.



Student: Shenyu Zheng from Henan University, Kaifeng, China


Mentors: Steven Christou and Supun Wanniarachchi





Electronic Design Automation Plugins -
create plugins for open-source Electronic Design Automation tools for synthesis, simulation and coverage analysis (iVerilog, covered, Yosys).



Student: Udara De Silva from University...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the Jenkins GSoC team and mentors,
I would like to welcome
&lt;a href=&quot;https://github.com/cizezsy&quot;&gt;Shenyu Zheng&lt;/a&gt;,
&lt;a href=&quot;https://github.com/udara28&quot;&gt;Udara De Silva&lt;/a&gt;,
&lt;a href=&quot;https://github.com/pvtuan10&quot;&gt;Pham Vu Tuan&lt;/a&gt; and
&lt;a href=&quot;https://github.com/gautamabhishek46&quot;&gt;Abhishek Gautam&lt;/a&gt;.
They will be working on Google Summer of Code projects in the Jenkins organization,
and they have already done some contributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we have the following projects:&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/2018/code-coverage-api-plugin&quot;&gt;Code Coverage API Plugin&lt;/a&gt; -
create a new API Plugin to unify existing Code Coverage plugins and provide new features.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Student: &lt;a href=&quot;https://github.com/cizezsy&quot;&gt;Shenyu Zheng&lt;/a&gt; from Henan University, Kaifeng, China&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors: &lt;a href=&quot;https://github.com/christ66&quot;&gt;Steven Christou&lt;/a&gt; and &lt;a href=&quot;https://github.com/Supun94&quot;&gt;Supun Wanniarachchi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/eda-plugins&quot;&gt;Electronic Design Automation Plugins&lt;/a&gt; -
create plugins for open-source Electronic Design Automation tools for synthesis, simulation and coverage analysis (iVerilog, covered, Yosys).&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Student: &lt;a href=&quot;https://github.com/udara28&quot;&gt;Udara De Silva&lt;/a&gt; from University of Akron, Ohio, USA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors: &lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt; and &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/remoting-over-message-bus&quot;&gt;Jenkins Remoting over Message Bus/Queue &lt;/a&gt; -
add support of a popular message queue/bus technology (RabbitMQ or Kafka) as a fault-tolerant communication layer in Jenkins.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Student: &lt;a href=&quot;https://github.com/pvtuan10&quot;&gt;Pham Vu Tuan&lt;/a&gt; from Nanyang Technological University, Singapore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors: &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; and &lt;a href=&quot;https://github.com/Supun94&quot;&gt;Supun Wanniarachchi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/2018/simple-pull-request-job-plugin&quot;&gt;Simple Pull-Request Job Plugin&lt;/a&gt; -
add ability to define Jenkins jobs as YAML files stored in SCM, integrate it with existing plugin ecosystem.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Student: &lt;a href=&quot;https://github.com/gautamabhishek46&quot;&gt;Abhishek Gautam&lt;/a&gt; from Visvesvaraya National Institute of Technology, Nagpur, India&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mentors: &lt;a href=&quot;https://github.com/Jeff-Symphony&quot;&gt;Jeff Knurek&lt;/a&gt;, &lt;a href=&quot;https://github.com/kwhetstone&quot;&gt;Kristin Whetstone&lt;/a&gt; and
&lt;a href=&quot;https://github.com/marti1125&quot;&gt;Willy Aguirre&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During next 4 weeks project teams will be reaching out to potential stakeholders in order to establish connections and
to get comments regarding their project designs.
If you are interested in the projects, please join discussions in the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Developer mailing lists&lt;/a&gt; and project meetings once they get scheduled.
Please also expect expect more detailed blogposts about the projects soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested to know more about GSoC in Jenkins, you can find information, timeline and communication channels
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/04/30/using-the-beta-annotation/</id>
<title>Using new core APIs with the Beta annotation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/30/using-the-beta-annotation/" />
<author>
<name>jglick</name>
</author>
<category term='core'></category>
<category term='developer'></category>
<category term='plugin'></category>
<summary>
This sort of slid under the radar in the middle of some bigger changes
for the JEP-202
reference implementation, so I wanted to call it out now. Arguably this could
deserve a retroactive JEP, though I would rather fold it into a JEP for
JENKINS-49651 (see below).


As of Jenkins 2.118, or plugin parent POM 3.7, you can mark any Java member
(class, method, constructor, field, or I suppose also interface,
enum, or annotation) with API visibility (protected or public) with an
annotation:



@Restricted(Beta.class)



The idea is to announce to potential users of the member that the API
may still be in flux and only code prepared to keep up should...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This sort of slid under the radar in the middle of some bigger changes
for the &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/202&quot;&gt;JEP-202&lt;/a&gt;
reference implementation, so I wanted to call it out now. Arguably this could
deserve a retroactive JEP, though I would rather fold it into a JEP for
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/49651&quot;&gt;JENKINS-49651&lt;/a&gt; (see below).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of Jenkins 2.118, or plugin parent POM 3.7, you can mark any Java member
(&lt;code&gt;class&lt;/code&gt;, &lt;code&gt;method&lt;/code&gt;, &lt;code&gt;constructor&lt;/code&gt;, &lt;code&gt;field&lt;/code&gt;, or I suppose also interface,
&lt;code&gt;enum&lt;/code&gt;, or &lt;code&gt;annotation&lt;/code&gt;) with API visibility (&lt;code&gt;protected&lt;/code&gt; or &lt;code&gt;public&lt;/code&gt;) with an
&lt;a href=&quot;https://github.com/kohsuke/access-modifier/pull/11&quot;&gt;annotation&lt;/a&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;java&quot;&gt;&lt;span class=&quot;nd&quot;&gt;@Restricted&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Beta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&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 idea is to announce to potential users of the member that the API
may still be in flux and only code prepared to keep up should be using
it. For an example, 2.118 added a &lt;code&gt;VirtualFile.toExternalURL()&lt;/code&gt; method
that is being implemented in &lt;code&gt;artifact-manager-s3&lt;/code&gt; and (pending some
PR merges) called in &lt;code&gt;copyartifact&lt;/code&gt; and &lt;code&gt;workflow-basic-steps&lt;/code&gt;. We do
not necessarily want this to be called yet by unknown parties out
there in the Jenkins ecosystem. To enforce that, any attempt to call
or implement &lt;code&gt;toExternalURL&lt;/code&gt; will produce a build failure, unless you
add this property to your plugin POM, as these plugins have done:&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;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;useBeta&amp;gt;&lt;/span&gt;true&lt;span class=&quot;nt&quot;&gt;&amp;lt;/useBeta&amp;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;Why? Because there is a chance the design is wrong and it might need
to be changed—perhaps some upcoming bug fix would demand a &lt;code&gt;boolean&lt;/code&gt;
parameter be added, for example.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under the conventional notion of Jenkins API deprecation and compatibility
policy, once an API like this makes it into a release version, that is it—we
might mark it &lt;code&gt;@Deprecated&lt;/code&gt; but we need to maintain compatibility indefinitely,
and find some way to migrate existing implementations / call sites.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the &lt;code&gt;@Beta&lt;/code&gt; annotation, that promise is not being made. If it needs
a &lt;code&gt;boolean&lt;/code&gt; parameter for some reason, that will be added and those
three plugins updated to match; we are not going to bother retaining
the original overload and somehow delegating to the new one. This
simplification of the developer workflow is important to the use cases
of &lt;a href=&quot;https://github.com/jenkins-infra/evergreen&quot;&gt;Essentials&lt;/a&gt; (JEP-3xx), and I would expect the &lt;code&gt;useBeta&lt;/code&gt; mark to
become widespread among plugins included in Essentials. Such as the situation
where one team needs to feel
comfortable refactoring code under its aegis freely, and the refactored result
should be deliverable as a unit to production via the Evergreen distribution
system.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So that leaves two important questions:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, is the annotation
permanent, and if not, when should it be removed? I do not think there
is any hard policy, but the intention is that it should be removed
once the API is in more or less widespread use and has held up. For
this example, if people start using S3 artifacts, and especially if
someone successfully writes an implementation of artifact storage in
Azure that uses the API, the concept will have been reasonably proven.
At that point we want the API to be used wherever it would make sense,
and if there is some very belated realization that the design is not
quite right, we accept the burden of deprecating the original and
migrating callers compatibly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt;, it is fine and well to say that someone changing the signature
of a beta &lt;code&gt;toExternalURL&lt;/code&gt; is on the hook to update the three plugins
using it, but what if a Jenkins admin (&lt;em&gt;not&lt;/em&gt; running Essentials, for
shame) upgrades to (say) Jenkins 2.125 with the new signature but
declines to accept the updates to those plugins (say,
&lt;code&gt;workflow-basic-steps&lt;/code&gt; 2.9) which adapt to the change? It is not
enough to say that it is their fault for holding back on the updates
arbitrarily; the plugin manager &lt;em&gt;offers&lt;/em&gt; you updates but does nothing
to tell you when they are &lt;em&gt;required&lt;/em&gt;, so suddenly throwing
&lt;code&gt;NoSuchMethodError&lt;/code&gt; is not a helpful response.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The solution needs to be ironed out, but my expectation is to use
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/49651&quot;&gt;JENKINS-49651&lt;/a&gt;
for this. For example, &lt;code&gt;workflow-basic-steps&lt;/code&gt; 2.8,
using &lt;code&gt;toExternalURL()&lt;/code&gt;, would have declared itself compatible with
&lt;code&gt;Jenkins-Version: 2.118&lt;/code&gt;, and thus implicitly anything newer. The
developer doing the refactoring would also amend some 2.125 (and
newer) core metadata to say that it conflicts with anything older than
the 2.9 release of the plugin. The plugin manager would therefore
block the 2.8 plugin from even being loaded on the 2.125 core; the
admin would need to update before using it. In the case of an
incompatible change made to a plugin API, rather than a core API, the
UX is a little smoother since the plugin manager could just refuse to
let you update one without the other.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re a plugin or core developer who is interested in using the &lt;code&gt;@Beta&lt;/code&gt;
annotations, or have questions about our motiviations, please join the
discussion on
&lt;a href=&quot;https://groups.google.com/d/msgid/jenkinsci-dev/CANfRfr0Ngpm_f-F_BhTzHijyPse7pMVT8-oVazHrO%3Di_d7ZR4A%40mail.gmail.com&quot;&gt;this mailing list thread&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/04/27/essentials-versions-are-numbered/</id>
<title>Jenkins Essentials: The days of versions are numbered</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/27/essentials-versions-are-numbered/" />
<author>
<name>rtyler</name>
</author>
<category term='evergreen'></category>
<summary>
Jenkins Essentials has been renamed to Jenkins Evergreen since this was written.





A couple weeks ago, I
wrote about the Jenkins Essentials
effort, on which we&#8217;ve been making steady progress. Personally, the most
exciting challenge of this project is defining the machinery to drive
automatic updates
of Jenkins Essentials, which viewed from a high level, are classic continuous
delivery challenges.


In this post, I wanted to dive into a bit of the gritty details of how we&#8217;re
going to be delivering Jenkins Essentials with automatic updates, which has
some really interesting requirements for the development of Jenkins itself.





The traditional Jenkins core and plugin development workflow involves a
developer working on changes...
</summary>
<content type='html'>
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;em&gt;Jenkins Essentials&lt;/em&gt; has been renamed to &lt;em&gt;Jenkins &lt;strong&gt;Evergreen&lt;/strong&gt;&lt;/em&gt; since this was written.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A couple weeks ago, I
&lt;a href=&quot;https://www.jenkins.io/blog/2018/04/06/jenkins-essentials/&quot;&gt;wrote about the Jenkins Essentials&lt;/a&gt;
effort, on which we’ve been making steady progress. Personally, the most
exciting challenge of this project is defining the machinery to drive
&lt;a href=&quot;https://www.jenkins.io/blog/2018/04/06/jenkins-essentials/#auto-update&quot;&gt;automatic updates&lt;/a&gt;
of Jenkins Essentials, which viewed from a high level, are &lt;em&gt;classic&lt;/em&gt; continuous
delivery challenges.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this post, I wanted to dive into a bit of the gritty details of how we’re
going to be delivering Jenkins Essentials with automatic updates, which has
some really interesting requirements for the development of Jenkins itself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/logos/magician/256.png&quot; alt=&quot;Jenkins Essentials&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The traditional Jenkins core and plugin development workflow involves a
developer working on changes for some amount of time, then when they’re ready,
they &quot;create a release&quot; which typically involves publishing artifacts to our
Artifactory, and then on a timer (typically every 15 minutes) the Update Center will
re-generate a file called &lt;code&gt;update-center.json&lt;/code&gt;. Once the new Update Center has
been generated, it is published and consumed by Jenkins installations within
24 hours. Of course, only after Jenkins administrators recognize that there is
an update available, can they install it. All in all, it can take quite a long
time from when a developer publishes a release, to when it is successfully used
by an end-user.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With our desire to make Jenkins Essentials updates seamless and automatic, the
status quo clearly was not going to work. Our shift in thinking has required a
couple simultaneous efforts to make this more continuously delivered approach
viable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;developer-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#developer-improvements&quot; /&gt;Developer Improvements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting from the developer’s workflow,
&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;
has been working on publishing &quot;incremental builds&quot; of artifacts into a
&lt;a href=&quot;https://github.com/jenkins-infra/iep/tree/master/iep-009&quot;&gt;special Maven repository&lt;/a&gt;
in Artifactory. Much of his work is described in the very thorough
&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/305&quot;&gt;Jenkins Enhancement Proposal 305&lt;/a&gt;.
This support, which is &lt;em&gt;now live&lt;/em&gt; on
&lt;a href=&quot;https://ci.jenkins.io/blue/&quot;&gt;ci.jenkins.io&lt;/a&gt;
allows plugin developers to publish versioned changes from &lt;em&gt;pull requests&lt;/em&gt; and
&lt;em&gt;branches&lt;/em&gt; to the &lt;code&gt;incrementals&lt;/code&gt; repository. Not only does this make it much
easier for Jenkins Essentials to deliver changes closer to the &lt;code&gt;HEAD&lt;/code&gt; of
&lt;code&gt;master&lt;/code&gt; branches, it also unlocks lots of flexibility for Jenkins developers
who coordinate changes across matrices of plugins and core, as occasionally is
necessary for Jenkins Pipeline, Credentials, Blue Ocean, and a number of other
foundational components of a modern Jenkins install.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a follow-up blog post, Jesse is going to go into much more detail on some of
the access control and tooling changes he had to solve to make this
incrementals machinery work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, incremental builds are only a piece of the puzzle, with those
artifacts, Jenkins Essentials has to be able to do something useful with them!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update-improvements&quot; /&gt;Update Improvements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The number one requirement, from my perspective, for the automatically updated
distribution is that it is &lt;strong&gt;safe&lt;/strong&gt;. &quot;Safe&quot; means that a user doesn’t need to
be involved in the update process, and if something goes wrong, the
instance recovers without the user needing to do anything to remediate a
&quot;bad code deploy.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my previous post on the subject, I mentioned Baptiste’s work on
&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/302&quot;&gt;Jenkins Enhancement
Proposal 302&lt;/a&gt; which describes the &quot;data safety&quot; system for safely applying
updates, and in case of failure, rolling back.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next obvious question is &quot;what’s failure?&quot; which Baptiste spent some time
exploring and implementing in two more designs:&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;&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/304&quot;&gt;JEP-304: Essentials Client Error Telemetry Logging&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/306&quot;&gt;JEP-306: Essentials Instance Client Health Checking&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the server side, of which there is substantial work for Jenkins Essentials,
these concepts integrate with the concept of an
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/307&quot;&gt;Update Lifecycle&lt;/a&gt;
between the server and client. In essence, the server side must be able to
deliver the right updates to the right clients, and avoid delivering tainted
updates (those with known problems) to clients. While this part of the work is
still on-going, tremendous progress has been made over the past couple weeks
in ensuring that updates can be safely, securely, and automatically delivered.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the ability to identify &quot;bad code deploys&quot;, and having a mechanism for
safely rolling back, not only does Jenkins Essentials allow seamless
updates, but it enables Jenkins developers to deliver features and bugfixes
&lt;em&gt;much&lt;/em&gt; more quickly than our current distribution model allows.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While Jenkins Essentials does not have a package ready for broad consumption
yet, we’re rapidly closing in on the completion of our first milestone which
ties all of these automatic update components together and builds the
foundation for continuous delivery of all subsequent improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can follow our progress in the
&lt;a href=&quot;https://github.com/jenkins-infra/evergreen&quot;&gt;jenkins-infra/evergreen&lt;/a&gt;
repository, or join us in our
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkins-infra_evergreen:gitter.im&quot;&gt;Gitter chat&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/04/25/configuring-jenkins-pipeline-with-yaml-file/</id>
<title>Configuring a Jenkins Pipeline using a YAML file</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/25/configuring-jenkins-pipeline-with-yaml-file/" />
<author>
<name>mdesanti</name>
</author>
<category term='jenkins'></category>
<category term='pipelines'></category>
<category term='yaml'></category>
<category term='sharedlibrary'></category>
<summary>
A few years ago our CTO wrote about building a
Continuous Integration server for Ruby On Rails using Jenkins and docker.
The solution has been our CI pipeline for the past years until we recently decided to
make an upgrade. Why?




Jenkins version was way out of date and it was getting difficult to
upgrade


Wolox has grown significantly over the past years
and we’ve been experiencing scaling issues


Very few people knew how to fix any issues with the server


Configuring jobs was not an easy task and that made our project
kickoff process slower


Making changes to the commands that each job runs was not easy and not
many people...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few years ago our CTO wrote about building a
&lt;a href=&quot;https://medium.com/wolox-driving-innovation/ruby-on-rails-continuous-integration-with-jenkins-and-docker-compose-8dfd24c3df57&quot;&gt;Continuous Integration server for Ruby On Rails using Jenkins and docker&lt;/a&gt;.
The solution has been our CI pipeline for the past years until we recently decided to
make an upgrade. Why?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins version was way out of date and it was getting difficult to
upgrade&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.wolox.co&quot;&gt;Wolox&lt;/a&gt; has grown significantly over the past years
and we’ve been experiencing scaling issues&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Very few people knew how to fix any issues with the server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuring jobs was not an easy task and that made our project
kickoff process slower&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Making changes to the commands that each job runs was not easy and not
many people had permissions to do so. Wolox has a wide range of
projects, with a wide variety of languages which made this problem even
bigger.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Taking into account these problems, we started digging into the newest
version of Jenkins to see how we could improve our CI. We needed to
build a new CI that could, at least, address the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Projects must be built using Docker. Our projects depend on one or
multiple docker images to run (app, database, redis, etc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easy to configure and replicate if necessary&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easy to add a new project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easy to change the building steps. Everyone working on the project
should be able to change if they want to run &lt;em&gt;npm install&lt;/em&gt; or &lt;em&gt;yarn
install&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;installing-jenkins-and-docker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installing-jenkins-and-docker&quot; /&gt;Installing Jenkins and Docker&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Installing Jenkins is straightforward. You can visit
&lt;a href=&quot;https://www.jenkins.io/download/&quot;&gt;Jenkins Installation page&lt;/a&gt; and choose the
option that best suits your needs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are the steps we followed to install Jenkins in AWS:&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;sudo &lt;/span&gt;rpm — import https://pkg.jenkins.io/debian/jenkins.io.key
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;wget &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;yum &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;java-1.8.0 &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;yum remove java-1.7.0-openjdk &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;yum &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;jenkins &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;yum update &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;yum &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; docker&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;automatically-adding-projects-from-github&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automatically-adding-projects-from-github&quot; /&gt;Automatically adding projects from Github&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Adding projects automatically from Github can be achieved using the
&lt;a href=&quot;https://plugins.jenkins.io/github-branch-source&quot;&gt;GitHub Branch Source Plugin&lt;/a&gt;.
It allows Jenkins to scan a GitHub organization
for projects that match certain rules and add them to Jenkins
automatically. The only constraint that all branches must meet in order
to be added is that they contain a Jenkinsfile that explains how to
build 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;easy-to-change-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#easy-to-change-configuration&quot; /&gt;Easy to change configuration&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;not-so-easy-to-change-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#not-so-easy-to-change-configuration&quot; /&gt;Not so easy to change configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the biggest pains we had with our previous Jenkins was the
difficulty of changing the steps necessary to build the project. If you
looked at a project’s build steps, you would find something like 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;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash +x&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Remove unnecessary files&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[34mRemoving unnecessary files...&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[0m&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; log/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.log &amp;amp;&amp;gt; /dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &amp;amp;&amp;gt; /dev/null
&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; public/uploads/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &amp;amp;&amp;gt; /dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &amp;amp;&amp;gt; /dev/null

&lt;span class=&quot;c&quot;&gt;# Build Project&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[34mBuilding Project...&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[0m&quot;&lt;/span&gt;
docker-compose &lt;span class=&quot;nt&quot;&gt;--project-name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JOB_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; build

&lt;span class=&quot;c&quot;&gt;# Prepare test database&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;COMMAND&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rake db:drop db:create db:migrate&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[34mRunning: &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COMMAND&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[0m&quot;&lt;/span&gt;
docker-compose &lt;span class=&quot;nt&quot;&gt;--project-name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JOB_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; run  &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;test &lt;/span&gt;web &lt;span class=&quot;nv&quot;&gt;$COMMAND&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Run tests&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;COMMAND&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rspec spec&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[34mRunning: &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COMMAND&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[0m&quot;&lt;/span&gt;
unbuffer docker-compose &lt;span class=&quot;nt&quot;&gt;--project-name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JOB_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; run web &lt;span class=&quot;nv&quot;&gt;$COMMAND&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Run rubocop lint&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;COMMAND&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rubocop app spec -R --format simple&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[34mRunning: &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COMMAND&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;33[0m&quot;&lt;/span&gt;
unbuffer docker-compose &lt;span class=&quot;nt&quot;&gt;--project-name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JOB_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; run &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;RUBYOPT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-Ku&quot;&lt;/span&gt; web &lt;span class=&quot;nv&quot;&gt;$COMMAND&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;And some post build steps that cleaned up the docker:&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;#!/bin/bash +x&lt;/span&gt;
docker-compose &lt;span class=&quot;nt&quot;&gt;--project-name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JOB_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; stop &amp;amp;&amp;gt; /dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &amp;amp;&amp;gt; /dev/null
docker-compose &lt;span class=&quot;nt&quot;&gt;--project-name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JOB_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--force&lt;/span&gt; &amp;amp;&amp;gt; /dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &amp;amp;&amp;gt; /dev/null
docker stop &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;docker ps &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;exited&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; &amp;amp;&amp;gt; /dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &amp;amp;&amp;gt; /dev/null
docker &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;docker ps &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;exited&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; &amp;amp;&amp;gt; /dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &amp;amp;&amp;gt; /dev/null
docker rmi &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;docker images &lt;span class=&quot;nt&quot;&gt;--filter&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;dangling=true&#39;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--no-trunc&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; &amp;amp;&amp;gt; /dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &amp;amp;&amp;gt; /dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although these commands are not complex, changing any of them required
someone with permissions to modify the job and an understanding ofwhat
needed to be done.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jenkinsfile-to-the-rescue-or-not&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsfile-to-the-rescue-or-not&quot; /&gt;Jenkinsfile to the rescue…​ or not&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the current Jenkins version, we can take advantage of
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;Jenkins Pipeline&lt;/a&gt; and model our build
flow in a file. This file is checked into the repository and, therefore,
anyone with access to it can change the build steps. Yay!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Pipeline even has support for:&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/doc/book/pipeline/docker/&quot;&gt;Docker&lt;/a&gt; and
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/docker/#advanced-usage-with-scripted-pipeline&quot;&gt;multiple
images&lt;/a&gt; can be used for a build!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setting environment variables with &lt;em&gt;withEnv&lt;/em&gt; and many other built -in
functions that can be found
&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/&quot;&gt;here&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;This makes a perfect case for &lt;a href=&quot;https://www.wolox.co&quot;&gt;Wolox&lt;/a&gt;. We can have
our build configuration in a file that’s checked into the repository and
can be changed by anyone with write access to it. However, a Jenkinsfile
for a simple rails project would look something like 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;groovy&quot;&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Jenkinsfile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Might&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compile&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;MYTOOL_HOME=/usr/local/mytool&#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;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;postgres:9.2&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withRun&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;db&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;DB_USERNAME=postgres&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DB_PASSWORD=&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;DB_HOST=db&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;DB_PORT=5432&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;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;redis:X&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withRun&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;redis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;REDIS_URL=redis://redis&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;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imageName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;--file .woloxci/Dockerfile .&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;inside&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--link ${db.id}:postgres --link ${redis.id}:redis&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rake db:create&quot;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rake db:migrate&quot;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rspec spec&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;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 file is not only difficult to read, but also difficult to change.
It’s quite easy to break things if you’re not familiar with Groovy and
even easier if you know nothing about how Jenkins’ pipeline works.
Changing or adding a new Docker image isn’t straightforward and might
lead to confusion.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configuring-jenkins-pipeline-via-yaml&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuring-jenkins-pipeline-via-yaml&quot; /&gt;Configuring Jenkins Pipeline via YAML&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Personally, I’ve always envied simple configuration files for CIs and
this time it was our chance to build CI that could be configured using a
YAML file. After some analysis we concluded that a YAML like this one
would suffice:&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;config&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;dockerfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;.woloxci/Dockerfile&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;project_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;some-project-name&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;services&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;s&quot;&gt;postgresql&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;redis&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;analysis&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;s&quot;&gt;bundle exec rubocop -R app spec --format simple&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bundle exec rubycritic --path ./analysis --minimum-score 80 --no-browser&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;setup_db&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;s&quot;&gt;bundle exec rails db:create&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bundle exec rails db:schema:load&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;test&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;s&quot;&gt;bundle exec rspec&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;security&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;s&quot;&gt;bundle exec brakeman --exit-on-error&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;audit&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;s&quot;&gt;bundle audit check --update&lt;/span&gt;


&lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;GIT_COMMITTER_NAME&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;a&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;GIT_COMMITTER_EMAIL&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;b&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;LANG&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;C.UTF-8&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;It outlines some basic configuration for the project, environment
variables that need to be present during the run, dependentservices, and
our build steps.&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;jenkinsfile-shared-libraries-woloxci&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkinsfile-shared-libraries-woloxci&quot; /&gt;Jenkinsfile + Shared Libraries = WoloxCI&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After investigating for a while about Jenkins and the pipeline, we found
that we could extend it with
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;shared libraries&lt;/a&gt;.
Shared libraries are written in groovy and can be imported
into the pipeline and executed when necessary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you look carefully at this Jenkinsfile,
we see that the code is a chain of methods calls that receive a
closure, where we execute another method passing a new closure 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;groovy&quot;&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Jenkinsfile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Might&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compile&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;
    &lt;span class=&quot;nf&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;MYTOOL_HOME=/usr/local/mytool&#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;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;postgres:9.2&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withRun&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;db&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;DB_USERNAME=postgres&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DB_PASSWORD=&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;DB_HOST=db&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;DB_PORT=5432&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;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;redis:X&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withRun&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;redis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;REDIS_URL=redis://redis&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;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imageName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;--file .woloxci/Dockerfile .&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;inside&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--link ${db.id}:postgres --link ${redis.id}:redis&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rake db:create&quot;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rake db:migrate&quot;&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rspec spec&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;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;Groovy is flexible enough to allow this same declarative code to be
created at runtime, making our dream of using a YAML to configure our
job come true!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introducing-wolox-ci&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-wolox-ci&quot; /&gt;Introducing Wolox-CI&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s how &lt;a href=&quot;https://github.com/Wolox/wolox-ci&quot;&gt;wolox-ci&lt;/a&gt; was born- our
shared library for Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With &lt;a href=&quot;https://github.com/Wolox/wolox-ci&quot;&gt;wolox-ci&lt;/a&gt;, our Jenkinsfile is now
reduced to:&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;nd&quot;&gt;@Library&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;wolox-ci&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;

  &lt;span class=&quot;nf&quot;&gt;woloxCi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;.woloxci/config.yml&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now it simply checks out the code and then calls wolox-ci. The library
reads yaml file like this one&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;config&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;dockerfile&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;.woloxci/Dockerfile&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;project_name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;some-project-name&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;services&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;s&quot;&gt;postgresql&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;redis&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;analysis&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;s&quot;&gt;bundle exec rubocop -R app spec --format simple&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bundle exec rubycritic --path ./analysis --minimum-score 80 --no-browser&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;setup_db&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;s&quot;&gt;bundle exec rails db:create&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bundle exec rails db:schema:load&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;test&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;s&quot;&gt;bundle exec rspec&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;security&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;s&quot;&gt;bundle exec brakeman --exit-on-error&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;audit&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;s&quot;&gt;bundle audit check --update&lt;/span&gt;


&lt;span class=&quot;na&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;RAILS_ENV&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;test&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;GIT_COMMITTER_NAME&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;a&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;GIT_COMMITTER_EMAIL&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;b&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;LANG&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;C.UTF-8&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;and builds the Jenkinsfile to get your job running on the fly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The nice part about having a shared library is that we can extend and
fix our library in a centralized way. Once we add new code, the library
is automatically updated in Jenkins which will notify all of our jobs
with the update.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since we have projects in different languages we use Docker to build the
testing environment. WoloxCI assumes there is a Dockerfile to build and
will run all the specified commands inside the container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;woloxci-config-yml&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#woloxci-config-yml&quot; /&gt;Woloxci config.yml&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;config&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#config&quot; /&gt;Config&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first part of the config.yml file specifies some basic
configuration: project’s name and Dockerfile location. The Dockerfile is
used to build the image where the commands will be run.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;services&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#services&quot; /&gt;Services&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This section describes which services will be exposed to the container.
Out of the box, WoloxCI has support for &lt;em&gt;postgresql&lt;/em&gt;, &lt;em&gt;mssql&lt;/em&gt; and
&lt;em&gt;redis&lt;/em&gt;. You can also specify the docker image version you want! It is
not hard to add a new service. You just need to add the corresponding
file at&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Wolox/wolox-ci/tree/development/vars&quot; class=&quot;bare&quot;&gt;https://github.com/Wolox/wolox-ci/tree/development/vars&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;and modify how the services are parsed&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Wolox/wolox-ci/blob/development/src/com/wolox/parser/ConfigParser.groovy#L76&quot; class=&quot;bare&quot;&gt;https://github.com/Wolox/wolox-ci/blob/development/src/com/wolox/parser/ConfigParser.groovy#L76&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#steps&quot; /&gt;Steps&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The listed commands in this section will run inside the Docker
container. As a result, you’ll see each of the steps on the Jenkins UI.&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://cdn-images-1.medium.com/max/2000/0*SlHf1JHAAvEvZQ74.&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;environment&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#environment&quot; /&gt;Environment&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you need some environment variables during your build, you can
specify them here. Whatever variable you set will be available inside
the Docker container when your commands listed in the &lt;strong&gt;steps&lt;/strong&gt; section
described above.&lt;/p&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;wrapping-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#wrapping-up&quot; /&gt;Wrapping up&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;WoloxCI is still being tested with a not-so-small sample of our
projects. The possibility of changing the build steps through a YAML
file makes it accessible for everyone and that is a great improvement in
our CI workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Docker gives us the possibility of easily changing the programming
language without making any changes to our Jenkins installation and
Jenkins’ Github Organization feature automatically adds new projects
when a new repository with a Jenkinsfile is detected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All of these improvements have reduced the time we spend maintaining
Jenkins significantly and give us the possibility of easily scaling
without any extra configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This library is working in our CI but it still can be improved.
If you would like to add features, feel free to
&lt;a href=&quot;https://github.com/Wolox/wolox-ci&quot;&gt;contribute&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/2018/04/18/blueocean-1-5-0/</id>
<title>Faster sailing on Blue Ocean 1.5.0</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/18/blueocean-1-5-0/" />
<author>
<name>jennbriden</name>
</author>
<category term='blueocean'></category>
<summary>
Hello, I am Jenn, the new Product Manager for Blue Ocean and Jenkins
Pipeline at CloudBees. I am based out of the Seattle area and am excited to be
working on Jenkins. :D We released version 1.5.0 of the Blue Ocean plugin late last week. If you&#8217;re
using Blue Ocean, you&#8217;ll want to grab this update since it includes many
improvements and bug fixes!


New Features


Blue Ocean now includes a user interface update to show the downstream jobs
launched with the 'build' step
(link: JENKINS-38339)







With Blue Ocean 1.5.0, users can now Reorder Steps in the Blue Ocean Pipeline
Editor simply by dragging and dropping steps to reorder them...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello, I am Jenn, the new Product Manager for Blue Ocean and Jenkins
Pipeline at CloudBees. I am based out of the Seattle area and am excited to be
working on Jenkins. :D We released version 1.5.0 of the Blue Ocean plugin late last week. If you’re
using Blue Ocean, you’ll want to grab this update since it includes many
improvements and bug fixes!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-features&quot; /&gt;New Features&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean now includes a user interface update to show the downstream jobs
launched with the &#39;build&#39; step
(link: &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/38339&quot;&gt;JENKINS-38339&lt;/a&gt;)&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/blueocean-1.5.0/downstream-jobs.png&quot; alt=&quot;Visualizing Downstream Jobs&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Blue Ocean 1.5.0, users can now &lt;strong&gt;Reorder Steps in the Blue Ocean Pipeline
Editor&lt;/strong&gt; simply by dragging and dropping steps to reorder them in the list of
steps.
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/38323&quot;&gt;JENKINS-38323&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &quot;Artifacts&quot; tab also now supports pagination, which allows developers to
paginate through the Artifacts tab. Previously, this list
was cut off at 100 entries.
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/43588&quot;&gt;JENKINS-43588&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;improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#improvements&quot; /&gt;Improvements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We were able to include two performance improvements in 1.5.0 which reduce the
&lt;strong&gt;Dashboard&lt;/strong&gt; loading time in Blue Ocean:&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://issue-redirect.jenkins.io/issue/44995&quot;&gt;JENKINS-44995&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/48868&quot;&gt;JENKINS-48868&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;Support for viewing output for failed runs with no stages is also included in
this release. For developers who have no stages/steps defined in their
pipelines, they can now see the full log output for failed runs. This update
helps with Pipeline debugging in Jenkins.
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/48074&quot;&gt;JENKINS-48074&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Further improving the log output for Pipeline Runs, 1.5.0 also improves viewing
of long log output lines with wrapping.  Previously, a single, long line of
output in the log wouldn’t be fully visible in the log window.
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/49036&quot;&gt;JENKINS-49036&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;fixes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fixes&quot; /&gt;Fixes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One notable bug fix we addressed in this release was that &lt;code&gt;input&lt;/code&gt; steps in
&lt;code&gt;post&lt;/code&gt; directives would not properly prompt for input. By fixing
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/49297&quot;&gt;JENKINS-49297&lt;/a&gt;
users of Declarative Pipeline with Blue Ocean can include &lt;code&gt;input&lt;/code&gt; steps in
their &lt;code&gt;post&lt;/code&gt; directives.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The full detailed change log can be viewed on the
&lt;a href=&quot;https://plugins.jenkins.io/blueocean&quot;&gt;Blue Ocean plugin page&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;update-your-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#update-your-plugin&quot; /&gt;Update Your Plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugin updates in Jenkins are available in the Plugin Manager Update Center. This page includes instructions for using the UI and CLI to update your plugins: &lt;a href=&quot;https://www.jenkins.io/doc/book/managing/plugins/&quot;&gt;Check out the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are using the Blue Ocean UI, click Administration in the page’s header to open Plugin Manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Installing the primary Blue Ocean plugin will update its dependencies 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;providing-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#providing-feedback&quot; /&gt;Providing Feedback&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;Chat with us at Gitter: &lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci_blueocean-plugin:gitter.im&quot; class=&quot;bare&quot;&gt;https://app.gitter.im/#/room/#jenkinsci_blueocean-plugin:gitter.im&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Report issues at &lt;a href=&quot;https://issues.jenkins.io/&quot; class=&quot;bare&quot;&gt;https://issues.jenkins.io/&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/2018/04/16/jenkins-x-explained-part1/</id>
<title>Jenkins X Explained Part 1 - an integrated CI/CD solution for Kubernetes</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/16/jenkins-x-explained-part1/" />
<author>
<name>jrawlings</name>
</author>
<category term='jenkins-x'></category>
<category term='kubernetes'></category>
<category term='pipeline'></category>
<summary>
Jenkins X is an opinionated platform for providing CI / CD on top of
Kubernetes.
We’ve chosen a set of core applications that we install and wire together so things work out-of-the-box, providing a
turn key experience. This blog aims to build on previous introductions to Jenkins X and provide a deeper
insight to what you get when you install Jenkins X.







So what happens? After downloading the jx CLI you will now be able to create clusters with public cloud providers
or install onto an existing Kubernetes cluster.







This command will create a cluster on your cloud provider of choice.



&gt; jx create cluster



Alternatively you can bring...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt; is an opinionated platform for providing CI / CD on top of
&lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt;.
We’ve chosen a set of core applications that we install and wire together so things work out-of-the-box, providing a
turn key experience. This blog aims to build on previous introductions to Jenkins X and provide a deeper
insight to what you get when you install Jenkins X.&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/jenkins-x/install/key.png&quot; alt=&quot;key&quot; width=&quot;300&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So what happens? After downloading the jx CLI you will now be able to create clusters with public cloud providers
or install onto an existing Kubernetes cluster.&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/jenkins-x/install/cloud-providers.png&quot; alt=&quot;cloud Providers&quot; width=&quot;300&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This command will create a cluster on your cloud provider of choice.&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;&amp;gt; jx create cluster&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alternatively you can bring your own Kubernetes cluster and install Jenkins X on 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&gt;&amp;gt; jx install&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That said, we’ve found that creating a new cluster on a public cloud such as GKE
is a lot way easier to start as we can be sure of the state of the cluster.
For example we know that storage, networking and loadbalancers will be working as expected.
Creating a cluster on GKE takes only a few minutes so it’s a great way to try things out as well as run your
enterprise workloads.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For now lets assume we are using GKE. When &lt;code&gt;jx create cluster&lt;/code&gt; has finished you will see some output in the
terminal that also includes the default admin password to use when logging into the core applications below.
There is a flag &lt;code&gt;--default-admin-password&lt;/code&gt; you can use to set this password yourself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;accessing-applications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#accessing-applications&quot; /&gt;Accessing applications&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We automatically install an Nginx ingress controller running with an external loadbalancer pointing at it’s
Kubernetes service. We also generate all the Kubernetes Ingress rules using a golang library called
&quot;&lt;a href=&quot;https://github.com/jenkins-x/exposecontroller&quot;&gt;exposecontroller&lt;/a&gt;&quot;.
This runs as a Kubernetes Job triggered by a
&lt;a href=&quot;https://helm.sh/&quot;&gt;Helm&lt;/a&gt; hook once any application is installed to the cluster. &lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using &quot;exposecontroller&quot; means we can control all the ingress rules for an environment using a single set of
configurations, rather than each application needing to know how to expose the kubernetes service to the outside world.
This also means we can easily switch between HTTP and HTTPS plus support integration with projects like
&lt;a href=&quot;https://hub.kubeapps.com/charts/stable/cert-manager&quot;&gt;cert-manager&lt;/a&gt; for auto generation of signed TLS certificates.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;environments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#environments&quot; /&gt;Environments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One important point to make is Jenkins X aims to use terminology that developers are familiar with. That’s not
to say we are changing Kubernetes fundamentals, it’s more that if you don’t know Kubernetes concepts then we aim
to help you still adopt the cloud technology and pull back the curtain as you gain confidence and experience.
To that point, a core part of Jenkins X are &quot;environments&quot;. An environment can have one or more applications running
in it. In Kubernetes term an &quot;environment&quot; maps to the concept of a &quot;namespace&quot; in code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The installation by default created three environments, this is customisable but by default we have a &quot;dev&quot;, a &quot;staging&quot;
and a &quot;production environment&quot;. To list, select, or switch between these environments run:&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;&amp;gt; jx env&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;jenkins-x-core-applications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-x-core-applications&quot; /&gt;Jenkins X core applications&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the &quot;dev&quot; environment we have installed a number of core applications we believe are required at a minimum
to start folks off with CI/CD on Kubernetes. We can easily add to these core apps using Jenkins X addons but
for now lets focus on the core apps. Jenkins X comes with configuration that wires these services together,
meaning everything works together straight away. This dramatically reduces the time to get started with Kubernetes
as all the passwords, environment variables and config files are all setup up to work with each other.&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;&lt;strong&gt;Jenkins&lt;/strong&gt; — provides both CI and CD automation. There is an effort to decompose Jenkins over time to
become more cloud native and make use of Kubernetes concepts around CRDs, storage and scaling for example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nexus&lt;/strong&gt; — acts as a dependency cache for Nodejs and Java applications to dramatically improve build
times. After an initial build of a SpringBoot application the build time is reduced from 12 mins to 4. We
have not yet but intend to demonstrate swapping this with Artifactory soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker Registry&lt;/strong&gt; — an in cluster docker registry where our pipelines push application images, we will
soon switch to using native cloud provider registries such as Google Container Registry, Azure Container
Registry or Amazon Elastic Container Registry (ECR) for example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Chartmuseum&lt;/strong&gt; — a registry for publishing Helm charts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monocular&lt;/strong&gt; — a UI used for discovering and running Helm charts&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;helm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#helm&quot; /&gt;Helm&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We learned a lot in our early days with fabric8 on Kubernetes and there were some projects from the ecosystem
that either weren’t around or (at the time) didn’t work with OpenShift, therefore we were restricted when
making some design decisions. A couple of years on and now with Jenkins X we were able to look at other OSS
projects that have been flourishing, so I was very happy to start looking at &lt;a href=&quot;https://helm.sh/&quot;&gt;Helm&lt;/a&gt;.
Helm is a package manager for Kubernetes and allows easy installation and upgrades of applications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was pretty clear that for Jenkins to evolve and include deployments to the cloud we should embrace Helm
and provide an opinionated experience that helps teams and developers. The core applications mentioned above
means Jenkins X provides an out of the box integrated CI/CD solution for Helm.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We know that helm has limitations but with the work on
&lt;a href=&quot;https://github.com/kubernetes-helm/community/blob/master/helm-v3/000-helm-v3.md&quot;&gt;Helm 3&lt;/a&gt;, the focus of the Kubernetes
sig-apps group, the Kubernetes community and investment we see from key organisations such as Microsoft, we feel Helm
is currently the best way to install and upgrade applications on Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;gitops&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gitops&quot; /&gt;GitOps&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We mentioned earlier that we setup three environments by default. What this means is for the staging and production
environments we created:&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;Kubernetes namespace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An environment resource (&lt;a href=&quot;https://kubernetes.io/docs/concepts/api-extension/custom-resources/&quot;&gt;CustomResourceDefinition&lt;/a&gt;)
in the dev environment which includes details of how applications are promoted to it and includes various team
settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A git repository that we store what applications and their versions should be present in that environment.
These are stored in a Helm requirements.yaml file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A Jenkins Pipeline job: explained in more detail below&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;cicd-for-environments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cicd-for-environments&quot; /&gt;CI/CD for Environments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Having a Jenkins Pipeline Job for each environment means that Pull Requests to the git repo trigger a CI
job.  For now that job performs basic validation but in the future will include ‘gates’ to ensure a change to that
environment has passed expected checks such as QA tasks, gain enough approvals from the correct people, etc -
&lt;strong&gt;YES&lt;/strong&gt; CI for environments!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once CI checks have passed the new application or version change can be merged. Only users that have karma
can merge the Pull Request and therefore we get RBAC plus traceability for our environment deployments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This means every application manifest, their version and configuration including storage requirements, resource
needs and secrets for your environments are stored in Git repositories. Given a disaster recovery scenario this
is exactly what you want.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Did I just say secrets in Git? Yes! We will be providing a nicer experience to helps folks get set up but we
ourselves encrypt our secrets and  store them in Git, then decrypt them when we come to install and upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s our Git repo &lt;a href=&quot;https://github.com/jenkins-x/cloud-environments/blob/a1edcc6/env-jx-infra/secrets.yaml&quot; class=&quot;bare&quot;&gt;https://github.com/jenkins-x/cloud-environments/blob/a1edcc6/env-jx-infra/secrets.yaml&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We do all this with the help of a Helm wrapper called &lt;a href=&quot;https://github.com/futuresimple/helm-secrets&quot;&gt;helm secrets&lt;/a&gt;.
I’m working on a followup blog post with examples, better explanations and how to guides + add better integration
with JX in the coming weeks.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;fancy-getting-involved&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fancy-getting-involved&quot; /&gt;Fancy getting involved?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We mainly hangout in the &lt;a href=&quot;https://jenkins-x.io/community/&quot;&gt;jenkins-x Kubernetes slack channels&lt;/a&gt; and for tips on
being more involved with Jenkins X take a look at our &lt;a href=&quot;https://jenkins-x.io/contribute&quot;&gt;contributing docs&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve not already seen it here’s a video showing the create cluster explained in this blog.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/r8-J9Qg-p9U?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&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/04/13/jenkins-x-23-days-later/</id>
<title>Jenkins X making awesome progress after 24 days</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/13/jenkins-x-23-days-later/" />
<author>
<name>jstrachan</name>
</author>
<category term='jenkins-x'></category>
<category term='kubernetes'></category>
<category term='pipeline'></category>
<summary>
Its been 24 days since we
announced Jenkins X,
a CI/CD solution for modern cloud applications on Kubernetes.
I&#8217;m truly blown away by the response and feedback from the community - thank you!


We&#8217;ve also had lots of folks report they&#8217;ve successfully used Jenkins X
on a number of clouds including GKE, AWS and AKS along with on-premises clusters which is great to hear!


Here&#8217;s a brief overview of the changes in the last 24 days from the
Roadmap:




we now fully support GitHub and GitHub enterprise. BitBucket cloud and gitea is almost there too.
Hopefully BitBucketServer and Gitlab are not too far away either. For more detail see
supporting...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Its been 24 days since we
&lt;a href=&quot;https://www.jenkins.io/blog/2018/03/19/introducing-jenkins-x/&quot;&gt;announced Jenkins X&lt;/a&gt;,
a CI/CD solution for modern cloud applications on Kubernetes.
I’m truly blown away by the response and feedback from the community - thank you!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve also had lots of folks report they’ve successfully used &lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt;
on a number of clouds including GKE, AWS and AKS along with on-premises clusters which is great to hear!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a brief overview of the changes in the last 24 days from the
&lt;a href=&quot;https://jenkins-x.io/contribute/roadmap/&quot;&gt;Roadmap&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;we now fully support GitHub and GitHub enterprise. BitBucket cloud and gitea is almost there too.
Hopefully BitBucketServer and Gitlab are not too far away either. For more detail see
&lt;a href=&quot;https://jenkins-x.io/developing/git/&quot;&gt;supporting different git servers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For issue tracking we support GitHub, GitHub Enterprise and JIRA. For more detail see
&lt;a href=&quot;https://jenkins-x.io/developing/issues/&quot;&gt;supporting issue trackers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gradle support is now available from &lt;a href=&quot;https://jenkins-x.io/developing/create-spring/&quot;&gt;jx create spring&lt;/a&gt;
or by importing gradle apps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go, Node and Rust build packs are now available with more &lt;a href=&quot;https://jenkins-x.io/contribute/roadmap/&quot;&gt;planned&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New &lt;em&gt;addons&lt;/em&gt; for &lt;a href=&quot;https://anchore.com/&quot;&gt;anchore&lt;/a&gt; and &lt;a href=&quot;https://kubeless.io/&quot;&gt;kubeless&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;Also we’ve made it a little bit easier to keep your &lt;code&gt;jx&lt;/code&gt; binary up to date &lt;em&gt;continuously&lt;/em&gt;. Just type one of the following:&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://jenkins-x.io/commands/jx_version/&quot;&gt;&lt;code&gt;jx version&lt;/code&gt;&lt;/a&gt; will prompt you if there is a new version available
and if prompted, it will upgrade itself&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/commands/jx_upgrade_cli/&quot;&gt;&lt;code&gt;jx upgrade cli&lt;/code&gt;&lt;/a&gt; will upgrade the &lt;code&gt;jx&lt;/code&gt; binary if its available or
&lt;a href=&quot;https://jenkins-x.io/commands/jx_upgrade_platform/&quot;&gt;&lt;code&gt;jx upgrade platform&lt;/code&gt;&lt;/a&gt; for the platform&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more detail on the changes over the last 24 days with metrics please see the
&lt;a href=&quot;https://jenkins-x.io/news/changes-april-11-2018/&quot;&gt;changelog generated by Jenkins X&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’d love to hear your feedback what you think of
&lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt; and the
&lt;a href=&quot;https://jenkins-x.io/contribute/roadmap/&quot;&gt;Roadmap&lt;/a&gt; - please
&lt;a href=&quot;https://jenkins-x.io/community/&quot;&gt;join the community&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://jenkins-x.io/&quot;&gt;Jenkins X website&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/demos/&quot;&gt;Demos&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/400&quot;&gt;Jenkins X JEP proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/04/11/security-updates/</id>
<title>Security updates for Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/11/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.116 and 2.107.2, that fix two security vulnerabilities.


For an overview of what was fixed, see the security advisory.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.116 and 2.107.2, that fix two security vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-04-11&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/04/10/opinionated-cd-jenkins-x/</id>
<title>Opinionated Kubernetes and Jenkins X</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/10/opinionated-cd-jenkins-x/" />
<author>
<name>michaelneale</name>
</author>
<category term='jenkins-x'></category>
<category term='kubernetes'></category>
<category term='pipeline'></category>
<summary>
I
recently wrote
about how all the cloud platforms are all in Kubernetes and so are developers.
It is an exciting time, but the problem for many is that this is
a huge blank sheet of paper for how to build and deploy applications.
A white space, a void, a limitless canvas of possibilities.
Insert metaphors here.


The problem, as you may guess, is that few people really like or are able to start with a blank canvas.
I know I prefer to start with something working and iterate towards a solution,
or be given some rails to stay on (again with the metaphors).


That&#8217;s where the Jenkins X project...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I
&lt;a href=&quot;https://www.cloudbees.com/blog/all-in-on-kubernetes-for-developers&quot;&gt;recently wrote&lt;/a&gt;
about how all the cloud platforms are all in Kubernetes and so are developers.
It is an exciting time, but the problem for many is that this is
a huge blank sheet of paper for how to build and deploy applications.
A white space, a void, a limitless canvas of possibilities.
Insert metaphors here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The problem, as you may guess, is that few people really like or are able to start with a blank canvas.
I know I prefer to start with something working and iterate towards a solution,
or be given some rails to stay on (again with the metaphors).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s where the &lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X&lt;/a&gt; project comes in.
Jenkins X is a Kubernetes-native continuous integration and continuous delivery platform
for developing cloud native applications that was recently introduced as a
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/400/README.adoc&quot;&gt;Jenkins Enhancement Proposal&lt;/a&gt;,
sponsored by &lt;a href=&quot;https://twitter.com/jstrachan&quot;&gt;James Strachan&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is a lot to take in but at it’s heart,
this is an open source opinionated way to do continuous delivery with Kubernetes,
natively, without necessarily having to learn all the things I talked about in my last blog post.
I shall attempt to explain what this is all about and why it matters to developers.
As someone said on the jenkins-dev mailing list
“We have the two glued together with baling wire and twine” -
Jenkins X aims to simplify how to work with continuous delivery and Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First and most importantly, let’s see the logo:&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/jenkins-x/jenkins-x.svg&quot; alt=&quot;Jenkins X Logo&quot; width=&quot;200&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can see the nautical theme leaking through (and Kubernetes).
Whilst it is called Jenkins X, it is about quite a lot more than Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-x-makes-decisions-for-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-x-makes-decisions-for-you&quot; /&gt;Jenkins X makes decisions for you&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X presents itself to you initially as a handy sleek command line
(a native binary you can install called jx - the debate is on as to how pronounce it).
Let’s take a tour (sail?):&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;&amp;gt; jx import my-app&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have an existing project, this will detect what type of project it is, build a pipeline for you (and a bunch of Kubernetes things, like Helm Charts), add it to your project and set it up in GitHub, WebHooks and all, build the project (run the pipeline) and deploy a version to a “staging” environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If it looks ok, you can promote it to production:&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;&amp;gt; jx promote --env production --version 1.0.1 my-app&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If something went wrong in production, you can roll back an app to any version (the version numbers are made for you):&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;&amp;gt; jx promote --env production --version 1.0.0 my-app
&amp;gt; jx get apps # list versions&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An &lt;strong&gt;environment&lt;/strong&gt; is a well-established concept for web developers using
continuous delivery: out of the box Jenkins X makes three of them for you
(dev, staging and production), but you can make as many as you like.
Environments have rules around how things are promoted into them
(and they also have their own extensible pipelines,
but you can just use them as-is to start).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also create a Spring Boot microservice app:&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;&amp;gt; jx create spring&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Answer a few questions and it will set everything up for you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Any changes you make to your app automatically are built,
and if the build looks good, they go through to the staging environment.
WebHooks are setup for you (if you are using GitHub) to smooth this over.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For those looking at starting from pre-made apps, there are &quot;quickstarts&quot;:&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;&amp;gt; jx create quickstart&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;They are based on a growing set of starter apps, in a variety of languages and tech stacks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Review apps&lt;/strong&gt; for your changes: Each pull request is built/tested,
and a “review app” is made available in a temporary environment.
That means each proposed change, before it goes to the default branch (master),
has an environment made (temporary) that it can be tried out in.
In GitHub, this shows up as a comment in the pull request:&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/jenkins-x/comment-in-github-pull-request_0.png&quot; alt=&quot;Comment in a GitHub Pull Request&quot; width=&quot;550&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;project-type-detection&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-type-detection&quot; /&gt;Project type detection&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, so far there is no editing or manual creation of pipelines,
or scripting or setup, just importing or creating your app and go.
This is powered by
&lt;a href=&quot;https://github.com/jenkins-x/draft-repo/tree/master/packs&quot;&gt;Draft “packs”&lt;/a&gt;
(a handy project that came out of Azure).
 What you end up with is a Jenkinsfile in your project repository.
 You may want to edit it one day, or you may be happy with it as is!
 Jenkins is famous for being un-opinionated in what you do,
 but Jenkins X has strong opinions (but you can extend and customise).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;image::/images/jenkins-x/draft-logo.png[Draft Logo, width=300]&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;deploying-or-promoting-to-environments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deploying-or-promoting-to-environments&quot; /&gt;Deploying or promoting to environments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Deploying happens via pipelines behind the scenes -
when a change is pushed, or a version promoted.
You don’t need to directly interact with Kubernetes if you don’t need to.
A tool called Helm does the heavy lifting:
Helm is used to package and perform installations and upgrade for your apps.&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/jenkins-x/helm-logo.png&quot; alt=&quot;Helm Logo&quot; width=&quot;156&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is a little more magic going on here with environments, which you don’t see at first.
Each environment, for a team, is represented by a Git repository behind the scenes.
Configuration as code is a well-established best practice these days,
so why not use it to track deployments and initiate deployments.
I also mentioned in my previous post how declarative Kubernetes is:
it is perfect for keeping all config in a repository, of the desired system state.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each promotion is actually a pull request to a per-environment repository.
This repository is made and managed for you (and kept outside of the
main application code repository), you don’t have to look at it,
but you can extend things there should you need to.
Specific environment repositories may have different access rules,
or be controlled by a different team (perhaps even deploy to a different cluster).
Some have coined the term for this as “GitOps.”
I first came across this concept on a
&lt;a href=&quot;https://www.weave.works/blog/gitops-operations-by-pull-request&quot;&gt;WeaveWorks blog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll try and explain this one with a diagram:&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/jenkins-x/gitops-flow.png&quot; alt=&quot;GitOps Workflow&quot; width=&quot;600&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The pipeline is actually split in the middle.
On the left is the more familiar continuous integration pipeline.
This works on pull requests, pre-release version of things
and is all about testing(automated and manual review).
The source of truth for this is the configuration in the
applications repository: branches, pull requests and so on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The right-hand side is the continuous delivery pipeline.
This kicks in when the application is ready to be updated with a new release.
This is the “GitOps” repo behind the scenes that controls the state of things in Kubernetes.
A promotion on this side is a pull request, and then a merge,
from the staging repository to the production repository.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;installing-jenkins-x&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#installing-jenkins-x&quot; /&gt;Installing Jenkins X&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The jx command line has a jx install command that installs it into a Kubernetes cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The best experience initially is using Google’s excellent GKE service:&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;&amp;gt; jx create cluster gke&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will ask a few questions, and go and set it all up for you in a
cluster set aside for Jenkins X (recommended).
Jenkins X runs entirely as services on top of a Kubernetes cluster.&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;&amp;gt; jx install&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Is designed to work with a Kubernetes cluster (if it already exists,
recommendation is to have a cluster put aside for Jenkins X if possible).
Amazon EKS support is coming (mostly it is around testing),
that service is in beta/early access so it is still a work in progress,
as is Microsoft Azures excellent AKS service.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;so-where-is-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#so-where-is-jenkins&quot; /&gt;So where is Jenkins?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Good question, thanks for asking. Well, it is behind the scenes.
As you have seen, there was no direct interaction with Jenkins,
but it is there, running the pipelines for continuous integration and
continuous delivery of the respective repositories, and orchestrating things with Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you run &lt;code&gt;jx get pipelines&lt;/code&gt; you can see URLs to the various pipelines
that have been setup for you are part of interacting with Jenkins X.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By the way,
&lt;a href=&quot;https://www.jenkins.io/blog/2018/03/19/introducing-jenkins-x/&quot;&gt;James Strachan has written an extensive blog on jenkins.io&lt;/a&gt;
that really explores the Jenkins X project in-depth.
Once you finish reading this blog, take a stroll on over there and read James&#39;.
He also provides several ways you can get involved in 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;what-else-can-i-do-with-the-command-line&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-else-can-i-do-with-the-command-line&quot; /&gt;What else can I do with the command line?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lots, the jx command line has built in help:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jx open&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;open apps, services or pipelines in your browser&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jx activity&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;explains how things got to where they are, a history&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jx get environments&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;list environments&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;jx get apps&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;show the state of applications, what versions are in what environments.&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;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;There is a whole lot more to this, and lots more moving parts and services
that are set up for you that are very useful, but it is best to head over
to &lt;a href=&quot;https://jenkins-x.io/&quot;&gt;jenkins-x.io&lt;/a&gt; and have a look.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project is obviously in early stages (it is still a Draft JEP after all) and there is lots happening.
Check out the &lt;a href=&quot;https://jenkins-x.io/community/&quot;&gt;Jenkins X community&lt;/a&gt;
if you want to chat on slack, IRC, issues or email.
Also, read the
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/400/README.adoc&quot;&gt;Jenkins Enhancement Proposal doc&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/04/09/whats-in-declarative/</id>
<title>The new things arriving in Declarative Pipeline!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/09/whats-in-declarative/" />
<author>
<name>abayer</name>
</author>
<category term='pipeline'></category>
<category term='declarative'></category>
<summary>
Last week we released the latest version of Declarative Pipelines, version
1.2.8. With that out, we thought now would be a good time to introduce you to
the new features and options that have been added to Declarative since the
beginning of 2018. These are all available now in the Update Center, with
version 1.2.8.





Declarative Directive Generator


This is something we&#8217;re really happy about - if you go to the "Pipeline Syntax"
link from your Pipeline&#8217;s page in Jenkins, you&#8217;ll see a couple new links on the
left, including "Declarative Directive Generator". The Directive Generator is
much like the Snippet Generator that&#8217;s been in Pipeline for a couple...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week we released the latest version of Declarative Pipelines, version
1.2.8. With that out, we thought now would be a good time to introduce you to
the new features and options that have been added to Declarative since the
beginning of 2018. These are all available &lt;em&gt;now&lt;/em&gt; in the Update Center, with
version 1.2.8.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/declarative-1.2.8/directive-generator-link.png&quot; alt=&quot;Accessing the new Declarative Directive Generator&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;declarative-directive-generator&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#declarative-directive-generator&quot; /&gt;Declarative Directive Generator&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is something we’re really happy about - if you go to the &quot;Pipeline Syntax&quot;
link from your Pipeline’s page in Jenkins, you’ll see a couple new links on the
left, including &quot;Declarative Directive Generator&quot;. The Directive Generator is
much like the Snippet Generator that’s been in Pipeline for a couple years now,
but where the Snippet Generator is just for filling out a form for a step and
generating the Pipeline code that configuration maps to, the Directive
Generator is built to help you write your Declarative Pipeline directives, like
&lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;options&lt;/code&gt;, &lt;code&gt;stage&lt;/code&gt;, and more!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the first release to include the Directive Generator, and it’s
definitely going to see more polish going forward, but we think it should be
quite helpful for you already. We’ll be putting up another blog post looking at
the Directive Generator in more detail in the near future.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;new-when-conditions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-when-conditions&quot; /&gt;New &lt;code&gt;when&lt;/code&gt; conditions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve added a number of new &lt;code&gt;when&lt;/code&gt; conditions, providing you more control over
whether your stages get executed.&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;equals&lt;/code&gt; - Compares two values - strings, variables, numbers, booleans - and
returns true if they’re equal. I’m honestly not sure how we missed adding
this earlier! You can do &quot;not equals&quot; comparisons using the &lt;code&gt;not { equals …​
}&lt;/code&gt; combination too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;changeRequest&lt;/code&gt; - In its simplest form, this will return true if this
Pipeline is building a change request, such as a GitHub pull request. You can
also do more detailed checks against the change request, allowing you to ask
&quot;is this a change request against the master branch?&quot; and much more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;buildingTag&lt;/code&gt; - A simple condition that just checks if the Pipeline is
running against a tag in SCM, rather than a branch or a specific commit
reference.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;tag&lt;/code&gt; - A more detailed equivalent of &lt;code&gt;buildingTag&lt;/code&gt;, allowing you to check
against the tag name itself.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition, we’ve added a new option to &lt;code&gt;when&lt;/code&gt;: &lt;code&gt;beforeAgent&lt;/code&gt;. This allows you
to specify that the &lt;code&gt;when&lt;/code&gt; conditions should be evaluated before entering the
&lt;code&gt;agent&lt;/code&gt; for the &lt;code&gt;stage&lt;/code&gt;, rather than the normal behavior of evaluating &lt;code&gt;when&lt;/code&gt;
conditions after entering the &lt;code&gt;agent&lt;/code&gt;. When &lt;code&gt;beforeAgent true&lt;/code&gt; is specified,
you will not have access to the &lt;code&gt;agent’s workspace, but you can avoid
unnecessary SCM checkouts and waiting for a valid `agent&lt;/code&gt; to be available. This
can speed up your Pipeline’s execution in some cases.&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/declarative-1.2.8/directive-generator.png&quot; alt=&quot;Using the new Declarative Directive Generator&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;new-post-conditions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-post-conditions&quot; /&gt;New &lt;code&gt;post&lt;/code&gt; conditions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;changed&lt;/code&gt; condition has always been a bit confusing, and to be
honest, it wasn’t our best work. &lt;code&gt;changed&lt;/code&gt; will fire any time the current run’s
status is different than the previous run’s status - whether the current run is
healthier than the previous one, or the other way around. That’s…​not actually
very useful. So now we’ve added two new &lt;code&gt;post&lt;/code&gt; conditions that should provide
you with a lot more value than &lt;code&gt;changed&lt;/code&gt; has.&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;fixed&lt;/code&gt; - This will check to see if the current run is successful, and if the
previous run was either failed or unstable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;regression&lt;/code&gt; - This will check to see if the current run’s status is worse
than the previous run’s status. So if the previous run was successful, and
the current run is unstable, this will fire and its block of steps will
execute. It will also run if the previous run was unstable, and the current
run is a failure, etc.&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;new-options&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-options&quot; /&gt;New &lt;code&gt;options&lt;/code&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;options&lt;/code&gt; directive in Declarative can contain a number of different kinds
of configuration: traditional Jenkins job properties, like &lt;code&gt;buildDiscarder&lt;/code&gt;,
wrapper steps to execute the entire Pipeline within, like &lt;code&gt;timeout&lt;/code&gt;, and
Declarative-specific options that can switch from some default behaviors of
Declarative execution. We’ve added two new Declarative-specific options in the
last few releases.&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;checkoutToSubdirectory&lt;/code&gt; - Allows you to override the location that the
automatic SCM checkout will use. Using &lt;code&gt;checkoutToSubdirectory(&quot;foo&quot;)&lt;/code&gt;, your
Pipeline will checkout your repository to &lt;code&gt;&quot;$WORKSPACE/foo&quot;&lt;/code&gt;, rather than the
default of &lt;code&gt;&quot;$WORKSPACE&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;newContainerPerStage&lt;/code&gt; - If you’re using a top-level &lt;code&gt;docker&lt;/code&gt; or &lt;code&gt;dockerfile&lt;/code&gt;
&lt;code&gt;agent&lt;/code&gt;, and want to ensure that each of your stages run in a fresh container
of the same image, you can use this option. Any &lt;code&gt;stage&lt;/code&gt; without its own
&lt;code&gt;agent&lt;/code&gt; specified will run in a new container using the image you’ve
specified or built, on the same computer and with access to the same
workspace.&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;stage-options&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-options&quot; /&gt;Stage options&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes, you may only want to disable automatic checkout of your repository,
using the &lt;code&gt;skipDefaultCheckout(true)&lt;/code&gt; option, for one specific stage in your
Pipeline. Or perhaps you want to have a &lt;code&gt;timeout&lt;/code&gt; that covers an entire
&lt;code&gt;stage&lt;/code&gt;, including time spent waiting for a valid &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;post&lt;/code&gt; condition
execution, or the new &lt;code&gt;input&lt;/code&gt; directive for stages (see further down for more
details on that!). To make those things possible, we’ve added a new &lt;code&gt;options&lt;/code&gt;
direction to &lt;code&gt;stage&lt;/code&gt;. You can use a subset of the top-level &lt;code&gt;options&lt;/code&gt; content
in a &lt;code&gt;stage’s `options&lt;/code&gt; - wrapper steps, and Declarative-specific options that
are marked as legal in a &lt;code&gt;stage&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;input&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#input&quot; /&gt;Input&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ve always been able to run the &lt;code&gt;input&lt;/code&gt; step inside a &lt;code&gt;stage’s `steps&lt;/code&gt;
block, but we’ve found that approach can lose out on some of the value that the
&lt;code&gt;input&lt;/code&gt; step provides.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To help with that, we’ve added a new &lt;code&gt;input&lt;/code&gt; directive
to &lt;code&gt;stage&lt;/code&gt;, with the same parameters as the &lt;code&gt;input&lt;/code&gt; step. When you use the
&lt;code&gt;stage&lt;/code&gt; &lt;code&gt;input&lt;/code&gt; directive rather than using the step directly, any parameters
you’ve specified for the &lt;code&gt;input&lt;/code&gt; will be made available in the &lt;code&gt;stage’s
environment, meaning you can reference parameters from the `input&lt;/code&gt; in &lt;code&gt;when&lt;/code&gt;
conditions, or in &lt;code&gt;environment&lt;/code&gt; variables.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
    agent none
    stages {
        stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Example&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            input {
                message &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Should we continue?&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                ok &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Yes, we should.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                submitter &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;alice,bob&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                parameters {
                    string(&lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;PERSON&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;defaultValue&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Mr Jenkins&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;description&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Who should I say hello to?&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)
                }
            }
            agent any
            steps {
                echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Hello, &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;PERSON&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;, nice to meet you.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, the &lt;code&gt;input&lt;/code&gt; directive is evaluated before you enter any &lt;code&gt;agent&lt;/code&gt; specified
on this &lt;code&gt;stage&lt;/code&gt;, so if you are using a top-level &lt;code&gt;agent none&lt;/code&gt; and each &lt;code&gt;stage&lt;/code&gt;
has its own &lt;code&gt;agent&lt;/code&gt; specified, you can avoid consuming an executor while
waiting for the &lt;code&gt;input&lt;/code&gt; to be submitted.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, you can use &lt;code&gt;timeout&lt;/code&gt; in the &lt;code&gt;stage&lt;/code&gt; &lt;code&gt;options&lt;/code&gt;, as
mentioned above, to time-out the &lt;code&gt;input&lt;/code&gt; if too much time has passed without a
response.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope you find these new features and options for Declarative Pipelines
helpful, and I look forward to the rest of 2018 as we continue to invest and
improve in &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Jenkins Pipeline&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/04/06/jenkins-essentials/</id>
<title>Jenkins Essentials: five minutes, five clicks</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-04-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/04/06/jenkins-essentials/" />
<author>
<name>rtyler</name>
</author>
<category term='evergreen'></category>
<summary>
Jenkins Essentials has been renamed to Jenkins Evergreen since this was written.





In his presentation at the 2017 Jenkins World Contributor Summit,
Kohsuke
challenged us to continue the work started with Jenkins 2 of making Jenkins
easier to install and easier to use. "A user should be successful with Jenkins
in under five minutes and five clicks." At that same Contributor Summit, a few
of us discussed the idea of a distribution which had "batteries
included", which
Andrew
proudly named "Jenkins Essentials." At the time I was certainly not as excited
about the project as I am now, I thought to myself "we built a Setup Wizard in
Jenkins 2, nobody...
</summary>
<content type='html'>
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;em&gt;Jenkins Essentials&lt;/em&gt; has been renamed to &lt;em&gt;Jenkins &lt;strong&gt;Evergreen&lt;/strong&gt;&lt;/em&gt; since this was written.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In his presentation at the 2017 &lt;a href=&quot;https://jenkinsworld.com&quot;&gt;Jenkins World&lt;/a&gt; Contributor Summit,
&lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke&lt;/a&gt;
challenged us to continue the work started with Jenkins 2 of making Jenkins
easier to install and easier to use. &quot;A user should be successful with Jenkins
in under five minutes and five clicks.&quot; At that same Contributor Summit, a few
of us discussed the idea of a distribution which had &quot;batteries
included&quot;, which
&lt;a href=&quot;https://github.com/abayer&quot;&gt;Andrew&lt;/a&gt;
proudly named &quot;Jenkins Essentials.&quot; At the time I was certainly not as excited
about the project as I am now, I thought to myself &quot;we built a Setup Wizard in
Jenkins 2, nobody needs a Setup Wizard++.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/logos/magician/256.png&quot; alt=&quot;Jenkins Essentials&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Kohsuke and I continued to discuss the idea, more and more ideas came up.
Towards the end of 2017 the picture became much clearer: &lt;strong&gt;Jenkins Essentials
would be a comprehensive, low-maintenance distribution&lt;/strong&gt; to help new and
existing users be successful with Jenkins, without needing to be Jenkins
&lt;em&gt;experts&lt;/em&gt;. This will of course not replace the existing distribution of Jenkins core and
its plugins, which allow many of us large amounts of flexibility, but rather it
will make Jenkins easier for users who don’t want to &quot;build it themselves.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The more I thought about it, the more excited about the idea I became: Jenkins
Essentials could open the door to new improvements and features in Jenkins
which had been left in the &quot;idea and design&quot; phase going back almost &lt;em&gt;two
years&lt;/em&gt;! Really, I checked, some of the concepts adopted into the design of
Jenkins Essentials were first conceived of in early 2016!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kohsuke briefly discussed the project in
&lt;a href=&quot;https://www.jenkins.io/blog/2018/03/20/evolving-mission-of-jenkins/&quot;&gt;his previous blog post&lt;/a&gt;
but in post I wanted to expand on &lt;a href=&quot;#what&quot;&gt;what&lt;/a&gt; Jenkins Essentials is, and our
&lt;a href=&quot;#progress&quot;&gt;progress&lt;/a&gt; has been in its development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what&quot; /&gt;What’s in Jenkins Essentials&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few months ago I prepared
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/300/jenkins-essentials-and-evergreen-fosdem-2018.pdf&quot;&gt;this presentation&lt;/a&gt;
for the
&lt;a href=&quot;https://fosdem.org/2018/&quot;&gt;FOSDEM 2018&lt;/a&gt;
Jenkins Contributor Summit, which outlines the following &quot;pillars&quot; or Jenkins
Essentials, which are also described in
&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/300&quot;&gt;JEP-300&lt;/a&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;#auto-update&quot;&gt;Automatically Updated Distribution&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#sane-defaults&quot;&gt;Automatic Sane Defaults&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#connected&quot;&gt;Connected&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#obvious-path&quot;&gt;Obvious Path to User Success&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;auto-update&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#auto-update&quot; /&gt;Automatically Updated Distribution&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to provide an easier-to-use and easier-to-manage Jenkins environment,
Jenkins Essentials will be distributed as an automatically self-updating
distribution, containing Jenkins core and a version-locked set of plugins
considered &quot;essential.&quot; Rather than attempting to mirror the existing Weekly
and LTS release lines for core, plus some plugin version matrix, Jenkins
Essentials will update in a manner similar to Google Chrome.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This automatically updating distribution will mean that Jenkins Essentials will
require significantly less overhead to manage, receiving improvements and bug
fixes without any user involvement. From the user perspective, their Jenkins
will appear to automatically improve over time.&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;There is really interesting work being pioneered by
&lt;a href=&quot;https://github.com/batmat&quot;&gt;Baptiste Mathus&lt;/a&gt;
with
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/302&quot;&gt;JEP-302&lt;/a&gt;
to ensure that these automatic upgrades can be performed safely.&lt;/p&gt;
&lt;/div&gt;
&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;sane-defaults&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sane-defaults&quot; /&gt;Automatic Sane Defaults&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Providing a core along with &quot;essential&quot; plugins is a good first step to helping
Jenkins users successfully automate their CI/CD workloads, but requires
additional &quot;smoothing&quot; over some of the numerous options and configurations
plugins. Jenkins Essentials will perform some amount of &quot;automatic
environment-based self-configuration.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, clicking a &quot;Launch Stack&quot; button from the &lt;a href=&quot;https://www.jenkins.io/download&quot;&gt;Download&lt;/a&gt;
page would launch an AWS-flavored Jenkins Essentials which, out of the box
attempts to set up AWS-specific configuration with S3 and EC2 services.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;connected&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#connected&quot; /&gt;Connected&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to provide a more seamless experience for end-users, and ensure that
Jenkins project developers receive useful error and usage telemetry to drive
further improvements in Jenkins, Jenkins Essentials must necessarily be viewed
as a &quot;&lt;strong&gt;Connected&lt;/strong&gt;&quot; application. This means some yet-to-be-specified number of
server-side applications to coordinate updates, receive and process telemetry,
broker 3rd-party service authentications, relay webhooks, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;obvious-path&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#obvious-path&quot; /&gt;Obvious Path to User Success&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final pillar in Jenkins Essentials, is to ensure that Jenkins provides an
obvious path for a user to configure and use it successfully. This largely
entails in-application documentation, examples, and disabling legacy
functionality within the application. All with the end goal of preventing users
from inadvertently choosing legacy, or poorly supported, options when
configuring their CI/CD workloads.&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;progress&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#progress&quot; /&gt;Progress thus far&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Suffice it to say, Jenkins Essentials is a hugely ambitious project! We have
been making steady progress however, as you can see in the
&lt;a href=&quot;https://github.com/jenkins-infra/evergreen&quot;&gt;jenkins-infra/evergreen&lt;/a&gt;
repository on GitHub. We have been adamantly following the
&lt;a href=&quot;https://github.com/jenkinsci/jep&quot;&gt;Jenkins Enhancement Proposal&lt;/a&gt;
process, and have been making sure our designs and implementations are clear as
we build them. Thus far we’ve written designs and implemented:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JEP-300: &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/300&quot;&gt;Jenkins Essentials&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JEP-301: &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/301&quot;&gt;Evergreen packaging for Jenkins Essentials&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JEP-302: &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/302&quot;&gt;Evergreen snapshotting data safety system&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JEP-303: &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/303&quot;&gt;Evergreen Client Registration and Authentication&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JEP-304: &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/304&quot;&gt;Essentials Client Error Telemetry Logging&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;Unfortunately we don’t yet have the first parts of the &lt;a href=&quot;#auto-update&quot;&gt;Automatically Updated Distribution&lt;/a&gt; working,
which means you cannot download Jenkins Essentials &lt;em&gt;today&lt;/em&gt; and get started with
it. We’re still building the Jenkins-side and server-side components necessary
to make the full feedback loop operate, without which we would not be able to
safely deliver new upgrades to Jenkins Essentials installations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in getting involved, you can check out our
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkins-infra_evergreen:gitter.im&quot;&gt;Gitter channel&lt;/a&gt;
or our
&lt;a href=&quot;https://issues.jenkins.io/secure/RapidBoard.jspa?rapidView=406&quot;&gt;Jira issues board&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Essentials is just one major initiative going on in the Jenkins project
this year, so I hope you’re as excited as I am for the future of Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/03/20/evolving-mission-of-jenkins/</id>
<title>Evolving Mission of Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-03-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/03/20/evolving-mission-of-jenkins/" />
<author>
<name>kohsuke</name>
</author>
<category term='jenkins-x'></category>
<category term='evergreen'></category>
<summary>
Lately, perhaps subtle but exciting changes are starting to happen in the Jenkins project.


The past few weeks have seen the birth of two new initiatives in Jenkins:
Jenkins Essentials and
Jenkins X.  Each is
exciting in its own right, and I encourage interested parties to take a look at
their goals and missions and participate in them.  But in this post, I want to
discuss why together these two dots form an important arc, which actually
started in the introduction of Jenkins 2 and continued with Blue Ocean.


In Jenkins 2, we changed Jenkins so that it starts with richer functionality
and more sensible security setup,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lately, perhaps subtle but exciting changes are starting to happen in the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The past few weeks have seen the birth of two new initiatives in Jenkins:
&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/300&quot;&gt;Jenkins Essentials&lt;/a&gt; and
&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/400&quot;&gt;Jenkins X&lt;/a&gt;.  Each is
exciting in its own right, and I encourage interested parties to take a look at
their goals and missions and participate in them.  But in this post, I want to
discuss why together these two dots form an important arc, which actually
started in the introduction of Jenkins 2 and continued with Blue Ocean.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Jenkins 2, we changed Jenkins so that it starts with richer functionality
and more sensible security setup, among other things.  This was the first step
in a new direction for Jenkins.  We changed our focus from “we’ll write plugins
and you figure out the rest” to “we’ll write plugins, we’ll assemble them, and
we’ll help you be more productive.”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean was another step on this journey.  We focused on important
continuous delivery use cases in Jenkins, and aimed to provide a great
user-experience for those use cases.  Aside from obvious productivity boost for
users, it also decidedly blended together feature areas that are internally
provided by a whole bunch of different plugins, but users see much less seam
between them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Essentials, which &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R Tyler Croy&lt;/a&gt; proposed in
recent weeks, is another step forward.  That project aims to take an even
bigger responsibility in keeping people’s Jenkins instances up and running.
Like Blue Ocean, Jenkins Essentials focuses on delivering a comprehensive
Jenkins user experience rather than a collection of unrelated plugins which
users have to figure out how to wire together.  It also creates an exciting
vehicle for contributors, in which we can develop and deliver features quite
differently, and more rapidly, than how we deliver them today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X, which was proposed by &lt;a href=&quot;https://github.com/jstrachan&quot;&gt;James Strachan&lt;/a&gt; a
few weeks after Jenkins Essentials, is the latest point on this same arc.
Jenkins X brings a different aspect to building a solution — it focuses on a
specific vertical area, namely Kubernetes application development, and
drastically simplifies the software development in that domain by bringing
together Jenkins, a whole bunch of plugins, and an opinionated best practice of
how one should use Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Collectively, the arc that these efforts form aims to solve the most important
and consistent concerns for Jenkins users — ease of use, plugin complexity,
fear of upgrade, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the early days of Jenkins, it was up to each and every Jenkins admin to find
the right way to assemble pieces into a solution for their organizations, but
this hard work remained largely private.  Now, these newer projects are
bringing this back into the community.  They are making Jenkins more valuable
to existing users, and more approachable and useful to a whole new set of users
who are not currently using Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From that perspective, I hope more projects like them will follow, pushing us
beyond “just writing plugins”, taking even bigger steps to make users
productive.  This is a little bit like how I watched Eclipse evolve from just a
Java IDE to an umbrella of projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Exciting times!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/03/19/password-audit/</id>
<title>Jenkins community account password audit</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-03-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/03/19/password-audit/" />
<author>
<name>daniel-beck</name>
</author>
<category term='security'></category>
<category term='community'></category>
<summary>
Last year, news of compromised passwords being used for accounts able to distribute NPM packages made the rounds.


Their system looks similar to how publishing of plugins works in the Jenkins project:




Accounts are protected by passwords chosen by users.


Individual contributors have permission to release the components they maintain.


The components they release are used by millions of developers around the world to deliver their software.




In other words, weak passwords are a problem for us just as much as for NPM, and what happened to them could happen to us.


To address this problem, the Jenkins security and infra teams have recently collaborated on...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last year, &lt;a href=&quot;https://thenewstack.io/npm-password-resets-show-developers-need-better-security-practices/&quot;&gt;news of compromised passwords being used for accounts able to distribute NPM packages&lt;/a&gt; made the rounds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Their system looks similar to how publishing of plugins works in the Jenkins project:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Accounts are protected by passwords chosen by users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Individual contributors have permission to release the components they maintain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The components they release are used by millions of developers around the world to deliver their software.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In other words, weak passwords are a problem for us just as much as for NPM, and what happened to them could happen to us.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To address this problem, the Jenkins security and infra teams have recently collaborated on a password audit.
The audit covered all accounts with permissions to upload plugins and components, and on accounts with other levels of privileged infrastructure access.
We ran brute force tools on salted password hashes of those accounts looking for &quot;weak&quot; passwords — passwords present in a set of publicly available password lists we chose for this audit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We checked the password of every qualifying account for every unsafe password rather than trying to match them to any previous password leaks&#39; email/password pairs.
Users with weak account passwords were notified via email a few weeks ago and were asked to change their password to something stronger.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We performed the same checks over the previous weekend, but this time we only checked the passwords of accounts whose passwords were deemed weak during our first check.
We then invalidated the password of any account whose password was still not considered &quot;strong&quot; (i.e. their password was unchanged or had been changed to another weak password).
Users of those accounts will need to request a password reset before signing in again.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We plan to implement further safeguards, including improving the account management app at &lt;a href=&quot;https://accounts.jenkins.io&quot; class=&quot;bare&quot;&gt;https://accounts.jenkins.io&lt;/a&gt; to reject weak passwords.
If you’re interested in helping the security team make Jenkins more secure, let us know on the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-dev mailing list&lt;/a&gt;, or &lt;a href=&quot;https://www.jenkins.io/security/#team&quot;&gt;request to join the security team&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/03/19/introducing-jenkins-x/</id>
<title>Introducing Jenkins X: a CI/CD solution for modern cloud applications on Kubernetes</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-03-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/03/19/introducing-jenkins-x/" />
<author>
<name>jstrachan</name>
</author>
<category term='jenkins-x'></category>
<category term='kubernetes'></category>
<category term='pipeline'></category>
<summary>
We are excited to share and invite the community to join us on a project we’ve been thinking about over the last few months called Jenkins X which extends the Jenkins ecosystem to solve the problem of automating CI/CD in the cloud.


Background


The last few years have seen massive changes in the software industry:




use of immutable container images for distributing software which are smaller, easier to work with and lead to cheaper infrastructure costs than VMs alone (approx 20% less on average)


Kubernetes has become the defacto way of installing, upgrading, operating and managing containers at scale on any public or hybrid...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to share and invite the community to join us on a project we’ve been thinking about over the last few months called &lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt; which extends the Jenkins ecosystem to solve the problem of automating CI/CD in the cloud.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last few years have seen massive changes in the software industry:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;use of immutable container images for distributing software which are smaller, easier to work with and lead to cheaper infrastructure costs than VMs alone (approx 20% less on average)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; has become the defacto way of installing, upgrading, operating and managing containers at scale on any public or hybrid cloud&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2018 is the year all the major public clouds, operating system vendors and PaaS offerings support &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; natively&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;we now have an open source industry standard for distributing, installing and managing applications on any cloud!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;increased adoption of microservices and cloud native applications leading to massive increase in the number of components which require CI/CD along with increased release frequency&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;improvements in DevOps practices coming from the community such as the &lt;a href=&quot;https://puppet.com/blog/2017-state-devops-report-here&quot;&gt;State of DevOps Report&lt;/a&gt; which show the approach of high performing teams&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;increasingly many businesses now realise that to compete you have to deliver value quickly via software&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;teams need to become high performing if the business is to succeed&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All of this adds up to an increased demand for teams to have a solution for cloud native CI/CD with lots of automation!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introducing-jenkins-x&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-jenkins-x&quot; /&gt;Introducing Jenkins X&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 right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/jenkins-x/logo.svg&quot; alt=&quot;Jenkins X Logo&quot; width=&quot;200&quot; /&gt;
&lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt; is a project which rethinks how developers should interact with CI/CD in the cloud with a focus on making development teams productive through automation, tooling and DevOps best practices.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io&quot;&gt;Jenkins X&lt;/a&gt; is open source and we invite you to give us feedback and to contribute to the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-the-big-deal&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-the-big-deal&quot; /&gt;Whats the big deal?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For many years Jenkins has been capable of doing pretty much anything in the CI/CD space; the challenge has always been figuring out how to get the right plugins, configuration and code to work together in your &lt;code&gt;Jenkinsfile&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me the big deal about Jenkins X is as a developer you can type one command &lt;a href=&quot;https://jenkins-x.io/developing/create-spring/&quot;&gt;jx create&lt;/a&gt; or &lt;a href=&quot;https://jenkins-x.io/developing/import/&quot;&gt;jx import&lt;/a&gt; and get your source code, git repository and application created, automatically built and deployed to Kubernetes on each Pull Request or git push with full CI/CD complete with Environments and Promotion via GitOps!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers and teams don’t have to spend time figuring out how to package software as docker images, create the Kubernetes YAML to run their application on kubernetes, create Preview environments or even learn how to implement CI/CD pipelines with declarative pipeline-as-code &lt;code&gt;Jenkinsfiles&lt;/code&gt;. It’s all automated for you out of the box! So you can focus instead on delivering value!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the same time, Jenkins X doesn’t hide anything. If you do want to hack the &lt;code&gt;Dockerfile&lt;/code&gt;, &lt;code&gt;Jenkinsfile&lt;/code&gt; or Helm charts for your apps or their environments then go right ahead - those are all available versioned in git with the rest of your source code with full CI/CD on it all. GitOps FTW!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X automates CI/CD and DevOps best practices for you - so you can become a faster performing team! Let your butler do more work for you!&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;demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demo&quot; /&gt;Demo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a &lt;a href=&quot;https://www.youtube.com/watch?v=kPes3rvT1UM&quot;&gt;demonstration of Jenkins X&lt;/a&gt; running on GKE:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/kPes3rvT1UM?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can check out &lt;a href=&quot;https://jenkins-x.io/demos/&quot;&gt;more demos here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-x-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-x-features&quot; /&gt;Jenkins X Features&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now lets walk through the features of Jenkins X that we showed in the demo:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;automated-cicd-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automated-cicd-pipelines&quot; /&gt;Automated CI/CD Pipelines&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Create &lt;a href=&quot;https://jenkins-x.io/developing/create-spring/&quot;&gt;new Spring Boot projects&lt;/a&gt;,  &lt;a href=&quot;https://jenkins-x.io/developing/create-quickstart/&quot;&gt;new quickstarts&lt;/a&gt;  or &lt;a href=&quot;https://jenkins-x.io/developing/import/&quot;&gt;import existing source code&lt;/a&gt; quickly into Jenkins X via the &lt;a href=&quot;https://jenkins-x.io/commands/jx/&quot;&gt;jx command line tool&lt;/a&gt; and:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;get a Pipeline automatically setup for you that implements best practice CI/CD features:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;creates a &lt;code&gt;Jenkinsfile&lt;/code&gt; for defining the CI/CD pipelines through declarative pipeline-as-code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;creates a &lt;code&gt;Dockerfile&lt;/code&gt; for packaging the application up as an immutable container image (for applications which generate images)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;creates a &lt;a href=&quot;https://docs.helm.sh/developing_charts/#charts&quot;&gt;Helm chart&lt;/a&gt; for deploying and running your application on &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ensures your code is in a git repository (e.g. GitHub) with the necessary webhooks to trigger the Jenkins CI/CD pipelines on push events&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;triggers the first release pipeline to promote your application to your teams &lt;em&gt;Staging&lt;/em&gt; Environment&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then on each Pull Request:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a CI pipeline is triggered to build your application and run all the tests ensuring you keep the master branch in a ready to release state&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;your Pull Request is deployed to a Preview Environment (more on this later)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When a Pull Request is merged to the master branch the Release pipeline is triggered to create a new release:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a new semantic version number is generated&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the source code is modified for the new version (e.g. &lt;em&gt;pom.xml&lt;/em&gt; files get their &lt;em&gt;&amp;lt;version&amp;gt;&lt;/em&gt; elements modified) and then tagged in git&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;new versioned artifacts are published including:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;docker image, helm chart and any language specific artifacts (e.g. &lt;em&gt;pom.xml&lt;/em&gt; and jar files for Java, npm packages for node or binaries for go etc)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the new version is promoted to &lt;a href=&quot;https://jenkins-x.io/about/features/#environments&quot;&gt;Environments&lt;/a&gt; (more on this later)&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;environment-promotion-via-gitops&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#environment-promotion-via-gitops&quot; /&gt;Environment Promotion via GitOps&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Jenkins X each team gets their own &lt;a href=&quot;https://jenkins-x.io/about/features/#environments&quot;&gt;environments&lt;/a&gt;. The default environments are &lt;em&gt;Staging&lt;/em&gt; and &lt;em&gt;Production&lt;/em&gt; but teams can create as many environments as they wish and call them whatever they prefer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An Environment is a place to deploy code and each Environment maps to a separate &lt;a href=&quot;https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/&quot;&gt;namespace in Kubernetes&lt;/a&gt; so they are isolated from each other and can be managed independently.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We use something called &lt;em&gt;GitOps&lt;/em&gt; to manage environments and perform &lt;a href=&quot;https://jenkins-x.io/about/features/#promotion&quot;&gt;promotion&lt;/a&gt;. This means that:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Each environment gets its own git repository to store all the environment specific configuration together with a list of all the applications and their version and configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Promotion of new versions of applications to an environment results in:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a Pull Request is created for the configuration change that triggers the CI pipeline tests on the Environment along with code review and approval&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;once the Pull Request is merged the release pipeline for the environment which updates the applications running in that environment by applying the helm chart metadata from the git repository.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Environments can be configured to either promote &lt;em&gt;automatically&lt;/em&gt; as part of a release pipeline or they can use &lt;em&gt;manual&lt;/em&gt; promotion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The defaults today are for the &lt;em&gt;Staging&lt;/em&gt; environment to use automatic promotion; so all merges to master are automatically promoted to Staging. Then the &lt;em&gt;Production&lt;/em&gt; environment is configured to use manual promotion; so you choose when do promote.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However it is easy to change the  configuration of how many environments you need and how they are configured via the &lt;a href=&quot;https://jenkins-x.io/commands/jx_create_environment/&quot;&gt;jx create environment&lt;/a&gt; and &lt;a href=&quot;https://jenkins-x.io/commands/jx_edit_environment/&quot;&gt;jx edit environment&lt;/a&gt; commands&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;preview-environments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#preview-environments&quot; /&gt;Preview Environments&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins X lets you create &lt;a href=&quot;https://jenkins-x.io/about/features/#preview-environments&quot;&gt;Preview Environments&lt;/a&gt; for Pull Requests. Typically this happens automatically in the Pull Request Pipelines when a Pull Request is submitted but you can also perform this manually yourself via the &lt;a href=&quot;https://jenkins-x.io/developing/preview/&quot;&gt;jx preview&lt;/a&gt; command.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following happens when a Preview Environment is created:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a new &lt;a href=&quot;https://jenkins-x.io/about/features/#environments&quot;&gt;Environment&lt;/a&gt; of kind &lt;code&gt;Preview&lt;/code&gt; is created along with a &lt;a href=&quot;https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/&quot;&gt;kubernetes namespace&lt;/a&gt; which show up the &lt;a href=&quot;https://jenkins-x.io/commands/jx_get_environments/&quot;&gt;jx get environments&lt;/a&gt; command along with the &lt;a href=&quot;https://jenkins-x.io/developing/kube-context/&quot;&gt;jx environment and jx namespace commands&lt;/a&gt; so you can see which preview environments are active and switch into them to look around&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the Pull Request is built as a preview docker image and chart and deployed into the preview environment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a comment is added to the Pull Request to let your team know the preview application is ready for testing with a link to open the application. So in one click your team members can try out the preview!&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/jenkins-x/intro/pr-comment.png&quot; alt=&quot;Issue Comment&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is particularly useful if you are working on a web application or REST endpoint; it lets your team interact with the running Pull Request to help folks approve changes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feedback&quot; /&gt;Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the commit comments reference issues (e.g. via the text &lt;code&gt;fixes #123&lt;/code&gt;) then Jenkins X pipelines will generate release notes like those of &lt;a href=&quot;https://github.com/jenkins-x/jx/releases&quot;&gt;the jx releases&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, as the version associated with those new commits is promoted to &lt;code&gt;Staging&lt;/code&gt; or &lt;code&gt;Production&lt;/code&gt;, you will get automated comments on each fixed issue that the issue is now available for review in the corresponding environment along with a link to the release notes and a link to the app running in that environment. e.g.&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/jenkins-x/intro/issue-comment.png&quot; alt=&quot;Issue Comment&quot; width=&quot;800&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;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;Hopefully you now want to give Jenkins X a try. One of the great features of Jenkins is that it’s super easy to get started: install Java, download a war and run via &lt;code&gt;java -jar jenkins.war&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Jenkins X we’ve tried to follow a similarly simple experience. One complication is that Jenkins X has more moving pieces than a single JVM; it also needs a Kubernetes cluster :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First you need to &lt;a href=&quot;https://jenkins-x.io/getting-started/install/&quot;&gt;download and install the jx command line tool&lt;/a&gt; so its on your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then you need to run a single command to &lt;a href=&quot;https://jenkins-x.io/getting-started/create-cluster/&quot;&gt;create a new Kubernetes cluster and install Jenkins X&lt;/a&gt; (in this example, on GKE).&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;jx create cluster gke&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today we support creating Kubernetes clusters and installing Jenkins X on Amazon (AWS), Google (GKE), Microsoft Azure, and even locally using minikube.
We plan to support AWS EKS soon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the time of this writing the easiest cloud to get started with is Google’s GKE so we recommend you start there unless you already use AWS or Azure. Amazon and Microsoft are working hard to make Kubernetes clusters as easy to create and manage as they are on GKE.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All the public clouds have a free tier so you should be able to spin up a Kubernetes cluster and install Jenkins X for a few hours then tear it down and it should be cheaper than a cup of coffee (probably free!). Just remember to tear down the cluster when you are done!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a &lt;a href=&quot;https://youtu.be/ELA4tytdFeA&quot;&gt;demo of creating a kubernetes cluster and installing Jenkins X&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/ELA4tytdFeA?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you really don’t want to use the public cloud, you can &lt;a href=&quot;https://jenkins-x.io/getting-started/install-on-cluster/&quot;&gt;install Jenkins X on an existing kubernetes cluster&lt;/a&gt; (if it has RBAC enabled!). Or, if you can &lt;a href=&quot;https://github.com/kubernetes/minikube&quot;&gt;install and run minikube&lt;/a&gt;, then you should be able to &lt;a href=&quot;https://jenkins-x.io/getting-started/create-cluster/&quot;&gt;install Jenkins X on it as well&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;relationship-between-jenkins-and-jenkins-x&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#relationship-between-jenkins-and-jenkins-x&quot; /&gt;Relationship between Jenkins and Jenkins X&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is the core CI/CD engine within Jenkins X. So Jenkins X is built on the massive shoulders of Jenkins and its awesome community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/400&quot;&gt;proposing Jenkins X as a sub project&lt;/a&gt; within the Jenkins foundation as Jenkins X has a different focus: automating CI/CD for the cloud using Jenkins plus other open source tools like Kubernetes, Helm, Git, Nexus/Artifactory etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over time we are hoping Jenkins X can help drive some changes in Jenkins itself to become more cloud native, which will benefit the wider Jenkins community in addition to Jenkins X.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;please-join-us&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#please-join-us&quot; /&gt;Please join us!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So I hope the above has given you a feel for the vision of where we are heading with Jenkins X and to show where we are today. The project is still very young, we have &lt;a href=&quot;https://github.com/jenkins-x/jx/issues&quot;&gt;lots to do&lt;/a&gt; and we are looking for more input on where to go next and what to focus on. We’re also working on high level &lt;a href=&quot;https://jenkins-x.io/contribute/roadmap&quot;&gt;roadmap&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To make Jenkins X a success we’d love you to get involved, &lt;a href=&quot;https://jenkins-x.io/getting-started/&quot;&gt;try it out&lt;/a&gt; and &lt;a href=&quot;https://jenkins-x.io/community/&quot;&gt;give us feedback in the community&lt;/a&gt;! We love contributions whether its email, chat, issues or even better Pull Requests ;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re thinking of contributing here’s some ideas:&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://jenkins-x.io/community/&quot;&gt;Give us feedback&lt;/a&gt;. What could we improve? Anything you don’t like or you think is missing?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help &lt;a href=&quot;https://jenkins-x.io/docs/contributing/documentation/&quot;&gt;improve the documentation&lt;/a&gt; so its more clear how to get started and use Jenkins X&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/developing/create-quickstart/#adding-your-own-quickstarts&quot;&gt;Add your own quickstarts&lt;/a&gt; so the Jenkins X community can easily bootstrap new projects using your quickstart. If you work on an open source project is there a good quickstart we could add to Jenkins X?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you’d like to &lt;a href=&quot;https://jenkins-x.io/contribute/development/&quot;&gt;contribute to the code&lt;/a&gt; then try browse the &lt;a href=&quot;https://github.com/jenkins-x/jx/issues&quot;&gt;current issues&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;we have marked issues &lt;a href=&quot;https://github.com/jenkins-x/jx/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22&quot;&gt;help wanted&lt;/a&gt; or &lt;a href=&quot;https://github.com/jenkins-x/jx/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22&quot;&gt;good first issue&lt;/a&gt; to save you hunting around too much&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;in particular we would love help on getting Jenkins X &lt;a href=&quot;https://github.com/jenkins-x/jx/issues?q=is%3Aopen+is%3Aissue+label%3Awindows&quot;&gt;working well on windows&lt;/a&gt; or the &lt;a href=&quot;https://github.com/jenkins-x/jx/issues?q=is%3Aissue+is%3Aopen+label%3Aintegrations&quot;&gt;integrations&lt;/a&gt; with cloud services, git providers and issues trackers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;for more long term goals we’ve the &lt;a href=&quot;https://jenkins-x.io/contribute/roadmap&quot;&gt;roadmap&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;we could always use more test cases and to improve test coverage!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To help get faster feedback we are using Jenkins X as the CI/CD platform to develop Jenkins X itself. For example Jenkins X creates &lt;a href=&quot;https://github.com/jenkins-x/jx/releases&quot;&gt;all the releases and release notes&lt;/a&gt;. We’ll talk more about &lt;a href=&quot;https://github.com/jenkins-x/updatebot&quot;&gt;UpdateBot&lt;/a&gt; in a future blog post but you can see all the &lt;a href=&quot;https://github.com/pulls?q=is%3Apr+archived%3Afalse+user%3Ajenkins-x+label%3Aupdatebot+is%3Aclosed&quot;&gt;automated pull requests generated&lt;/a&gt; in the various Jenkins X pipelines via &lt;a href=&quot;https://github.com/jenkins-x/updatebot&quot;&gt;UpdateBot&lt;/a&gt; pushing version changes from upstream dependencies into downstream repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that the Jenkins community tends to use IRC for chat and the Kubernetes community uses Slack, so Jenkins X has rooms for &lt;a href=&quot;https://jenkins-x.io/community/&quot;&gt;both IRC and slack&lt;/a&gt; depending on which chat technology you prefer - as the Jenkins X community will be working closely with both the Jenkins community and the various Kubernetes communities (Kubernetes, Helm, Skaffold, Istio et al).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most rewarding things about open source is being able to learn from others in the community. So I’m hoping that even if you are not yet ready to use Kubernetes in your day job or are not yet interested in automating your Continuous Delivery - that you’ll at least consider taking a look at Jenkins X, if for no other reason than to help you learn more about all these new ideas, technologies and approaches!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks for listening and I’m looking forward to &lt;a href=&quot;https://jenkins-x.io/community/&quot;&gt;seeing you in the community&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://github.com/jenkinsci/jep/tree/master/jep/400&quot;&gt;Jenkins X JEP proposal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/&quot;&gt;Jenkins X website&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/getting-started/&quot;&gt;Getting Started Guide&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-x.io/demos/&quot;&gt;Demos&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/2018/03/15/jep-200-lts/</id>
<title>Security hardening: Jenkins LTS 2.107.1 switches XStream / Remoting blacklists to whitelists (JEP-200)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-03-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/03/15/jep-200-lts/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='core'></category>
<category term='security'></category>
<category term='remoting'></category>
<category term='upgrade'></category>
<summary>
This is a post about a major change in Jenkins, which is available starting
from Jenkins 2.102 and Jenkins LTS 2.107.1.
This is a change with a serious risk of regressions in plugins.
If you are a Jenkins administrator, please read this blogpost and
upgrade guidelines
BEFORE upgrading.






I would like to provide some heads-up about the
JEP-200 change,
which is included into the new Jenkins LTS 2.107.x baseline.


Background


For many years Jenkins used to specifically blacklist certain classes and packages according to known or suspected exploits.
This approach has been proven unsustainable due to the risk of deserialization attacks via unknown classes
from 3rd-party components, after the
SECURITY-429/CVE-2017-1000353 fix in 2.46.2
it...
</summary>
<content type='html'>
&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;This is a post about a major change in Jenkins, which is available starting
from Jenkins 2.102 and Jenkins LTS 2.107.1.
This is a change with a serious risk of regressions in plugins.
If you are a Jenkins administrator, please read this blogpost and
&lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.107/#upgrading-to-jenkins-lts-2-107-1&quot;&gt;upgrade guidelines&lt;/a&gt;
&lt;strong&gt;BEFORE&lt;/strong&gt; upgrading.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to provide some heads-up about the
&lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/200/README.adoc&quot;&gt;JEP-200&lt;/a&gt; change,
which is included into the new Jenkins LTS 2.107.x baseline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For many years Jenkins used to specifically &lt;em&gt;blacklist&lt;/em&gt; certain classes and packages according to known or suspected exploits.
This approach has been proven unsustainable due to the risk of deserialization attacks via unknown classes
from 3rd-party components, after the
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-04-26/#cli-unauthenticated-remote-code-execution&quot;&gt;SECURITY-429/CVE-2017-1000353&lt;/a&gt; fix in 2.46.2
it was decided to replace blacklists by more restrictive whitelists.
In October 2017 &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; proposed a Jenkins Enhancement Proposal,
which finally got accepted as &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/200/README.adoc&quot;&gt;JEP-200&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The change implies a risk of regressions in plugins serializing non-whitelisted Java-internal and 3rd-party classes,
and that’s why it is so important to follow the upgrade guidelines for this release.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;current-state&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-state&quot; /&gt;Current state&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JEP-200 was first integrated in Jenkins 2.102 (released in January 2018), and it has got a lot of testing since that.
See &lt;a href=&quot;https://www.jenkins.io/blog/2018/01/13/jep-200/&quot;&gt;this blogpost&lt;/a&gt; for the original announcement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the last two months we received more than &lt;strong&gt;75 issues&lt;/strong&gt; from users of Jenkins weekly releases.
All these issues have been triaged, and we have released most of the fixes.
More than &lt;strong&gt;50 plugins&lt;/strong&gt; were fixed in total, and many more plugins were updated in order to enable compatibility testing.
A significant part of the discovered regressions were caused by real defects which were causing performance and stability
issues in plugins.
Thanks a lot to all the Jenkins contributors and plugin maintainers who helped deliver timely changes for this effort!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over last 6 weeks Jenkins weekly releases had positive community ratings,
the overall JEP-200 adoption reached ~12% of all Jenkins installations on March 01.
All major plugins have been also tested directly or verified in the wild on weekly releases.
So we are confident that the change is ready to be released in LTS.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the other hand, we continue to receive JEP-200 regression reports.
They are mostly caused by niche plugins which are not widely used in weekly releases,
and unfortunately not all fixes have been released yet (see &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins+affected+by+fix+for+JEP-200&quot;&gt;the Wiki page&lt;/a&gt; for up-to-date info).
We anticipate more regressions to be reported after the LTS release and broader adoption.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to simplify the upgrade to the new LTS baseline,
I have prepared some helpful materials together with &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;
and &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;.
Below you can find the embedded slide deck and video, or scroll down to see the key information
in the text form.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
  &lt;iframe width=&quot;720&quot; height=&quot;400&quot; frameborder=&quot;0&quot; src=&quot;https://speakerdeck.com/player/f2b7e049ec46424b98ec4f0b58fd33bf&quot; /&gt;
&lt;/center&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Video:&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
  &lt;iframe width=&quot;720&quot; height=&quot;400&quot; frameborder=&quot;0&quot; src=&quot;https://www.youtube-nocookie.com/embed/Vfnc9t1RuYA?rel=0&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;for-jenkins-administrators&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#for-jenkins-administrators&quot; /&gt;For Jenkins administrators&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Upgrading to a core with JEP-200 requires a special update procedure, which is described below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;upgrading-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrading-jenkins&quot; /&gt;Upgrading Jenkins&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;JEP-200 is not the only major change in 2.107.1, please read
the &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.107/#upgrading-to-jenkins-lts-2-107-1&quot;&gt;full upgrade guide&lt;/a&gt; carefully&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you have a way of testing the upgrade before applying it to production, do it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Back up your instance so you have any easy way of rolling back&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update all affected plugins.
See &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins+affected+by+fix+for+JEP-200&quot;&gt;this Wiki page&lt;/a&gt; for the list of affected plugins,
fix statuses and workarounds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply workarounds for non-released patches if needed (see below)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update to the new version of the Jenkins core&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using backups and staging servers is good advice before &lt;em&gt;any&lt;/em&gt; upgrade but especially this one,
given the relatively high risk of regression.
Due to the nature of the changes, some plugins may refuse to load after the upgrade and cause your Jenkins service to fail to start.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;after-the-upgrade&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#after-the-upgrade&quot; /&gt;After the upgrade&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To the extent that advance testing of the impact of this change on popular plugins has been completed,
most users (and even plugin developers) should not notice any difference.
Still, it is highly advised to monitor your system after the upgrade, especially the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins System log (especially during the startup)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Job/Build logs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you do encounter a log message referencing the &lt;code&gt;&lt;a href=&quot;https://jenkins.io/redirect/class-filter/&quot; class=&quot;bare&quot;&gt;https://jenkins.io/redirect/class-filter/&lt;/a&gt;&lt;/code&gt; URL,
most likely it is a JEP-200 regression.
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&gt;some.pkg.and.ClassName in file:/var/lib/jenkins/plugins/some-plugin-name/WEB-INF/lib/some-library-1.2.jar might be dangerous, so rejecting; see https://jenkins.io/redirect/class-filter/&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you see this kind of message, we highly recommend reporting it so that it can be investigated and probably fixed quickly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;reporting-jep-200-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reporting-jep-200-issues&quot; /&gt;Reporting JEP-200 issues&lt;/h3&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;Starting from May 01, JEP-200 issues are triaged by plugin and core maintainers.
JEP-200 maintainers are available for code reviews if needed,
but they will not be reviewing cases in JIRA and searching for miscategorized issues on a daily basis.
If you experience new JEP-200 regressions, please follow the guidelines below.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please report any issues you encounter matching the above pattern in the
&lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;Jenkins issue tracker&lt;/a&gt;, under the appropriate plugin component.
Before reporting please check whether this issue has already been reported.&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;Add the &lt;code&gt;JEP-200&lt;/code&gt; label&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Include the stacktrace you see in the log&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If possible, include complete steps to reproduce the problem from scratch&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find examples of previously reported issues using &lt;a href=&quot;https://issues.jenkins.io/issues/?jql=labels%20%3D%20JEP-200&quot;&gt;this query&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins developers will evaluate issues and strive to offer a fix in the form of a core and/or plugin update.
Right after the feature release there was be a special team triaging the reports.
Starting from May 01 the issues will be triaged by plugin and core maintainers.
See &lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/200#rollout-plan&quot;&gt;JEP-200 Maintenance plan&lt;/a&gt; for more info.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more details and current status, see
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins+affected+by+fix+for+JEP-200&quot;&gt;Plugins affected by fix for JEP-200&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;applying-workarounds&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#applying-workarounds&quot; /&gt;Applying workarounds&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Assuming you see no particular reason to think that the class in question has dangerous deserialization semantics, which is rare,
it is possible to work around the problem in your own installation as a temporary expedient.
Note the class name(s) mentioned in the JEP-200 log messages,
and run Jenkins with the &lt;code&gt;hudson.remoting.ClassFilter&lt;/code&gt; startup option, e.g.:&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;java &lt;span class=&quot;nt&quot;&gt;-Dhudson&lt;/span&gt;.remoting.ClassFilter&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;some.pkg.and.ClassName,some.pkg.and.OtherClassName &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; jenkins.war ...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This workaround process may require several iterations, because classes whitelisted in the workaround may also
include fields with types requiring whitelisting.&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;for-plugin-developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#for-plugin-developers&quot; /&gt;For plugin developers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are a plugin developer, please see &lt;a href=&quot;https://www.jenkins.io/blog/2018/01/13/jep-200/&quot;&gt;the original JEP-200 announcement&lt;/a&gt;.
That blog post provides guidelines for testing and fixing plugin compatibility after the JEP-200 changes.
The presentation above also provides some information about what needs to be tested.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/03/12/browser-usage/</id>
<title>Browser Market Share on jenkins.io</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-03-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/03/12/browser-usage/" />
<author>
<name>olblak</name>
</author>
<category term='stats'></category>
<summary>
Over the last year, several efforts were done on jenkins.io like
security advisories or documentation
and I wanted to understand the impact it had on its traffic.


I had a look to the Google Analytics account used for jenkins.io and it was
interesting to discover which browsers are used by Jenkins visitors and how
this compares with other websites. So I decided to analyze one year of data
from January 2017 to January 2018. Then I selected
statcounter
as an external data source in order to compare results from jenkins.io.


First, let&#8217;s talk about numbers:




During that period, 3,496,245 users across the world visited this website.


This is a growth of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the last year, several efforts were done on jenkins.io like
&lt;a href=&quot;https://www.jenkins.io/security/advisories/&quot;&gt;security advisories&lt;/a&gt; or &lt;a href=&quot;https://www.jenkins.io/doc/&quot;&gt;documentation&lt;/a&gt;
and I wanted to understand the impact it had on its traffic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I had a look to the Google Analytics account used for jenkins.io and it was
interesting to discover which browsers are used by Jenkins visitors and how
this compares with other websites. So I decided to analyze one year of data
from January 2017 to January 2018. Then I selected
&lt;a href=&quot;https://gs.statcounter.com/about&quot;&gt;statcounter&lt;/a&gt;
as an external data source in order to compare results from jenkins.io.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, let’s talk about numbers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;During that period, 3,496,245 users across the world visited this website.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is a growth of 52.69% visitors compared to the year before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;92.28% of them used a desktop, 6.63% were on mobile and only 1.10% on a tablet.&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 left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-02-27/jenkins_browser_2017-2018.png&quot; alt=&quot;jenkins browser 2017 2018&quot; width=&quot;250&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;caption class=&quot;title&quot;&gt;Table 1. Browser Usage&lt;/caption&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;Browser&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Percentage&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;Chrome&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;69.82%&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;Firefox&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;14.75%&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;Safari&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;6.44%&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;IE&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;5.84%&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;Edge&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;1.59%&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;We clearly see that 91% of Jenkins.io visitors only use three browsers. Chrome
is by far the leader followed by Firefox and Safari.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Obviously those numbers taken alone don’t mean anything, so let’s try to put
them in perspective with another data source.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Netscape 4.8 was still used by 15 visitors over the year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;6 visitors used their Nintendo DS.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;statcounter&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#statcounter&quot; /&gt;StatCounter&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s now compare our previous results with the same time period from
&lt;a href=&quot;https://gs.statcounter.com/about&quot;&gt;statcounter&lt;/a&gt; who argues to collect data from
2million websites.  Statcounter allow us to display browsers stats based on 4
different categories, &#39;All platform&#39;, &#39;Desktop&#39;, &#39;Tablet&#39; or &#39;Mobile&#39;. + For
this comparison, I am interested by &#39;All platform&#39; and of course &#39;Desktop&#39; as
92.28% of Jenkins.io visitors use a desktop.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;caption class=&quot;title&quot;&gt;Table 2. Browser Market Share Across All Platforms&lt;/caption&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;Browser&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Percentage&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;Chrome&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;54.13%&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;Safari&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;14.50%&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;UC Browser&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;8.25%&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;Firefox&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;6.15%&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;IE&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;3.89%&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;Excepted Chrome who still leads the ranking with &quot;only&quot; 54%, all the others
actors are totally shuffled.  Safari moved to the 2nd place with 14.50% &#39;UC
Browser&#39; appeared in the top 3 with 8.25% where only 0.10% of Jenkins.io
visitors were using UC browser.  Firefox moved to the 4th places with only
6.15%.  It’s interesting how this &quot;All platform&quot; browser market share from
statcounter doesn’t reflect Jenkins.io visitors&#39; habits.
(&lt;a href=&quot;https://gs.statcounter.com/browser-market-share#monthly-201701-201801-bar&quot;&gt;&lt;strong&gt;Source&lt;/strong&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now at a first glance, results look more similar to the Jenkins.io visitors;
excepted for Chrome and Firefox which shed some percentages in favor of
Internet Explorer and Edge.  This promotes IE to the 3rd place with 8.86% of
usage, and downgrade Safari to the 4th place with 6,44%.  Compared to
Jenkins.io results, Edge is still at the 5th position.  It’s very interesting
to see how this ranking is so different from the &quot;All platform&quot; one but follows
the same pattern coming from Jenkins.io visitors.  This highlights how browser
choices are strongly influenced by the platform used and contrary to a general
&lt;a href=&quot;https://gs.statcounter.com/platform-market-share/desktop-mobile-tablet&quot;&gt;trend&lt;/a&gt;,
Jenkins.io visitors remain desktop users.  This absence of mobile users
probably explains why some browsers are so under represented within Jenkins
visitors.
(&lt;a href=&quot;https://gs.statcounter.com/browser-market-share/desktop/worldwide#monthly-201701-201801-bar&quot;&gt;&lt;strong&gt;Source&lt;/strong&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;caption class=&quot;title&quot;&gt;Table 3. Browser Market Share on the Desktop&lt;/caption&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;Browser&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Usage&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;Chrome&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;63.59%&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;Firefox&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;13.75%&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;IE&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;8.86%&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;Safari&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;5.50%&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;Edge&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;4.35%&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;/colgroup&gt;
&lt;/table&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;These observations should be carefully interpreted as it may be overestimated or underestimated (depending on various &lt;a href=&quot;https://en.wikipedia.org/wiki/Usage_share_of_web_browsers#Accuracy&quot;&gt;factors&lt;/a&gt;)  and doesn’t take into consideration local specificities. &lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins.io visitors are a majority of desktop users.
They are aligned with the world trends when we talk about desktop browsers however only a minority of them come from a mobile.
This is probably because jenkins.io is not (yet) mobile friendly and obsiously this would be a nice improvement to have.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc&quot;&gt;contributions&lt;/a&gt; are welcomed and especially for mobile user experience.&lt;/p&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;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/03/05/jenkins-world-talk-proposal-tips/</id>
<title>5 tips for improving your Jenkins World 2018 talk proposals</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-03-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/03/05/jenkins-world-talk-proposal-tips/" />
<author>
<name>alyssat</name>
</author>
<category term='jenkinsworld'></category>
<summary>
You&#8217;ve marked your calendar to alert you weeks in advance of the CFP deadline.
You&#8217;ve spent your nights and weekends to skillfully craft your abstract and you
are convinced this is THE one.  You confidently clicked the 'submit' button
only to find out weeks later you&#8217;ve received an automated declined email. On
top of feeling disappointed, you probably wondered why your proposal was turned
down.


As Jenkins World CFP
is still open, we hope to demystify the selection process by offering a few
tips to help increase the chance of your proposal getting accepted.


Tip 1: Make your title concise and attention-grabbing

There’s only a few seconds to make...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2018/jenkins-world-2018-poster.png&quot; alt=&quot;Jenkins World&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ve marked your calendar to alert you weeks in advance of the CFP deadline.
You’ve spent your nights and weekends to skillfully craft your abstract and you
are convinced this is THE one.  You confidently clicked the &#39;submit&#39; button
only to find out weeks later you’ve received an automated declined email. On
top of feeling disappointed, you probably wondered why your proposal was turned
down.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As &lt;a href=&quot;https://jenkinsworld2018cfp.hubb.me/Home/Dashboard&quot;&gt;Jenkins World CFP&lt;/a&gt;
is still open, we hope to demystify the selection process by offering a few
tips to help increase the chance of your proposal getting accepted.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tip-1-make-your-title-concise-and-attention-grabbing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tip-1-make-your-title-concise-and-attention-grabbing&quot; /&gt;Tip 1: Make your title concise and attention-grabbing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s only a few seconds to make an impression with your proposal. Your title
and abstract should be succinct and attention grabbing. Think about what makes
your Jenkins proposal exceptional over others. What value will it bring to
attendees?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tip-2-know-your-audience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tip-2-know-your-audience&quot; /&gt;Tip 2: Know your audience&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins World audiences want to learn and adopt the newest development
practices, process, languages and frameworks. They are highly technical and are
interested in deep technical talks that are original and offers valuable
information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tip-3-transformational-user-stories&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tip-3-transformational-user-stories&quot; /&gt;Tip 3: Transformational user stories&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Share your unique Jenkins project experiences, challenges, strategies, lessons
learned, and outcome. What can you share with your audience that will
facilitate knowledge transfer and development of new and innovative techniques?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tip-4-topic-should-be-relevant-and-applicable&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tip-4-topic-should-be-relevant-and-applicable&quot; /&gt;Tip 4: Topic should be relevant and applicable&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Consider how to make the topic more broadly applicable to the attendees, such
as with a hands-on demo explaining the concept. By showcasing innovative
methods that draw out relevant and compelling knowledge to the audience,
everybody is likely to more thoroughly absord the content of the talk. Also,
who doesn’t love a cool demo?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tip-5-got-tips-tricks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tip-5-got-tips-tricks&quot; /&gt;Tip 5: Got Tips &amp;amp; Tricks?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is used tons of different ways.  Sharing novel approaches, tips, or
tricks for increased efficiency and proficiency with Jenkins is almost always
well received!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates&quot; /&gt;Important Dates:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CFP Closes: March 18, 2018 @ 11:59pm Pacific&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CFP Notifications: April&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Agenda Announcement: April&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Event Dates:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins World USA | San Francisco | September 16 - 19, 2018&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins World Europe | Nice, France | October 23 - 25, 2018&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World
2018&lt;/a&gt; with the code &lt;code&gt;JWATONG&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Good Luck!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/02/22/cheetah/</id>
<title>Project Cheetah - Faster, Leaner Pipeline That Can Keep Up With Demand</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-02-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/02/22/cheetah/" />
<author>
<name>svanoort</name>
</author>
<category term='pipeline'></category>
<category term='performance'></category>
<category term='scalability'></category>
<summary>
Table of Contents

Introducing "Project Cheetah"
Yes, but what does it DO?
How Do I Set Speed/Durability Settings?

1. Globally, you can choose a global default durability setting:
2. Each Pipeline can get a custom Durability Setting:
3. Multibranch Projects can use a new BranchProperty to customize the Durability Setting.


Will Performance-Optimized Mode Help Me?
Other Goodies
How Did You Do It?
What Next?



Since it launched, Pipeline has had a bit of a Dr. Jekyll and Mr. Hyde performance problem.  In certain circumstances, Pipeline can turn from a mild-mannered CI/CD assistant into a monster.  It will happily eat storage read/write capacity like popcorn without caring about the other...
</summary>
<content type='html'>
&lt;div id=&quot;toc&quot; class=&quot;toc&quot;&gt;
&lt;div id=&quot;toctitle&quot;&gt;Table of Contents&lt;/div&gt;
&lt;ul class=&quot;sectlevel1&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#introducing-project-cheetah&quot;&gt;Introducing &quot;Project Cheetah&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#yes-but-what-does-it-do&quot;&gt;Yes, but what does it DO?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#how-do-i-set-speeddurability-settings&quot;&gt;How Do I Set Speed/Durability Settings?&lt;/a&gt;
&lt;ul class=&quot;sectlevel2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#1-globally-you-can-choose-a-global-default-durability-setting&quot;&gt;1. &lt;strong&gt;Globally&lt;/strong&gt;, you can choose a global default durability setting:&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#2-each-pipeline-can-get-a-custom-durability-setting&quot;&gt;2. &lt;strong&gt;Each Pipeline&lt;/strong&gt; can get a custom Durability Setting:&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#3-multibranch-projects-can-use-a-new-branchproperty-to-customize-the-durability-setting&quot;&gt;3. &lt;strong&gt;Multibranch Projects&lt;/strong&gt; can use a new BranchProperty to customize the Durability Setting.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#will-performance-optimized-mode-help-me&quot;&gt;Will Performance-Optimized Mode Help Me?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#other-goodies&quot;&gt;Other Goodies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#how-did-you-do-it&quot;&gt;How Did You Do It?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#what-next&quot;&gt;What Next?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since it launched, Pipeline has had a bit of a Dr. Jekyll and Mr. Hyde performance problem.  In certain circumstances, Pipeline can turn from a mild-mannered CI/CD assistant into a monster.  It will happily eat storage read/write capacity like popcorn without caring about the other concerns of our friendly butler.  When combined with other additional factors, this can result in real-world stability problems.  For example, combining slow storage with a spike in running Pipelines has brought down production Jenkins at more than one organization.  Similarly, users see issues if a busy controller gets hit with an extra source of stress; past culprits have been heavy automated (ab)use of Jenkins APIs, now-solved user lookup bugs, backup jobs, and plugins run crazy that load excessive numbers of builds.  Symptoms ranged from visible slowdowns in the UI to unresponsive jobs and &quot;hung&quot; controllers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now I’m &lt;em&gt;not&lt;/em&gt; saying this to scare people or to criticize the technology we’ve built. Implementing &lt;a href=&quot;https://www.jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice/&quot;&gt;Pipeline scalability best practices&lt;/a&gt; coupled with SSD storage keeps Jenkins in a happy place.  We just need context on the weaknesses to see why it’s important to address them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introducing-project-cheetah&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-project-cheetah&quot; /&gt;Introducing &quot;Project Cheetah&quot;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today we’re announcing the first major results of &quot;Project Cheetah&quot;, our long-running effort to address these challenges and improve Pipeline scalability.  More broadly, Cheetah aims to help in 3 places:&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;Small-scale containers:&lt;/strong&gt; Pipeline needs to run leanly in resource-constrained containers, to enable easy scale-out without consuming excessive resources on shared container hosts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enterprise systems:&lt;/strong&gt; Pipeline needs to effectively serve high-scale Jenkins instances that are central to many large companies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;General case:&lt;/strong&gt; run Pipelines a bit more quickly on average, and allow users to get much-stronger performance in worst-case scenarios.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These changes are implemented across many of the Pipeline plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;yes-but-what-does-it-do&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#yes-but-what-does-it-do&quot; /&gt;Yes, but what does it DO?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project Cheetah offers several things, but the most important is Durability Settings for all Pipelines, and especially the Performance-Optimized setting.  This setting avoids several potentially unexpected performance &quot;surprises&quot; that may strike users.  In the general case, it greatly reduces the disk IO needs for Pipeline.  How much?  Below is a graph of storage utilization with legacy Pipeline versions (think early 2017) and with the latest version using the Performance-Optimized mode.  These are tested on an AWS instance backed by an EBS volume provisioned with 300 IOPs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before and After:&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/2018-02-22-cheetah/io-utilization.png&quot; alt=&quot;io utilization&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, storage utilization goes down by a &lt;em&gt;lot&lt;/em&gt;.  While the exact number will vary, across the benchmark testcases &lt;strong&gt;this results in Pipeline throughput of 2x to 6x the previous before becoming IO-bound&lt;/strong&gt;. This also increases stability of Jenkins controllers because they will tolerate unexpected load.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This comes with a major drop in CPU IOWait as well:&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/2018-02-22-cheetah/cpu-iowait.png&quot; alt=&quot;cpu iowait&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And of course the rate at which data is written to disk and number of writes/s is also reduced:&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/2018-02-22-cheetah/diskio.png&quot; alt=&quot;diskio&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For enterprise users, timing stats often show 10-20% of normal builds is serializing the Program and writing the record of steps run (&quot;FlowNodes&quot;) - the performance optimized durability setting will cut this to &lt;em&gt;almost nothing&lt;/em&gt; (for standard pipelines, 1/100 or less) - so builds will complete faster, especially complex ones.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please see the &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/scaling-pipeline/&quot;&gt;Pipeline Scalability documentation&lt;/a&gt; for deeper information on the new Durability Settings, how to use them, and which plugin versions are required to gain these features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, users may see a reduction in hung Pipelines because new test utilities made it possible to identify and correct a variety of bugs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-do-i-set-speeddurability-settings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-set-speeddurability-settings&quot; /&gt;How Do I Set Speed/Durability Settings?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are 3 ways to configure the durability setting:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;1-globally-you-can-choose-a-global-default-durability-setting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#1-globally-you-can-choose-a-global-default-durability-setting&quot; /&gt;1. &lt;strong&gt;Globally&lt;/strong&gt;, you can choose a global default durability setting:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under &quot;Manage Jenkins&quot; &amp;gt; &quot;Configure System&quot;, labelled &quot;Pipeline Speed/Durability Settings&quot;.  You can override these with the more specific settings below.&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/2018-02-22-cheetah/global-durability.png&quot; alt=&quot;global durability&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;2-each-pipeline-can-get-a-custom-durability-setting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#2-each-pipeline-can-get-a-custom-durability-setting&quot; /&gt;2. &lt;strong&gt;Each Pipeline&lt;/strong&gt; can get a custom Durability Setting:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is one of the job properties located at the top of the job configuration, labelled &quot;Custom Pipeline Speed/Durability Level.&quot;  &lt;strong&gt;This overrides the global setting.&lt;/strong&gt;  Or, use a &quot;properties&quot; step - the setting will apply to the NEXT run after the step is executed (same result).&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/2018-02-22-cheetah/pipeline-durability-highlighted.png&quot; alt=&quot;pipeline durability highlighted&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
    agent any
    stages {
        stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Example&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            steps {
                echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Hello World&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            }
        }
    }
    options {
        durabilityHint(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;PERFORMANCE_OPTIMIZED&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;properties([durabilityHint(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;PERFORMANCE_OPTIMIZED&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&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;sect2&quot;&gt;
&lt;h3 id=&quot;3-multibranch-projects-can-use-a-new-branchproperty-to-customize-the-durability-setting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#3-multibranch-projects-can-use-a-new-branchproperty-to-customize-the-durability-setting&quot; /&gt;3. &lt;strong&gt;Multibranch Projects&lt;/strong&gt; can use a new BranchProperty to customize the Durability Setting.&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under the SCM you can configure a custom Branch Property Strategy and add a property for Custom Pipeline Speed/Durability Level.  This overrides the global Durability Setting and will apply to each branch at the next run.  You can also use a &quot;properties&quot; step to override the setting, but remember that you may have to run the step again to undo 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/2018-02-22-cheetah/multibranch-durability.png&quot; alt=&quot;multibranch durability&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Durability settings will take effect with the next applicable Pipeline run, not immediately.  The setting will be displayed in the log.&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/2018-02-22-cheetah/durability-in-log-highlighted.png&quot; alt=&quot;durability in log highlighted&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is a slight durability trade-off for using the Performance-Optimized mode — &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/scaling-pipeline/#what-am-i-giving-up-with-this-durability-setting-trade-off&quot;&gt;the appropriate section of the Pipeline Scalability documentation&lt;/a&gt; has the specifics.
For most uses we do not expect this to be important, but there are a few specific cases where users may wish to use a slower/higher-durability setting.  &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/scaling-pipeline/#suggested-best-practices-and-tips-for-durability-settings&quot;&gt;The Best Practices are documented.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We recommend using Performance-Optimized by default, but because it does represent a slight behavioral change the initial &quot;Cheetah&quot; plugin releases defaults to maintain previous behavior. We expect to switch this default in the future with appropriate notice once people have a chance to get used to the new 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;will-performance-optimized-mode-help-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#will-performance-optimized-mode-help-me&quot; /&gt;Will Performance-Optimized Mode Help Me?&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;Yes, if your Jenkins instance uses NFS, magnetic storage, runs many Pipelines at once, or shows high iowait (above 5%)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes, if you are running Pipelines with many steps (more than several hundred).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes, if your Pipeline stores large files or complex data to variables in the script, keeps that variable in scope for future use, and then runs steps.  This sounds oddly specific but happens more than you’d expect.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For example: &lt;code&gt;readFile&lt;/code&gt; step with a large XML/JSON file, or using configuration information from parsing such a file with &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#code-readjson-code-read-json-from-files-in-the-workspace&quot;&gt;One of the Utility Steps&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another common pattern is a &quot;summary&quot; object containing data from many branches (logs, results, or statistics). Often this is visible because you’ll be adding to it often via an add/append or &lt;code&gt;Map.put()&lt;/code&gt; operations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Large arrays of data or Maps of configuration information are another common example of this situation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, if your Pipelines spend almost all their time waiting for a few shell/batch steps to finish.  This ISN’T a magic &quot;go fast&quot; button for everything!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, if Pipelines are writing massive amounts of data to logs (logging is unchanged).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, if you are not using Pipelines, or your system is loaded down by other factors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, if you don’t enable higher-performance modes for pipelines.  See above for how!&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;other-goodies&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-goodies&quot; /&gt;Other Goodies&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;Users can now set an optional job property so that individual Pipelines fail cleanly rather than resuming upon restarting the controller.  This is useful for niche cases where some Pipelines are considered disposable and users would value a clean restart over Pipeline durability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We’ve reduced classloading and reflection quite significantly, which improves scaling and reduces CPU use:&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/2018-02-22-cheetah/classloading.png&quot; alt=&quot;classloading&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Script Security (as of version 1.41) has gotten optimizations to reduce the performance overhead of Sandbox mode and eliminate lock contention so Pipeline multithreads better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline Step data uses up less space on disk (regardless of the durability setting) - this should be 30% smaller.  Assume it’s a few MB per 1000 steps - but for every build after the change.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Even in the low-performance/high-durability modes, some redundant writes have been removed, which decreases the number of writes by 10-20%.&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;how-did-you-do-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-did-you-do-it&quot; /&gt;How Did You Do It?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s probably material for another blog post or &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld&quot;&gt;Jenkins World talk&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The short answer is: first we built a tool to simulate a full production environment and provide detailed metrics collection at scale.  Then we profiled Jenkins to identify bottlenecks and attacked them.  Rinse and repeat.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-next&quot; /&gt;What Next?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next big change, which I’m calling Cheetah Part 2 is to address Pipeline’s logging. For every Step run, Pipeline writes one or more small log files. These log files are then copied into the build log content, but are retained to make it possible to easily fetch logs for each step.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This copying process means every log line is written twice, greatly reducing performance, and writing to many small files is orders of magnitude slower than appending to one big log file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re going to remove this duplication and data fragmentation and use a more efficient mechanism to find per-step logs. This should further improve the ability to run Pipelines on NFS mounts and hard-drive-backed storage, and should significantly improve performance at scale.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Besides this, there’s a variety of different tactical improvements to improve scaling behavior and reduce resource needs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Project Cheetah work doesn’t free users to &lt;em&gt;completely ignore&lt;/em&gt; &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/scaling-pipeline/&quot;&gt;Pipeline scaling best practices&lt;/a&gt; and  &lt;a href=&quot;https://www.jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice/&quot;&gt;previous suggestions&lt;/a&gt;.  Nor does it eliminate the need for &lt;a href=&quot;https://www.jenkins.io/blog/2016/11/21/gc-tuning/&quot;&gt;efficient GC settings&lt;/a&gt;.  But this and other enhancements from the last year &lt;em&gt;can&lt;/em&gt; significantly improve the storage situation for most users and reduce the penalties for worst-case behaviors.  When you add all the pieces together, the result is a faster, leaner, more reliable Pipeline experience.&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/02/19/gsoc2018-announcement/</id>
<title>Jenkins is accepted to Google Summer Of Code 2018, join us!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-02-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/02/19/gsoc2018-announcement/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
We are happy to announce that Jenkins project has been accepted to
Google Summer of Code 2018.
This year we invite students and mentors to join the Jenkins community and work together
on various initiatives: core, plugins, development tools and infrastructure.


Our mentors have already created some project ideas.
For example, you are welcome to work on the new Configuration-as-Code initiative or
to help creating standard API for Code Coverage plugins.
If you like test automation, there is a proposal to
Jenkins Acceptance Test Harness.
Over the next weeks we plan to extend this list by new even more project ideas.


All information about the Jenkins GSoC is available on...
</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/gsoc/jenkins-gsoc-logo_small.png&quot; alt=&quot;Jenkins GSoC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to announce that Jenkins project has been accepted to
&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code 2018&lt;/a&gt;.
This year we invite students and mentors to join the Jenkins community and work together
on various initiatives: core, plugins, development tools and infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our mentors have already created some &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/gsoc2018-project-ideas&quot;&gt;project ideas&lt;/a&gt;.
For example, you are welcome to work on the new &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/gsoc2018-project-ideas/#jenkins-configuration-as-code&quot;&gt;Configuration-as-Code initiative&lt;/a&gt; or
to help &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/gsoc2018-project-ideas/#code-coverage-api-plugin&quot;&gt;creating standard API for Code Coverage plugins&lt;/a&gt;.
If you like test automation, there is a proposal to
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/gsoc2018-project-ideas/#improvements-to-the-jenkins-acceptance-test-harness&quot;&gt;Jenkins Acceptance Test Harness&lt;/a&gt;.
Over the next weeks we plan to extend this list by new even more project ideas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All information about the Jenkins GSoC is available on its &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;subproject page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;i-am-a-student-how-do-i-apply&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-am-a-student-how-do-i-apply&quot; /&gt;I am a student. How do I apply?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/contributors&quot;&gt;Information for students&lt;/a&gt; for application guidelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First step is to join discussions in the mailing lists in order to introduce yourself, establish connections with the community and potential mentors.
The application period starts on March 12 and ends on March 27, but don’t let it misguide you!
Use time before application to discuss project ideas/proposals with mentors and to process their feedback.
To create a better proposal, we also recommend to study Jenkins and to do some contributions in the area of your project proposal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not satisfied by the current &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/gsoc2018-project-ideas&quot;&gt;project ideas&lt;/a&gt;?
You can &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/gsoc2018-project-ideas/#proposing-new-project-ideas&quot;&gt;propose your own idea&lt;/a&gt;
in the developer mailing list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;i-want-to-be-a-mentor-is-it-too-late&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-want-to-be-a-mentor-is-it-too-late&quot; /&gt;I want to be a mentor. Is it too late?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s not!
If you are passionate about open-source and Jenkins, we invite you to join the mentors team.
You can either propose a new project idea or join an existing one.
See &lt;a href=&quot;https://www.jenkins.io/blog/2018/01/06/gsoc2018-call-for-mentors&quot;&gt;Call for Mentors&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors&quot;&gt;Information for mentors&lt;/a&gt; for details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year mentorship does &lt;strong&gt;NOT&lt;/strong&gt; require strong expertise in Jenkins development.
The objective is to guide students and to get involved into the Jenkins community.
GSoC org admins will help to find advisers if special expertise is required.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates&quot; /&gt;Important dates&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;Mar 05 - deadline for new GSoC project idea proposals&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 12 - student application period starts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 27 - deadline for student applications&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apr 23 - accepted projects announced, community bonding starts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;May 14 - coding period starts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Aug 06 - end of the coding period&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://summerofcode.withgoogle.com/how-it-works/#timeline&quot;&gt;GSoC Timeline&lt;/a&gt; for more info.
In the Jenkins project we will also organize special events during and after GSoC (e.g. at Jenkins world).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;P.S:&lt;/strong&gt; I am going to create a special GSoC 2018 edition of swags for mentors and students. Do not miss them ;)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/02/14/security-updates/</id>
<title>Security updates for Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-02-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/02/14/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.107 and 2.89.4, that fix multiple security vulnerabilities.


For an overview of what was fixed, see the security advisory.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our LTS upgrade guide.








While the severity score works out as medium for all the vulnerabilities, we strongly recommend that anyone operating publicly accessible Jenkins instances update as soon as possible, as their secrets on disk might be at risk by SECURITY-705.





Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.107 and 2.89.4, that fix multiple security vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-02-14&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.89/#upgrading-to-jenkins-lts-2-89-4&quot;&gt;LTS upgrade guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
While the severity score works out as &lt;em&gt;medium&lt;/em&gt; for all the vulnerabilities, we strongly recommend that anyone operating publicly accessible Jenkins instances update as soon as possible, as their secrets on disk might be at risk by SECURITY-705.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/02/05/security-updates/</id>
<title>Security updates for multiple Jenkins plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-02-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/02/05/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<summary>
Multiple Jenkins plugins received updates today that fix several security vulnerabilities.




Android Lint


CCM


Credentials Binding


JUnit


Pipeline: Supporting APIs




For an overview of these security fixes, see the security advisory.


Subscribe to the jenkinsci-advisories mailing list to receive important future notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Multiple Jenkins plugins received updates today that fix several security vulnerabilities.&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/android-lint&quot;&gt;Android Lint&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/ccm&quot;&gt;CCM&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/credentials-binding&quot;&gt;Credentials Binding&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/junit&quot;&gt;JUnit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/workflow-support&quot;&gt;Pipeline: Supporting APIs&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;For an overview of these security fixes, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2018-02-05&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important future notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/01/26/fosdem-hackaton/</id>
<title>You are invited to the Post-FOSDEM 2018 Jenkins Hackfest</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-01-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/01/26/fosdem-hackaton/" />
<author>
<name>lnewman</name>
</author>
<category term='fosdem'></category>
<category term='event'></category>
<summary>
On the first weekend in February, numerous free and open source developers from around the
world will travel to Brussels, Belgium, for arguably the largest event of its kind:
FOSDEM.
Among the thousands of hackers in attendance will be a number of Jenkins contributors.


On the Monday after FOSDEM,
you are invited to join a group of those contributors for a full day of hacking on Jenkins.
Folks of all experience levels are welcome;
there will be sessions for everyone from seasoned hackers to new contributors.


All-day Jenkins Hackfest


The Hackfest will start at 9:30am on Monday with general introductions and gathering of potential topics/projects.
Bring suggestions for topics that...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the first weekend in February, numerous free and open source developers from around the
world will travel to Brussels, Belgium, for arguably the largest event of its kind:
&lt;a href=&quot;https://fosdem.org&quot;&gt;FOSDEM&lt;/a&gt;.
Among the thousands of hackers in attendance will be a number of Jenkins contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the Monday after FOSDEM,
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/246098584/&quot;&gt;you are invited&lt;/a&gt; to join a group of those contributors for a full day of hacking on Jenkins.
Folks of all experience levels are welcome;
there will be sessions for everyone from seasoned hackers to new contributors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;all-day-jenkins-hackfest&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#all-day-jenkins-hackfest&quot; /&gt;All-day Jenkins Hackfest&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Hackfest will start at 9:30am on Monday with general introductions and gathering of potential topics/projects.
Bring suggestions for topics that interest you, or just come and choose from the topics others suggest.
There will be plenty of topics from which to choose.
All the topic suggestions will all be added to a backlog and we will identify and cluster around popular topics.
Then we’ll divide into smaller groups and work on individual topics in timeboxed sessions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Meals, snacks, and beverages will be provided throughout the day, wrapping up with dinner around 5pm.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;something-for-everyone&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#something-for-everyone&quot; /&gt;Something for everyone&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hackfests like this one are a great opportunity for contributors of all levels to get involved, learn from each other, and
work together on interesting and high impact areas of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some long-time contributors already know what areas they’ll work on and are looking for people interested in joining them.
Mark Waite (maintainer of the Jenkins Git and Git Client plugins) and Christian Halstrick (SAP) will be spending the day improving the way Git client plugin uses JGit.
R. Tyler Croy (Jenkins community concierge) and Olivier Vernin (Jenkins infrastructure engineer) will work on infrastructure improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Others contributors, such as Jesse Glick and Andrew Bayer
(recipients of the  &quot;&lt;a href=&quot;https://www.jenkins.io/blog/2017/09/08/enumerators-in-pipeline/&quot;&gt;A Small Matter of Programming&lt;/a&gt;&quot; award), will arrive without a set plan.
They will, of course, have some topics to propose, so you might get a chance to work with them.
Or if you have an area you’d like to work on, they and many other experts will be on hand for discussion and code review.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is also a great opportunity for new contributors to join the project.
Baptiste Mathus, long time contributor and all-around nice guy, will host a &quot;New Contributor Hackergarten&quot; covering the basics of contributing to Jenkins and submitting fixes via GitHub Pull requests.
Even those with minimal coding experience can contribute by improving documentation and making typo fixes via this same process.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;fun&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fun&quot; /&gt;Fun!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More than anything else, Hackfests like this are great fun.
No matter what your level of experience, there will be plenty to do and great people with whom to do it.
Reserve a space by
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/246098584/&quot;&gt;joining the meetup here&lt;/a&gt;.
Then bring your own laptop and passion for improving Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#details&quot; /&gt;Details&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;Date&lt;/strong&gt;: Monday, February 5, 2018&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 9:30 AM to 5:00 PM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Location&lt;/strong&gt;: BeCentral sprl/bvba
Cantersteen 12
1000 Brussel
Belgium
Room: Studio C (1st floor)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/246098584/&quot;&gt;RSVP Required&lt;/a&gt;&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;Meals, snacks, and beverages will be provided.
Bring your own computer.&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;strong&gt;Ask for &quot;Jenkins&quot; at the front desk if you get lost.&lt;/strong&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/2018/01/21/overhaul-of-manage-jenkins-page/</id>
<title>Overhaul of Manage Jenkins page</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-01-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/01/21/overhaul-of-manage-jenkins-page/" />
<author>
<name>recena</name>
</author>
<category term='jenkins'></category>
<category term='ui'></category>
<category term='restyling'></category>
<category term='upgrade'></category>
<summary>
Overview


Recently some UI improvements around the Manage Jenkins page have been introduced. The visual changes are very subtle but behind them, there are interesting benefits.


Some of the goals that we have tried to achieve:




Applying a semantic HTML


Removing the &lt;table&gt; tag usage for implementing layouts and content structures. Read this article if you want to know reasons and/or arguments.


Small re-styling focused on spacing, margins, composition, etc..


Accessibility




In order to provide a quick overview of the visual changes, let&#8217;s take a look at these screenshots.


System tray with administrative messages (before)





System tray with administrative messages (after)





Manage Jenkins page (before)





Manage Jenkins page (after)




Information about how...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently some UI improvements around the Manage Jenkins page have been introduced. The visual changes are very subtle but behind them, there are interesting benefits.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of the goals that we have tried to achieve:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Applying a &lt;a href=&quot;https://en.wikipedia.org/wiki/Semantic_HTML&quot;&gt;semantic HTML&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removing the &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; tag usage for implementing layouts and content structures. Read this &lt;a href=&quot;https://www.hotdesign.com/seybold&quot;&gt;article&lt;/a&gt; if you want to know reasons and/or arguments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Small re-styling focused on spacing, margins, composition, etc..&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accessibility&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to provide a quick overview of the visual changes, let’s take a look at these screenshots.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;system-tray-with-administrative-messages-before&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#system-tray-with-administrative-messages-before&quot; /&gt;System tray with administrative messages (before)&lt;/h3&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/2018-01-15-JENKINS-43786/JENKINS-43786_3-before.png&quot; alt=&quot;JENKINS 43786 3 before&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;system-tray-with-administrative-messages-after&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#system-tray-with-administrative-messages-after&quot; /&gt;System tray with administrative messages (after)&lt;/h3&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/2018-01-15-JENKINS-43786/JENKINS-43786_2.png&quot; alt=&quot;JENKINS 43786 2&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;manage-jenkins-page-before&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#manage-jenkins-page-before&quot; /&gt;Manage Jenkins page (before)&lt;/h3&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/2018-01-15-JENKINS-43786/JENKINS-43786_4-before.png&quot; alt=&quot;JENKINS 43786 4 before&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;manage-jenkins-page-after&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#manage-jenkins-page-after&quot; /&gt;Manage Jenkins page (after)&lt;/h3&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/2018-01-15-JENKINS-43786/JENKINS-43786_1.png&quot; alt=&quot;JENKINS 43786 1&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Information about how this change can affect the current implementations of &lt;a href=&quot;https://www.jenkins.io/doc/developer/extensions/jenkins-core/#administrativemonitor&quot;&gt;Administrative Monitors&lt;/a&gt; can be found in the following section&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;for-core-developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#for-core-developers&quot; /&gt;For core developers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s use a real example for showing how this proposal works.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the original UI implementation of &lt;code&gt;HudsonHomeDiskUsageMonitor.java&lt;/code&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;html&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:st=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:stapler&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:d=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:define&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:l=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/lib/layout&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:t=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/lib/hudson&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:f=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/lib/form&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;warning&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;form&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;method=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;post&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;action=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${rootURL}/${it.url}/act&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${it.id}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;style=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;float:right&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;f:submit&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;yes&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${%Tell me more}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;f:submit&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;no&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${%Dismiss}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      ${%blurb(app.rootDir)}
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;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;And this is the proposed change:&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;html&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:st=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:stapler&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:d=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:define&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:l=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/lib/layout&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:t=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/lib/hudson&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:f=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/lib/form&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;alert alert-warning&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;form&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;method=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;post&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;action=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${rootURL}/${it.url}/act&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${it.id}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;f:submit&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;yes&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${%Tell me more}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;f:submit&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;no&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${%Dismiss}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
  ${%blurb(app.rootDir)}
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;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;Some highlights:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No more ad hoc UI compositions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No more custom CSS classes when Jenkins project is already using &lt;a href=&quot;https://getbootstrap.com&quot;&gt;Bootstrap&lt;/a&gt; for many different things&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Based on &lt;a href=&quot;https://getbootstrap.com/docs/3.3/components/#alerts&quot;&gt;Bootstrap Alert&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;All administrative monitors defined in Jenkins core have been adapted as part of this proposal.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;for-plugin-developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#for-plugin-developers&quot; /&gt;For plugin developers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No changes are &lt;em&gt;really&lt;/em&gt; needed, but we do recommend you to adapt your plugins to this proposal so Jenkins users have a better user experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Taking into account that you want to keep backward compatibility, you will need some changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In your implementation of &lt;a href=&quot;https://www.jenkins.io/doc/developer/extensions/jenkins-core/#administrativemonitor&quot;&gt;Administrative Monitor&lt;/a&gt;, add this helper method:&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;java&quot;&gt;&lt;span class=&quot;cm&quot;&gt;/**
 * This method can be removed when the baseline is updated to 2.103
 *
 * @return If this version of the plugin is running on a Jenkins version where JENKINS-43786 is included.
 */&lt;/span&gt;
 &lt;span class=&quot;nd&quot;&gt;@Restricted&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;DoNotUse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
 &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;isTheNewDesignAvailable&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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Jenkins&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getVersion&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;isNewerThan&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;VersionNumber&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2.103&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;In your view (a.k.a. Jelly file or Groovy 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;html&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?jelly escape-by-default=&#39;true&#39;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:jelly&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:j=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;jelly:core&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:if&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;test=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${!it.isTheNewDesignAvailable}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;warning&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;SSH Host Key Verifiers are not configured for all SSH agents on this Jenkins instance. This could leave these agents open to man-in-the-middle attacks. &lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${rootURL}/computer/&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Update your agent configuration&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; to resolve this.&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:if&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;j:if&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;test=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${it.isTheNewDesignAvailable}&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;alert alert-warning&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    SSH Host Key Verifiers are not configured for all SSH agents on this Jenkins instance. This could leave these agents open to man-in-the-middle attacks. &lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${rootURL}/computer/&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Update your agent configuration&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; to resolve this.
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:if&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/j:jelly&amp;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;If you don’t want to keep a &lt;em&gt;strict&lt;/em&gt; backward compatibility, the impact is minimal. In fact, you can see an &lt;a href=&quot;https://github.com/jenkinsci/github-plugin/pull/177#issuecomment-337266953&quot;&gt;example&lt;/a&gt; on GitHub Plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some helpful references:&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://issue-redirect.jenkins.io/issue/43786&quot;&gt;JIRA issue&lt;/a&gt; where the proposal was tracked&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/2857&quot;&gt;Pull Request&lt;/a&gt; with the change in Jenkins core. You can find several screenshots&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/ssh-slaves-plugin/pull/70&quot;&gt;Pull Request&lt;/a&gt; for adapting SSH Agent Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Do not hesitate to &lt;a href=&quot;https://github.com/recena&quot;&gt;ping me&lt;/a&gt; if you decide to adapt your Administrative Monitors.&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/2018/01/17/jenkins-world-cfp-open/</id>
<title>Jenkins World 2018: Call for Papers is Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-01-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/01/17/jenkins-world-cfp-open/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<summary>
Happy 2018! The Jenkins World train is ready to take off once again. As usual, the sign of festivities looming begins with the Call for Papers.  Those who attended Jenkins World 2017 know that Jenkins World 2018 is coming back to San Francisco. But what they did not know is that Jenkins World will also be coming to Europe. You read that right, Jenkins World is taking place in two locations in 2018:




Jenkins World USA | San Francisco | September 16 - 19, 2018


Jenkins World Europe | October - date and location TBA




To encourage open collaboration and stimulate discussions...
</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/JW2018.png&quot; alt=&quot;Jenkins World 2018&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Happy 2018! The Jenkins World train is ready to take off once again. As usual, the sign of festivities looming begins with the Call for Papers.  Those who attended Jenkins World 2017 know that Jenkins World 2018 is coming back to San Francisco. But what they did not know is that Jenkins World will also be coming to Europe. You read that right, Jenkins World is taking place in two locations in 2018:&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.cloudbees.com/jenkinsworld/home&quot;&gt;&lt;strong&gt;Jenkins World USA&lt;/strong&gt; | San Francisco | September 16 - 19, 2018&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins World Europe | October - date and location TBA&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;To encourage open collaboration and stimulate discussions that will help advance Jenkins adoption and drive it forward, we invite Jenkins users, developers and industry experts to submit a speaking proposal to Jenkins World San Francisco and or Europe.  Submissions for both locations are being accepted now and will &lt;strong&gt;close on March 18, 2018 @ 11:59PM Pacific.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;where-do-i-go-to-submit-my-proposal&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-do-i-go-to-submit-my-proposal&quot; /&gt;Where do I go to submit my proposal?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Submissions for both Jenkins World USA and Europe are accepted at:&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://jenkinsworld2018cfp.hubb.me/Home/Dashboard&quot;&gt;Jenkins World USA&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkinsworld2018cfp.hubb.me/Home/Dashboard&quot;&gt;Jenkins World Europe&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;can-i-make-proposals-to-both-conferences&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#can-i-make-proposals-to-both-conferences&quot; /&gt;Can I make proposal(s) to both conferences?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, you can! Once you’ve created an account on the &lt;a href=&quot;https://jenkinsworld2018cfp.hubb.me/Home/Dashboard&quot;&gt;CFP&lt;/a&gt; website you will be given the option to make submission(s) to one conference or both conferences.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;when-is-the-deadline-jenkins-world-usa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#when-is-the-deadline-jenkins-world-usa&quot; /&gt;When is the deadline Jenkins World USA?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sunday March 18, 2018 @ 11:59PM Pacific&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;when-is-the-deadline-for-jenkins-world-europe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#when-is-the-deadline-for-jenkins-world-europe&quot; /&gt;When is the deadline for Jenkins World Europe?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sunday March 18, 2018 @ 11:59PM Pacific&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;important-dates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#important-dates&quot; /&gt;Important Dates:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CFP Opens: January 17, 2018&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CFP Closes: March 18, 2018 @ 11:59pm Pacific&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CFP Notifications: April&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Agenda Announcement: April&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Event Dates:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins World USA | San Francisco | September 16 - 19, 2018&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins World Europe | October - exact date TBA&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/01/13/jep-200/</id>
<title>JEP-200: Remoting / XStream whitelist integrated into Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-01-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/01/13/jep-200/" />
<author>
<name>jglick</name>
</author>
<category term='core'></category>
<category term='security'></category>
<category term='remoting'></category>
<category term='upgrade'></category>
<summary>
There is a newer version of the announcement for Jenkins administrators.
Please see this blogpost.






Overview


JEP-200 has been integrated into Jenkins weekly builds
and (if all goes well) will be a part of the next LTS line.
In a nutshell, this change is a security hardening measure
to be less permissive about deserializing Java classes defined in the Java Platform or libraries bundled with Jenkins.
For several years now, Jenkins has specifically blacklisted certain classes and packages according to known or suspected exploits;
now it will reject all classes not explicitly mentioned in a whitelist, or defined in Jenkins core or plugins.




For Jenkins administrators


Before upgrade

Back up your...
</summary>
<content type='html'>
&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;There is a newer version of the announcement for Jenkins administrators.
Please see &lt;a href=&quot;https://www.jenkins.io/blog/2018/03/15/jep-200-lts/&quot;&gt;this blogpost&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&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://github.com/jenkinsci/jep/blob/master/jep/200/README.adoc&quot;&gt;JEP-200&lt;/a&gt; has been integrated into Jenkins weekly builds
and (if all goes well) will be a part of the next LTS line.
In a nutshell, this change is a security hardening measure
to be less permissive about deserializing Java classes defined in the Java Platform or libraries bundled with Jenkins.
For several years now, Jenkins has specifically &lt;em&gt;blacklisted&lt;/em&gt; certain classes and packages according to known or suspected exploits;
now it will reject all classes not explicitly mentioned in a &lt;em&gt;whitelist&lt;/em&gt;, or defined in Jenkins core or plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;for-jenkins-administrators&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#for-jenkins-administrators&quot; /&gt;For Jenkins administrators&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;before-upgrade&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#before-upgrade&quot; /&gt;Before upgrade&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back up your Jenkins instance prior to upgrade so you have any easy way of rolling back.
If you are running any of the plugins listed in
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins+affected+by+fix+for+JEP-200&quot;&gt;Plugins affected by fix for JEP-200&lt;/a&gt;,
update them after taking the backup but before upgrading Jenkins core.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have a way of testing the upgrade in an isolated environment before applying it to production,
do so now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using backups and a staging server is good advice before &lt;em&gt;any&lt;/em&gt; upgrade but especially this one,
with a relatively high risk of regression.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;after-upgrade&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#after-upgrade&quot; /&gt;After upgrade&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To the extent that advance testing of the impact of this change on popular plugins has been completed,
most users (and even plugin developers) should not notice any difference.
If you do encounter a &lt;code&gt;java.lang.SecurityException: Rejected: some.pkg.and.ClassName&lt;/code&gt; in the Jenkins UI or logs,
you may have found a case where an unusual plugin, or an unusual usage mode of a common plugin,
violates the existing whitelist.
This will be visible in the Jenkins system log as a message from &lt;code&gt;jenkins.security.ClassFilterImpl&lt;/code&gt; like the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;some.pkg.and.ClassName in file:/var/lib/jenkins/plugins/some-plugin-name/WEB-INF/lib/some-library-1.2.jar might be dangerous, so rejecting; see https://jenkins.io/redirect/class-filter/&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;where the link would direct you here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you find such a case, please report it in the Jenkins issue tracker, under the appropriate plugin component.
Link it to &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/47736&quot;&gt;JENKINS-47736&lt;/a&gt; and add the &lt;code&gt;JEP-200&lt;/code&gt; label.
If at all possible, include complete steps to reproduce the problem from scratch.
Jenkins developers will strive to evaluate the reason for the violation and offer a fix in the form of a core and/or plugin update.
For more details and current status, see
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins+affected+by+fix+for+JEP-200&quot;&gt;Plugins affected by fix for JEP-200&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Assuming you see no particular reason to think that the class in question has dangerous deserialization semantics, which is rare,
it is possible to work around the problem in your own installation as a temporary expedient.
Simply make note of any class name(s) mentioned in such log messages,
and run Jenkins with this startup option (details will depend on your installation method):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;-Dhudson.remoting.ClassFilter=some.pkg.and.ClassName,some.pkg.and.OtherClassName&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;for-plugin-developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#for-plugin-developers&quot; /&gt;For plugin developers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;testing-plugins-against-jenkins-2-102-and-above&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-plugins-against-jenkins-2-102-and-above&quot; /&gt;Testing plugins against Jenkins 2.102 and above&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a plugin developer encountering this kind of error,
your first task is to ensure that it is reproducible in a functional (&lt;code&gt;JenkinsRule&lt;/code&gt;) test
when running Jenkins 2.102 or newer to reproduce the error.&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;sh&quot;&gt;mvn &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-Djenkins&lt;/span&gt;.version&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2.102 &lt;span class=&quot;nt&quot;&gt;-Denforcer&lt;/span&gt;.skip&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&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 above assumes you are using a recent 2.x or 3.x parent &lt;a href=&quot;https://github.com/jenkinsci/plugin-pom&quot;&gt;Plugin POM&lt;/a&gt;.
For certain cases you may need to use &lt;a href=&quot;https://github.com/jenkinsci/plugin-compat-tester&quot;&gt;Plugin Compat Tester (PCT)&lt;/a&gt;
to run tests against Jenkins core versions newer than your baseline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Running PCT against the latest Jenkins core:&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;sh&quot;&gt;java &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; pct-cli.jar &lt;span class=&quot;nt&quot;&gt;-reportFile&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/out/pct-report.xml &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-workDirectory&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pwd&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;/work &lt;span class=&quot;nt&quot;&gt;-skipTestCache&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-mvn&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;which mvn&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-includePlugins&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ARTIFACT_ID&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-localCheckoutDir&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;YOUR_PLUGIN_REPO&lt;/span&gt;&lt;span class=&quot;k&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;You may need to run tests using an agent or force saves of plugin settings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For maven plugins you can also specify custom Jenkins versions in &lt;code&gt;Jenkinsfile&lt;/code&gt; to run tests against JEP-200:&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;buildPlugin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;jenkinsVersions:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;2.102&#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;(again picking whatever version you need to test against)
so that the test is included during CI builds, even while your minimum core baseline predates JEP-200.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your plugins are built with Gradle, your mileage may vary.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;making-plugins-compatible-with-jenkins-2-102-or-above&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#making-plugins-compatible-with-jenkins-2-102-or-above&quot; /&gt;Making plugins compatible with Jenkins 2.102 or above&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you discover a compatibility issue in your plugin,
you then have several choices for fixing the problem:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ideally, simplify your code so that the mentioned class is not deserialized via Jenkins Remoting or XStream to begin with:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If the problem occurred when receiving a response from an agent, change your &lt;code&gt;Callable&lt;/code&gt; (or &lt;code&gt;FileCallable&lt;/code&gt;) to return a plainer type.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the problem occurred when saving an XML file (such as a &lt;code&gt;config.xml&lt;/code&gt; or &lt;code&gt;build.xml&lt;/code&gt;), use a plainer type in non-&lt;code&gt;transient&lt;/code&gt; fields in your persistable plugin classes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the class(es) are defined in the Java Platform or some library bundled in Jenkins core, propose a pull request adding it to &lt;code&gt;core/src/main/resources/jenkins/security/whitelisted-classes.txt&lt;/code&gt; in &lt;code&gt;jenkinsci/jenkins&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the class(es) are defined in a third-party library bundled in your plugin, create a resource file &lt;code&gt;META-INF/hudson.remoting.ClassFilter&lt;/code&gt; listing them. (&lt;a href=&quot;https://github.com/jenkinsci/workflow-support-plugin/pull/50/files&quot;&gt;example&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You may also do this for Java or Jenkins core library classes, as a hotfix until your core baseline includes the whitelist entry proposed above.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the class(es) are defined in a JAR you build and then bundle in your plugin’s &lt;code&gt;*.jpi&lt;/code&gt;, add a &lt;code&gt;Jenkins-ClassFilter-Whitelisted: true&lt;/code&gt; manifest entry. This whitelists every class in the JAR. (&lt;a href=&quot;https://github.com/jenkinsci/lib-jenkins-maven-embedder/pull/15/files&quot;&gt;example&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/2018/01/08/moving-from-buddybuild-for-android/</id>
<title>Moving from buddybuild to Jenkins for Android Developers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-01-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/01/08/moving-from-buddybuild-for-android/" />
<author>
<name>orrc</name>
</author>
<category term='android'></category>
<category term='plugins'></category>
<summary>
Last week, buddybuild — a hosted continuous integration service focused on mobile apps — announced that it had been acquired by Apple, and consequently its complete Android offering, along with its free tier for iOS users, will be discontinued at the beginning of March.


This was a fairly undesirable way to start 2018 for buddybuild&#8217;s Android users and, with less than two months to find an alternative, many took to Twitter to simultaneously congratulate buddybuild on their acquisition, and commiserate with others who have to find a new way to build and test their app.


While Jenkins is usually deployed as a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week, buddybuild — a hosted continuous integration service focused on mobile apps — announced that it had been &lt;a href=&quot;https://www.buddybuild.com/blog/buddybuild-is-now-part-of-apple&quot;&gt;acquired by Apple&lt;/a&gt;, and consequently its complete Android offering, along with its free tier for iOS users, will be discontinued at the beginning of March.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was a fairly undesirable way to start 2018 for buddybuild’s Android users and, with less than two months to find an alternative, many took to Twitter to simultaneously &lt;a href=&quot;https://twitter.com/K4KYA/status/948465314047635456&quot;&gt;congratulate buddybuild on their acquisition&lt;/a&gt;, and commiserate with others who have to find a new way to build and test their app.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While Jenkins is usually deployed as a self-hosted solution (with over &lt;a href=&quot;https://stats.jenkins.io/&quot;&gt;150k installs&lt;/a&gt;), rather than a hosted service like buddybuild, we thought this would be a good time to highlight — thanks to the &lt;a href=&quot;https://plugins.jenkins.io/&quot;&gt;rich plugin ecosystem&lt;/a&gt; of Jenkins — some of the possibilities offered to Android developers by Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;common-workflows&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#common-workflows&quot; /&gt;Common workflows&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Android projects are fundamentally no different from how other types of software development projects might make use of a Continuous Integration &amp;amp; Continuous Delivery system (CI/CD) such as Jenkins: Android developers will collaborate using a source control management system (SCM) such as &lt;a href=&quot;https://plugins.jenkins.io/git&quot;&gt;Git&lt;/a&gt; or &lt;a href=&quot;https://plugins.jenkins.io/mercurial&quot;&gt;Mercurial&lt;/a&gt;; they will create Pull Requests, which should be automatically verified; they expect to get feedback on test failures and code quality (e.g. via email or Slack); and they should be able to easily deploy new versions of their app to beta testers or end users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To this end, Jenkins lets you define your &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;build and deployment pipelines&lt;/a&gt; in a structured and auditable fashion (via &lt;code&gt;Jenkinsfile&lt;/code&gt;), supports a multitude of SCMs, while the &lt;a href=&quot;https://www.jenkins.io/doc/tutorials/build-a-multibranch-pipeline-project/&quot;&gt;multibranch Pipeline&lt;/a&gt; feature automatically creates new Jenkins jobs for every new Pull Request in your repository, and cleans them up as branches get merged.  The &lt;a href=&quot;https://www.jenkins.io/projects/blueocean/&quot;&gt;Blue Ocean user interface&lt;/a&gt; ties these features together in a clean, modern UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph boxshadow&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2018-01-08/blue-ocean-screenshot.png&quot; alt=&quot;Blue Ocean build screenshot&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;building-android-apps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#building-android-apps&quot; /&gt;Building Android Apps&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To build an Android app, you need the Java development tools (JDK), which Jenkins can &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Tool+Auto-Installation&quot;&gt;automatically install&lt;/a&gt; for you, plus the Android SDK, which you can also install on individual build agents using a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Tool+Auto-Installation&quot;&gt;tool installer&lt;/a&gt;, or you can use a &lt;a href=&quot;https://docker.com/&quot;&gt;Docker container&lt;/a&gt; with the Android SDK Tools preinstalled, for example.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, you can use your SCM plugin of choice to fetch your source code, and build the app using the Android Gradle Plugin via the &lt;a href=&quot;https://docs.gradle.org/4.4.1/userguide/gradle_wrapper.html&quot;&gt;Gradle Wrapper&lt;/a&gt; — in most cases this is as simple as running &lt;code&gt;./gradlew assembleDebug&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once your app has been built and packaged into a &lt;code&gt;.apk&lt;/code&gt; file, you can use the &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/core/#archiveartifacts-archive-the-artifacts&quot;&gt;&lt;code&gt;archiveArtifacts&lt;/code&gt;&lt;/a&gt; build step, storing the APK, enabling colleagues to download APKs directly from Jenkins, so that they can try out the latest build.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;testing-android-apps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-android-apps&quot; /&gt;Testing Android Apps&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Android SDK supports two types of test: unit tests, which run on the JVM, and instrumentation tests, which have to run on an Android device or emulator.  Both types of test can be executed using Jenkins and, since the Android Gradle Plugin writes the test results to disk in JUnit XML format, the &lt;a href=&quot;https://plugins.jenkins.io/junit&quot;&gt;JUnit Plugin&lt;/a&gt; for Jenkins can be used to parse the results, enabling you see a test report, and to be notified of test failures.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Compiling and executing the unit tests for your app is as simple as adding another build step which runs &lt;code&gt;./gradlew testDebugUnitTest&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Similarly, instrumentation tests can be compiled and executed via the &lt;code&gt;connectedDebugAndroidTest&lt;/code&gt; task in Gradle.  However, before you do this, you should ensure that an Android device is connected to your Jenkins build agent, or you can make use of the &lt;a href=&quot;https://plugins.jenkins.io/android-emulator&quot;&gt;Android Emulator Plugin&lt;/a&gt; to automatically download, create, and start an emulator for you during a build.  There are also plugins for cloud testing services such as &lt;a href=&quot;https://github.com/jenkinsci/aws-device-farm-plugin&quot;&gt;AWS Device Farm&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you have finished executing the tests, you can use the &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/junit/#junit-archive-junit-formatted-test-results&quot;&gt;&lt;code&gt;junit&lt;/code&gt;&lt;/a&gt; step to analyse the results: &lt;code&gt;junit &#39;**/TEST-*.xml&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;static-analysis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#static-analysis&quot; /&gt;Static Analysis&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Similar to other Java or Kotlin projects, you can scan your codebase using static analysis tools like FindBugs or Checkstyle.  Once again, Jenkins has &lt;a href=&quot;https://plugins.jenkins.io/analysis-core&quot;&gt;analysis plugins&lt;/a&gt; which can parse the output of these tools, and present you with the results and trend graphs, or optionally flag the build as unstable or failed if too many problems have been detected.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Android SDK provides a further useful static analysis tool called &lt;a href=&quot;https://developer.android.com/studio/write/lint.html&quot;&gt;Lint&lt;/a&gt;.  The output of this tool can be parsed by the &lt;a href=&quot;https://plugins.jenkins.io/warnings-ng&quot;&gt;Warnings Next Generation Plugin&lt;/a&gt;, which will analyse the issues found, and provide you with a detailed report within Jenkins.  This functionality was &lt;a href=&quot;https://www.youtube.com/watch?v=Erd2k6EKxCQ&amp;amp;t=53m32s&quot;&gt;demonstrated by the Android Tools Team&lt;/a&gt; at the Google I/O conference a few years back.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;securely-signing-and-deploying-android-apps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#securely-signing-and-deploying-android-apps&quot; /&gt;Securely signing and deploying Android apps&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to distribute an Android app, it needs to be signed with a private key, which you should keep safe (losing it means you won’t be able to publish updates to your app!), and as secure as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of developers having to keep the signing keystore on their development machines, you can securely store the keystore and/or its passphrase on Jenkins using the &lt;a href=&quot;https://plugins.jenkins.io/credentials&quot;&gt;Credentials Plugin&lt;/a&gt;.  This avoids having to hardcode the passphrase into your &lt;code&gt;build.gradle&lt;/code&gt;, or have it otherwise checked into your SCM.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Credentials Plugin allows you to store secrets in Jenkins — which will be stored encrypted on disk when not in use — and those secrets can temporarily be made available during a build, either as a file in the build workspace, or exposed as an environment variable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use such environment variables in a &lt;code&gt;signingConfig&lt;/code&gt; block within your &lt;code&gt;build.gradle&lt;/code&gt;, or you can make use of the &lt;a href=&quot;https://plugins.jenkins.io/android-signing&quot;&gt;Android Signing Plugin&lt;/a&gt; to sign your APK for you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you have your production-ready APK built and signed, you can automatically upload it to Google Play using the &lt;a href=&quot;https://plugins.jenkins.io/google-play-android-publisher&quot;&gt;Google Play Android Publisher plugin&lt;/a&gt;.  The benefit of using this plugin is that it supports multiple APK upload, expansion files, uploading of ProGuard mapping files, promotion of builds from alpha, to beta, to production — and once again, your Google Play credentials are securely stored on Jenkins thanks to integration with the Credentials Plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;sample-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sample-pipeline&quot; /&gt;Sample Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a straightforward example of a &lt;code&gt;Jenkinsfile&lt;/code&gt; defining a pipeline to build, test, and optionally deploy an Android app, from a multibranch Pipeline job.
It requires the Pipeline, JUnit, Android Lint, Google Play Android Publisher, and Mailer plugins to be installed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Run on a build agent where we have the Android SDK installed&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;android&#39;&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;c1&quot;&gt;// Stop the build early in case of compile or test failures&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;skipStagesAfterUnstable&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;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;Compile&#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;// Compile the app and its dependencies&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./gradlew compileDebugSources&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Unit 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;// Compile and run the unit tests for the app and its dependencies&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./gradlew testDebugUnitTest&#39;&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Analyse the test results and update the build result as appropriate&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/TEST-*.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;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;Build APK&#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;// Finish building and packaging the APK&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./gradlew assembleDebug&#39;&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Archive the APKs so that they can be downloaded from Jenkins&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;archiveArtifacts&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/*.apk&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Static analysis&#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 Lint and analyse the results&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./gradlew lintDebug&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;androidLint&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;pattern:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/lint-results-*.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;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;Deploy&#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;c1&quot;&gt;// Only execute this stage when building from the `beta` branch&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;branch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;beta&#39;&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&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;c1&quot;&gt;// Assuming a file credential has been added to Jenkins, with the ID &#39;my-app-signing-keystore&#39;,&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// this will export an environment variable during the build, pointing to the absolute path of&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// the stored Android keystore file.  When the build ends, the temporarily file will be removed.&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;SIGNING_KEYSTORE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;my-app-signing-keystore&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Similarly, the value of this variable will be a password stored by the Credentials Plugin&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;SIGNING_KEY_PASSWORD&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;my-app-signing-password&#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;// Build the app in release mode, and sign the APK using the environment variables&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./gradlew assembleRelease&#39;&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Archive the APKs so that they can be downloaded from Jenkins&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;archiveArtifacts&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/*.apk&#39;&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Upload the APK to Google Play&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;androidApkUpload&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;googleCredentialsId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Google Play&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;apkFilesPattern:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/*-release.apk&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;trackName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;beta&#39;&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;success&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;c1&quot;&gt;// Notify if the upload succeeded&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;to:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;beta-testers@example.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;New build available!&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Check it out!&#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;n&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;failure&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// Notify developer team of the failure&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;to:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;android-devs@example.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Oops!&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Build ${env.BUILD_NUMBER} failed; ${env.BUILD_URL}&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;/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;not-just-for-android&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#not-just-for-android&quot; /&gt;Not just for Android&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While buddybuild concentrated on Android and iOS apps, thanks to the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Distributed+builds&quot;&gt;distributed build agent architecture&lt;/a&gt; of Jenkins, you can automate any type of project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, you can expand the capabilities of Jenkins by adding macOS (or Windows, Linux, BSD…) agents; you can dynamically spin up agents on &lt;a href=&quot;https://plugins.jenkins.io/ec2&quot;&gt;AWS EC2 instances&lt;/a&gt;, &lt;a href=&quot;https://plugins.jenkins.io/azure-vm-agents&quot;&gt;Microsoft Azure VMs&lt;/a&gt;, or &lt;a href=&quot;https://plugins.jenkins.io/azure-container-agents&quot;&gt;Azure Container Instances&lt;/a&gt;; you can create agents using &lt;a href=&quot;https://plugins.jenkins.io/vsphere-cloud&quot;&gt;VMware&lt;/a&gt;, and so on.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;Conclusion&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thousands of Jenkins instances are already using the various Android-related plugins, and Pipeline along with the Blue Ocean User Interface make using Jenkins simpler than it’s ever been.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Give Jenkins a try for building your Android projects, check out the &lt;a href=&quot;https://www.jenkins.io/doc/tutorials/&quot;&gt;tutorials&lt;/a&gt;, and get in touch via the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;users&#39; mailing list&lt;/a&gt;, or &lt;a href=&quot;https://www.jenkins.io/chat/&quot;&gt;IRC&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, as with Jenkins itself, all &lt;a href=&quot;https://plugins.jenkins.io/&quot;&gt;plugins&lt;/a&gt; distributed are &lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;open-source&lt;/a&gt;, so feel free to &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;contribute&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2018/01/06/gsoc2018-call-for-mentors/</id>
<title>Google Summer Of Code 2018: Call for mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-01-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/01/06/gsoc2018-call-for-mentors/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='gsoc'></category>
<category term='gsoc2018'></category>
<category term='events'></category>
<category term='community'></category>
<summary>
This year the Jenkins project is interested in participating in
Google Summer of Code (GSoC).
As in 2016/2017, we are looking for mentors.
So yes, we are looking for you :)





What is GSoC?


GSoC is an annual international program which encourages
college-aged students to participate with open source projects during the summer
break between classes.


Students accepted into the program receive a stipend,
paid by Google, to work on well-defined projects to improve or enhance the Jenkins
project.
In exchange, numerous Jenkins community members volunteer as mentors
for students to help integrate them into the open source community and succeed
in completing their summer projects.




What do mentors get?




A student who works full-time...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year the Jenkins project is interested in participating in
&lt;a href=&quot;https://developers.google.com/open-source/gsoc/&quot;&gt;Google Summer of Code (GSoC)&lt;/a&gt;.
As in 2016/2017, we are looking for mentors.
So yes, we are looking for you :)&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;what-is-gsoc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-gsoc&quot; /&gt;What is GSoC?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GSoC is an annual international program which encourages
college-aged students to participate with open source projects during the summer
break between classes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Students accepted into the program receive a stipend,
paid by Google, to work on well-defined projects to improve or enhance the Jenkins
project.
In exchange, numerous Jenkins community members volunteer as &lt;em&gt;mentors&lt;/em&gt;
for students to help integrate them into the open source community and succeed
in completing their summer projects.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-do-mentors-get&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-do-mentors-get&quot; /&gt;What do mentors get?&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;A student who works full-time in the area of your interest for several months&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Joint projects with Jenkins experts, lots of fun and ability to study something together&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Limited-edition of swags from Google and Jenkins project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maybe: Participation in GSoC Mentor Summit and other GSoC events/meetups&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;conditions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conditions&quot; /&gt;Conditions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentors are expected to…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Be passionate about Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lead the project in the area of their interest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Actively participate in the project during student selection, community bonding and coding phases (March - August)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work in teams of 2+ mentors per 1 each student&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dedicate a consistent and significant amount of time, especially during the coding phase (&lt;em&gt;~5 hours&lt;/em&gt; per week in a team of two mentors)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentorship does &lt;strong&gt;NOT&lt;/strong&gt; require strong expertise in Jenkins plugin development.
The main objective is to guide students and to get them involved into the Jenkins community.
GSoC org admins will help to find advisors if a special expertise is needed.&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;&lt;strong&gt;Disclaimer:&lt;/strong&gt; We cannot guarantee that the Jenkins organization gets accepted to GSoC.
Even if it gets accepted, we may need to select projects depending on student applications
and the number of allocated project slots.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;timeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#timeline&quot; /&gt;Timeline&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dec 2017 - started collecting project ideas&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jan 17 - Status review at the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Meeting+Agenda&quot;&gt;Jenkins Governance Meeting&lt;/a&gt;.
Outcome: decision whether we apply to GSoC in 2018.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jan 21 - Application to GSoC (deadline - Jan 23)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Feb 12 - List of accepted mentoring organizations published&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 05 - Deadline for project idea proposals&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next - &lt;a href=&quot;https://developers.google.com/open-source/gsoc/timeline&quot;&gt;GSoC Timeline&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 class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-to-apply&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-apply&quot; /&gt;How to apply?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested in proposing a project or joining an existing one, please respond to
&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/We-14-z_YXU&quot;&gt;this thread&lt;/a&gt;
in the Jenkins Developer mailing list.
We aggregate/review proposals in
&lt;a href=&quot;https://docs.google.com/document/d/1q2p_XZEdbkcVDMpEPTtjPS15i2Oq3CQgH_geJjPhofY/edit&quot;&gt;this document&lt;/a&gt;
where you just need to describe the idea and introduce yourself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please propose new project ideas for discussion until March 05.
You can join an existing project at any time, including community bonding and coding periods.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-requirements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-requirements&quot; /&gt;Project requirements&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GSoC is about code (though it may and likely should include some documentation and testing work)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Projects should be about Jenkins (plugins, core, infrastructure, integrations, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Projects should be potentially doable by a student in 3-4 months&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find more information about requirements and practices in the
&lt;a href=&quot;https://google.github.io/gsocguides/mentor/&quot;&gt;GSoC Mentor Guide&lt;/a&gt;.&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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/&quot;&gt;Jenkins GSoC subproject page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/mentors&quot;&gt;Information for mentors&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/open-source/gsoc/&quot;&gt;Google Summer of Code page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://google.github.io/gsocguides/mentor/&quot;&gt;GSoC Mentor Guide&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.google.com/open-source/gsoc/timeline&quot;&gt;GSoC Timeline&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/2018/01/03/fosdem-2018/</id>
<title>FOSDEM 2018!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2018-01-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2018/01/03/fosdem-2018/" />
<author>
<name>markewaite</name>
</author>
<category term='community'></category>
<category term='event'></category>
<summary>
FOSDEM 2018 is a free event for software developers to meet, share ideas and collaborate.
It is an annual event that brings open source contributors from around the world for two days of presentations, discussions, and learning.


Jenkins will be well-represented at FOSDEM 2018.





Happy Hour before FOSDEM


We&#8217;ll have a happy hour Friday evening before FOSDEM at Cafe Le Roy d&#8217;Espagne.
See the meetup page for details.




Jenkins table at FOSDEM


A Jenkins table will be staffed by volunteers at FOSDEM to answer questions, discuss topics, and help users.
See the meetup page for details.




Presentations at FOSDEM




Automated Linux Containers deployment for fun and profit by David Negreira


Advanced...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2018/&quot;&gt;FOSDEM 2018&lt;/a&gt; is a free event for software developers to meet, share ideas and collaborate.
It is an annual event that brings open source contributors from around the world for two days of presentations, discussions, and learning.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins will be well-represented at FOSDEM 2018.&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/2018-01-03-fosdem/fosdem-2018.png&quot; alt=&quot;FOSDEM 2018&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;happy-hour-before-fosdem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#happy-hour-before-fosdem&quot; /&gt;Happy Hour before FOSDEM&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll have a &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/245685813/&quot;&gt;happy hour&lt;/a&gt; Friday evening before FOSDEM at Cafe Le Roy d’Espagne.
See the &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/245685813/&quot;&gt;meetup page&lt;/a&gt; for details.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-table-at-fosdem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-table-at-fosdem&quot; /&gt;Jenkins table at FOSDEM&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A Jenkins table will be staffed by volunteers at FOSDEM to answer questions, discuss topics, and help users.
See the &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/245688007/&quot;&gt;meetup page&lt;/a&gt; for details.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;presentations-at-fosdem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#presentations-at-fosdem&quot; /&gt;Presentations at FOSDEM&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://fosdem.org/2018/schedule/event/containers_automated_deployments/&quot;&gt;Automated Linux Containers deployment for fun and profit&lt;/a&gt; by &lt;a href=&quot;https://fosdem.org/2018/schedule/speaker/david_negreira/&quot;&gt;David Negreira&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2018/schedule/event/advanced_testing_java/&quot;&gt;Advanced testing in action on a Java project&lt;/a&gt; by &lt;a href=&quot;https://fosdem.org/2018/schedule/speaker/vincent_massol/&quot;&gt;Vincent Massol&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://fosdem.org/2018/schedule/event/deployment_provisioning_orchestration/&quot;&gt;Deployment vs Provisioning vs Orchestration vs Configuration Management&lt;/a&gt; by &lt;a href=&quot;https://fosdem.org/2018/schedule/speaker/peter_souter/&quot;&gt;Peter Souter&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;jenkins-hackfest-after-fosdem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-hackfest-after-fosdem&quot; /&gt;Jenkins Hackfest after FOSDEM&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A Jenkins Hackfest will be held the day after FOSDEM 2018.
Those who would like to join us for the hackfest 5 Feb 2018 should register for the &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/246098584/&quot;&gt;meetup&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Meals, snacks, and beverages will be provided for the hackfest.  Come join us, and let’s write some code!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Questions? feel free to contact &lt;a href=&quot;mailto:alytong13@gmail.com&quot;&gt;Alyssa Tong&lt;/a&gt; or &lt;a href=&quot;mailto:mark.earl.waite@gmail.com&quot;&gt;Mark Waite&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/2017/12/31/new-year/</id>
<title>Happy New Year!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-12-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/12/31/new-year/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='community'></category>
<category term='new-year-blogpost'></category>
<summary>
Jenkins project congratulates all users and contributors with the New Year!
Let&#8217;s take a look at some changes this year.





Highlights




We released major features like BlueOcean
and Declarative Pipeline



These features offer a new user experience in Jenkins Web UI, powered by Jenkins Pipeline.





In Jenkins 2.54 we updated the Java minimal requirement to Java 8 (announcement).


Plugin CI has been moved to our Jenkins-on-Jenkins instance.
All plugins are being built by Jenkins Pipeline with a special pipeline library


We adopted the Jenkins Enhancement Proposal (JEP) process for major changes in Jenkins.
There are already JEPs under review:



JEP-2: Criteria for selecting "Suggested Plugins"


JEP-200: Switch Remoting/XStream blacklist to a whitelist


JEP-201:...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins project congratulates all users and contributors with the New Year!
Let’s take a look at some changes this year.&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/2017-12-31-new-year/card.png&quot; alt=&quot;NewYear&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#highlights&quot; /&gt;Highlights&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;We released major features like &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;BlueOcean&lt;/a&gt;
and &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;These features offer a new user experience in Jenkins Web UI, powered by &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;Jenkins Pipeline&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In Jenkins 2.54 we updated the Java minimal requirement to Java 8 (&lt;a href=&quot;https://www.jenkins.io/blog/2017/04/10/jenkins-has-upgraded-to-java-8/&quot;&gt;announcement&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin CI has been moved to our &lt;a href=&quot;https://ci.jenkins.io/&quot;&gt;Jenkins-on-Jenkins instance&lt;/a&gt;.
All plugins are being built by Jenkins Pipeline with a special &lt;a href=&quot;https://github.com/jenkins-infra/pipeline-library&quot;&gt;pipeline library&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We adopted the &lt;a href=&quot;https://github.com/jenkinsci/jep/blob/master/jep/1/README.adoc#what-is-a-jep&quot;&gt;Jenkins Enhancement Proposal (JEP)&lt;/a&gt; process for major changes in Jenkins.
There are already JEPs under review:&lt;/p&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/jep/tree/master/jep/2&quot;&gt;JEP-2: Criteria for selecting &quot;Suggested Plugins&quot;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/200&quot;&gt;JEP-200: Switch Remoting/XStream blacklist to a whitelist&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jep/tree/master/jep/201&quot;&gt;JEP-201: Jenkins Configuration as Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;some-stats&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#some-stats&quot; /&gt;Some stats&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2017 we had &lt;strong&gt;60&lt;/strong&gt; weekly and &lt;strong&gt;13&lt;/strong&gt; LTS releases with &lt;strong&gt;305&lt;/strong&gt; fixes/enhancements only in the core.
Next week Jenkins is going to hit the &lt;code&gt;2.100&lt;/code&gt; version, and the core changed greatly since the &lt;code&gt;2.0&lt;/code&gt; release in April 2016.
&lt;a href=&quot;https://www.jenkins.io/security/&quot;&gt;Jenkins Security&lt;/a&gt; was one of the hottest areas this year, there were &lt;strong&gt;7&lt;/strong&gt; &lt;a href=&quot;https://www.jenkins.io/security/advisories/&quot;&gt;security advisories&lt;/a&gt; for the core and &lt;strong&gt;15&lt;/strong&gt; - for plugins.
For comparison, in 2016 there were only &lt;strong&gt;6&lt;/strong&gt; security releases in total.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were &lt;strong&gt;2605&lt;/strong&gt; plugin releases, and &lt;strong&gt;&amp;gt;215&lt;/strong&gt; NEW plugins have been hosted in the Update Center.
In particular Jenkins ecosystem has greatly expanded into the Cloud space
by offering dozens of new plugins (e.g. for Azure and Kubernetes).
We also got many new plugins providing integrations with various Development and DevOps tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other subprojects and Jenkins components also got major updates.
For example,
&lt;a href=&quot;https://www.jenkins.io/projects/remoting/&quot;&gt;Jenkins Remoting&lt;/a&gt; got 15 releases with stability improvements.
&lt;a href=&quot;https://github.com/stapler/stapler&quot;&gt;Stapler Framework&lt;/a&gt; also got 6 releases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Keep updating, Jenkins 2 is not only about Pipeline as Code!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;events&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#events&quot; /&gt;Events&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we got many new &lt;a href=&quot;https://www.jenkins.io/projects/jam/&quot;&gt;Jenkins Area Meetups&lt;/a&gt;.
Currently there are 77 meetups with more than 20,000 members in total (&lt;a href=&quot;https://www.meetup.com/pro/jenkins&quot;&gt;full map&lt;/a&gt;).
More than 100 meetups have been organized around the globe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were also several Jenkins-focused conferences including the following ones:&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.cloudbees.com/jenkinsworld&quot;&gt;Jenkins World&lt;/a&gt; in San-Francisco&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins User Conferences in &lt;a href=&quot;https://www.cloudbees.com/event/jenkins-user-conference-2017-israel&quot;&gt;Israel&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/blog/2017/10/25/jenkins-user-conference-china/&quot;&gt;Shanghai&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Days Of Jenkins in &lt;a href=&quot;https://www.code-conf.com/doj/doj-gbg/&quot;&gt;Gothenburg&lt;/a&gt; and &lt;a href=&quot;https://www.code-conf.com/doj/doj-osl/&quot;&gt;Oslo&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jcd-paris.jfrog.com/&quot;&gt;Jenkins Community Day&lt;/a&gt; in Paris&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cvent.com/events/jenkins-days-by-cloudbees/event-summary-aca8686c85fc4eedbd83c611a94756cd.aspx&quot;&gt;Jenkins Days&lt;/a&gt; in Amsterdam&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/event/cloudbees-jenkins-automotive-and-embedded-day&quot;&gt;CloudBees | Jenkins Automotive and Embedded Day&lt;/a&gt; in Stuttgart&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;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;Next year we will have traditional contributor meeting at &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/FOSDEM+2018&quot;&gt;FOSDEM&lt;/a&gt;
and at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld&quot;&gt;Jenkins World 2018&lt;/a&gt;.
If you are interested in Jenkins, stop by at our community booths and join the contributor summits/hackathons.
We also want to participate in Google Summer of Code 2018,
and currently we are &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/We-14-z_YXU&quot;&gt;looking for mentors&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned, there is much more to come next year!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/12/15/auto-convert-freestyle-jenkins-jobs-to-coded-pipeline/</id>
<title>Auto-Convert Freestyle Jobs to Jenkins Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-12-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/12/15/auto-convert-freestyle-jenkins-jobs-to-coded-pipeline/" />
<author>
<name>spillai</name>
</author>
<category term='pipeline'></category>
<category term='freestyle'></category>
<summary>
This is a guest post by Sanil Pillai, Director of Labs &amp; Strategic Insights, Infostretch






Infostretch has created a
plugin for teams
upgrading from Freestyle Jobs to Pipelines as code with Jenkins Pipeline.
This new plugin streamlines the process and accelerates
pipeline on-boarding for any new set of applications. Previously, when
upgrading to Jenkins Pipeline, converting Freestyle Jobs required developers
to drill down on each one of those hundreds (or thousands!)  of jobs to understand
tools, configurations, URLs, parameters, and more before rewriting them in
Pipeline syntax. This process is very manual,
error-prone, lengthy, and not cost-effective. Beyond saving time, the new
plugin also assures adherence to proper coding standards...
</summary>
<content type='html'>
&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;This is a guest post by Sanil Pillai, Director of Labs &amp;amp; Strategic Insights, Infostretch&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.infostretch.com&quot;&gt;Infostretch&lt;/a&gt; has created a
&lt;a href=&quot;https://plugins.jenkins.io/convert-to-pipeline&quot;&gt;plugin&lt;/a&gt; for teams
upgrading from Freestyle Jobs to Pipelines as code with Jenkins Pipeline.
This new plugin streamlines the process and accelerates
pipeline on-boarding for any new set of applications. Previously, when
upgrading to Jenkins Pipeline, converting Freestyle Jobs required developers
to drill down on each one of those hundreds (or thousands!)  of jobs to understand
tools, configurations, URLs, parameters, and more before rewriting them in
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax&quot;&gt;Pipeline syntax&lt;/a&gt;. This process is very manual,
error-prone, lengthy, and not cost-effective. Beyond saving time, the new
plugin also assures adherence to proper coding standards and separates complex
business logic and standards declaration from execution flow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Key features:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Convert single freestyle job to pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Convert chain of freestyle jobs to single pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Works with both Jenkins and CloudBees Jenkins Enterprise&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin can be customized to support any Freestyle plugin and an
organization’s &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries&quot;&gt;Pipeline Shared Library&lt;/a&gt;,
or Groovy coding standards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Works with CloudBees&#39; Role-based Access Control to help the new Pipelines
comply with existing security policies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct migration of properties such as &quot;Build with Parameters&quot; to newly
created Pipelines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct migration of Agent on which job is to be run with support for multiple agent labels across different downstream jobs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Environment properties: JDK, NodeJS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supports Git SCM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build steps: Maven, Ant, Shell, Batch, and Ansible Playbook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Post build actions: artifact archiver, simple mailer, TestNG reports, JUnit reports, checkstyle publisher&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, let’s take a look at how to get started:&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;Click on a link at Root level or Folder level or Job level.&lt;/p&gt;
&lt;div class=&quot;imageblock middle&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/freestyle-converter/Image01-Jenkins-Pipeline-Infostretch.png&quot; alt=&quot;Image01 Jenkins Pipeline Infostretch&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Select the job from the drop-down list that is the beginning point of the
&quot;chain&quot;. If job level link is clicked, this drop-down list will not be visible.&lt;/p&gt;
&lt;div class=&quot;imageblock middle&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/freestyle-converter/Image02-Jenkins-Pipeline-Infostretch.png&quot; alt=&quot;Image02 Jenkins Pipeline Infostretch&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Provide the new pipeline job name. If this is not specified, the plugin will
attempt to create a new pipeline job with the naming convention of
&quot;oldname-pipeline&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Check &quot;Recursively convert downstream jobs if any?&quot; if you wish to have all the
downstream jobs converted into this new pipeline. The plugin will write all the
logic of current and downstream jobs into a single pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check &quot;Commit Jenkinsfile?&quot; if you would like the plugin to create a
Jenkinsfile and commit it back to the SCM. The plugin will commit the
Jenkinsfile at the root of the SCM repository it finds in the first job
(selected in step 1 above). It will attempt to commit to this repo using the
credentials it finds in the first job.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do note that the plugin will checkout the repo in to a temporary workspace on
the controller (JENKINS_HOME/plugins/convert-to-    pipeline/ws). Once the
conversion is complete and Jenkinsfile is committed back to the repo, the
workspace will be deleted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &quot;Convert&quot; to convert the Freestyle job configurations to a single
scripted pipeline job. Once the conversion is complete and the new job is
created, you will be redirected to the newly created pipeline job.&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s it!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To learn more about plugin usage, customization and to see a demo
click &lt;a href=&quot;https://www.youtube.com/watch?v=Xx7AbPM4KYM&amp;amp;feature=youtu.be&quot;&gt;here&lt;/a&gt;
to watch the webinar replay on-demand.&lt;/p&gt;
&lt;/div&gt;&lt;/ol&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/12/14/security-update/</id>
<title>Security updates for Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-12-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/12/14/security-update/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.95 and 2.89.2, that fix two security vulnerabilities.
For an overview of what was fixed, see the security advisory.


We usually announce core security updates well in advance on the jenkinsci-advisories mailing list, to give Jenkins administrators time to schedule a maintenance.
Additionally, we try to align security updates with the regular LTS schedule.
We have chosen not to do so in this case for two reasons:




The random failure to set up Jenkins is very noticeable, and given that we&#8217;ve seen automated exploits for unprotected Jenkins instances in the past we consider it important to fix...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.95 and 2.89.2, that fix two security vulnerabilities.
For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-12-14&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We usually announce core security updates well in advance on the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt;, to give Jenkins administrators time to schedule a maintenance.
Additionally, we try to align security updates with the regular LTS schedule.
We have chosen not to do so in this case for two reasons:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-12-14#random-failures-to-initialize-the-setup-wizard-on-startup&quot;&gt;random failure to set up Jenkins&lt;/a&gt; is very noticeable, and given that we’ve seen &lt;a href=&quot;https://www.jenkins.io/security/advisory/2015-10-01/&quot;&gt;automated exploits for unprotected Jenkins instances&lt;/a&gt; in the past we consider it important to fix that issue as soon as possible, so that users setting up new instances of Jenkins can be confident they won’t start up insecurely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-12-14#csrf-protection-delayed-after-startup&quot;&gt;CSRF issue&lt;/a&gt; appears to only affect instances for a very short (seconds at most, if at all) time period immediately after startup, so administrators could apply the fix during the next scheduled Jenkins downtime, rather than immediately.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/12/04/jenkins-user-conference-china-recap/</id>
<title>Jenkins User Conference China Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-12-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/12/04/jenkins-user-conference-china-recap/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='juc'></category>
<summary>
This is a guest post by Forest Jing, who runs
the Shanghai Jenkins Area Meetup






The first Jenkins User Conference China was held on November 19, 2017 in
Shanghai, China. It was an amazing conference for Jenkins users in China. There were
almost 450 attendees to enjoy a lovely day with Jenkins creator, Kohsuke Kawaguchi.







There were 12 wonderful presentations, 1 workshop and 1 open space to set the stage for JUC China.
The day began with Kohsuke, welcomed to the stage by all the attendees here with their warm
applauses. All of them are fans of Jenkins and Kohsuke.  Thanks to Kohsuke, he made a...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://www.meetup.com/Shanghai-Jenkins-Area-Meetup/members/226406250/&quot;&gt;Forest Jing&lt;/a&gt;, who runs
the &lt;a href=&quot;https://www.meetup.com/Shanghai-Jenkins-Area-Meetup/&quot;&gt;Shanghai Jenkins Area Meetup&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first Jenkins User Conference China was held on November 19, 2017 in
Shanghai, China. It was an amazing conference for Jenkins users in China. There were
almost 450 attendees to enjoy a lovely day with Jenkins creator, Kohsuke Kawaguchi.&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/juc-china-2017/0A3_1763.JPG&quot; alt=&quot;0A3 1763&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were 12 wonderful presentations, 1 workshop and 1 open space to set the stage for JUC China.
The day began with Kohsuke, welcomed to the stage by all the attendees here with their warm
applauses. All of them are fans of Jenkins and Kohsuke.  Thanks to Kohsuke, he made a wonderful presentation to show the past, present and future of Jenkins for Chinese Jenkins users.&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/juc-china-2017/0A3_1742.JPG&quot; alt=&quot;0A3 1742&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The co-founder of DevOps Times community, Le Zhang released a report of adoption of Deployment Pipeline in Chinese IT organization.
The report shows that Jenkins is the most popular tool for DevOps and CD in China.&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/juc-china-2017/0A77A42D-0BFA-49AA-80E0-3D7FC0997261.png&quot; alt=&quot;0A77A42D 0BFA 49AA 80E0 3D7FC0997261&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It also has proven that “If it hurts, do it more often!” is right because the IT organization who deploy more frequently, deployment  failure would be less.&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/juc-china-2017/0A3_1767.JPG&quot; alt=&quot;0A3 1767&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Three Musketeers of DevOps in China (Le Zhang, Xuefeng Shi,Forest Jing) have demonstrated a DevOps pipeline based on Jenkins and many open-source software such as Kubernetes, Gitlab, etc.&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/juc-china-2017/53297F0E-0B48-4E62-80FB-6B6DF4D7A2C2.png&quot; alt=&quot;53297F0E 0B48 4E62 80FB 6B6DF4D7A2C2&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the presentation, lots of fans waited in line to take pictures with Kohsuke.&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/juc-china-2017/0A3_1825.JPG&quot; alt=&quot;0A3 1825&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are some photos of the JUC China. We really enjoyed 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/juc-china-2017/68B2E556-D452-4FD9-B6D0-5E5985AE7221.png&quot; alt=&quot;68B2E556 D452 4FD9 B6D0 5E5985AE7221&quot;&gt;
&lt;/img&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/juc-china-2017/3F5821C1-8CFF-4561-8989-FD68775B22E2.png&quot; alt=&quot;3F5821C1 8CFF 4561 8989 FD68775B22E2&quot;&gt;
&lt;/img&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/juc-china-2017/0A3_9598.JPG&quot; alt=&quot;0A3 9598&quot;&gt;
&lt;/img&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/juc-china-2017/0A3_1644.JPG&quot; alt=&quot;0A3 1644&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, as an organizer for JUC China, I would like to thank Kohsuke Kawaguchi, Alyssa Tong, Sam Van Oort and so many friends from CloudBees and Jenkins community to have given us so many help to make the first JUC China an amazing and successful conference for Jenkins users in China. We look forward to organizing many more JUC China.&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/11/27/tutorials-in-the-jenkins-user-documentation/</id>
<title>Introducing Tutorials in the Jenkins User Documentation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-11-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/11/27/tutorials-in-the-jenkins-user-documentation/" />
<author>
<name>gilesgas</name>
</author>
<category term='tutorial'></category>
<category term='blueocean'></category>
<category term='pipeline'></category>
<summary>
Regular perusers of the Jenkins User Documentation may have noticed
the presence of the Tutorials part (between the Guided Tour and User
Handbook) that appeared in the last couple of months and gradually began to get
populated with much of my recent work, writing Jenkins tutorials.


My name&#8217;s Giles and I&#8217;ve been a technical writer in the software development
field for several years now. I&#8217;ve always been passionate about technical writing
and more recently, the technologies that go into developing written content and
automating its generation - like Jenkins! I was a former Atlassian and recently
joined CloudBees as a Senior Technical Writer, working remotely from the "Sydney
Office",...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regular perusers of the &lt;a href=&quot;https://www.jenkins.io/doc&quot;&gt;Jenkins User Documentation&lt;/a&gt; may have noticed
the presence of the &lt;strong&gt;Tutorials&lt;/strong&gt; part (between the &lt;strong&gt;Guided Tour&lt;/strong&gt; and &lt;strong&gt;User
Handbook&lt;/strong&gt;) that appeared in the last couple of months and gradually began to get
populated with much of my recent work, writing Jenkins tutorials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My name’s Giles and I’ve been a technical writer in the software development
field for several years now. I’ve always been passionate about technical writing
and more recently, the technologies that go into developing written content and
automating its generation - like Jenkins! I was a former Atlassian and recently
joined CloudBees as a Senior Technical Writer, working remotely from the &quot;Sydney
Office&quot;, with my current focus on the Jenkins User Documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-tutorials&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-tutorials&quot; /&gt;Why tutorials?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My exposure to Jenkins and its usage over the years has been patchy at best.
During this time, however, I’ve had some degree of experience as a user of
various continuous delivery (CD) tools like Jenkins and am reasonably familiar
with the advantages these tools can offer software development teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve also found that while many software developers are familiar with the
broader concept of &quot;developer operations&quot; (or simply &quot;devops&quot;), fewer seem
familiar with the concepts of CD and related tools to facilitate devops within
organizations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The CD process is based on the fundamental flow of &lt;strong&gt;building the application&lt;/strong&gt; &amp;gt;
&lt;strong&gt;testing it&lt;/strong&gt; &amp;gt; &lt;strong&gt;delivering it&lt;/strong&gt;, where typically:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;building&lt;/strong&gt; part involves compiling the application and/or ensuring all
necessary libraries and dependencies are in place for the application to run
as intended.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;testing&lt;/strong&gt; part involves testing the built application with automated tests
to ensure that changes implemented by developers function as expected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;delivering&lt;/strong&gt; part involves packaging or presenting the application in a
way that can be delivered to customers or other users for any kind of purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, as one of the major contributors to the Jenkins User Documentation (and
faced with a reasonably steep learning curve), it quickly became apparent about
the lack of accessible documentation to hand-hold people relatively new to
Jenkins through this CD process. I couldn’t find anything in the Jenkins User
Documentation to demonstrate how Jenkins implements this process on a simple
app that delivers an end result.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the guidance and assistance of helpful colleagues, I therefore decided to
embark on creating a series of Jenkins tutorials to help fill these
documentation and knowledge gaps. These tutorials are based on Daniele Procida’s
description of how tutorials should be presented in his blog post
&quot;&lt;a href=&quot;https://www.divio.com/en/blog/documentation/&quot;&gt;What nobody tells you about
documentation&lt;/a&gt;&quot;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;introductory-tutorials&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introductory-tutorials&quot; /&gt;Introductory tutorials&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first set of tutorials on the &lt;a href=&quot;https://www.jenkins.io/doc/tutorials&quot;&gt;Tutorials overview&lt;/a&gt; page
demonstrate how to implement this fundamental CD process in Jenkins on a simple
application for a given technology stack.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So far, there’s one for
&lt;a href=&quot;https://www.jenkins.io/doc/tutorials/build-a-java-app-with-maven/&quot;&gt;Java with Maven&lt;/a&gt; and another
for &lt;a href=&quot;https://www.jenkins.io/doc/tutorials/build-a-node-js-and-react-app-with-npm/&quot;&gt;Node.js and
React with npm&lt;/a&gt;. Another for Python will be added to this list in the near
future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These tutorials define your application’s entire CD process (i.e. your Pipeline)
in a &lt;code&gt;Jenkinsfile&lt;/code&gt;, whose Groovy-like Declarative Pipeline syntax is checked in
to your Git source repository. Managing your Pipeline with your application’s
source code like this forms the fundamentals of &quot;Pipeline as code&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;strong&gt;Introductory tutorials&lt;/strong&gt; also cover how to use some powerful features of
Jenkins, like &lt;a href=&quot;https://www.jenkins.io/doc/tutorials/create-a-pipeline-in-blue-ocean/&quot;&gt;Blue Ocean&lt;/a&gt;,
which makes it easy to connect to an existing cloud, web or locally hosted Git
repository and create your Pipeline with limited knowledge of Pipeline syntax.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;advanced-tutorials&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#advanced-tutorials&quot; /&gt;Advanced tutorials&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also soon to be released will be the first &lt;strong&gt;Advanced tutorial&lt;/strong&gt; on building
multibranch Pipelines in Jenkins. This tutorial takes the &quot;Pipeline as code&quot;
concept to a new level, where a single &lt;code&gt;Jenkinsfile&lt;/code&gt; (defining the entire CD
process across all branches of your application’s Git repository) consists of
multiple stages which are selectively executed based on the branch that Jenkins
is building.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additional tutorials that demonstrate more advanced features of Jenkins and how
to manage your Pipelines with greater sophistication and flexibility will be
added to this section in future.&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;summing-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summing-up&quot; /&gt;Summing up&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can access all currently available tutorials from the
&lt;a href=&quot;https://www.jenkins.io/doc/tutorials&quot;&gt;Tutorials overview&lt;/a&gt; page in the Jenkins User Documentation.
It’s worthwhile checking that page from time to time as it’ll be updated
whenever a new tutorial is published.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, if you have any suggestions for tutorials or other content you’d like to
see in the documentation, please post your suggestions in the
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkins/docs:matrix.org&quot;&gt;jenkinsci/docs gitter channel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph boxshadow&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2017-11/sydney-office-team.jpg&quot; alt=&quot;The &amp;quot;Sydney Office&amp;quot; team&quot; width=&quot;80%&quot; /&gt;&lt;br&gt;
&lt;em&gt;The Sydney Office team meeting at Carriageworks - from left to right, Giles
Gaskell, Nicholae Pascu, Michael Neale and James Dumay&lt;/em&gt;&lt;/br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/11/08/security-updates/</id>
<title>Security updates for Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-11-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/11/08/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.89 and 2.73.3, that fix two low-severity security vulnerabilities.


For an overview of what was fixed, see the security advisory.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our LTS upgrade guide.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.89 and 2.73.3, that fix two low-severity security vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-11-08&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.73/#upgrading-to-jenkins-lts-2-73-3&quot;&gt;LTS upgrade guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/10/25/jenkins-user-conference-china/</id>
<title>Jenkins User Conference China</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-10-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/10/25/jenkins-user-conference-china/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='Jenkins User Conference'></category>
<summary>
This is a guest post by Forest Jing, who runs
the Shanghai Jenkins Area Meetup











I am excited to announce the inaugural
Jenkins User Conference China
will be taking place on November 19, 2017 in Shanghai, China.
The theme of JUC China is “Jenkins Driven CD and DevOps”.
Much like in the US, CD and DevOps are big topics of interest in China.
We are honored to have Kohsuke Kawaguchi join us as one of the keynote speakers at this inaugural Jenkins event.
We will also have sessions from many of China&#8217;s big named companies like Baidu, Tencet, Pinterest, Ctrip, Huawei, Microsoft, and more.
Below are some highlights of...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://www.meetup.com/Shanghai-Jenkins-Area-Meetup/members/226406250/&quot;&gt;Forest Jing&lt;/a&gt;, who runs
the &lt;a href=&quot;https://www.meetup.com/Shanghai-Jenkins-Area-Meetup/&quot;&gt;Shanghai Jenkins Area Meetup&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock middle&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/C0238CBC-BDE6-4097-B634-5D8633D24F4C.png&quot; alt=&quot;C0238CBC BDE6 4097 B634 5D8633D24F4C&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am excited to announce the inaugural
&lt;a href=&quot;https://www.bagevent.com/event/846598?bag_track=bagevent#website_moduleId_79702&quot;&gt;Jenkins User Conference China&lt;/a&gt;
will be taking place on November 19, 2017 in Shanghai, China.
The theme of JUC China is “Jenkins Driven CD and DevOps”.
Much like in the US, CD and DevOps are big topics of interest in China.
We are honored to have Kohsuke Kawaguchi join us as one of the keynote speakers at this inaugural Jenkins event.
We will also have sessions from many of China’s big named companies like Baidu, Tencet, Pinterest, Ctrip, Huawei, Microsoft, and more.
Below are some highlights of the event.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;sunday-nov-19th-agenda&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sunday-nov-19th-agenda&quot; /&gt;Sunday Nov 19th Agenda&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Morning keynote sessions&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There will be 4 keynote speeches:&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;Kohsuke Kawaguchi, creator of Jenkins will introduce Jenkins Past, Present &amp;amp; Future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le Zhang, a very famous DevOps and CD expert will show pipeline driven CD and DevOps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Engineering Director from Huawei will show the CD and DevOps practice in Huawei.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Xu Zheng from Pinterest will present Run Jenkins infrastructure as service in Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;In the Afternoon, we have set up 3 tracks&lt;/strong&gt;&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;CD &amp;amp; DevOps user stories from Microsoft, Tencent, Ctrip and JinDong - all are big companies in China.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enterprise Jenkins experience the use of Jenkins as an enterprise tool not only for teams.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Workshop to lead engineers to practice CloudBees Jenkins and open source Jenkins features.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock middle&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/8C5A0F23-4632-4DAC-AFAE-AE5535B1BED3.png&quot; alt=&quot;8C5A0F23 4632 4DAC AFAE AE5535B1BED3&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re in the neighborhood, we sincerely
&lt;a href=&quot;https://www.bagevent.com/event/846598?bag_track=bagevent#website_moduleId_79702&quot;&gt;invite you to join us&lt;/a&gt;
at Jenkins User Conference China.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Follow us on Twitter @china_juc&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/10/23/security-updates/</id>
<title>Security updates for multiple Jenkins plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-10-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/10/23/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<summary>
Multiple Jenkins plugins received updates today that fix several security vulnerabilities.




Active Choices (uno-choice)


Build-Publisher


Dependency Graph Viewer


global-build-stats




Additionally, the Multijob Plugin also received a security update several weeks ago.


For an overview of these security fixes, see the security advisory.


Active Choices Plugin distribution had been suspended since April due to its mandatory dependency on the suspended Scriptler Plugin.
That dependency has been made optional, so Active Choices can be used without having Scriptler installed.
This means we are able to resume distribution of Active Choices Plugin again.
It should be available on update sites later today.


We also announced a medium severity security vulnerability in SCP publisher plugin...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Multiple Jenkins plugins received updates today that fix several security vulnerabilities.&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/uno-choice&quot;&gt;Active Choices&lt;/a&gt; (uno-choice)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/build-publisher&quot;&gt;Build-Publisher&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/depgraph-view&quot;&gt;Dependency Graph Viewer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/global-build-stats&quot;&gt;global-build-stats&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, the &lt;a href=&quot;https://plugins.jenkins.io/jenkins-multijob-plugin&quot;&gt;Multijob Plugin&lt;/a&gt; also received a security update several weeks ago.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of these security fixes, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-10-23&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Active Choices Plugin distribution had been suspended since April due to its mandatory dependency on the suspended Scriptler Plugin.
That dependency has been made optional, so Active Choices can be used without having Scriptler installed.
This means we are able to resume distribution of Active Choices Plugin again.
It should be available on update sites later today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also announced a medium severity security vulnerability in SCP publisher plugin that does not have a fix at this time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important future notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/10/16/jenkins-world-session-videos-are-available/</id>
<title>Jenkins World 2017 Session Videos are Available</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-10-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/10/16/jenkins-world-session-videos-are-available/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<summary>
This is a guest post by Alyssa Tong, who runs
the Jenkins Area Meetup program and is also responsible for
Marketing &amp; Community Programs at CloudBees, Inc.






Jenkins World 2017 keynotes and breakout session videos are now available HERE. Photos from the conference can be seen HERE.


Save the date for Jenkins World 2018:




Conference dates are September 16-19, 2018 in San Francisco.


Registration will open on October 16, 2017.


Call for Papers will open on December 1, 2017....
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, who runs
the &lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;Jenkins Area Meetup&lt;/a&gt; program and is also responsible for
Marketing &amp;amp; Community Programs at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins World 2017 keynotes and breakout session videos are now available &lt;a href=&quot;https://www.youtube.com/playlist?list=PLvBBnHmZuNQLqgKDFmGnUClw68qsQ9Hq5&quot;&gt;HERE&lt;/a&gt;. Photos from the conference can be seen &lt;a href=&quot;https://photos.google.com/share/AF1QipNPpAxMZPBYSUcQI6h9PMDYjSf2ZivW3_G-aLWG8BRqQA3XmCuFQUwOnwWERD7X1Q?key=N1RLX2FDSVdDY0dha2JhNUN5UHhmYU0tX0RhLUpR&quot;&gt;HERE&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Save the date for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2018&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Conference dates are September 16-19, 2018 in San Francisco.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Registration will open on October 16, 2017.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Call for Papers will open on December 1, 2017.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/10/11/security-updates/</id>
<title>Important security updates for Jenkins core and plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-10-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/10/11/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<category term='plugins'></category>
<summary>
We just released security updates to Jenkins, versions 2.84 and 2.73.2, that fix several security vulnerabilities.
Additionally, we published a new release of Swarm Plugin whose client contains a security fix, and Maven Plugin 3.0 was recently released to resolve a security issue.
Users of Swarm Plugin and Maven Plugin should update these to their respective newest versions.


For an overview of what was fixed, see the security advisory.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our LTS upgrade guide.


We also published information about a vulnerability in Speaks! Plugin.
There is no fix available and we recommend...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.84 and 2.73.2, that fix several security vulnerabilities.
Additionally, we published a new release of Swarm Plugin whose client contains a security fix, and Maven Plugin 3.0 was recently released to resolve a security issue.
Users of Swarm Plugin and Maven Plugin should update these to their respective newest versions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-10-11&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.73/#upgrading-to-jenkins-lts-2-73-2&quot;&gt;LTS upgrade guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also published information about a vulnerability in Speaks! Plugin.
There is no fix available and we recommend it be uninstalled.
Its distribution has been suspended.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/10/06/hacktoberfest/</id>
<title>Hacktoberfest. Contribute to Jenkins!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-10-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/10/06/hacktoberfest/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='hacktoberfest'></category>
<category term='event'></category>
<category term='community'></category>
<summary>
Once again it&#8217;s October in our calendars.
It means that the regular Hacktoberfest event is back!
During this one-month hackathon you can support open source and earn a limited edition T-shirt.
Jenkins project offers an opportunity to participate in the project
and to get reviews and help from Jenkins contributors.





How do I sign up?



Sign-up to Hacktoberfest on the event website.


Everything is set, just start coding!





What can I do?

There are lots of ways to contribute to Jenkins during Hacktoberfest.
You can&#8230;&#8203;




Write code


Improve documentation,
write blogposts


Automate Tests


Translate and internationalize components


Design - artwork and UI improvements also count!




See the Contribute and Participate page for for information.



Where can I contribute?

The...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once again it’s October in our calendars.
It means that the regular &lt;a href=&quot;https://hacktoberfest.digitalocean.com&quot;&gt;Hacktoberfest&lt;/a&gt; event is back!
During this one-month hackathon you can support open source and earn a limited edition T-shirt.
Jenkins project offers an opportunity to &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;participate in the project&lt;/a&gt;
and to get reviews and help from Jenkins contributors.&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/2017-hacktoberfest/social-card.png&quot; alt=&quot;Hacktoberfest&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-do-i-sign-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-sign-up&quot; /&gt;How do I sign up?&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Sign-up to Hacktoberfest on &lt;a href=&quot;https://hacktoberfest.digitalocean.com&quot;&gt;the event website&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Everything is set, just start coding!&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-can-i-do&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-can-i-do&quot; /&gt;What can I do?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are lots of ways to &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;contribute&lt;/a&gt; to Jenkins during Hacktoberfest.
You can…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Write code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improve documentation,
write &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc#adding-a-blog-post&quot;&gt;blogposts&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate Tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Translate and &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Internationalization&quot;&gt;internationalize&lt;/a&gt; components&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Design - artwork and UI improvements also count!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;Contribute and Participate&lt;/a&gt; page for for information.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;where-can-i-contribute&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-can-i-contribute&quot; /&gt;Where can I contribute?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project is located in several organizations in GitHub.
Core and plugins are located in the &lt;a href=&quot;https://github.com/jenkinsci/&quot;&gt;jenkinsci&lt;/a&gt; org,
infrastructure - in &lt;a href=&quot;https://github.com/jenkins-infra/&quot;&gt;jenkins-infra&lt;/a&gt;.
You can contribute to &lt;strong&gt;any&lt;/strong&gt; component within these organizations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, you could contribute to the following components:&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/jenkins&quot;&gt;Jenkins Core&lt;/a&gt;
(&lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/CONTRIBUTING.md&quot;&gt;contributing&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/&quot;&gt;Project Website&lt;/a&gt;
(&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc&quot;&gt;contributing&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Packaging (
&lt;a href=&quot;https://github.com/jenkinsci/docker&quot;&gt;Docker&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/packaging&quot;&gt;native packages&lt;/a&gt;
)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugins (&lt;a href=&quot;https://plugins.jenkins.io/&quot;&gt;existing plugins&lt;/a&gt;,
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+tutorial&quot;&gt;plugin tutorial&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;You can also &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+tutorial#Plugintutorial-CreatingaNewPlugin&quot;&gt;create&lt;/a&gt;
new Jenkins plugins and get them
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hosting+Plugins&quot;&gt;hosted&lt;/a&gt;
in the organization.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-can-i-do-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-can-i-do-2&quot; /&gt;What can I do?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;issue tracker&lt;/a&gt; contains lots of issues you could work on.
If you are new to Jenkins,
you could start by fixing some easier issues.
In the issue tracker we mark such issues with the &lt;code&gt;newbie-friendly&lt;/code&gt; label
(&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=project%20%3D%20JENKINS%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22%2C%20Reopened)%20AND%20labels%20in%20(newbie-friendly)&quot;&gt;search query&lt;/a&gt;).
You can also submit your own issue and propose a fix.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-do-i-label-issues-and-pull-requests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-label-issues-and-pull-requests&quot; /&gt;How do I label issues and pull requests?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hacktoberfest project requires issues and/or pull requests to be labeled with the &lt;code&gt;hacktoberfest&lt;/code&gt; label.
You may have no permissions to set labels on your own, but do not worry!
Just mention &lt;code&gt;@jenkinsci/hacktoberfest&lt;/code&gt; or &lt;code&gt;@jenkins-infra/hacktoberfest&lt;/code&gt; in the repository,
and we will set the labels for you.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-do-i-get-reviews&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-get-reviews&quot; /&gt;How do I get reviews?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All examples above are being monitored by the Jenkins contributors,
and you will likely get a review within few days.
Reviews in other repositories and plugins may take longer.
In the case of delays, ping &lt;code&gt;@jenkinsci/code-reviewers&lt;/code&gt; in your pull request
or send a message to the mailing list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;where-can-i-find-info&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-can-i-find-info&quot; /&gt;Where can I find info?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins project contains lots of materials about contributing to the project.
Here are some entry links:&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/participate/&quot;&gt;Participate and Contribute&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2017/08/07/intro-to-plugin-development/&quot;&gt;Plugin Development Tutorials&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/developer/&quot;&gt;Developer Documentation&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;need-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#need-help&quot; /&gt;Need help?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can reach out to us using &lt;a href=&quot;https://www.jenkins.io/chat/&quot;&gt;IRC Channels&lt;/a&gt;
and the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/&quot;&gt;Jenkins Developer Mailing List&lt;/a&gt;.
In the case of mailing lists it is recommended to mention Hacktoberfest
in the email subject.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/</id>
<title>Share a standard Pipeline across multiple projects with Shared Libraries</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-10-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/" />
<author>
<name>pstrh</name>
</author>
<category term='pipeline'></category>
<category term='declarative'></category>
<category term='microservices'></category>
<summary>
This is a guest post by Philip Stroh, Software Architect at
TimoCom.





When building multiple microservices - e.g. with Spring Boot - the integration
and delivery pipelines of your services will most likely be very similar.
Surely, you don&#8217;t want to copy-and-paste Pipeline code from one Jenkinsfile
to another if you develop a new service or if there are adaptions in your
delivery process. Instead you would like to define something like a pipeline
"template" that can be applied easily to all of your services.


The requirement for a common pipeline that can be used in multiple projects does not only emerge in microservice architectures. It&#8217;s valid for...
</summary>
<content type='html'>
&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;
This is a guest post by Philip Stroh, Software Architect at
&lt;a href=&quot;https://www.timocom.com&quot;&gt;TimoCom&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When building multiple microservices - e.g. with Spring Boot - the integration
and delivery pipelines of your services will most likely be very similar.
Surely, you don’t want to copy-and-paste Pipeline code from one &lt;code&gt;Jenkinsfile&lt;/code&gt;
to another if you develop a new service or if there are adaptions in your
delivery process. Instead you would like to define something like a pipeline
&quot;template&quot; that can be applied easily to all of your services.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The requirement for a common pipeline that can be used in multiple projects does not only emerge in microservice architectures. It’s valid for all areas where applications are
built on a similar technology stack or deployed in a standardized way (e.g. pre-packages as containers).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post I’d like to outline the possibility to create such a pipeline &quot;template&quot; using Jenkins Shared Libraries. If
you’re not yet familiar with Shared Libraries I’d recommend having a look at
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries&quot;&gt;the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following code shows a (simplified) integration and delivery Pipeline for a
Spring Boot application in declarative syntax.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;JenkinsFile&lt;/div&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;branch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;master&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;scmUrl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ssh://git@myScmServer.com/repos/myRepo.git&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;serverPort&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;8080&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;developmentServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;dev-myproject.mycompany.com&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;stagingServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;staging-myproject.mycompany.com&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;productionServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;production-myproject.mycompany.com&#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;checkout git&#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;git&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;branch:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;branch&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;GitCredentials&#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;n&quot;&gt;scmUrl&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;build&#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;s1&quot;&gt;&#39;mvn clean package -DskipTests=true&#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;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;n&quot;&gt;parallel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
                    &lt;span class=&quot;s2&quot;&gt;&quot;unit tests&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn test&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;},&lt;/span&gt;
                    &lt;span class=&quot;s2&quot;&gt;&quot;integration tests&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn integration-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;o&quot;&gt;}&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;deploy development&#39;&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;deploy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;developmentServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;serverPort&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;deploy staging&#39;&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;deploy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stagingServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;serverPort&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;deploy production&#39;&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;deploy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;productionServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;serverPort&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;n&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;failure&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;to:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;team@example.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Pipeline failed&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${env.BUILD_URL}&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This Pipeline builds the application, runs unit as well as integration tests and deploys the application to
several environments. It uses a global variable &quot;deploy&quot; that is provided within a Shared Library. The deploy method
copies the JAR-File to a remote server and starts the application. Through the handy REST endpoints of Spring Boot
Actuator a previous version of the application is stopped beforehand. Afterwards the deployment is verified via the
health status monitor of the application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;vars/deploy.groovy&lt;/div&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;port&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;httpRequest&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;httpMode:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;POST&#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;s2&quot;&gt;&quot;http://${server}:${port}/shutdown&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;validResponseCodes:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;200,408&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sshagent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;RemoteCredentials&#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;s2&quot;&gt;&quot;scp target/*.jar root@${server}:/opt/jenkins-demo.jar&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;ssh root@${server} nohup java -Dserver.port=${port} -jar /opt/jenkins-demo.jar &amp;amp;&quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;retry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&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;sleep&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;httpRequest&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;url:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://${server}:${port}/health&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;validResponseCodes:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;200&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;validResponseContent:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&quot;status&quot;:&quot;UP&quot;&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The common approach to reuse pipeline code is to put methods like &quot;deploy&quot; into
a Shared Library. If we now start developing the next application of the same
fashion we can use this method for deployments as well. But often there are
even more similarities within projects of one company. E.g. applications are
built, tested and deployed in the same way into the same environments
(development, staging and production). In this case it is possible to define
the whole Pipeline as a global variable within a Shared Library. The next code
snippet defines a Pipeline &quot;template&quot; for all of our Spring Boot applications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;vars/myDeliveryPipeline.groovy&lt;/div&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Map&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pipelineParams&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;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;checkout git&#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;git&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;branch:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pipelineParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;branch&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;GitCredentials&#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;n&quot;&gt;pipelineParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;scmUrl&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;build&#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;s1&quot;&gt;&#39;mvn clean package -DskipTests=true&#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;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;n&quot;&gt;parallel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
                        &lt;span class=&quot;s2&quot;&gt;&quot;unit tests&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn test&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;},&lt;/span&gt;
                        &lt;span class=&quot;s2&quot;&gt;&quot;integration tests&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn integration-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;o&quot;&gt;}&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;deploy developmentServer&#39;&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;deploy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pipelineParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;developmentServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pipelineParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;serverPort&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;deploy staging&#39;&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;deploy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pipelineParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;stagingServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pipelineParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;serverPort&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;deploy production&#39;&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;deploy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pipelineParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;productionServer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pipelineParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;serverPort&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;n&quot;&gt;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;failure&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;to:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pipelineParams&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Pipeline failed&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${env.BUILD_URL}&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;Now we can setup the Pipeline of one of our applications with the following method call:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;myDeliveryPipeline&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;branch:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;master&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;scmUrl:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ssh://git@myScmServer.com/repos/myRepo.git&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;nl&quot;&gt;email:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;team@example.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;serverPort:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;8080&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;nl&quot;&gt;developmentServer:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;dev-myproject.mycompany.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;nl&quot;&gt;stagingServer:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;staging-myproject.mycompany.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                   &lt;span class=&quot;nl&quot;&gt;productionServer:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;production-myproject.mycompany.com&#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;The Shared library documentation mentions the ability to encapsulate
similarities between several Pipelines with a global variable. It shows how we
can enhance our template approach and build a higher-level DSL step:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;vars/myDeliveryPipeline.groovy&lt;/div&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&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;c1&quot;&gt;// evaluate the body block, and collect configuration into the object&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pipelineParams&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;body&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;resolveStrategy&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DELEGATE_FIRST&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;delegate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pipelineParams&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&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;c1&quot;&gt;// our complete declarative pipeline can go in here&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;Now we can even use our own DSL-step to set up the integration and deployment Pipeline of our project:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;myDeliveryPipeline&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;branch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;master&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;scmUrl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ssh://git@myScmServer.com/repos/myRepo.git&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;email&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;team@example.com&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;serverPort&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;8080&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;developmentServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;dev-myproject.mycompany.com&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stagingServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;staging-myproject.mycompany.com&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;productionServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;production-myproject.mycompany.com&#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;The blog post showed how a common Pipeline template can be developed using the
Shared Library functionality in Jenkins. The approach allows to create a
standard Pipeline that can be reused by applications that are built in a
similar way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It works for Declarative and Scripted Pipelines as well. For declarative
pipelines the ability to define a Pipeline block in a Shared Library is
official supported since version 1.2 (see the recent blog post on
&lt;a href=&quot;https://www.jenkins.io/blog/2017/09/25/declarative-1/&quot;&gt;Declarative Pipeline 1.2&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/09/29/jenkins-contributor-awards-at-jenkins-world/</id>
<title>Jenkins Contributors Awarded Top Honors at Jenkins World 2017</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-09-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/09/29/jenkins-contributor-awards-at-jenkins-world/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<summary>
This is a guest post by Alyssa Tong, who runs
the Jenkins Area Meetup program and is also responsible for
Marketing &amp; Community Programs at CloudBees, Inc.











For the first time at Jenkins World, the Jenkins project honored the
achievement of three Jenkins contributors in the areas of Most Valuable
Contributor, Jenkins Security MVP, and most Valuable Advocate. These three
individuals has consistently demonstrated excellence and proven value to the
project. With gratitude and congratulations, below are the well deserved
winners:


Alex Earl - Most Valuable Contributor


Alex is the current or previous maintainer of some of the most used Jenkins
plugins and has been for years. He&#8217;s a regular contributor...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, who runs
the &lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;Jenkins Area Meetup&lt;/a&gt; program and is also responsible for
Marketing &amp;amp; Community Programs at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld-awards/award.jpg&quot; alt=&quot;Awards&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the first time at Jenkins World, the Jenkins project honored the
achievement of three Jenkins contributors in the areas of Most Valuable
Contributor, Jenkins Security MVP, and most Valuable Advocate. These three
individuals has consistently demonstrated excellence and proven value to the
project. With gratitude and congratulations, below are the well deserved
winners:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/slide&quot;&gt;Alex Earl&lt;/a&gt; - Most Valuable Contributor&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alex is the current or previous maintainer of some of the most used Jenkins
plugins and has been for years. He’s a regular contributor to project policy
discussions, and helps to keep the project running by improving the Jenkins
project infrastructure, moderating the mailing lists and processing requests
for hosting new plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/stevemarlowe&quot;&gt;Steve Marlowe&lt;/a&gt; - Jenkins Security MVP&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Steve is one of the most prolific reporter of security vulnerabilities in
Jenkins. His reports are well-written, clearly identify the problematic
behavior, and provide references that help quickly resolve the reported issue.
On top of that, Steve is always responsive when asked for clarification.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/ikikko&quot;&gt;Tomonari Nakamura&lt;/a&gt; - Most Valuable Advocate&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld-awards/tomonari.jpg&quot; alt=&quot;Ikikko&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tomonari leads the Jenkins User Group in Tokyo, which is one of the largest and
the most active with a long history. The group has been organizing meet-ups for
more than 10 times now, and every meet-up fills up to 100% very quickly with
regular turn-out of 100-200 people. At one point the group under his leadership
organized a fully volunteer-run &quot;Jenkins User Conference&quot; in Tokyo that
commanded 1000+ attendees.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations to our winners.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can’t wait to recognize more contributors at Jenkins World 2018!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/09/27/sept-jenkins-online-meetup/</id>
<title>Pipeline and Blue Ocean Demos from Jenkins World</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-09-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/09/27/sept-jenkins-online-meetup/" />
<author>
<name>rtyler</name>
</author>
<category term='jam'></category>
<category term='jenkinsonlinemeetup'></category>
<category term='jenkinsworld'></category>
<category term='events'></category>
<summary>
At Jenkins World last month, we continued the tradition of "lunch-time demos"
in the Jenkins project&#8217;s booth which we started in 2016.  We invited a number
of Jenkins contributors to present brief 10-15 minute demos on something they
were working on, or considered themselves experts in. Continuing the
post-Jenkins World tradition, we also just hosted a "Jenkins Online Meetup"
featuring a selection of those lunch-time demos.





I would like to thank Alyssa Tong for organizing this online meetup, Liam Newman for acting as the host, and our speakers:




Oleg Nenashev


Michael Hüttermann


Thorsten Scherler


Stephen Donner


Mark Waite


Keith Zantow




Below are some links from the sample projects demonstrated and the direct...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At Jenkins World last month, we continued the tradition of &quot;lunch-time demos&quot;
in the Jenkins project’s booth which we started in 2016.  We invited a number
of Jenkins contributors to present brief 10-15 minute demos on something they
were working on, or considered themselves experts in. Continuing the
post-Jenkins World tradition, we also just hosted a &quot;Jenkins Online Meetup&quot;
featuring a selection of those lunch-time demos.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;https://www.youtube-nocookie.com/embed/jBGFjFc6Jf8?list=PLN7ajX_VdyaOfwJ-BMZo_JNTIMCMNxlbN&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to thank &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt; for organizing this online meetup, &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt; for acting as the host, and our speakers:&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/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/michaelhuettermann&quot;&gt;Michael Hüttermann&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/scherler&quot;&gt;Thorsten Scherler&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/stephendonner&quot;&gt;Stephen Donner&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kzantow&quot;&gt;Keith Zantow&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;Below are some links from the sample projects demonstrated and the direct links
to each session.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;developing-pipeline-libraries-locally&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#developing-pipeline-libraries-locally&quot; /&gt;Developing Pipeline Libraries Locally&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=jBGFjFc6Jf8&amp;amp;t=10s&quot;&gt;Video link&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have ever tried developing Pipeline Libraries, you may have noticed how
long it takes to deploy a new version to server to discover just another syntax
error. I will show how to edit and test Pipeline libraries locally before
committing to the repository (with Configuration-as-Code and Docker).&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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://speakerdeck.com/onenashev/jenkins-world-2017-developing-pipeline-libraries-locally&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/oleg-nenashev/demo-jenkins-config-as-code&quot;&gt;Source Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://hub.docker.com/r/onenashev/demo-jenkins-config-as-code/&quot;&gt;Demo container&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;delivery-pipelines-with-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#delivery-pipelines-with-jenkins&quot; /&gt;Delivery Pipelines with Jenkins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=jBGFjFc6Jf8&amp;amp;t=1447s&quot;&gt;Video link&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Showing off how to set up holistic Delivery Pipelines with the DevOps enabler tool Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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/michaelhuettermann/sandbox/tree/master/all&quot;&gt;Demo application&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;pimp-my-blue-ocean&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pimp-my-blue-ocean&quot; /&gt;Pimp my Blue Ocean&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=jBGFjFc6Jf8&amp;amp;t=3018s&quot;&gt;Video link&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How to customize Blue Ocean, where I create a custom plugin and extending Blue
Ocean with custom theme and custom components.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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/scherler/jw17boseed&quot;&gt;Presentation and demo code&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;deliver-blue-ocean-components-at-the-speed-of-light&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliver-blue-ocean-components-at-the-speed-of-light&quot; /&gt;Deliver Blue Ocean Components at the Speed of Light&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=jBGFjFc6Jf8&amp;amp;t=3810s&quot;&gt;Video link&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using storybook.js.org for Blue Ocean frontend to speed up the delivery process
- validate with PM and designer the UX. Showing how quickly you develop your
components.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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/scherler/jw17boseed&quot;&gt;Presentation and demo code&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;mozillas-declarative-shared-libraries-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mozillas-declarative-shared-libraries-setup&quot; /&gt;Mozilla’s Declarative + Shared Libraries Setup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=jBGFjFc6Jf8&amp;amp;t=4878s&quot;&gt;Video link&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How Mozilla is using Declarative Pipelines and shared libraries together.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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://docs.google.com/document/d/1sXW6ghoXvoN8_XU_5PTFYRQrXjpCJCq-t1Ajrc3-Oj4/edit&quot;&gt;Google Doc with links&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mozilla/fxtest-jenkins-pipeline&quot;&gt;Shared Library source code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://firefox-test-engineering.readthedocs.io/en/latest/&quot;&gt;Documentation for the shared library&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;See also the &lt;code&gt;#fx-test&lt;/code&gt; IRC channel on &lt;code&gt;irc.mozilla.org&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;git-tips-and-tricks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#git-tips-and-tricks&quot; /&gt;Git Tips and Tricks&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=jBGFjFc6Jf8&amp;amp;t=6425s&quot;&gt;Video link&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Latest capabilities in the git plugin, like large file support, reference
repositories and some reminders of existing tips that can reduce server load,
decrease job time, and decrease disc use.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;visual-pipeline-creation-in-blue-ocean&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#visual-pipeline-creation-in-blue-ocean&quot; /&gt;Visual Pipeline Creation in Blue Ocean&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=jBGFjFc6Jf8&amp;amp;t=7390s&quot;&gt;Video link&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will show how to use Blue Ocean to build a real-world continuous delivery
pipeline using the visual pipeline editor. We will coordinate multiple
components of a web application across test and production environments,
simulating a modern development and deployment workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/09/25/declarative-1/</id>
<title>Parallel stages with Declarative Pipeline 1.2</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-09-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/09/25/declarative-1/" />
<author>
<name>abayer</name>
</author>
<category term='pipeline'></category>
<category term='declarative'></category>
<summary>
After a few months of work on its key features, I&#8217;m happy to announce the
1.2 release of
Declarative Pipeline!
On behalf of the contributors developing Pipeline, I thought it would be
helpful to discuss three of the key changes.





Parallel Stages

First, we&#8217;ve added syntax support for parallel stages. In earlier versions of
Declarative Pipeline, the only way to run chunks of Pipeline code in parallel
was to use the parallel step inside the steps block for a stage, like this:



/* .. snip .. */
stage('run-parallel-branches') {
  steps {
    parallel(
      a: {
       ...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a few months of work on its key features, I’m happy to announce the
1.2 release of
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline&lt;/a&gt;!
On behalf of the contributors developing Pipeline, I thought it would be
helpful to discuss three of the key changes.&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/declarative-1.2/pipeline-parallel-stages.png&quot; alt=&quot;A Pipeline with Parallel stages&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;parallel-stages&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#parallel-stages&quot; /&gt;Parallel Stages&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, we’ve added syntax support for parallel stages. In earlier versions of
Declarative Pipeline, the only way to run chunks of Pipeline code in parallel
was to use the &lt;code&gt;parallel&lt;/code&gt; step inside the &lt;code&gt;steps&lt;/code&gt; block for a stage, like 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;groovy&quot;&gt;&lt;span class=&quot;cm&quot;&gt;/* .. snip .. */&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;run-parallel-branches&#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;parallel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;a:&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;s2&quot;&gt;&quot;This is branch a&quot;&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;},&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;b:&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;s2&quot;&gt;&quot;This is branch b&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;span class=&quot;cm&quot;&gt;/* .. snip .. */&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;While this works, it doesn’t integrate well with the rest of the Declarative
Pipeline syntax. For example, to run each parallel branch on a different agent,
you need to use a &lt;code&gt;node&lt;/code&gt; step, and if you do that, the output of the parallel
branch won’t be available for &lt;code&gt;post&lt;/code&gt; directives (at a &lt;code&gt;stage&lt;/code&gt; or &lt;code&gt;pipeline&lt;/code&gt;
level). Basically the old &lt;code&gt;parallel&lt;/code&gt; step required you to use Scripted Pipeline
within a Declarative Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But now with Declarative Pipeline 1.2, we’ve introduced a true Declarative
syntax for running stages in parallel:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;none&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;Run Tests&#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;parallel&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 On Windows&#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;agent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;windows&quot;&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;bat&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;run-tests.bat&quot;&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;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;**/TEST-*.xml&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;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 On Linux&#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;agent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;linux&quot;&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;run-tests.sh&quot;&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;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;**/TEST-*.xml&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;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;You can now specify either &lt;code&gt;steps&lt;/code&gt; or &lt;code&gt;parallel&lt;/code&gt; for a &lt;code&gt;stage&lt;/code&gt;, and within
&lt;code&gt;parallel&lt;/code&gt;, you can specify a list of &lt;code&gt;stage&lt;/code&gt; directives to run in parallel,
with all the configuration you’re used to for a &lt;code&gt;stage&lt;/code&gt; in Declarative
Pipeline. We think this will be really useful for cross-platform builds and
testing, as an example. Support for parallel stages will be in the
soon-to-be-released Blue Ocean Pipeline Editor 1.3 as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find more documentation on parallel stages in the
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/&quot;&gt;User Handbook&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;defining-declarative-pipelines-in-shared-libraries&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#defining-declarative-pipelines-in-shared-libraries&quot; /&gt;Defining Declarative Pipelines in Shared Libraries&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Until the 1.2 release, Declarative Pipelines did not officially support
defining your &lt;code&gt;pipeline&lt;/code&gt; blocks in a shared library. Some of you may have tried
that out and found that it could work in some cases, but since it was never an
officially supported feature, it was vulnerable to breaking due to necessary
changes for the supported use cases of Declarative. But with 1.2, we’ve added
official support for defining &lt;code&gt;pipeline&lt;/code&gt; blocks in &lt;code&gt;src/&lt;strong&gt;.groovy&lt;/strong&gt; files in your
shared libraries. Within your &lt;code&gt;src/&lt;/code&gt;.groovy&lt;/code&gt; file’s &lt;code&gt;call&lt;/code&gt; method, you can
call &lt;code&gt;pipeline { …​ }&lt;/code&gt;, or possibly different &lt;code&gt;pipeline { …​ }&lt;/code&gt; blocks
depending on &lt;code&gt;if&lt;/code&gt; conditions and the like. Note that only one &lt;code&gt;pipeline { …​ }&lt;/code&gt;
block can actually be executed per run - you’ll get an error if a second one
tries to execute!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;major-improvements-to-parsing-and-environment-variables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#major-improvements-to-parsing-and-environment-variables&quot; /&gt;Major Improvements to Parsing and Environment Variables&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hopefully, you’ll never actually care about this change, but we’re very happy
about it nonetheless. The original approach used for actually taking the
&lt;code&gt;pipeline { …​ }&lt;/code&gt; block and executing its contents was designed almost two
years ago, and wasn’t very well suited to how you all are actually using
Declarative Pipelines. In our attempts to work around some of those limitations,
we made the parsing logic even more complicated and fragile, resulting in an
&lt;a href=&quot;https://issues.jenkins.io/issues/?jql=labels%20%3D%20declarative-variable-and-method-resolution&quot;&gt;impressive
number of bugs&lt;/a&gt;, mainly relating to inconsistencies and bad behavior with
&lt;code&gt;environment&lt;/code&gt; variables.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Declarative 1.2, we’ve replaced the runtime parsing logic completely with a
far more robust system, which also happens to fix most of those bugs at the
same time! While not every issue has been resolved, you may find that you can
use &lt;code&gt;environment&lt;/code&gt; variables in more places, escaping is more consistent,
Windows paths are no longer handled incorrectly, and a lot more. Again, we’re
hoping you’ve never had the misfortune to run into any of these bugs, but if
you have, well, they’re fixed now, and it’s going to be a lot easier for us to
fix any future issues that may arise relating to &lt;code&gt;environment&lt;/code&gt; variables, &lt;code&gt;when&lt;/code&gt;
expressions, and more. Also, the parsing at the very beginning of your build
may be about 0.5 seconds faster. =)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;more-to-come&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-to-come&quot; /&gt;More to Come!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we don’t have any concrete plans for what will be going into Declarative
Pipelines 1.3, rest assured that we’ve got some great new features in mind, as
well as our continuing dedication to fixing the bugs you encounter and report.
So please do keep &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;opening tickets&lt;/a&gt; for
issues and feature requests. Thanks!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/09/08/enumerators-in-pipeline/</id>
<title>Closure on enumerators in Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-09-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/09/08/enumerators-in-pipeline/" />
<author>
<name>rtyler</name>
</author>
<category term='pipeline'></category>
<category term='jenkinsworld'></category>
<summary>
While at Jenkins World, Kohsuke Kawaguchi
presented two long-time Jenkins contributors with a
"Small Matter of Programming"
award: Andrew Bayer and
Jesse Glick. "Small Matter of Programming"
being:




a phrase used to ironically indicate that a suggested feature or design change
would in fact require a great deal of effort; it often implies that the person
proposing the feature underestimates its cost.



&#8212; Wikipedia



In this context the "Small Matter" relates to Jenkins
Pipeline and a very simple snippet of Scripted Pipeline:



[1, 2, 3].each { println it }



For a long time in Scripted Pipeline, this simply did not work as users would
expect it. Originally filed as
JENKINS-26481 in 2015,
it became one of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While at Jenkins World, &lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;
presented two long-time Jenkins contributors with a
&quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Small_matter_of_programming&quot;&gt;Small Matter of Programming&lt;/a&gt;&quot;
award: &lt;a href=&quot;https://github.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt; and
&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;. &quot;Small Matter of Programming&quot;
being:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;a phrase used to ironically indicate that a suggested feature or design change
would in fact require a great deal of effort; it often implies that the person
proposing the feature underestimates its cost.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Wikipedia
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this context the &quot;Small Matter&quot; relates to &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Jenkins
Pipeline&lt;/a&gt; and a very simple snippet of Scripted Pipeline:&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;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&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;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;it&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;For a long time in Scripted Pipeline, this simply did not work as users would
expect it. Originally filed as
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/26481&quot;&gt;JENKINS-26481&lt;/a&gt; in 2015,
it became one of the most voted for, and watched, tickets in the entire issue
tracker until it was ultimately fixed earlier this year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/12508267@N00/36886763192/&quot;&gt;&lt;img src=&quot;https://farm5.staticflickr.com/4421/36886763192_1ae5a04428.jpg&quot; alt=&quot;Photo by Kohsuke&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At least some closures are executed only once inside of Groovy CPS DSL scripts
managed by the workflow plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Original bug description by Daniel Tschan
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At a high level, what has been confusing for many users is that Scripted
Pipeline looks like a Groovy, it quacks like a Groovy, but it’s not &lt;em&gt;exactly&lt;/em&gt;
Groovy. Rather, there’s an custom Groovy interpreter
(&lt;a href=&quot;https://github.com/jenkinsci/workflow-cps-plugin&quot;&gt;CPS&lt;/a&gt;) that executes the
Scripted Pipeline in a manner which provides the durability/resumability that
defines Jenkins Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Without diving into too much detail, refer to the pull requests linked to
JENKINS-26481 for that, the code snippet above was particularly challenging to
rectify inside the Pipeline execution layer. As one of the chief architects for
Jenkins Pipeline, Jesse made a number of changes around the problem in 2016,
but it wasn’t until early 2017 when Andrew, working on Declarative Pipeline,
started to identify a number of areas of improvement in CPS and provided
multiple patches and test cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As luck would have it, combining two of the sharpest minds in the Jenkins
project resulted in the &quot;Small Matter of Programming&quot; being finished, and
released in May of this year with &lt;a href=&quot;https://plugins.jenkins.io/workflow-cps&quot;&gt;Pipeline: Groovy&lt;/a&gt; 2.33.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please join me in congratulating, and thanking, Andrew and Jesse for their
diligent and hard work smashing one of the most despised bugs in Jenkins
history :).&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/29/2017-community-survey/</id>
<title>Take the 2017 Jenkins Survey!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/29/2017-community-survey/" />
<author>
<name>bvdawson</name>
</author>
<category term='jenkins'></category>
<summary>
This is a guest post by Brian
Dawson on behalf of CloudBees, where he works as a DevOps Evangelist
responsible for developing and sharing continuous delivery and DevOps best
practices. He also serves as the CloudBees Product Marketing Manager for
Jenkins.





Once again it’s that time of year when CloudBees sponsors the
Jenkins Community Survey to
assist the community with gathering objective insights into how jenkins is
being used and what users would like to see in the Jenkins project.


Your personal information (name, email address and company) will NOT be used by CloudBees for
sales or marketing.


As an added incentive to take the survey, CloudBees will enter participants
into a...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://twitter.com/brianvdawson&quot;&gt;Brian
Dawson&lt;/a&gt; on behalf of CloudBees, where he works as a DevOps Evangelist
responsible for developing and sharing continuous delivery and DevOps best
practices. He also serves as the CloudBees Product Marketing Manager for
Jenkins.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once again it’s that time of year when CloudBees sponsors the
&lt;a href=&quot;https://www.surveymonkey.com/r/jenkins-2017&quot;&gt;Jenkins Community Survey&lt;/a&gt; to
assist the community with gathering objective insights into how jenkins is
being used and what users would like to see in the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Your personal information (name, email address and company) will NOT be used by CloudBees for
sales or marketing.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As an added incentive to take the survey, &lt;strong&gt;CloudBees will enter participants
into a drawing for a free pass to Jenkins World 2018 (1st prize) and a $100
Amazon Gift Card (2nd prize).&lt;/strong&gt; The survey will close at the end of September, so
click the link at the end of the blog post to get started!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All participants will be able to access reports summarizing survey results. If
you’re curious about what insights your input will provide, see the results of
last year’s 2016 survey:&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/2017/03/24/jenkins-community-survey/&quot;&gt;2016 Community Survey Results&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;Your feedback helps capture a bigger picture of
community trends and needs. There are laws that govern prize giveaways and
eligibility; CloudBees has compiled all those fancy
&lt;a href=&quot;https://www.cloudbees.com/blog/take-2017-jenkins-community-survey&quot;&gt;terms and conditions here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please take the survey and let your voice be heard - it will take less than 10
minutes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.surveymonkey.com/r/jenkins-2017&quot;&gt;&lt;strong&gt;Take me to the survey&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/23/pull-requests-and-more/</id>
<title>Jenkins Needs You - Pull Request Corner at Jenkins World 2017</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/23/pull-requests-and-more/" />
<author>
<name>markewaite</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<summary>
This is a guest post by Mark Waite, who maintains
the git plugin,
the git client plugin,
and is a technical evangelist for CloudBees, Inc.






The Jenkins project booth at Jenkins World 2017
will include the "Pull Requests Corner", recruiting new Jenkins contributors.
We think there are many people who will attend the conference without realizing how easy it is
to help the Jenkins project, and how much the help is appreciated.


Meet us in the "Pull Requests Corner" and we&#8217;ll help you find a way to help Jenkins.
Here are some areas where we can use your help.
Most of them do not require coding, and do not require...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt;, who maintains
the &lt;a href=&quot;https://plugins.jenkins.io/git&quot;&gt;git plugin&lt;/a&gt;,
the &lt;a href=&quot;https://plugins.jenkins.io/git-client&quot;&gt;git client plugin&lt;/a&gt;,
and is a technical evangelist for &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project booth at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2017&lt;/a&gt;
will include the &quot;Pull Requests Corner&quot;, recruiting new Jenkins contributors.
We think there are many people who will attend the conference without realizing how easy it is
to help the Jenkins project, and how much the help is appreciated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Meet us in the &quot;Pull Requests Corner&quot; and we’ll help you find a way to help Jenkins.
Here are some areas where we can use your help.
Most of them do not require coding, and do not require a large time commitment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;one-minute-feedback-on-your-version&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#one-minute-feedback-on-your-version&quot; /&gt;One Minute Feedback on Your Version&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins changelog pages (&lt;a href=&quot;https://www.jenkins.io/changelog-stable/&quot;&gt;LTS&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/changelog/&quot;&gt;weekly&lt;/a&gt;) gather user experiences with specific Jenkins versions.
You can help other Jenkins users by clicking one of the weather icons in the &lt;a href=&quot;https://www.jenkins.io/changelog-stable/&quot;&gt;LTS changelog&lt;/a&gt; (or the &lt;a href=&quot;https://www.jenkins.io/changelog/&quot;&gt;weekly changelog&lt;/a&gt;) for the release you’re using.
Changelog feedback from weekly releases helps the release team select the long term support version.
Changelog feedback from LTS releases helps other users prepare to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It takes less than a minute, and helps the community (which will ultimately help you).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;five-minutes-to-answer-a-question&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#five-minutes-to-answer-a-question&quot; /&gt;Five Minutes to Answer a Question&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/logos/needs-you/Jenkins_Needs_You-02.png&quot; alt=&quot;Jenkins needs YOU&quot; width=&quot;480&quot; /&gt;
In five minutes or less, you can help other Jenkins users.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Answer a question on the #jenkins channel of &lt;a href=&quot;https://webchat.freenode.net/?channels=jenkins&quot;&gt;internet relay chat (IRC)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Answer a question on the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-users&quot;&gt;Jenkins users mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Answer a question on &lt;a href=&quot;https://stackoverflow.com/questions/tagged/jenkins&quot;&gt;stackoverflow jenkins&lt;/a&gt;, &lt;a href=&quot;https://stackoverflow.com/questions/tagged/jenkins-plugins&quot;&gt;jenkins plugins&lt;/a&gt;, or &lt;a href=&quot;https://stackoverflow.com/questions/tagged/jenkins-pipeline&quot;&gt;jenkins pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Answer a question on &lt;a href=&quot;https://www.reddit.com/r/jenkinsci/&quot;&gt;reddit&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;ten-minutes-to-learn-and-share&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ten-minutes-to-learn-and-share&quot; /&gt;Ten Minutes to Learn and Share&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have ten minutes, you can learn something new and share what you learned.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Read a &lt;a href=&quot;https://www.jenkins.io/blog/&quot;&gt;Jenkins community blog post&lt;/a&gt; and tweet it with the hashtag #jenkinsci&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read a &lt;a href=&quot;https://devops.com/?s=Jenkins&quot;&gt;devops.com blog post&lt;/a&gt; and share it on LinkedIn&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read a &lt;a href=&quot;https://www.cloudbees.com/blog&quot;&gt;CloudBees blog post&lt;/a&gt; and test drive an idea from it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find another Jenkins blog and share it (I recently discovered &lt;a href=&quot;https://cicd.life/tutorials/&quot;&gt;Matt Bajor’s ci/cd life blog&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;fifteen-minutes-for-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fifteen-minutes-for-pipeline&quot; /&gt;Fifteen Minutes for Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Liam Newman has created the &quot;&lt;a href=&quot;https://www.youtube.com/watch?v=FhDomw6BaHU&amp;amp;list=PLvBBnHmZuNQJsTCaXs91HRrmso7RNSl-L&quot;&gt;Jenkins Minute&lt;/a&gt;&quot; video series.
They are brief video segments focusing on specific Jenkins functionality.
Choose a video, watch it, and share what you learned on social media.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;twenty-minutes-for-a-bug&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#twenty-minutes-for-a-bug&quot; /&gt;Twenty Minutes for a Bug&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://issues.jenkins.io/secure/Dashboard.jspa&quot;&gt;Jenkins bug tracker&lt;/a&gt; contains thousands of bugs.
Reviewing, duplicating, and clarifying bug reports takes time.
When maintainers are reviewing, duplicating, and clarifying bug reports, they are &lt;strong&gt;not&lt;/strong&gt; fixing bugs, and they are &lt;strong&gt;not&lt;/strong&gt; adding new capabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can help maintainers by reviewing and duplicating a bug report that matters to you.
A comment on a bug report is especially helpful when it confirms you’ve been able to duplicate the bug.
It is even more helpful if your verification includes the steps you took and how they differ from the original report.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A bug report which has been duplicated, and includes &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/How+to+report+an+issue&quot;&gt;clear instructions&lt;/a&gt;, is much more likely to receive maintainer attention.
Help yourself and others by duplicating bugs that matter to you.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;thirty-minutes-for-documentation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thirty-minutes-for-documentation&quot; /&gt;Thirty Minutes for Documentation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins documentation includes
user documentation (&lt;a href=&quot;https://www.jenkins.io/doc/&quot;&gt;guided tour&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/doc/book/&quot;&gt;handbook&lt;/a&gt;) and
developer documentation (&lt;a href=&quot;https://www.jenkins.io/doc/developer/&quot;&gt;tutorial&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/doc/developer/guides/&quot;&gt;how-to guides&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/doc/developer/book/&quot;&gt;reference&lt;/a&gt;).
You can help the documentation by describing something important to you clearly and completely.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io/blob/master/CONTRIBUTING.adoc#adding-documentation&quot;&gt;instructions for documentation contributors&lt;/a&gt; to see how easy it is to help.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;forty-five-minutes-for-translation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#forty-five-minutes-for-translation&quot; /&gt;Forty Five Minutes for Translation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If English is not your native language, you can help with Jenkins localization.
Jenkins is used worldwide, and many users will benefit from translations.
Considering the rapid and continuing evolution of Jenkins, it is no surprise that there is plenty to translate.
Refer to the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Internationalization&quot;&gt;internationalization guide&lt;/a&gt; for instructions to help you contribute translations.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;sixty-minutes-for-a-meetup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sixty-minutes-for-a-meetup&quot; /&gt;Sixty Minutes for a Meetup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Local groups around the world meet often for Jenkins presentations, discussions, and demonstrations.
Organizing a &lt;a href=&quot;https://www.jenkins.io/projects/jam/&quot;&gt;Jenkins Area Meetup&lt;/a&gt; will introduce you to other users, and will let you explore new ways to benefit from Jenkins.
The team at &lt;a href=&quot;mailto:jenkinsci-jam@googlegroups.com&quot;&gt;jenkinsci-jam@googlegroups.com&lt;/a&gt; is ready to support your JAM with stickers, t-shirts, and more.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;week-or-more-adopt-a-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#week-or-more-adopt-a-plugin&quot; /&gt;Week or More - Adopt a Plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins plugin ecosystem covers a wide range of areas.
Jenkins plugin maintainers come from many different backgrounds, with many different interests.
Often, a plugin maintainer may find that they want to do something different on the project, or they may leave the project.
When a plugin maintainer is no longer able to maintain a plugin, they can &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-governance/adopt-a-plugin/&quot;&gt;place it for adoption&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugins placed for adoption range from very specific use cases (node stalker plugin) to very general use cases (Subversion plugin).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Maintaining an orphan plugin is a great way to contribute to the project.
Follow the instructions to &quot;&lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-governance/adopt-a-plugin/&quot;&gt;Adopt a Plugin&lt;/a&gt;&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;see-you-there&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#see-you-there&quot; /&gt;See You There!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All those techniques (and more) are available on the Jenkins &lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;participate page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Look for the &quot;Jenkins Needs You&quot; poster at Jenkins World, and come talk
to us about the ways you can learn new things, address your concerns,
and help Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join the Jenkins project at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; on August 30-31,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&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/2017/08/21/jenkins-world-demos/</id>
<title>Demos at Jenkins World 2017</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/21/jenkins-world-demos/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<summary>
This is a guest post by Alyssa Tong, who runs
the Jenkins Area Meetup program and is also responsible for
Marketing &amp; Community Programs at CloudBees, Inc.






Jenkins World 2017 is a week
away. Like last year, we are bringing back the lunch-time demos in the Jenkins
project&#8217;s booth.
These are quick 15 minute How-to demos by Jenkins
experts.
These demos will not be live streamed, nor recorded, so come early to get the
front row seat, we are expecting a large crowd!


Wednesday, August 30th









Time
Session
Details
Presenter




12:15 - 12:30
Delivery Pipelines with Jenkins
How to set up holistic Delivery Pipelines with the DevOps enabler tool Jenkins.
Michael Hutterman


12:30 - 12:45
Developing Pipeline Libraries Locally
If you...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, who runs
the &lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;Jenkins Area Meetup&lt;/a&gt; program and is also responsible for
Marketing &amp;amp; Community Programs at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2017&lt;/a&gt; is a week
away. Like last year, we are bringing back the lunch-time demos in the Jenkins
project’s booth.
These are quick 15 minute How-to demos by Jenkins
&lt;a href=&quot;https://www.jenkins.io/blog/2017/08/03/jenkinsworld-ask-the-experts/&quot;&gt;experts&lt;/a&gt;.
These demos will &lt;strong&gt;not&lt;/strong&gt; be live streamed, nor recorded, so come early to get the
front row seat, we are expecting a large crowd!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;wednesday-august-30th&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#wednesday-august-30th&quot; /&gt;Wednesday, August 30th&lt;/h3&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time&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;Details&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Presenter&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;12:15 - 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;&lt;strong&gt;Delivery Pipelines with Jenkins&lt;/strong&gt;&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;em&gt;How to set up holistic Delivery Pipelines with the DevOps enabler tool Jenkins.&lt;/em&gt;&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;a href=&quot;https://github.com/michaelhuettermann&quot;&gt;Michael Hutterman&lt;/a&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;12:30 - 12: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;&lt;strong&gt;Developing Pipeline Libraries Locally&lt;/strong&gt;&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;em&gt;If you have ever tried developing Pipeline Libraries, you may have noticed how long it takes to deploy a new version to server to discover just another syntax error. I will show how to edit and test Pipeline libraries locally before committing to the repository (with Configuration-as-Code and Docker).&lt;/em&gt;&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;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&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;12:45 - 13: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;&lt;strong&gt;Securing a Jenkins Instance&lt;/strong&gt;&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;em&gt;A set of minimum steps every Jenkins Admin should follow so his public-facing Jenkins instance doesn’t turn into a Bitcoin mine.&lt;/em&gt;&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;a href=&quot;https://github.com/clguimanMSFT&quot;&gt;Claudiu Guiman&lt;/a&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;13:00 - 13: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;&lt;strong&gt;Git Tips and Tricks&lt;/strong&gt;&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;em&gt;Latest capabilities in the git plugin, like large file support, reference repositories and some reminders of existing tips that can reduce server load, decrease job time, and decrease disc use.&lt;/em&gt;&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;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&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;13:15 - 13: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;&lt;strong&gt;Delivery Pipelines with Jenkins 2&lt;/strong&gt;&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;em&gt;How to promote Java EE and Docker binaries toward production.&lt;/em&gt;&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;a href=&quot;https://github.com/michaelhuettermann&quot;&gt;Michael Hutterman&lt;/a&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;13:30 - 13: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;&lt;strong&gt;Delivery Pipelines, with Jenkins 2, SonarQube, and Artifactory&lt;/strong&gt;&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;em&gt;The nuts and bolts of setting up a scalable, high-end delivery pipeline.&lt;/em&gt;&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;a href=&quot;https://github.com/michaelhuettermann&quot;&gt;Michael Hutterman&lt;/a&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;13:45 - 14: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;&lt;strong&gt;Visual Pipeline Creation in &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;&lt;/strong&gt;&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;em&gt;We will show how to use Blue Ocean to build a real-world continuous delivery pipeline using the visual pipeline editor. We will coordinate multiple components of a web application across test and production environments, simulating a modern development and deployment workflow.&lt;/em&gt;&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;a href=&quot;https://github.com/kzantow&quot;&gt;Keith Zantow&lt;/a&gt;&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;thursday-august-31st&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thursday-august-31st&quot; /&gt;Thursday, August 31st&lt;/h3&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time&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;Details&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Presenter&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;12:30 - 12: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;&lt;strong&gt;Docker Based Build Executor Agents&lt;/strong&gt;&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;em&gt;How using Docker based build agents can simplify your Jenkins management duties.&lt;/em&gt;&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;a href=&quot;https://github.com/ericsmalling&quot;&gt;Eric Smalling&lt;/a&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;12:45 - 13: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;&lt;strong&gt;Pimp my Blue Ocean&lt;/strong&gt;&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;em&gt;How to customize Blue Ocean, where I create a custom plugin and extending Blue Ocean with custom theme and custom components.&lt;/em&gt;&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;a href=&quot;https://github.com/scherler&quot;&gt;Thorsten Scherler&lt;/a&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;13:00 - 13: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;&lt;strong&gt;Deliver Blue Ocean Components at the Speed of Light&lt;/strong&gt;&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;em&gt;Using storybook.js.org for Blue Ocean frontend to speed up the delivery process - validate with PM and designer the UX. Showing how quickly you develop your components.&lt;/em&gt;&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;a href=&quot;https://github.com/scherler&quot;&gt;Thorsten Scherler&lt;/a&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;13:15 - 13: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;&lt;strong&gt;Mozilla’s Declarative + Shared Libraries Setup&lt;/strong&gt;&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;em&gt;How Mozilla is using Declarative Pipelines and shared libraries together.&lt;/em&gt;&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;a href=&quot;https://github.com/stephendonner&quot;&gt;Stephen Donner&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/col&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join the Jenkins project at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; on August 30-31,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/18/declarative-pipelines-at-jenkinsworld/</id>
<title>Declarative Pipeline at Jenkins World</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/18/declarative-pipelines-at-jenkinsworld/" />
<author>
<name>abayer</name>
</author>
<category term='plugins'></category>
<category term='pipeline'></category>
<summary>
This is a guest post by Andrew Bayer, who is
one of the authors of the
Declarative Pipeline plugin,
and is a software engineer on the Pipeline team at
CloudBees, Inc.






A year ago at Jenkins World 2016, we unveiled Declarative Pipeline, a
structured way to define your Pipeline. It&#8217;s been a great year for Declarative
and Pipeline in general, with the release of Declarative Pipeline 1.0 in
February, multiple releases since then, the introduction of
documentation on Pipeline at jenkins.io,
with a focus on Declarative, and more. Given everything that&#8217;s happened over
the last year, we thought it&#8217;d be good to let you all know what you can expect
to see...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt;, who is
one of the authors of the
&lt;a href=&quot;https://plugins.jenkins.io/pipeline-model-definition&quot;&gt;Declarative Pipeline plugin&lt;/a&gt;,
and is a software engineer on the Pipeline team at
&lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A year ago at Jenkins World 2016, we unveiled Declarative Pipeline, a
structured way to define your Pipeline. It’s been a great year for Declarative
and Pipeline in general, with the release of Declarative Pipeline 1.0 in
February, multiple releases since then, the introduction of
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;documentation on Pipeline at jenkins.io&lt;/a&gt;,
with a focus on Declarative, and more. Given everything that’s happened over
the last year, we thought it’d be good to let you all know what you can expect
to see and hear about Declarative Pipeline at this year’s Jenkins World.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, on Thursday, August 31, I’ll be giving a talk on Declarative Pipeline
with &lt;a href=&quot;https://github.com/rsandell&quot;&gt;Robert Sandell&lt;/a&gt;, one of my coworkers
here at CloudBees and another author of Declarative Pipeline. We’ll be
covering what’s happened with Declarative over the last year, new features
added since the 1.0 release, such as the &lt;code&gt;libraries&lt;/code&gt; directive and more &lt;code&gt;when&lt;/code&gt;
conditions, what’s planned for the upcoming 1.2 release (which is planned for
shortly after Jenkins World!), including parallel &lt;code&gt;stage&lt;/code&gt;s, and what’s on the
roadmap for the future. In addition, we’ll be demoing some of the features in
1.2, and providing some pointers on best practices for writing your Declarative
Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also on Thursday, &lt;a href=&quot;https://github.com/stephendonner&quot;&gt;Stephen Donner from Mozilla&lt;/a&gt;
will be giving a demo showing Mozilla’s usage of Declarative Pipeline and
shared libraries at the Community Booth - Mozilla has been doing great work
with Declarative, and I’m excited to see their usage in more detail and hear
Stephen talk about their experience!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition, Robert, Stephen, and myself will all be at Jenkins World both days
of the main sessions, and Robert and myself will also be at the
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/241213280/&quot;&gt;Contributor Summit&lt;/a&gt;
on Tuesday. We’d love to hear your thoughts on Declarative and will be happy to
answer any questions that we can. Looking forward to seeing you all!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Andrew Bayer and Robert Sandell will be talking about the latest on
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/ALOd/declarative-pipelines-in-jenkins&quot;&gt;Declarative Pipeline in Jenkins&lt;/a&gt;
 at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in August,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/17/speaker-blog-blazemeter/</id>
<title>Running load tests in Jenkins Pipeline with Taurus</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/17/speaker-blog-blazemeter/" />
<author>
<name>hinman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<summary>
This is a guest post by Guy Salton, Sr. Professional Services Engineer for
CA BlazeMeter.






Jenkins
Pipeline is an important Jenkins feature for creating and managing a project
in Jenkins. This is opposed to the traditional way of creating a Jenkins
project by using the Jenkins GUI. When running your open-source load test,
Jenkins Pipeline enables resilience, execution control, advanced logic and
Version Control management.  This blog post will explain how to run any
open-source load test with Jenkins Pipeline, through Taurus.


Taurus is an open source test automation framework
that enables running and analyzing tests from 9 open source load and functional
testing tools: JMeter,
Selenium, Gatling, The Grinder, Locust,...
</summary>
<content type='html'>
&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;This is a guest post by Guy Salton, Sr. Professional Services Engineer for
&lt;a href=&quot;https://www.blazemeter.com/ca-technologies&quot;&gt;CA BlazeMeter&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.blazemeter.com/blog/running-jmeter-test-jenkins-pipeline-tutorial&quot;&gt;Jenkins
Pipeline&lt;/a&gt; is an important Jenkins feature for creating and managing a project
in Jenkins. This is opposed to the traditional way of creating a Jenkins
project by using the Jenkins GUI. When running your open-source load test,
Jenkins Pipeline enables resilience, execution control, advanced logic and
Version Control management.  This blog post will explain how to run any
open-source load test with Jenkins Pipeline, through Taurus.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://gettaurus.org/&quot;&gt;Taurus&lt;/a&gt; is an open source test automation framework
that enables running and analyzing tests from 9 open source load and functional
testing tools: &lt;a href=&quot;https://www.blazemeter.com/jmeter-load-testing&quot;&gt;JMeter&lt;/a&gt;,
Selenium, Gatling, The Grinder, Locust, Tsung, Siege, Apache Bench, and PBench.
Test results can be analyzed in Taurus. For advanced analyses or running tests
in the cloud, Taurus integrates with
&lt;a href=&quot;https://info.blazemeter.com/testing-landing-page-url&quot;&gt;BlazeMeter&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Guy will be
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/BYQn/learn-to-release-faster-by-load-testing-with-jenkins-free?iframe=no&quot;&gt;presenting&lt;/a&gt;
more on this topic at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in August,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;getting-started-with-taurus&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started-with-taurus&quot; /&gt;Getting started with Taurus&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;a href=&quot;https://gettaurus.org&quot;&gt;Taurus&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create the following Taurus configuration in YAML. Learn more about YAML in Taurus from
&lt;a href=&quot;https://gettaurus.org/docs/YAMLTutorial/&quot;&gt;this tutorial&lt;/a&gt;.&lt;/p&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;## execution:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;concurrency&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;100&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;hold-for&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;10m&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;ramp-up&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;120s&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;scenario&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Thread Group&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;scenarios&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;Thread Group&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;requests&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;label&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;blazedemo&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GET&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://blazedemo.com/&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 script runs 100 concurrent users, holds the load for 10 minutes, the
ramp-up is 120 seconds and the thread group runs one GET request to
&lt;code&gt;blazedemo.com&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can specify an executor by adding &lt;code&gt;executor: &amp;lt;executor_name&amp;gt;&lt;/code&gt; to the
script. Otherwise, the default executor will be JMeter. In the background,
Taurus will create an artifact directory with a jmx file (or a Scala file if
you run Gatling, a Python file if you are running Selenium, etc.).&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open a terminal and run: &lt;code&gt;bzt &amp;lt;file_name&amp;gt;.yml&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;View the test results:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-1.png&quot; alt=&quot;Viewing test results from Taurus&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to conduct an in-depth analysis of your test results, run your
tests on BlazeMeter. You will be able to monitor KPIs through advanced and
colorful reports, evaluate system health over time, and run your tests from
multiple geo-locations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Run the following command from the 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;bzt &amp;lt;file_name&amp;gt;.yml &lt;span class=&quot;nt&quot;&gt;-report&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-2.png&quot; alt=&quot;Viewing test results in Blazemeter&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;integrate-taurus-with-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#integrate-taurus-with-pipeline&quot; /&gt;Integrate Taurus With Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To run Taurus through &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Pipeline&lt;/a&gt;, you can also go
straight to Jenkins after creating your Taurus script.&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;Open Jenkins → New Item → Fill in an item name → Click on ‘Pipeline’&lt;/p&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/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-3.png&quot; alt=&quot;blazemeter speaker blog 2017 3&quot;&gt;
&lt;/img&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/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-4.png&quot; alt=&quot;blazemeter speaker blog 2017 4&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Now create a Pipeline script. You can include all parts of
your CI/CD process in this script: Commit, Build, Unit Test, Performance Test,
etc., by creating different stages.&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This Pipeline has three stages: The first is called “build”. In this example it
is empty, but you can add commands that will build your code. The second,
called “Performance Tests”, creates a folder called “Taurus-Repo” and runs the
Taurus script that we created. At the same time (note the “parallel” command),
there is a “sleep” command for 60 seconds. Obviously it makes no sense to put
those two commands together, this is just to show you the option of running 2
commands in parallel. The third stage called “Deploy” is also empty in this
example. This is where you could deploy your new version.&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;node&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;Build&#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;c1&quot;&gt;// Run the Taurus build&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;Performance Tests&#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;parallel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;BlazeMeterTest:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Taurus-Repo&#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;bzt &amp;lt;file_name&amp;gt;.yml -report&#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;nl&quot;&gt;Analysis:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;‘&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Deploy&lt;/span&gt;&lt;span class=&quot;err&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;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-5.png&quot; alt=&quot;blazemeter speaker blog 2017 5&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that you can either add the Pipeline inline, or choose the “Pipeline
script from SCM” option and add the URL to the script on GitHub (in this case
you need to upload a &lt;code&gt;Jenkinsfile&lt;/code&gt; to GitHub). With &quot;Pipeline from SCM&quot;,
whenever you need to update the tests, you can just add new commits to the
&lt;code&gt;Jenkinsfile&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Save the Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on ‘Build Now’ to run the Pipeline&lt;/p&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/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-6.png&quot; alt=&quot;blazemeter speaker blog 2017 6&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Click on the new Build that is running now (build #6 in this example).&lt;/p&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/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-7.png&quot; alt=&quot;blazemeter speaker blog 2017 7&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Click on ‘Console Output’ to see the test results:&lt;/p&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/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-8.png&quot; alt=&quot;blazemeter speaker blog 2017 8&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;In the Console Output you can see the test results and also the link to the report in BlazeMeter.&lt;/p&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/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-9.png&quot; alt=&quot;blazemeter speaker blog 2017 9&quot;&gt;
&lt;/img&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/jenkinsworld2017/blazemeter/blazemeter-speaker-blog-2017-10.png&quot; alt=&quot;blazemeter speaker blog 2017 10&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s it! Jenkins Pipeline is now running open-source load testing tools via Taurus.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Come to
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/BYQn/learn-to-release-faster-by-load-testing-with-jenkins-free&quot;&gt;my
free hands-on workshop “Learn to Release Faster by Load Testing With Jenkins”&lt;/a&gt;
at Jenkins World 2017 on Tuesday August 29th from 1-5pm.  You will learn how to
test continuously with Jenkins, JMeter, BlazeMeter and Taurus, including how to
run JMeter with Jenkins, run the BlazeMeter plugin for Jenkins and how to use
open-source Taurus.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To learn more about BlazeMeter,
&lt;a href=&quot;https://info.blazemeter.com/testing-landing-page2&quot;&gt;click here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/11/remoting-update/</id>
<title>Remoting Update. Protocols deprecation, Java 8 requirement and plans</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/11/remoting-update/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='remoting'></category>
<category term='agents'></category>
<category term='upgrade'></category>
<category term='core'></category>
<summary>
Updated on Jan 10, 2019: The deprecated protocols were removed in Remoting 3.40+ and Jenkins 2.214+.
See JENKINS-60381: Remove old for more information and links.





There are upcoming changes in Jenkins "core" which may require extra steps
when upgrading Jenkins.  If you use configuration management for Jenkins
agents, please read this announcement carefully.


If you have ever seen messages like "Channel is already closed" or "Remote call failed" in your build logs,
you have already met Jenkins Remoting.


Remoting is an agent executable and a library implementing the communication layer between Jenkins controllers and their agents (including communication protocols, distributed calls and classloading).
It is also used...
</summary>
<content type='html'>
&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;
Updated on Jan 10, 2019: The deprecated protocols were removed in Remoting 3.40+ and Jenkins 2.214+.
See &lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS-60381&quot;&gt;JENKINS-60381: Remove old&lt;/a&gt; for more information and links.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are upcoming changes in Jenkins &quot;core&quot; which &lt;strong&gt;may&lt;/strong&gt; require extra steps
when upgrading Jenkins.  If you use configuration management for Jenkins
agents, please read this announcement carefully.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have ever seen messages like &quot;Channel is already closed&quot; or &quot;Remote call failed&quot; in your build logs,
you have already met &lt;a href=&quot;https://www.jenkins.io/projects/remoting&quot;&gt;Jenkins Remoting&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remoting is an agent executable and a library implementing the communication layer between Jenkins controllers and their agents (including communication protocols, distributed calls and classloading).
It is also used in several other cases: &lt;a href=&quot;https://plugins.jenkins.io/maven-plugin&quot;&gt;Maven Integration Plugin&lt;/a&gt;, Remoting-based CLI, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to make it clear what’s changing in Jenkins Remoting, I have documented the various components on
&lt;a href=&quot;https://www.jenkins.io/projects/remoting&quot;&gt;the Remoting’s sub-project page&lt;/a&gt;, and will try to publish regular updates about the status of
Remoting to this site and the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;developer mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this post I would like to provide an update on the Remoting roadmap and to announce two major incoming changes: deprecation of old protocols and upgrade to Java 8.
Both changes will take place in one of the next Weekly releases.
ETA is Jenkins 2.75 on Aug 20, 2017.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below are details on the incoming changes and compatibility notes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;old-remoting-protocols-deprecation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#old-remoting-protocols-deprecation&quot; /&gt;Old Remoting Protocols Deprecation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It has been almost one year since the release of JNLP4-connect protocol in Remoting 3.0.
This protocol has been enabled by default since 2.46.x, and so far it demonstrates good stability being compared to JNLP2 and JNLP3 protocols.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the governance meeting
&lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins-meeting/2017/jenkins-meeting.2017-08-02-18.00.html&quot;&gt;we decided&lt;/a&gt; to disable old Remoting protocols (JNLP/JNLP2 + CLI1) in new installations by default.
There are 3 reasons for it:&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;Maintenance of multiple protocols takes a lot of extra effort.
The JNL2 NIO engine is complex and barely diagnosable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are known issues in JNLP2 connection management (see &lt;a href=&quot;https://www.jenkins.io/projects/remoting/&quot;&gt;the protocol’s Errata&lt;/a&gt;). In many cases update to JNLP4 was a resolution&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JNLP1/JNLP2/CLI1 are unencrypted, and it is not something Jenkins users may expect in 2017&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is tracked as &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/45841&quot;&gt;JENKINS-45841&lt;/a&gt; in Jenkins JIRA.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how&quot; /&gt;How?&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When Jenkins is started in the new installation mode with enabled Installation Wizard, old protocols will be disabled&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins shows an administrative warning when obsolete protocols are enabled&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;compatibility-notes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#compatibility-notes&quot; /&gt;Compatibility notes&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Older instances won’t be affected by the disabling of the older JNLP1/JNLP2 protocols, which will still be enabled for them.
Newly created instances which skip, or disable, the Setup Wizard will not be affected either.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;New&quot; Jenkins instances installed via setup wizard &lt;strong&gt;may be affected&lt;/strong&gt; in edge cases. For example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Agents with Remoting older than 3.0 will be unable to connect.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mitigation:&lt;/strong&gt; Before updating make sure Remoting is not bundled custom Docker images, AMIs, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Swarm Plugin: old versions of Swarm Client (before 3.3) will be unable to connect to Jenkins, because Remoting 2.x is bundled&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Update Swarm Client&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Very&lt;/strong&gt; old jenkins-cli.jar without CLI2 support will be unable to connect.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Do not use Remoting-based CLI on new instances (see &lt;a href=&quot;https://www.jenkins.io/blog/2017/04/11/new-cli/&quot;&gt;this blogpost&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;upgrade-to-java-8&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-to-java-8&quot; /&gt;Upgrade to Java 8&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting with version 2.54, Jenkins requires Java 8 to run
(&lt;a href=&quot;https://www.jenkins.io/blog/2017/04/10/jenkins-has-upgraded-to-java-8/&quot;&gt;announcement blog post&lt;/a&gt;).
This version is also required for Jenkins LTS 2.60.1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remoting continued to support Java 7 for a while for backporting purposes,
but it will be also upgraded to Java 8 in the Remoting 3.11 release.
This Rremoting version is expected to be available in Jenkins 2.75 (ETA: Aug 20, 2017).
This change is tracked as &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/43985&quot;&gt;JENKINS-43985&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;compatibility-notes-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#compatibility-notes-2&quot; /&gt;Compatibility notes&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The update does not cause compatibility issues in common use-cases.
However, there may be issues in custom Jenkins core builds and packaging.
There are several examples below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins instances with built-in Remoting versions will &lt;strong&gt;NOT&lt;/strong&gt; be affected, Java 8 is already required there&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Users of community-provided Docker packages (&lt;a href=&quot;https://github.com/jenkinsci/docker-agent&quot;&gt;docker-agent&lt;/a&gt;,
  &lt;a href=&quot;https://github.com/jenkinsci/docker-inbound-agent&quot;&gt;docker-inbound-agent&lt;/a&gt;) will &lt;strong&gt;NOT&lt;/strong&gt; be affected,
Java 8 is already required there&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom&lt;/strong&gt; Jenkins WAR file builds targeting Java 7 may fail to build/run if they bundle Remoting 3.11 or later&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom&lt;/strong&gt; Jenkins agent instances (manually installed hosts, VM snapshots, Docker packages, AMIs, etc.) may fail if they download the latest Remoting version and use Java 7&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;java-9-support&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-9-support&quot; /&gt;Java 9 support&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As with Jenkins core, Java 9 &lt;strong&gt;not supported&lt;/strong&gt; and &lt;strong&gt;not tested&lt;/strong&gt; in Remoting.
It may work in some configurations, but it is not guaranteed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a consequence, it is not recommended to run Remoting with Java 9 right now.
It is also not recommended to use &lt;a href=&quot;https://plugins.jenkins.io/maven-plugin&quot;&gt;Maven Integration Plugin&lt;/a&gt; to run builds on Java 9.&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;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;There are some ongoing activities in the Remoting sub-project:&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;Stability and Diagnosability improvements
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/38833&quot;&gt;JENKINS-38833&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; When it comes to Remoting issues, it is really hard to diagnose them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recently I have published &lt;a href=&quot;https://speakerdeck.com/onenashev/day-of-jenkins-2017-dealing-with-agent-connectivity-issues&quot;&gt;some slides&lt;/a&gt; about preventing and diagnosing issues, but I want the behavior to be more stable by default&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This Epic lists my plans about Remoting issues and papercuts I would like to fix this year&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remoting Work Directories
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/44108&quot;&gt;JENKINS-44108&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For a long time logging was disabled by default in Java Web Start (JNLP) and SSH agents, because Remoting had no option to determine where to store such data before connecting to the controller&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new &lt;a href=&quot;https://github.com/jenkinsci/remoting/blob/master/docs/workDir.md&quot;&gt;Remoting Work Directory&lt;/a&gt; feature (since Remoting 3.8) offers such storage, which is also used for storing JAR caches and for checking workspace writeability before accepting builds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This Epic is about enabling Remoting work directories by default in common Agent launcher types.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remoting Upgradeability
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/44099&quot;&gt;JENKINS-44099&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Right now Remoting is not being upgraded automatically on JNLP agents, it is supported only for Windows service agents starting from Jenkins 2.50&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the Jenkins controller side it is required to upgrade the Jenkins core in order to pick Remoting fixes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This Epic aims simplifying the upgrade procedure for most common cases.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested in contributing to these tasks, or others in the Remoting
sub-project, please feel free to reach out via the issue tracker or
&lt;a href=&quot;https://www.jenkins.io/chat/&quot;&gt;#jenkins IRC channel&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are coming to Jenkins World, you can also find me at the &quot;Ask the Experts&quot; booth there.
See more info about Ask the Experts &lt;a href=&quot;https://www.jenkins.io/blog/2017/08/03/jenkinsworld-ask-the-experts/&quot;&gt;here&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;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/remoting/&quot;&gt;Remoting Sub-Project&lt;/a&gt; on Jenkins website&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/remoting/blob/master/CHANGELOG.md&quot;&gt;Remoting Release Notes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/remoting/blob/master/README.md&quot;&gt;Remoting documentation&lt;/a&gt; on GitHub&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/onenashev/day-of-jenkins-2017-dealing-with-agent-connectivity-issues&quot;&gt;My slides&lt;/a&gt; about Remoting issues troubleshooting&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/10/kubernetes-with-pipeline-acs/</id>
<title>CI/CD with Jenkins Pipeline and Azure</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/10/kubernetes-with-pipeline-acs/" />
<author>
<name>rtyler</name>
</author>
<category term='plugins'></category>
<category term='kubernetes'></category>
<category term='pipeline'></category>
<summary>
This is a guest post by Pui Chee Chen,
Product Manager at Microsoft working on
Azure
DevOps open source integrations.






Recently, we improved the Azure Credential plugin by
adding a custom binding for Azure Credentials which allows you to use an
Azure
service principal (the analog to a service or system account) via  the
Credentials Binding plugin. This means it&#8217;s now trivial to run Azure CLI
commands from a Jenkins Pipeline. We also recently published the first version
of the Azure App Service plugin which makes it very
easy to deploy
Azure Web
Apps directly from Jenkins Pipeline. While we&#8217;ll have
much more to discuss in our Jenkins World presentation on
Azure
DevOps open source...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/puicchan&quot;&gt;Pui Chee Chen&lt;/a&gt;,
Product Manager at Microsoft working on
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/AK4K/azure-devops-open-source-integrations&quot;&gt;Azure
DevOps open source integrations&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently, we improved the &lt;a href=&quot;https://plugins.jenkins.io/azure-credentials&quot;&gt;Azure Credential plugin&lt;/a&gt; by
adding a custom binding for Azure Credentials which allows you to use an
&lt;a href=&quot;https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?toc=%2fazure%2fazure-resource-manager%2ftoc.json&quot;&gt;Azure
service principal&lt;/a&gt; (the analog to a service or system account) via  the
Credentials Binding plugin. This means it’s now trivial to run Azure CLI
commands from a Jenkins Pipeline. We also recently published the first version
of the &lt;a href=&quot;https://plugins.jenkins.io/azure-app-service&quot;&gt;Azure App Service plugin&lt;/a&gt; which makes it &lt;em&gt;very&lt;/em&gt;
easy to deploy
&lt;a href=&quot;https://azure.microsoft.com/en-us/services/app-service/web/&quot;&gt;Azure Web
Apps&lt;/a&gt; directly from Jenkins Pipeline. While we’ll have
much more to discuss in our Jenkins World presentation on
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/AK4K/azure-devops-open-source-integrations&quot;&gt;Azure
DevOps open source integrations&lt;/a&gt;, in this blog post I wanted to share some good
snippets of what is possible today with Jenkins Pipeline and Azure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, a simple example using the Azure CLI to list resources in the
subscription:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: true&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;node {
    &lt;span style=&quot;color:#777&quot;&gt;/* .. snip .. */&lt;/span&gt;
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Deploy&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
        withCredentials([azureServicePrincipal(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;principal-credentials-id&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)]) {
            sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;az account set -s $AZURE_SUBSCRIPTION_ID&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;az resource list&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;azureServicePrincipal()&lt;/code&gt; cannot be used in Declarative Pipeline until
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/46103&quot;&gt;JENKINS-46103&lt;/a&gt; is
resolved.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once a Pipeline can interact with Azure, there are countless ways one could
implement continuous delivery with Jenkins and Azure. From a deploying a simple
webapp with the
&lt;a href=&quot;https://azure.microsoft.com/en-us/blog/annoucing-jenkins-deploy-to-azure-app-service-plugin-and-new-managed-disk-support-for-azure-storage-plugin/&quot;&gt;Azure
App Service plugin&lt;/a&gt; and the &lt;code&gt;azureWebAppPublish&lt;/code&gt; step, or a more advanced
container-based delivery pipeline to deliver new containers to
&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/container-service/kubernetes/container-service-tutorial-kubernetes-deploy-cluster&quot;&gt;Kubernetes
via Azure Container Service&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the &lt;a href=&quot;https://plugins.jenkins.io/docker-workflow&quot;&gt;Docker Pipeline plugin&lt;/a&gt; and a little bit of
extra scripting, a Jenkins Pipeline can also build and publish a Docker
container to an
&lt;a href=&quot;https://azure.microsoft.com/en-us/services/container-registry/&quot;&gt;Azure
Container Registry&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: true&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color:#B44;font-weight:bold&quot;&gt;groovy.json.JsonSlurper&lt;/span&gt;

node {
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;def&lt;/span&gt; container
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;def&lt;/span&gt; acrSettings

    withCredentials([azureServicePrincipal(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;principal-credentials-id&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)]) {
        stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Prepare Environment&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;az account set -s $AZURE_SUBSCRIPTION_ID&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            acrSettings = &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;new&lt;/span&gt; JsonSlurper().parseText(
                                            sh(&lt;span style=&quot;color:#606&quot;&gt;script&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;az acs show -o json -n my-acr&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;returnStdout&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;))
        }

        stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            container = docker.build(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;acrSettings.loginServer&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;/my-app:&lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;env.BUILD_ID&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;)
        }

        stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Publish&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            &lt;span style=&quot;color:#777&quot;&gt;/* https://issue-redirect.jenkins.io/issue/46108 */&lt;/span&gt;
            sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;docker login -u &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;AZURE_CLIENT_ID&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt; -p &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;AZURE_CLIENT_SECRET&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;acrSettings.loginServer&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            container.push()
        }

        stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Deploy&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Orchestrating a new deployment with kubectl is a simple exercise left to the reader ;)&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have been following our
&lt;a href=&quot;https://azure.microsoft.com/en-us/blog/tag/jenkins/&quot;&gt;Azure Blog&lt;/a&gt;, you may
have noticed we have shipped a &lt;strong&gt;lot&lt;/strong&gt; of updates to provide better support for
Azure on Jenkins, and vice versa, such as:&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;Hosted Jenkins&lt;/strong&gt;. New
&lt;a href=&quot;https://azuremarketplace.microsoft.com/en-us/marketplace/apps/azure-oss.jenkins&quot;&gt;Solution
Template&lt;/a&gt; in Azure Marketplace lets you spin up a
Jenkins Controller on Azure in minutes. Not only is it easy and fast, the solution
template gives you option to scale up by selecting the VM disk type and size.
And guess what? You can even select the Jenkins release type you want to use -
LTS, weekly build or Azure verified - all under your control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous integration experience&lt;/strong&gt;. In the latest version of our
&lt;a href=&quot;https://plugins.jenkins.io/azure-vm-agents&quot;&gt;Azure VM Agents plugin&lt;/a&gt;, we improved the user
experience and added the option to let you to select Managed Disk for disk
type (which is currently used extensively on
&lt;a href=&quot;https://ci.jenkins.io&quot;&gt;ci.jenknis.io&lt;/a&gt;. You no longer need to worry about
exceeding the number of VMs on your subscription.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous deployment experience&lt;/strong&gt;. Now, if
Azure CLI is not your cup of tea, we released our first plugin to provide
continuous deployment support to Azure App Service. The plugin supports all
languages Azure App Service supports. We even have a walkthrough
&lt;a href=&quot;https://docs.microsoft.com/en-us/azure/jenkins/deploy-jenkins-app-service-plugin&quot;&gt;here&lt;/a&gt; in the
brand new Jenkins Hub where you can find all Jenkins on Azure resources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pipeline readiness&lt;/strong&gt;. Also, all Azure plugins are and will be pipeline ready.
Have you been leveraging our
&lt;a href=&quot;https://plugins.jenkins.io/windows-azure-storage&quot;&gt;Azure Storage plugin&lt;/a&gt; in your Pipeline?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, what’s next? We have a big surprise in store at Jenkins World! :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are serious about supporting open source and the open source community.
Be sure to catch our talk on
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/AK4K/azure-devops-open-source-integrations&quot;&gt;Azure
DevOps open source integrations&lt;/a&gt;.
See you at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld&quot;&gt;Jenkins World 2017&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join the Azure DevOps team at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in August,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/08/introducing-jenkins-minute/</id>
<title>Introducing the Jenkins Minute video series</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/08/introducing-jenkins-minute/" />
<author>
<name>lnewman</name>
</author>
<category term='blueocean'></category>
<category term='docker'></category>
<category term='jenkins-minute'></category>
<category term='pipeline'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





There are less than three weeks left until
Jenkins World 2017.
Like last year, I&#8217;ll be at the
"Ask the Experts"
booth to answer questions about all things Jenkins.
In preparation, I&#8217;ve started a continuing series of quick tutorial videos that answer
some of the most common questions I&#8217;ve seen asked in the community forums.
These  are by no means exhaustive - they&#8217;re basic answers, which we can build upon.
Each video give a takes a simple example, shows how to create a working solution,
and includes links in the description to related Jenkins documentation pages.


I hope you...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are less than three weeks left until
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2017&lt;/a&gt;.
Like last year, I’ll be at the
&quot;&lt;a href=&quot;https://www.jenkins.io/blog/2017/08/03/jenkinsworld-ask-the-experts/&quot;&gt;Ask the Experts&lt;/a&gt;&quot;
booth to answer questions about all things Jenkins.
In preparation, I’ve started a continuing series of quick tutorial videos that answer
some of the most common questions I’ve seen asked in the community forums.
These  are by no means exhaustive - they’re basic answers, which we can build upon.
Each video give a takes a simple example, shows how to create a working solution,
and includes links in the description to related Jenkins documentation pages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope you find them useful.  Look for more of them coming soon!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Liam will be at the
&quot;&lt;a href=&quot;https://www.jenkins.io/blog/2017/08/03/jenkinsworld-ask-the-experts/&quot;&gt;Ask the Experts&lt;/a&gt;&quot;
booth at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in August.
Register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Creating Your First Pipeline in Blue Ocean&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/FhDomw6BaHU?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Using a Dockerfile with Jenkins Pipeline&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/Pi2kJ2RJS50?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Adding Parameters to Jenkins Pipeline&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/5_tvlaIeQUQ?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Recording Test Results and Archiving Artifacts&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/c9E8kGuAwLU?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/07/security-advisory/</id>
<title>Important security updates for multiple Jenkins plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/07/security-advisory/" />
<author>
<name>daniel-beck</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<summary>
Multiple Jenkins plugins received updates today that fix several security vulnerabilities, including multiple high severity ones.


We strongly recommend updating the following plugins as soon as possible:




Blue Ocean


Pipeline: Groovy Plugin


Script Security Plugin




Less severe security updates have been released for these plugins:




Config File Provider Plugin


Datadog Plugin


Deploy to container Plugin


DRY Plugin


Pipeline: Input Step Plugin


Static Analysis Utilities Plugin




Additionally, the OWASP Dependency-Check Plugin recently also received a security update.


For an overview of what was fixed, see the security advisory.


Subscribe to the jenkinsci-advisories mailing list to receive important future notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Multiple Jenkins plugins received updates today that fix several security vulnerabilities, including multiple &lt;em&gt;high severity&lt;/em&gt; ones.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We strongly recommend updating the following plugins as soon as possible:&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/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/workflow-cps&quot;&gt;Pipeline: Groovy Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/script-security&quot;&gt;Script Security 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;Less severe security updates have been released for these plugins:&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/config-file-provider&quot;&gt;Config File Provider Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/datadog&quot;&gt;Datadog Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/deploy&quot;&gt;Deploy to container Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/dry&quot;&gt;DRY Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/pipeline-input-step&quot;&gt;Pipeline: Input Step Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/analysis-core&quot;&gt;Static Analysis Utilities 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;Additionally, the &lt;a href=&quot;https://plugins.jenkins.io/dependency-check-jenkins-plugin&quot;&gt;OWASP Dependency-Check Plugin&lt;/a&gt; recently also received a security update.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-08-07&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important future notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/07/intro-to-plugin-development/</id>
<title>Plugin Development Tutorials, Videos, and More</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/07/intro-to-plugin-development/" />
<author>
<name>markewaite</name>
</author>
<category term='plugins'></category>
<summary>
This is a guest post by Mark Waite, who maintains
the git plugin,
the git client plugin,
and is a technical evangelist for CloudBees, Inc.






While developing the "Intro to Plugin Development"
workshop for Jenkins World 2017, I was impressed by the many Jenkins plugin development videos, tutorials, and guides.
Here are some of my favorite plugin development topics and links.


Plugin tutorial videos




Jenkins Online Meetup Plugin Development Part 1 - Basics - Steven Christou and Jesse Glick


Jenkins Online Meetup Plugin Development Part 2 - Web UI - Daniel Beck and Tom Fennelly


Writing your third plugin - Justin Ryan


Jenkins Hackathon session at TNG Technology Consulting - Kohsuke...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt;, who maintains
the &lt;a href=&quot;https://plugins.jenkins.io/git&quot;&gt;git plugin&lt;/a&gt;,
the &lt;a href=&quot;https://plugins.jenkins.io/git-client&quot;&gt;git client plugin&lt;/a&gt;,
and is a technical evangelist for &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While developing the &quot;&lt;a href=&quot;https://www.cloudbees.com/intro-plugin-development-workshop&quot;&gt;Intro to Plugin Development&lt;/a&gt;&quot;
workshop for Jenkins World 2017, I was impressed by the many Jenkins plugin development videos, tutorials, and guides.
Here are some of my favorite plugin development topics and links.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;plugin-tutorial-videos&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-tutorial-videos&quot; /&gt;Plugin tutorial videos&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;Jenkins Online Meetup &lt;a href=&quot;https://www.youtube.com/watch?v=azyv183Ua6U&quot;&gt;Plugin Development Part 1 - Basics&lt;/a&gt; - Steven Christou and Jesse Glick&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Online Meetup &lt;a href=&quot;https://www.youtube.com/watch?v=iAJBKFe8mMo&quot;&gt;Plugin Development Part 2 - Web UI&lt;/a&gt; - Daniel Beck and Tom Fennelly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=bmm06tnZuyY&quot;&gt;Writing your third plugin&lt;/a&gt; - Justin Ryan&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PBUkCQ7LW4c&quot;&gt;Jenkins Hackathon session at TNG Technology Consulting&lt;/a&gt; - Kohsuke Kawaguchi&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;plugin-tutorial-pages&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-tutorial-pages&quot; /&gt;Plugin tutorial pages&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;Tutorial on &lt;a href=&quot;https://www.jenkins.io/doc/developer/tutorial/&quot;&gt;jenkins.io&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install a Java Development kit, for example &lt;a href=&quot;https://adoptopenjdk.net/&quot;&gt;AdoptOpenJDK 8 or 11&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the latest &lt;a href=&quot;https://maven.apache.org/download.cgi&quot;&gt;maven release&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install your &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+tutorial#Plugintutorial-SettingupaproductiveenvironmentwithyourIDE&quot;&gt;IDE&lt;/a&gt; (I like Netbeans, has the Jenkins/Stapler plugin to make plugin creation as easy as menu:File[New Project &amp;gt; Maven &amp;gt; Jenkins Plugin])&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;more-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-details&quot; /&gt;More details&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many of the Jenkins plugin development topics have dedicated pages of their own, including user interface, plugin testing, and javadoc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;user-interface&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#user-interface&quot; /&gt;User interface&lt;/h3&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/ui-samples-plugin/&quot;&gt;UI samples plugin&lt;/a&gt; (bars, boxes, buttons, lists, notification, and syntax highlighting)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Understanding+Jelly+Tags&quot;&gt;Understanding Jelly Tags&lt;/a&gt; from the Jenkins wiki&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Form+Validation&quot;&gt;Form Validation&lt;/a&gt; from the Jenkins wiki&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jelly+form+controls&quot;&gt;Jelly Form Controls&lt;/a&gt; from the Jenkins wiki&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://reports.jenkins.io/core-taglib/jelly-taglib-ref.html&quot;&gt;Jelly Tag Library Reference&lt;/a&gt; from jenkins.io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DataBoundConstructor in &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Basic+guide+to+Jelly+usage+in+Jenkins&quot;&gt;Basic Guide to Jelly usage&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DataBoundSetter in &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/58-DEvuJZWI/5QrxBZRFJ6IJ&quot;&gt;google groups&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;testing-a-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-a-plugin&quot; /&gt;Testing a plugin&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Unit+Test&quot;&gt;Unit test&lt;/a&gt; from the Jenkins wiki&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins test objects like &lt;a href=&quot;https://javadoc.jenkins.io/component/jenkins-test-harness/org/jvnet/hudson/test/JenkinsRule.html&quot;&gt;JenkinsRule&lt;/a&gt; and the &lt;a href=&quot;https://javadoc.jenkins.io/component/jenkins-test-harness/org/jvnet/hudson/test/WithoutJenkins.html&quot;&gt;WithoutJenkins annotation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DataBoundConstructor in &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Basic+guide+to+Jelly+usage+in+Jenkins&quot;&gt;Basic Guide to Jelly usage&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DataBoundSetter in &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/58-DEvuJZWI/5QrxBZRFJ6IJ&quot;&gt;google groups&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java unit testing tools like &lt;a href=&quot;https://code.google.com/archive/p/hamcrest/wikis/Tutorial.wiki&quot;&gt;Hamcrest&lt;/a&gt; and &lt;a href=&quot;https://joel-costigliola.github.io/assertj/assertj-core-quick-start.html&quot;&gt;AssertJ&lt;/a&gt; (and &lt;a href=&quot;https://javadoc.jenkins.io/component/jenkins-test-harness/org/jvnet/hudson/test/JenkinsMatchers.html&quot;&gt;JenkinsMatchers&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java unit testing rules like &lt;a href=&quot;https://junit.org/junit4/javadoc/4.12/org/junit/rules/TemporaryFolder.html&quot;&gt;TemporaryFolder&lt;/a&gt;, &lt;a href=&quot;https://junit.org/junit4/javadoc/4.12/org/junit/rules/Timeout.html&quot;&gt;Timeout&lt;/a&gt;, and &lt;a href=&quot;https://junit.org/junit4/javadoc/4.12/org/junit/rules/DisableOnDebug.html&quot;&gt;DisableOnDebug&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java unit testing classes like &lt;a href=&quot;https://junit.org/junit4/javadoc/4.12/org/junit/Assume.html&quot;&gt;Assume&lt;/a&gt; and &lt;a href=&quot;https://junit.org/junit4/javadoc/4.12/org/junit/runners/Parameterized.html&quot;&gt;Parameterized&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java unit testing mock frameworks like &lt;a href=&quot;https://site.mockito.org/&quot;&gt;mockito&lt;/a&gt; and &lt;a href=&quot;https://powermock.github.io/&quot;&gt;powermock&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;javadoc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#javadoc&quot; /&gt;Javadoc&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://javadoc.jenkins.io/&quot;&gt;Jenkins core javadoc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://javadoc.jenkins.io/plugin/&quot;&gt;Jenkins plugins javadoc&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;extension-points&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#extension-points&quot; /&gt;Extension Points&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;List of &lt;a href=&quot;https://www.jenkins.io/doc/developer/extensions/jenkins-core/&quot;&gt;Jenkins core extension points&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/doc/developer/extensions/&quot;&gt;all Jenkins extension points&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;custom-build-steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#custom-build-steps&quot; /&gt;Custom build steps&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Adding a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Create+a+new+Plugin+with+a+custom+build+Step&quot;&gt;custom build step&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;actions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#actions&quot; /&gt;Actions&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins &lt;a href=&quot;https://www.cloudbees.com/blog/jenkins-internal-action-and-its-subtypes&quot;&gt;Action and its subtypes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mark will be presenting
&lt;a href=&quot;https://www.cloudbees.com/intro-plugin-development-workshop&quot;&gt;Intro to Plugin Development&lt;/a&gt;
at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in August.
Register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/08/03/jenkinsworld-ask-the-experts/</id>
<title>Ask the Experts at Jenkins World 2017</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-08-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/08/03/jenkinsworld-ask-the-experts/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<summary>
This is a guest post by Alyssa Tong, who runs
the Jenkins Area Meetup program and is also responsible for
Marketing &amp; Community Programs at CloudBees, Inc.











There are less than four weeks left until Jenkins World 2017. As usual, Jenkins
World would not be complete without the Jenkins projects' "Ask the Experts". If
you are new to Jenkins World, the Jenkins project booth will be located on the
expo floor where contributors to the project hang out, share demos, and
help users via the "Ask the Experts" program. I hope you will be pleasantly
surprised at the amount of 1-on-1 learning to be had in the booth!


We...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, who runs
the &lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;Jenkins Area Meetup&lt;/a&gt; program and is also responsible for
Marketing &amp;amp; Community Programs at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld2017/ask-the-experts.png&quot; alt=&quot;Ask the Experts&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are less than four weeks left until Jenkins World 2017. As usual, Jenkins
World would not be complete without the Jenkins projects&#39; &quot;Ask the Experts&quot;. If
you are new to Jenkins World, the Jenkins project booth will be located on the
expo floor where contributors to the project hang out, share demos, and
help users via the &quot;Ask the Experts&quot; program. I hope you will be pleasantly
surprised at the amount of 1-on-1 learning to be had in the booth!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have a great list of experts who have volunteered to help staff the booth,
including many frequent contributors, JAM organizers, and board members:&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/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt; - Core, security, Jenkins supporting infra and developer supporting infra, project processes and governance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/christ66&quot;&gt;Steven Christou&lt;/a&gt; - Plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt; - Pipeline, Docker,  governance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ndeloof&quot;&gt;Nicolas De Loof&lt;/a&gt; - Docker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/i386&quot;&gt;James Dumay&lt;/a&gt; - Blue Ocean, Pipeline, Jenkins future&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dduportal&quot;&gt;Damien Duportal&lt;/a&gt; - Docker, Infra/Virtualization, Provisioning Systems (ansible,chef, etc.), Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tfennelly&quot;&gt;Tom Fennelly&lt;/a&gt; - Blue Ocean, general frontend stuff, general Jenkins stuff&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; - Core, Pipeline, security, Jenkins dev infra, Mercurial, …&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/huettermann/&quot;&gt;Michael Hutterman&lt;/a&gt; - DevOps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/batmat&quot;&gt;Baptiste Mathus&lt;/a&gt; - Governance, infra, Pipeline, HOSTING&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/michaelneale&quot;&gt;Michael Neale&lt;/a&gt; - Docker, Blue Ocean&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; - Jenkins core, Jenkins administration, remoting&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt; - Pipeline, Jenkins 2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jtnord&quot;&gt;James Nord&lt;/a&gt; - Maven, plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/svanoort&quot;&gt;Sam Van Oort&lt;/a&gt; - Pipeline, performance/scalability, Linux, Docker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/orrc&quot;&gt;Chris Orr&lt;/a&gt; -  Android development, Jenkins dev infra&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/carlossg&quot;&gt;Carlos Sanchez&lt;/a&gt; - Docker, Mesos, Kubernetes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rsandell&quot;&gt;Bobby Sandell&lt;/a&gt; - Gerrit, Declarative Pipeline, core&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/scherler&quot;&gt;Thorsten Scherler&lt;/a&gt; - Blue Ocean, front-end&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ericsmalling&quot;&gt;Eric Smalling&lt;/a&gt; - Docker, config management (Puppet, some Ansible), VMware solutions, running Jenkins at large scale and general enterprise SDLC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/olblak&quot;&gt;Olivier Vernin&lt;/a&gt; - Infra, Docker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt; - Git, Git plugin, Git client plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/omehegan&quot;&gt;Owen Mehegan&lt;/a&gt; - GitLab plugin&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 questions? Stop by anyways to say ‘hello’ and pick up some stickers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are an active member of the Jenkins community and/or a contributor,
consider taking part in the &quot;Ask the Experts&quot; program. It’s a great opportunity
to bond with other contributors and talk with fellow Jenkins users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join the Jenkins project at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in August,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/07/27/standardizing-builds-with-shared-libraries/</id>
<title>Codifying the Build and Release Process with a Pipeline Shared Library</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-07-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/07/27/standardizing-builds-with-shared-libraries/" />
<author>
<name>rtyler</name>
</author>
<category term='event'></category>
<category term='JenkinsWorld'></category>
<summary>
This is a guest post by Alvin Huang, DevOps Engineer at
FireEye.





As a security company, FireEye relentlessly protects our customers from cyber attacks. To act
quickly on intelligence and expertise learned, the feedback loop from the front lines to features
and capabilities in software must be small. Jenkins helps us achieve this by allowing us to build,
test, and deploy to our hardware and software platforms faster, so we can stop the bad guys
before they reach our customers.


More capabilities and functionalities in our product offerings means more applications and
systems, which means more software builds and jobs in Jenkins. Within the FaaS (FireEye as a
Service)...
</summary>
<content type='html'>
&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;
This is a guest post by Alvin Huang, DevOps Engineer at
&lt;a href=&quot;https://www.fireeye.com&quot;&gt;FireEye&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a security company, FireEye relentlessly protects our customers from cyber attacks. To act
quickly on intelligence and expertise learned, the feedback loop from the front lines to features
and capabilities in software must be small. Jenkins helps us achieve this by allowing us to build,
test, and deploy to our hardware and software platforms faster, so we can stop the bad guys
before they reach our customers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More capabilities and functionalities in our product offerings means more applications and
systems, which means more software builds and jobs in Jenkins. Within the FaaS (FireEye as a
Service) organization, the tens of Jenkins jobs that were manageable manually in the web GUI
quickly grew to hundreds of jobs that required more automation. Along the way, we outgrew
our old legacy datacenter and were tasked with migrating 150+ Freestyle jobs on an old 1.x
Jenkins instance to a newer 2.x instance in the new datacenter in 60 days.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Copying Freestyle job XML configuration files to the new server would leave
technical debt.  Using Freestyle job templates would be better but for
complicated jobs that require multiple templates, this would still create large
dependency chains that would be hard to trace in the log output. Finally,
developers were not excited about having to replicate global changes, such as
add an email recipient when a new member joins the team, across tens of jobs
manually or using the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Configuration+Slicing+Plugin&quot;&gt;Configuration
Slicer&lt;/a&gt;. We needed a way to migrate the jobs in a timely fashion while getting
rid of as much technical debt as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Pipeline to the rescue! In 2.0, Jenkins added the capability to create pipelines as first-
class entities. At FireEye, we leveraged many of the features available in pipeline to aid in the
migration process including the ability to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;create Pipeline as Code in a &lt;code&gt;Jenkinsfile&lt;/code&gt; stored in SCM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;create Jenkins projects automatically when new branches or repos get added with a &lt;code&gt;Jenkinsfile&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;continue jobs after the Jenkins controller or build agent crashes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;and most importantly, build a Pipeline
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries&quot;&gt;Shared Library&lt;/a&gt; that keeps projects
&lt;a href=&quot;https://en.wikipedia.org/wiki/Don%27t_repeat_yourself&quot;&gt;DRY&lt;/a&gt; and
allows new applications to be on boarded into Jenkins within seconds&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, Jenkins Pipeline came with a DSL that our users would have to learn to translate their
Freestyle jobs to pipeline jobs. This would be a significant undertaking across multiple teams
just to create Jenkins jobs. Instead, the DevOps team identified similarities across all the
Freestyle jobs that we were migrating, learned the Jenkins DSL to become SMEs for the
organization, and built a shared library of functions and wrappers that saved each Dev/QA
engineer hours of time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below is an example function we created to promote builds in Artifactory:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;vars/promoteBuild.groovy&lt;/div&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_number&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Promote to Production repo&#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;milestone&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;label:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;promote to production&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Promote this build to Production?&#39;&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Artifactory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getArtifactoryServerID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;promote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;buildName&#39;&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;buildNumber&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;targetRepo&#39;&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;sourceRepo&#39;&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;source_repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;copy&#39;&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_repo&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;buildInfo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getBuildInfo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;buildInfo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;buildInfo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;number&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;Rather than learning the Jenkins DSL and looking up how the Artifactory Plugin worked in
Pipeline, users could easily call this function and pass it parameters to do the promotion work
for them. In the Shared Library, we can also create build wrappers of opinionated workflows,
that encompasses multiple functions, based on a set of parameters defined in the Jenkinsfile.
In addition to migrating the jobs, we also had to migrate the build agents. No one knew the
exact list of packages, versions, and build tools installed on each build server, so rebuilding
them would be extremely difficult. Rather than copying the VMs or trying to figure out what
packages were on the build agents, we opted to use Docker to build containers with all
dependencies needed for an application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope you will join me at my Jenkins World session:
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/ALOj/codifying-the-build-and-release-process-with-a-jenkins-pipeline-shared-library&quot;&gt;Codifying the Build and Release Process with a Jenkins
Pipeline Shared Library&lt;/a&gt;, as I deep dive into the inner workings of our Shared
Pipeline Library and explore how we integrated Docker into our CI/CD pipeline.
Come see how we can turn a &lt;code&gt;Jenkinsfile&lt;/code&gt; with just a set of parameters like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;standardBuild&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;machine&lt;/span&gt;          &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;docker&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dev_branch&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;develop&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;release_branch&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;master&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;artifact_apttern&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;*.rpm&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;html_pattern&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;nl&quot;&gt;keepAll:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;reportDir:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;.&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;reportFiles:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;output.html&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;reportName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;OutputReport&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dev_repo&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;pipeline-examples-dev&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;prod_repo&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;pipeline-examples-prod&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pr_script&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make prs&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dev_script&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make dev&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;release_script&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make release&#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;and a &lt;code&gt;Dockerfile&lt;/code&gt; like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Dockerfile&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;FROM faas/el7-python:base

RUN yum install -y python-virtualenv \
        rpm-build &amp;amp;&amp;amp; \
        yum clean all&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Into a full Jenkins Pipeline like this:&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/jenkinsworld2017/fireeye-pipeline.png&quot; alt=&quot;Full Stage View&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we look ahead at FireEye, I will explore how the Shared Library sets us up for easier future
migrations of other tools such as Puppet, JIRA, and Artifactory, and easier integration with new
tools like Openshift. I will also cover our strategies for deployments and plans to move to
Declarative Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alvin will be
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/ALOj/codifying-the-build-and-release-process-with-a-jenkins-pipeline-shared-library&quot;&gt;presenting&lt;/a&gt;
more on this topic at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in August,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/07/26/powershell-pipeline/</id>
<title>Microsoft PowerShell Support for Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-07-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/07/26/powershell-pipeline/" />
<author>
<name>gabloe</name>
</author>
<category term='durable-task'></category>
<category term='powershell'></category>
<summary>
I am pleased to announce Microsoft PowerShell support for Jenkins Pipeline!
As of Durable Task 1.14 and
Pipeline Nodes and Processes Plugin 2.12, you will now be able to run Microsoft PowerShell scripts
directly in your Jenkins Pipeline projects.  This blog post covers the basics
of getting started with Microsoft PowerShell in Pipeline and provides some
basic examples.


Introduction to Microsoft PowerShell


PowerShell is Microsoft&#8217;s open source and cross platform command line shell, as
well as an automation and configuration tool/framework which has a broad user
base. PowerShell can be used to perform common system administration tasks in
Windows, macOS, and Linux environments. It can also be used as...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am pleased to announce Microsoft PowerShell support for Jenkins Pipeline!
As of &lt;a href=&quot;https://plugins.jenkins.io/durable-task&quot;&gt;Durable Task 1.14&lt;/a&gt; and
&lt;a href=&quot;https://plugins.jenkins.io/workflow-durable-task-step&quot;&gt;Pipeline Nodes and Processes Plugin 2.12&lt;/a&gt;, you will now be able to run Microsoft PowerShell scripts
directly in your Jenkins Pipeline projects.  This blog post covers the basics
of getting started with Microsoft PowerShell in Pipeline and provides some
basic examples.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introduction-to-microsoft-powershell&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introduction-to-microsoft-powershell&quot; /&gt;Introduction to Microsoft PowerShell&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;PowerShell is Microsoft’s open source and cross platform command line shell, as
well as an automation and configuration tool/framework which has a broad user
base. PowerShell can be used to perform common system administration tasks in
Windows, macOS, and Linux environments. It can also be used as a general
purpose scripting language. Now that Jenkins Pipeline supports PowerShell, you
can enjoy the rich set of features in PowerShell for your daily DevOps work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before diving into using PowerShell in your Pipeline, I recommend reading the
&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/ms714469(v=vs.85).aspx&quot;&gt;Windows
PowerShell Reference&lt;/a&gt; as well as the
&lt;a href=&quot;https://blogs.msdn.microsoft.com/powershell/&quot;&gt;PowerShell Team Blog&lt;/a&gt; for an
introduction to PowerShell features, utilities, and as a quick look into the
PowerShell language.  Microsoft also has an active
&lt;a href=&quot;https://github.com/powershell/powershell&quot;&gt;PowerShell community&lt;/a&gt; on GitHub,
which I highly recommend visiting to submit feature requests and bug
reports as you see fit. Jenkins Pipeline currently supports Microsoft
PowerShell 3.0 or higher, so also be sure to check which version of PowerShell
is installed on your system in order to take advantage of PowerShell in your
Pipeline.  Please note that we recommend that you upgrade to the latest stable
version of PowerShell available, which as of this writing is version 5.1.14393.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The provided code examples use scripted pipeline syntax. Please consider using &lt;code&gt;script{}&lt;/code&gt; block for declarative pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-powershell-step&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-powershell-step&quot; /&gt;The &lt;code&gt;powershell&lt;/code&gt; step&lt;/h3&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;powershell&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Write-Output &quot;Hello, World!&quot;&#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&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;using-microsoft-powershell-in-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-microsoft-powershell-in-pipeline&quot; /&gt;Using Microsoft PowerShell in Pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Writing PowerShell code as part of your pipeline is incredibly simple. The step that you will use is
simply &lt;code&gt;powershell&lt;/code&gt;, and it includes the same optional parameters as the
Windows Batch (&lt;code&gt;bat&lt;/code&gt;) step, including:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;returnStdout: Returns the standard output stream with a default encoding of UTF-8 (alternative encoding is optional)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;returnStatus: Returns the exit status (integer) of the PowerShell script&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;examples&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#examples&quot; /&gt;Examples&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;capture-exit-status-of-a-powershell-script&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#capture-exit-status-of-a-powershell-script&quot; /&gt;Capture exit status of a PowerShell script&lt;/h4&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;powershell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;returnStatus:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;script:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ipconfig&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&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;c1&quot;&gt;// Success!&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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;capture-and-print-the-output-of-a-powershell-script&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#capture-and-print-the-output-of-a-powershell-script&quot; /&gt;Capture and print the output of a PowerShell script&lt;/h4&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;powershell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;returnStdout:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;script:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Write-Output &quot;PowerShell is mighty!&quot;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;msg&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;sect2&quot;&gt;
&lt;h3 id=&quot;which-streams-get-returned-when-i-use-returnstdout&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#which-streams-get-returned-when-i-use-returnstdout&quot; /&gt;Which streams get returned when I use &lt;code&gt;returnStdout&lt;/code&gt;?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Until the release of PowerShell 5, there were five distinct output streams. PowerShell 5 introduced a sixth stream for pushing &quot;informational&quot; content,
with the added benefit of being able to capture messages sent to Write-Host. Each row of the following table describes a PowerShell stream along with
the corresponding Cmdlet used for writing to the stream for that particular row. Please keep in mind that stream 6 and associated cmdlets either
do not exist or exhibit alternate behavior in versions of PowerShell earlier than version 5.&lt;/p&gt;
&lt;/div&gt;
&lt;table class=&quot;tableblock frame-ends grid-all&quot; style=&quot;width: 40%;&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3334%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Stream&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Description&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Cmdlet&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;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;Output stream (e.g. stdOut)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Write-Output&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;2&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Error stream (e.g. stdErr)&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Write-Error&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;3&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Warning stream&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Write-Warning&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;4&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Verbose stream&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Write-Verbose&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;5&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Debug stream&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Write-Debug&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;6&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Information stream&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;Write-Information (or Write-Host with &lt;a href=&quot;https://blogs.technet.microsoft.com/heyscriptingguy/2015/07/04/weekend-scripter-welcome-to-the-powershell-information-stream/&quot;&gt;caveats&lt;/a&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;If you are using the &lt;code&gt;returnStdout&lt;/code&gt; option of the &lt;code&gt;powershell&lt;/code&gt; Pipeline step
then &lt;strong&gt;only&lt;/strong&gt; stream 1 will be returned, while streams 2-6 will be redirected to
the console output. For example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;write-to-all-available-streams-and-return-the-standard-output&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#write-to-all-available-streams-and-return-the-standard-output&quot; /&gt;Write to all available streams and return the standard output&lt;/h4&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;powershell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;returnStdout:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;script:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
        # Enable streams 3-6
        $WarningPreference = &#39;Continue&#39;
        $VerbosePreference = &#39;Continue&#39;
        $DebugPreference = &#39;Continue&#39;
        $InformationPreference = &#39;Continue&#39;

        Write-Output &#39;Hello, World!&#39;
        Write-Error &#39;Something terrible has happened!&#39;
        Write-Warning &#39;Warning! There is nothing wrong with your television set&#39;
        Write-Verbose &#39;Do not attempt to adjust the picture&#39;
        Write-Debug &#39;We will control the horizontal.  We will control the vertical&#39;
        Write-Information &#39;We can change the focus to a soft blur or sharpen it to crystal clarity.&#39;
    &#39;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;println&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stdout&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;sect4&quot;&gt;
&lt;h5 id=&quot;console-output&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#console-output&quot; /&gt;Console output:&lt;/h5&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;[Pipeline] {
[Pipeline] powershell
[TestStreams] Running PowerShell script
﻿&amp;lt;Jenkins Home&amp;gt;\workspace\TestStreams@tmp\durable-4d924c2d\powershellScript.ps1 : Something terrible has
happened!
At ﻿&amp;lt;Jenkins Home&amp;gt;\workspace\TestStreams@tmp\durable-4d924c2d\powershellMain.ps1:2 char:1
+ &amp;amp; &#39;﻿&amp;lt;Jenkins Home&amp;gt;\workspace\TestStreams@tmp\durable-4d924c ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,powershellScript.ps1

Warning! There is nothing wrong with your television set
Do not attempt to adjust the picture
We will control the horizontal.  We will control the vertical
We can change the focus to a soft blur or sharpen it to crystal clarity.
Hello, World!
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note that &quot;Hello, World!&quot; gets printed last even though it is the first output
statement in my script.  Another interesting aspect of this example is that the
&lt;code&gt;powershell&lt;/code&gt; step failed, which ultimately caused the job to fail. The failure
in this example is due to the PowerShell error stream being non-empty, which
therefore caused the step to result in a non-zero exit status. However, as you
will soon discover, there are a variety of causes for a failing &lt;code&gt;powershell&lt;/code&gt;
step.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/col&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-causes-a-failing-exit-status&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-causes-a-failing-exit-status&quot; /&gt;What causes a failing exit status?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you execute a &lt;code&gt;powershell&lt;/code&gt; step, it may produce a non-zero exit code and
fail your pipeline build.  This is very similar to other shell steps with some
interesting caveats. Your &lt;code&gt;powershell&lt;/code&gt; step may produce a failing exit status
in the following instances:&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;Something in your PowerShell script has thrown an exception&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your PowerShell script explicitly calls &lt;code&gt;exit&lt;/code&gt; with a non-zero exit code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your PowerShell script calls a native application that produces a non-zero &lt;code&gt;$LastExitCode&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;$LastExitCode is an &lt;a href=&quot;https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_automatic_variables&quot;&gt;automatic variable&lt;/a&gt; that is set after executing a native application&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your PowerShell script results in a non-empty error stream (with or without throwing an exception)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overriding the exit status behavior of your &lt;code&gt;powershell&lt;/code&gt; step can be achieved
by explicitly exiting from your script as long as the failure was not caused by
an unhandled exception. For example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;unavoidable-failure-caused-by-an-unhandled-exception&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#unavoidable-failure-caused-by-an-unhandled-exception&quot; /&gt;Unavoidable failure caused by an unhandled exception&lt;/h4&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;powershell&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
        throw &#39;Error! Problem Exists Between Keyboard And Chair&#39;
        exit 0  # Unreachable code
    &#39;&#39;&#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&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;failed-step-caused-by-a-non-empty-error-stream&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#failed-step-caused-by-a-non-empty-error-stream&quot; /&gt;Failed step caused by a non-empty error stream&lt;/h4&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;powershell&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
        Write-Error &#39;Error! Problem Exists Between Keyboard And Chair&#39;
    &#39;&#39;&#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&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;failure-prevented-by-an-explicit-exit&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#failure-prevented-by-an-explicit-exit&quot; /&gt;Failure prevented by an explicit exit&lt;/h4&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;powershell&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
        Write-Error &#39;Error! Problem Exists Between Keyboard And Chair&#39;
        exit 0
    &#39;&#39;&#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&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;scripts-vs-cmdlets&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#scripts-vs-cmdlets&quot; /&gt;Scripts vs. Cmdlets&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A Cmdlet is a small lightweight utility written in either C#, and compiled, or
written in PowerShell directly. Depending on what your goal is in your pipeline
you can make use of Cmdlets directly in your pipeline code, call a self
contained PowerShell script, or some mixture of the two. If your strategy is to
keep each &lt;code&gt;powershell&lt;/code&gt; step as short and succinct as possible then it may make
sense for you to write a library of Cmdlets, but if you have monolithic scripts
then it may make sense for you to call those scripts directly from your
pipeline. The choice is entirely up to you, as both scenarios are supported.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/colgroup&gt;
&lt;/table&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;thanks-for-reading-and-have-fun&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thanks-for-reading-and-have-fun&quot; /&gt;Thanks for reading, and have fun!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I sincerely hope that this post has encouraged you to try using PowerShell in
your Jenkins Pipeline. Please do not hesitate to file an issue against the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Durable+Task+Plugin&quot;&gt;durable-task&lt;/a&gt;
plugin on
&lt;a href=&quot;https://issues.jenkins.io/secure/IssueNavigator.jspa?mode=hide&amp;amp;reset=true&amp;amp;jqlQuery=project+%3D+JENKINS+AND+status+in+%28Open%2C+%22In+Progress%22%2C+Reopened%29+AND+component+%3D+%27durable-task-plugin%27&quot;&gt;JIRA&lt;/a&gt;
if you have discovered any problem that you suspect is related to the
&lt;code&gt;powershell&lt;/code&gt; step.  For general PowerShell related issues or inquiries
please route your questions to the
&lt;a href=&quot;https://github.com/powershell/powershell&quot;&gt;PowerShell community&lt;/a&gt;.&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/2017/07/21/scaling-jenkins-with-kubernetes-on-google-container-engine/</id>
<title>Scaling Jenkins with Kubernetes on Google Container Engine</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-07-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/07/21/scaling-jenkins-with-kubernetes-on-google-container-engine/" />
<author>
<name>glaforge</name>
</author>
<category term='jenkins'></category>
<category term='kubernetes'></category>
<category term='jenkins-community-day-paris'></category>
<summary>
This is a guest post by Guillaume Laforge,
Developer Advocate for Google Cloud





Last week, I had the pleasure to speak at the
Jenkins Community Day conference, in Paris,
organized by my friends from JFrog,
provider of awesome tools for software management and distribution.
I covered how to scale Jenkins with Kubernetes on
Google Container Engine.


For the impatient, here are the slides of the presentation I’ve given:







But let’s step back a little. In this article, I’d like to share with you why you would want to run Jenkins in the cloud,
as well as give you some pointers to interesting resources on the topic.


Why running Jenkins in the...
</summary>
<content type='html'>
&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;
This is a guest post by Guillaume Laforge,
Developer Advocate for &lt;a href=&quot;https://cloud.google.com/&quot;&gt;Google Cloud&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week, I had the pleasure to speak at the
&lt;a href=&quot;https://jcd-paris.jfrog.com/&quot;&gt;Jenkins Community Day conference&lt;/a&gt;, in Paris,
organized by my friends from &lt;a href=&quot;https://www.jfrog.com/&quot;&gt;JFrog&lt;/a&gt;,
provider of awesome tools for software management and distribution.
I covered how to scale Jenkins with &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; on
&lt;a href=&quot;https://cloud.google.com/container-engine/&quot;&gt;Google Container Engine&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the impatient, here are the slides of the presentation I’ve given:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://speakerdeck.com/glaforge/scaling-jenkins-with-kubernetes-on-google-container-engine&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-k8s-gke.png&quot; alt=&quot;Scaling Jenkins with Kubernetes on Google Container Engine&quot; width=&quot;500&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But let’s step back a little. In this article, I’d like to share with you why you would want to run Jenkins in the cloud,
as well as give you some pointers to interesting resources on the topic.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-running-jenkins-in-the-cloud&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-running-jenkins-in-the-cloud&quot; /&gt;Why running Jenkins in the cloud?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So why running Jenkins in the cloud? First of all, imagine your small team, working on a single project.
You have your own little server, running under a desk somewhere, happily building your application on each commit,
a few times a day. So far so good, your build machine running Jenkins isn’t too busy, and stays idle most of the day.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s do some bottom of the napkin calculations. Let’s say you have a team of 3 developers,
committing roughly 4 times a day, on one single project, and the build takes roughly 10 minutes to go.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;3 developers * 4 commits / day / developer * 10 minutes build time * 1 project = 1 hour 20 minutes&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So far so good, your server indeed stays idle most of the day. Usually, at most,
your developers will wait just 10 minutes to see the result of their work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But your team is growing to 10 persons, the team is still as productive, but the project becoming bigger,
the build time goes up to 15 minutes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;10 developers * 4 commits / day / developer * 15 minutes build time * 1 project = 10 hours&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’re already at 10 hours build time, so your server is busy the whole day, and at times,
you might have several build going on at the same time, using several CPU cores in parallel.
And instead of building in 15 minutes, sometimes, the build might take longer, or your build might be queued.
So in theory, it might be 15 minutes, but in practice, it could be half an hour because of the length of the queue
or the longer time to build parallel projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, the company is successful, and has two projects instead of one (think a backend and a mobile app).
Your teams grow further up to 20 developers per project. The developers are a little less productive
because of the size of the codebase and project, so they only commit 3 times a day.
The build takes more time too, at 20 minutes (in ideal time). Let’s do some math again:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;20 developers * 3 commits / day / developer * 20 minutes build time * 2 projects = 40 hours&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whoa, that’s already 40 hours of total build time, if all the builds are run serially.
Fortunately, our server is multi-core, but still, there are certainly already many builds that are enqueued,
and many of them, perhaps up to 2-3 or perhaps even 4 could be run in parallel.
But as we said, the build queue increases further, the real effective time of build is certainly longer than 30 minutes.
Perhaps at times, developers won’t see the result of their developments before at least an hour, if not more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One last calculation? With team sizes of 30 developers, decreased productivity of 2 commits, 25 build time,
and 3 projects? And you’ll get 75 hours total build time. You may start creating a little build farm,
with a controller and several build agents. But you also increase the burden of server management.
Also, if you move towards a full Continuous Delivery or Continuous Deployment approach,
you may further increase your build times to go up to deployment, make more but smaller commits, etc.
You could think of running builds less often, or even on a nightly basis, to cope with the demand, but then,
your company is less agile, and the time-to-market for fixes of new features might increase,
and your developers may also become more frustrated because they are developing in the blind,
not knowing before the next day if their work was successful or not.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With my calculations, you might think that it makes more sense for big companies, with tons of projects and developers.
This is quite true, but when you’re a startup, you also want to avoid taking care of local server management,
provisioning, etc. You want to be agile, and use only compute resources you need for the time you need them.
So even if you’re a small startup, a small team, it might still make sense to take advantage of the cloud.
You pay only for the actual time taken by your builds as the build agent containers are automatically provisioned
and decommissioned. The builds can scale up via Kubernetes, as you need more (or less) CPU time for building everything.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And this is why I was happy to dive into scaling Jenkins in the cloud. For that purpose,
I decided to go with building with containers, with Kubernetes, as my app was also containerized as well.
Google Cloud offers Container Engine, which is basically just Kubernetes in the cloud.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;useful-pointers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#useful-pointers&quot; /&gt;Useful pointers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I based my presentation and demo on some great solutions that are published on the Google Cloud documentation portal.
Let me give you some pointers.&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://cloud.google.com/solutions/jenkins-on-container-engine&quot;&gt;Overview of Jenkins on Container Engine&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/solutions/jenkins-on-container-engine-tutorial&quot;&gt;Setting up Jenkins on Container Engine&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/solutions/configuring-jenkins-container-engine&quot;&gt;Configuring Jenkins for Container Engine&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.google.com/solutions/continuous-delivery-jenkins-container-engine&quot;&gt;Continuous Deployment to Container Engine using Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/GoogleCloudPlatform/continuous-deployment-on-kubernetes&quot;&gt;Lab: Build a Continuous Deployment Pipeline with Jenkins and Kubernetes&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 latter one is the tutorial I actually followed for the demo that I presented during the conference.
It’s a simple Go application, with a frontend and backend.
It’s continuously build, on each commit (well, every minute to check if there’s a new commit),
and deployed automatically in different environments: dev, canary, production.
The sources of the project are stored in Cloud Source Repository (it can be mirrored from Github, for example).
The containers are stored in Cloud Container Registry.
And both the Jenkins controller and agents, as well as the application are running inside Kubernetes clusters in Container Engine.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-and-perspective&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-and-perspective&quot; /&gt;Summary and perspective&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t bother with managing servers! Quickly, you’ll run out of CPU cycles,
and you’ll have happier developers with builds that are super snappy!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And for the record, at Google, dev teams are also running Jenkins!
There was a presentation (&lt;a href=&quot;https://www.youtube.com/watch?v=7ERV9C20GSE&quot;&gt;video&lt;/a&gt; and
&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-jenkins_inside_google.pdf&quot;&gt;slides&lt;/a&gt;
available) given last year by David Hoover at Jenkins World
talking about how developers inside Google are running hundreds of build agents to build projects on various platforms.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/07/17/speaker-blog-care/</id>
<title>Indispensable, Disposable Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-07-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/07/17/speaker-blog-care/" />
<author>
<name>hinman</name>
</author>
<category term='event'></category>
<category term='JenkinsWorld'></category>
<summary>
This is a guest post by Mandy Hubbard, Software Engineer/QA Architect at
Care.com.





Imagine this: It’s 4:30pm on a Friday,
you have a major release on Monday, and your Jenkins server goes down.
It doesn&#8217;t matter if it experienced a hardware failure,
fell victim to a catastrophic
fat-finger error,
or just got hit by a meteor - your Jenkins server is toast.
How long did it take to perfect your Pipeline,
all your Continuous Delivery jobs, plugins, and credentials?
Hopefully you at least have a recent backup of your Jenkins home directory,
but you’re still going have to work over the weekend with IT to procure a new server,
install it, and...
</summary>
<content type='html'>
&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;
This is a guest post by Mandy Hubbard, Software Engineer/QA Architect at
&lt;a href=&quot;https://www.care.com&quot;&gt;Care.com&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Imagine this: It’s 4:30pm on a Friday,
you have a major release on Monday, and your Jenkins server goes down.
It doesn’t matter if it experienced a hardware failure,
fell victim to a catastrophic
&lt;a href=&quot;https://en.wikipedia.org/wiki/Fat-finger_error&quot;&gt;fat-finger error&lt;/a&gt;,
or just got hit by a meteor - your Jenkins server is toast.
How long did it take to perfect your Pipeline,
all your Continuous Delivery jobs, plugins, and credentials?
Hopefully you at least have a recent backup of your Jenkins home directory,
but you’re still going have to work over the weekend with IT to procure a new server,
install it, and do full regression testing to be up and running by Monday morning.
Go ahead and take a moment, go to your car and just scream.
It will help …​ a little.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But what if you could have a Jenkins environment that is completely disposable,
one that could be easily rebuilt at any time?
Using &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; and Joyent’s
&lt;a href=&quot;https://www.joyent.com/containerpilot&quot;&gt;ContainerPilot&lt;/a&gt;, the team at
&lt;a href=&quot;https://www.care.com/homepay&quot;&gt;Care.com HomePay&lt;/a&gt;
has created a production Jenkins environment that is completely software-defined.
Everything required to set up a new Jenkins environment is stored in source control,
versioned, and released just like any other software.
At Jenkins World, I’ll do a developer deep-dive into this approach during my technical session,
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/ALPr/disposable-jenkins&quot;&gt;Indispensable, Disposable Jenkins&lt;/a&gt;,
including a demo of bringing up a fully configured Jenkins server in a Docker container.
For now, let me give you a basic outline of what we’ve done.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mandy will be
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/ALPr/disposable-jenkins&quot;&gt;presenting&lt;/a&gt;
more on this topic at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in August,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, we add ContainerPilot to our Jenkins image by including it in the &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Dockerfile&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;## ContainerPilot

ENV CONTAINERPILOT_VERSION 2.7.0
ENV CONTAINERPILOT_SHA256 3cf91aabd3d3651613942d65359be9af0f6a25a1df9ec9bd9ea94d980724ee13
ENV CONTAINERPILOT file:///etc/containerpilot/containerpilot.json

RUN curl -Lso /tmp/containerpilot.tar.gz https://github.com/joyent/containerpilot/releases/download/${CONTAINERPILOT_VERSION}/containerpilot-${CONTAINERPILOT_VERSION}.tar.gz &amp;amp;&amp;amp; \
    echo &quot;${CONTAINERPILOT_SHA256}  /tmp/containerpilot.tar.gz&quot; | sha256sum -c &amp;amp;&amp;amp; \
    tar zxf /tmp/containerpilot.tar.gz -C /bin &amp;amp;&amp;amp; \
rm /tmp/containerpilot.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then we specify &lt;code&gt;containerpilot&lt;/code&gt; as the Docker command in the &lt;code&gt;docker-compose.yml&lt;/code&gt;
and pass the Jenkins startup script as an argument.
This allows ContainerPilot to perform our preStart business before starting the Jenkins server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;docker-compose.yml&lt;/div&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;jenkins&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;devmandy/auto-jenkins:latest&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;always&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;mem_limit&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;8g&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&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;m&quot;&gt;80&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;22&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;dns&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;s&quot;&gt;8.8.8.8&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;127.0.0.1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;env_file&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;_env&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;volumes&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;s&quot;&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;environment&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;s&quot;&gt;CONSUL=consul&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;links&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;s&quot;&gt;consul:consul&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ports&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;8080:80&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;2222:22&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;containerpilot&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;/usr/local/bin/jenkins.sh&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;Configuration data is read from a Docker Compose &lt;code&gt;_env&lt;/code&gt; file,
as specified in the &lt;code&gt;docker-compose.yml&lt;/code&gt; file,
and stored in environment variables inside the container.
This is an example of our _env file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;_env&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;GITHUB_TOKEN=&amp;lt;my Github user token&amp;gt;
GITHUB_USERNAME=DevMandy
GITHUB_ORGANIZATION=DevMandy
DOCKERHUB_ORGANIZATION=DevMandy
DOCKERHUB_USERNAME=DevMandy
DOCKERHUB_PASSWORD=&amp;lt;my Dockerhub password&amp;gt;
DOCKER_HOST=&amp;lt;my Docker host, or localhost&amp;gt;
SLACK_TEAM_DOMAIN=DevMandy
SLACK_CHANNEL=jenkinsbuilds
SLACK_TOKEN=&amp;lt;my Slack token&amp;gt;
BASIC_AUTH=&amp;lt;my basic auth token&amp;gt;
AD_NAME=&amp;lt;my AD domain&amp;gt;
AD_SERVER=&amp;lt;my AD server&amp;gt;
PRIVATE_KEY=&amp;lt;my ssh private key, munged by a setup script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins stores its credentials and plugin information in various xml files.
The &lt;code&gt;preStart&lt;/code&gt; script modifies the relevant files,
substituting the environment variables as appropriate,
using a set of command line utilities called &lt;code&gt;xmlstarlet&lt;/code&gt;.
Here is an example method from our &lt;code&gt;preStart&lt;/code&gt; script that configures Github 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;bash&quot;&gt;github_credentials_setup&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;## Setting Up Github username in credentials.xml file&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo
    echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Adding Github username to credentials.xml file for SSH key&quot;&lt;/span&gt;
    xmlstarlet &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        ed &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--inplace&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;//com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey[id=&quot;github&quot;]/username&#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GITHUB_USERNAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JENKINS_HOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/credentials.xml

    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Adding Github username to credentials.xml file for Github token&quot;&lt;/span&gt;
    xmlstarlet &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        ed &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
         &lt;span class=&quot;nt&quot;&gt;--inplace&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;//com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl[id=&quot;github_token&quot;]/username&#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GITHUB_USERNAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JENKINS_HOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/credentials.xml

    &lt;span class=&quot;nv&quot;&gt;PASSWORD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Adding Github token to credentials.xml&quot;&lt;/span&gt;
    xmlstarlet &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        ed &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--inplace&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;//com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl[id=&quot;github_token&quot;]/password&#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PASSWORD&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JENKINS_HOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/credentials.xml
&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 approach can be used to automate all things Jenkins.
These are just a few of the things I’ll show you in my Jenkins World session,
which you can build on to automate anything else your Jenkins environment needs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Creation of credentials sets for interacting with third party services
like Github, Docker Hub and Slack&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuration of the &lt;a href=&quot;https://plugins.jenkins.io/active-directory&quot;&gt;Active Directory plugin&lt;/a&gt;
and setup of matrix-based security&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuration of the &lt;a href=&quot;https://plugins.jenkins.io/github-organization-folder&quot;&gt;Github Organization plugin&lt;/a&gt;,
which results in the automatic creation of all Jenkins pipeline jobs
by scanning the organization for all repositories containing a &lt;code&gt;Jenkinsfile&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuration of the
&lt;a href=&quot;https://plugins.jenkins.io/docker-workflow&quot;&gt;Docker Pipeline plugin&lt;/a&gt;, including creating templates for all custom build agents&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuration of the &lt;a href=&quot;https://plugins.jenkins.io/workflow-cps-global-lib&quot;&gt;Global Pipeline Libraries plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configuration of the &lt;a href=&quot;https://plugins.jenkins.io/slack&quot;&gt;Slack Notifier 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;With software-defined Jenkins, pipeline infrastructure
gains the same flexibility and resiliency as the rest of the development pipeline.
If we decide to change our Jenkins configuration in any way –
for example installing a new plugin or upgrading an existing one,
adding a new global library, or adding new Docker images for build agents –
we simply edit our &lt;code&gt;preStart&lt;/code&gt; script to include these changes, build a new Docker image,
and the Jenkins environment is automatically reconfigured when we start a new container.
Because the entire configuration specification lives in a Github repository,
changes are merged to the &quot;master&quot; branch using pull requests,
and our Jenkins Docker image is tagged using
&lt;a href=&quot;https://semver.org/&quot;&gt;semantic versioning&lt;/a&gt; just like any other component.
Jenkins can be both indispensable and completely disposable at the same time.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/07/13/speaker-blog-rosetta-stone/</id>
<title>Automated Software Maintenance</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-07-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/07/13/speaker-blog-rosetta-stone/" />
<author>
<name>hinman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2017'></category>
<summary>
This is a guest post by Kevin Burnett, DevOps Lead at
Rosetta Stone.





Have you experienced that thing where you make a change in an app, and when you
go to check on the results of the build, you find an error that really doesn&#8217;t
seem relevant to your change? And then you notice that your build is the first
in over a year. And then you realize that you have accidentally become the
subject matter expert in this app.


You have no clue what change caused this failure or when that change occurred.
Did one Jenkins agent become a
snowflake server,
accruing cruft on the file system that is...
</summary>
<content type='html'>
&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;
This is a guest post by Kevin Burnett, DevOps Lead at
&lt;a href=&quot;https://rosettastone.com&quot;&gt;Rosetta Stone&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Have you experienced that thing where you make a change in an app, and when you
go to check on the results of the build, you find an error that really doesn’t
seem relevant to your change? And then you notice that your build is the first
in over a year. And then you realize that you have accidentally become the
subject matter expert in this app.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You have no clue what change caused this failure or when that change occurred.
Did one Jenkins agent become a
&lt;a href=&quot;https://martinfowler.com/bliki/SnowflakeServer.html&quot;&gt;snowflake server&lt;/a&gt;,
accruing cruft on the file system that is not cleaned up before each build?
Did some unpinned external dependency upgrade in a backwards-incompatible fashion?
Did the credentials the build plan was using to connect to source control get rotated?
Did a dependent system go offline?
Or - and I realize that this is unthinkable - did you legitimately break a test?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not only is this type of archaeological expedition often a bad time for the
person who happened to commit to this app (&quot;No good deed goes unpunished&quot;), but
it’s also unnecessary. There’s a simple way to reduce the cognitive load it
takes to connect cause and effect: &lt;strong&gt;build more frequently&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One way we achieve this is by writing scripts to maintain our apps. When we
build, the goal is that an equivalent artifact should be produced unless there
was a change to the app in source control. As such, we pin all of our
dependencies to specific versions. But we also don’t want to languish on old
versions of dependencies, whether internal or external. So we also have an
&lt;code&gt;auto-maintain&lt;/code&gt; script that bumps all of these versions and commits the result.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll give an example. We use docker to build and deploy our apps, and each app
depends on a base image that we host in a docker registry. So a &lt;code&gt;Dockerfile&lt;/code&gt; in
one of our apps would have a line like 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&gt;FROM our.registry.example.com/rosettastone/sweet-repo:jenkins-awesome-project-sweet-repo-5&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We build our base images in Jenkins and tag them with the Jenkins &lt;code&gt;$BUILD_TAG&lt;/code&gt;,
so this app is using build 5 of the &lt;code&gt;rosettastone/sweet-repo&lt;/code&gt; base image.
Let’s say we updated our &lt;code&gt;sweet-repo&lt;/code&gt; base image to use ubuntu 16.04 instead of 14.04
and this resulted in build 6 of the base image. Our auto-maintain script takes
care of upgrading an app that uses this base image to the most recent version.
The steps in the auto-maintain script look like this:&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;Figure out what base image tag you’re using.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find the newest version of that base image tag by querying the docker registry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If necessary, update the &lt;code&gt;FROM&lt;/code&gt; line in the app’s &lt;code&gt;Dockerfile&lt;/code&gt; to pull in the most recent version.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We do the same thing with library dependencies.
If our &lt;code&gt;Gemfile.lock&lt;/code&gt; is referencing an old library, running &lt;code&gt;auto-maintain&lt;/code&gt; will update things.
The same applies to the &lt;code&gt;Jenkinsfile&lt;/code&gt; for each app. If we decide to implement a new policy where we
discard old builds, we update &lt;code&gt;auto-maintain&lt;/code&gt; so that it will bring each app into
compliance with the policy, by changing, for example, this &lt;code&gt;Jenkinsfile&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile (Before)&lt;/div&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;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;commit_stage&#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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;./bin/ci&#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;to this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile (After)&lt;/div&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;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;docker&#39;&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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logRotator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;numToKeepStr:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;100&#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;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;commit_stage&#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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;./bin/ci&#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;We try to account for these sorts of things (everything that we can) in our
&lt;code&gt;auto-maintain&lt;/code&gt; script rather than updating apps manually, since this reduces the
friction in keeping apps standardized.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you create an &lt;code&gt;auto-maintain&lt;/code&gt; script (start small), you just have to run it.
We run ours based on both &quot;actions&quot; and &quot;non-actions.&quot; When an internal library
changes, we kick off app builds, so a library’s &lt;code&gt;Jenkinsfile&lt;/code&gt; might look like
this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;commit_stage&#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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;./bin/ci&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;auto_maintain_things_that_might_be_using_me&#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;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;hot-project/auto-maintain-all-apps/master&#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;When &lt;code&gt;auto-maintain&lt;/code&gt; updates something in an app, we have it commit the change
back to the app, which in turn triggers a build of that app, and—​if all is
well—​a production deployment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The only missing link then for avoiding one-year build droughts is to get around
the problem where &lt;code&gt;auto-maintain&lt;/code&gt; isn’t actually updating anything in a certain app.
If no dependencies are changing, or if the technology in question is not
receiving much attention, &lt;code&gt;auto-maintain&lt;/code&gt; might not do anything for an
extended period of time, even if the script is run on a schedule using
&lt;a href=&quot;https://en.wikipedia.org/wiki/Cron&quot;&gt;&lt;code&gt;cron&lt;/code&gt;&lt;/a&gt;. For those cases, putting
a &lt;code&gt;cron&lt;/code&gt; trigger in the Pipeline for each app will ensure that builds still happen periodically:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;docker&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;triggers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cron&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;@weekly&#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;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;commit_stage&#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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;./bin/ci&#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;In most cases, these periodic builds won’t do anything different from the last
build, but when something does break, this strategy will allow you to decide
when you find out about it (by making your cron &lt;code&gt;@weekly&lt;/code&gt;, &lt;code&gt;@daily&lt;/code&gt;, etc)
instead of letting some poor developer find out about it when they do
something silly like commit code to an infrequently-modified app.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kevin will be
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/AK3m/how-we-do-devops-at-rosetta-stone&quot;&gt;presenting&lt;/a&gt;
more on this topic at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in August,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/07/10/security-advisory/</id>
<title>Security updates for multiple Jenkins plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-07-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/07/10/security-advisory/" />
<author>
<name>daniel-beck</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<summary>
Multiple Jenkins plugins received updates today that fix several security vulnerabilities, including high severity ones:




Docker Commons Plugin


Git Plugin


GitHub Branch Source Plugin


Parameterized Trigger Plugin


Periodic Backup Plugin


Pipeline: Build Step Plugin


Pipeline: Groovy Plugin


Poll SCM Plugin


Role-based Authorization Strategy Plugin


Script Security Plugin


Sidebar Link Plugin


Subversion Plugin




Additionally, the SSH Plugin received a security update a few days ago.


For an overview of what was fixed, see the security advisory.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Multiple Jenkins plugins received updates today that fix several security vulnerabilities, including &lt;em&gt;high severity&lt;/em&gt; ones:&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/docker-commons&quot;&gt;Docker Commons Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/git&quot;&gt;Git Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/github-branch-source&quot;&gt;GitHub Branch Source Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/parameterized-trigger&quot;&gt;Parameterized Trigger Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/periodicbackup&quot;&gt;Periodic Backup Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/pipeline-build-step&quot;&gt;Pipeline: Build Step Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/workflow-cps&quot;&gt;Pipeline: Groovy Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/pollscm&quot;&gt;Poll SCM Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/role-strategy&quot;&gt;Role-based Authorization Strategy Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/script-security&quot;&gt;Script Security Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/sidebar-link&quot;&gt;Sidebar Link Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/subversion&quot;&gt;Subversion 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;Additionally, the &lt;a href=&quot;https://plugins.jenkins.io/ssh&quot;&gt;SSH Plugin&lt;/a&gt; received a security update a few days ago.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-07-10&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/07/07/jenkins-conan/</id>
<title>Continuous Integration for C/C++ Projects with Jenkins and Conan</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-07-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/07/07/jenkins-conan/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkins-user-conference'></category>
<category term='jenkins-community-day-paris'></category>
<summary>
This is a guest post by Luis Martínez de Bartolomé,
Conan Co-Founder





C and C&#43;&#43; are present in very important industries today, including Operating Systems, embedded systems, finances, research, automotive, robotics, gaming, and many more. The main reason for this is performance, which is critical to many of these industries, and cannot be compared to any other technology.
As a counterpart, the C/C&#43;&#43; ecosystem has a few important challenges to face:




Huge projects - With millions of lines of code, it’s very hard to manage your projects without using modern tools.


Application Binary Interface (ABI) incompatibility - To guarantee the compatibility of a library with...
</summary>
<content type='html'>
&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;
This is a guest post by Luis Martínez de Bartolomé,
&lt;a href=&quot;https://conan.io&quot;&gt;Conan&lt;/a&gt; Co-Founder
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;C and C++ are present in very important industries today, including Operating Systems, embedded systems, finances, research, automotive, robotics, gaming, and many more. The main reason for this is performance, which is critical to many of these industries, and cannot be compared to any other technology.
As a counterpart, the C/C++ ecosystem has a few important challenges to face:&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;Huge projects&lt;/strong&gt; - With millions of lines of code, it’s very hard to manage your projects without using modern tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Application Binary Interface (ABI) incompatibility&lt;/strong&gt; - To guarantee the compatibility of a library with other libraries and your application,  different configurations (such as the operating system, architecture, and compiler) need to be under control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Slow compilation times&lt;/strong&gt; - Due to header inclusion and pre-processor bloat, together with the challenges mentioned above, it requires special attention to optimize the process and rebuild only the libraries that need to be rebuilt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Code linkage and inlining&lt;/strong&gt; - A static C/C++ library can embed headers from a dependent library. Also, a shared library can embed a static library. In both cases, you need to manage the rebuild of your library when any of its dependencies change.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Varied ecosystem&lt;/strong&gt; - There are many different compilers and build systems, for different platforms, targets and purposes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post will show how to implement DevOps best practices for C/C++ development, using &lt;strong&gt;Jenkins&lt;/strong&gt; CI, &lt;strong&gt;Conan&lt;/strong&gt; C/C++ package manager, and &lt;strong&gt;JFrog Artifactory&lt;/strong&gt; the universal artifact repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conan-the-cc-package-manager&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conan-the-cc-package-manager&quot; /&gt;Conan, The C/C++ Package Manager&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://conan.io&quot;&gt;Conan&lt;/a&gt; was born to mitigate these pains.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Conan uses python recipes, describing how to build a library by explicitly calling any build system, and also describing the needed information for the consumers (include directories, library names etc.).
To manage the different configurations and the ABI compatibility, Conan uses &quot;settings&quot; (os, architecture, compiler…). When a setting is changed, Conan generates a different binary version for the same library:&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/2017-07-07/diagram1.png&quot; alt=&quot;diagram1&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The built binaries can be uploaded to &lt;a href=&quot;https://www.jfrog.com/artifactory/&quot;&gt;JFrog Artifactory&lt;/a&gt; or &lt;a href=&quot;https://www.jfrog.com/bintray/&quot;&gt;Bintray&lt;/a&gt;, to be shared with your team or the whole community. The developers in your team won’t need to rebuild the libraries again, Conan will fetch only the needed Binary packages matching the user’s configuration from the configured remotes (distributed model).
But there are still some more challenges to solve:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How to manage the development and release process of your C/C++ projects?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to distribute your C/C++ libraries?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to test your C/C++ project?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to generate multiple packages for different configurations?
*How to manage the rebuild of the libraries when one of them changes?&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;conan-ecosystem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conan-ecosystem&quot; /&gt;Conan Ecosystem&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Conan ecosystem is growing fast, and DevOps with C/C++ is now a reality:&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;JFrog Artifactory&lt;/strong&gt; manages the full development and releasing cycles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JFrog Bintray&lt;/strong&gt; is the universal distribution hub.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins&lt;/strong&gt; automates the project testing, generates different binary configurations of your Conan packages, and automates the rebuilt libraries.&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/2017-07-07/diagram2.png&quot; alt=&quot;diagram2&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;jenkins-artifactory-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-artifactory-plugin&quot; /&gt;Jenkins Artifactory plugin&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;Provides a Conan DSL, a very generic but powerful way to call Conan from a Jenkins Pipeline script.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Manages the remote configuration with your Artifactory instance, hiding the authentication details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Collects from any Conan operation (installing/uploading packages) all the involved artifacts to generate and publish the buildInfo to Artifactory. The &lt;a href=&quot;https://www.jfrog.com/confluence/display/RTF/Build+Integration#BuildIntegration-Build-levelInformation&quot;&gt;buildInfo&lt;/a&gt; object is very useful, for example, to promote the created Conan packages to a different repository and to have full traceability of the Jenkins build:&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/2017-07-07/JFrogArtifactoryBuildBrowser.png&quot; alt=&quot;JFrogArtifactoryBuildBrowser&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s an example of the Conan DSL with the Artifactory plugin.  First we configure the Artifactory repository, then retrieve the dependencies and finally build it:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;def artifactory_name = &quot;artifactory&quot;
def artifactory_repo = &quot;conan-local&quot;
def repo_url = &#39;https://github.com/memsharded/example-boost-poco.git&#39;
def repo_branch = &#39;master&#39;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;node {
   def server
   def client
   def serverName&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;stage(&quot;Get project&quot;){
    git branch: repo_branch, url: repo_url
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;stage(&quot;Configure Artifactory/Conan&quot;){
    server = Artifactory.server artifactory_name
    client = Artifactory.newConanClient()
    serverName = client.remote.add server: server, repo: artifactory_repo
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;stage(&quot;Get dependencies and publish build info&quot;){
    sh &quot;mkdir -p build&quot;
    dir (&#39;build&#39;) {
      def b = client.run(command: &quot;install ..&quot;)
      server.publishBuildInfo b
    }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    stage(&quot;Build/Test project&quot;){
        dir (&#39;build&#39;) {
          sh &quot;cmake ../ &amp;amp;&amp;amp; cmake --build .&quot;
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can see in the above example that the Conan DSL is very explicit. It helps a lot with common operations, but also allows powerful and custom integrations. This is very important for C/C++ projects, because every company has a very specific project structure, custom integrations etc.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;complex-jenkins-pipeline-operations-managed-and-parallelized-libraries-building&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#complex-jenkins-pipeline-operations-managed-and-parallelized-libraries-building&quot; /&gt;Complex Jenkins Pipeline operations: Managed and parallelized libraries building&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we saw at the beginning of this blog post, it’s crucial to save time when building a C/C++ project. Here are several ways to optimize the process:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Only re-build the libraries that need to be rebuilt. These are the libraries that  have been affected by a dependant library that has changed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build in parallel, if possible. When there is no relation between two or more libraries in the project graph, you can build them in parallel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build different configurations (os, compiler, etc) in parallel. Use different agents if needed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s see an example using Jenkins Pipeline feature&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/2017-07-07/diagram3.png&quot; alt=&quot;diagram3&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The above graph represents our project P and its dependencies (A-G). We want to distribute the project for two different architectures, x86 and x86_64.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;What happens if we change library A?&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If we bump the version to A(v1) there is no problem, we can update the B requirement and also bump its version to B(v1) and so on. The complete flow would be as follows:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Push A(v1) version to Git, Jenkins will build the x86 and x86_64 binaries. Jenkins will upload all the packages to Artifactory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Manually change B to v1, now depending on A1, push to Git, Jenkins will build the B(v1) for x86 and x86_64 using the retrieved new A1 from Artifactory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Repeat the same process for C, D, F, G and finally our project.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But if we are developing our libraries in a development repository, we probably depend on the latest A version or will override A (v0) packages on every git push, and we want to automatically rebuild the affected libraries in this case B, D, F, G and P.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;How we can do this with Jenkins Pipelines?&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First we need to know which libraries need to be rebuilt. The &quot;conan info --build_order&quot; command identifies the libraries that were changed in our project, and also tells us which can be rebuilt in parallel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, we created two Jenkins pipelines tasks:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/lasote/skynet_example/blob/master/single_build.groovy&quot;&gt;&quot;SimpleBuild&quot;&lt;/a&gt; task which builds every single library. Similar to the first example using Conan DSL with the Jenkins Artifactory plugin. It’s a parameterized task that receives the libraries that need to built.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/lasote/skynet_example/blob/master/multi_build.groovy&quot;&gt;&quot;MultiBuild&quot;&lt;/a&gt; task which coordinates and launches the &quot;&lt;strong&gt;SimpleBuild&lt;/strong&gt;&quot; tasks, in parallel when possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also have a repository with a configuration yml. The Jenkins tasks will use it to know where the recipe of each library is, and the different profiles to be used. In this case they are &lt;strong&gt;x86&lt;/strong&gt; and &lt;strong&gt;x86_64&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;leaves:
  PROJECT:
    profiles:
       - ./profiles/osx_64
       - ./profiles/osx_32&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;artifactory:
  name: artifactory
  repo: conan-local&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;repos:
 LIB_A/1.0:
   url: https://github.com/lasote/skynet_example.git
   branch: master
   dir: ./recipes/A&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;LIB_B/1.0:
 url: https://github.com/lasote/skynet_example.git
 branch: master
 dir: ./recipes/b&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;…&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;PROJECT:
 url: https://github.com/lasote/skynet_example.git
 branch: master
 dir: ./recipes/PROJECT&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If we change and push library A to the repository, the &quot;&lt;strong&gt;MultiBuild&lt;/strong&gt;&quot; task will be triggered. It will start by checking which libraries need to be rebuilt, using the &quot;conan info&quot; command.
Conan will return something like this:
&lt;strong&gt;[B, [D, F], G]&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This means that we need to start building B, then we can build D and F in parallel, and finally build G. Note that library C does not need to be rebuilt, because it’s not affected by a change in library A.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &quot;&lt;strong&gt;MultiBuild&lt;/strong&gt;&quot; Jenkins pipeline script will create closures with the parallelized calls to the &quot;&lt;strong&gt;SimpleBuild&lt;/strong&gt;&quot; task, and finally launch the groups in parallel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;//for each group
      tasks = [:]
      // for each dep in group
         tasks[label] = { -&amp;gt; build(job: &quot;SimpleBuild&quot;,
                            parameters: [
                               string(name: &quot;build_label&quot;, value: label),
                               string(name: &quot;channel&quot;, value: a_build[&quot;channel&quot;]),
                               string(name: &quot;name_version&quot;, value: a_build[&quot;name_version&quot;]),
                               string(name: &quot;conf_repo_url&quot;, value: conf_repo_url),
                               string(name: &quot;conf_repo_branch&quot;, value: conf_repo_branch),
                               string(name: &quot;profile&quot;, value: a_build[&quot;profile&quot;])
                            ]
                     )
          }
     parallel(tasks)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Eventually, this is what will happen:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Two &lt;strong&gt;SimpleBuild&lt;/strong&gt; tasks will be  triggered, both for building library B, one for x86 and another for x86_64 architectures&lt;/p&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/2017-07-07/diagram4.png&quot; alt=&quot;diagram4&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Once &quot;A&quot; and &quot;B&quot; are built, &quot;F&quot; and &quot;D&quot; will be triggered, 4 workers will run the &quot;SimpleBuild&quot; task in parallel, (x86, x86_64)&lt;/p&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/2017-07-07/diagram5.png&quot; alt=&quot;diagram5&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Finally &quot;G&quot; will be built. So 2 workers will run in parallel.&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Stage View for the will looks similar to the figures below:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;MultiBuild&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2017-07-07/MultiBuild.png&quot; alt=&quot;MultiBuild&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;SimpleBuild&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2017-07-07/SimpleBuild.png&quot; alt=&quot;SimpleBuild&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can configure the &quot;&lt;strong&gt;SimpleBuild&lt;/strong&gt;&quot; task within different nodes (Windows, OSX, Linux…), and control the number of executors available in our Jenkins configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusions&quot; /&gt;Conclusions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Embracing DevOps for C/C++ is still marked as a to-do for many companies. It requires a big investment of time but can save huge amounts of time in the development and releasing life cycle for the long run. Moreover it increases the quality and the reliability of the C/C++ products. Very soon, adoption of DevOps for C/C++ companies will be a must!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins example shown above that demonstrating how to control the library building in parallel is just Groovy code and a custom convenient yml file. The great thing about it is not the example or the code itself. The great thing is the possibility of defining your own pipeline scripts to adapt to your specific workflows, thanks to Jenkins Pipeline, Conan and JFrog Artifactory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More on this topic will be presented at &lt;a href=&quot;https://jcd-paris.jfrog.com&quot;&gt;Jenkins Community Day Paris&lt;/a&gt; on
July 11, and &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-2017-israel-tlv-intercontinental-david-tickets-32226522396&quot;&gt;Jenkins User Conference Israel&lt;/a&gt; on July 13.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/07/05/continuousdelivery-devops-artifactory/</id>
<title>Delivery pipelines, with Jenkins 2: how to promote Java EE and Docker binaries toward production.</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-07-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/07/05/continuousdelivery-devops-artifactory/" />
<author>
<name>michaelhuettermann</name>
</author>
<category term='devops'></category>
<category term='jenkins'></category>
<category term='artifactory'></category>
<category term='bintray'></category>
<summary>
This is a guest post by Michael Hüttermann. Michael is an expert
in Continuous Delivery, DevOps and SCM/ALM. More information about him at huettermann.net, or
follow him on Twitter: @huettermann.






In a past blog post Delivery Pipelines,
with Jenkins 2, SonarQube, and Artifactory, we talked about pipelines which result in binaries for development versions. Now, in this blog post, I zoom in to different parts of the
holistic pipeline and cover the handling of possible downstream steps once you have the binaries of development versions, in our example a Java EE WAR and a Docker image (which contains the WAR).
We discuss basic concept of staging...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/michaelhuettermann&quot;&gt;Michael Hüttermann&lt;/a&gt;. Michael is an expert
in Continuous Delivery, DevOps and SCM/ALM. More information about him at &lt;a href=&quot;http://huettermann.net&quot;&gt;huettermann.net&lt;/a&gt;, or
follow him on Twitter: &lt;a href=&quot;https://twitter.com/huettermann&quot;&gt;@huettermann&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a past blog post &lt;a href=&quot;https://www.jenkins.io/blog/2017/04/18/continuousdelivery-devops-sonarqube/&quot;&gt;Delivery Pipelines,
with Jenkins 2, SonarQube, and Artifactory&lt;/a&gt;, we talked about pipelines which result in binaries for development versions. Now, in this blog post, I zoom in to different parts of the
holistic pipeline and cover the handling of possible downstream steps once you have the binaries of development versions, in our example a Java EE WAR and a Docker image (which contains the WAR).
We discuss basic concept of staging software, including further information about quality gates, and show example toolchains. This contribution particularly examines the staging from binaries from
dev versions to release candidate versions and from release candidate versions to final releases from the perspective of the automation server Jenkins, integrating with the binary
repository manager JFrog Artifactory and the distribution management platform JFrog Bintray, and ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;staging-software&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#staging-software&quot; /&gt;Staging software&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Staging (also often called promoting) software is the process of completely and consistently transferring a release with all its configuration items
from one environment to another. This is even more true with DevOps, where you want to accelerate the &lt;em&gt;cycle time&lt;/em&gt; (see Michael Hüttermann, &lt;em&gt;DevOps for Developers&lt;/em&gt; (Apress, 2012), 38ff).
For accelerating the cycle time, meaning to bring software to production, fast and in good quality, it is crucial to have fine processes and integrated tools to streamline the
delivery of software. The process of staging releases consists of deploying software to different staging levels, especially different test environments.
Staging also involves configuring the software for various environments without needing to recompile or rebuild the software. Staging is necessary
to transport the software to production systems in high quality. Many Agile projects make great experience with implementing a staging ladder in
order to optimize the cycle time between development software and the point when the end user is able to use the software in production.&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/artifactory-jenkins/01.png&quot; alt=&quot;01&quot; title=&quot;A typical stagging ladder, aka delivery pipeline.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Commonly, the staging ladder is illustrated on its side, with the higher rungs being the boxes further to the right. It’s good practice not to skip any rungs during staging.
The central development environment packages and integrates all respective configuration items and is the base for releasing. Software is staged over different environments by
configuration, without rebuilding. All changes go through the entire staging process, although defined exception routines may be in place,
for details see Michael Hüttermann, &lt;em&gt;Agile ALM&lt;/em&gt; (Manning, 2012).&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;To make concepts clearer, this blog post covers sample tools. Please note, that there are also alternative tools available. As one example: Sonatype Nexus is also able to host the covered binaries and also offers scripting functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We nowadays often talk about &lt;em&gt;delivery pipelines&lt;/em&gt;. A pipeline is just a set of stages and transition rules between those stages. From a DevOps perspective, a pipeline bridges multiple
functions in organizations, above all development and operations. A pipeline is a staging ladder. A change enters the pipeline at the beginning and leaves it at the end. The processing
can be triggered automatically (typical for delivery pipelines) or by a human actor (typical for special steps at overall pipelines, e.g. pulling and thus cherry-picking specific
versions to promote them to be release candidates are final releases).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipelines often look different, because they strongly depend on requirements and basic conditions, and can contain further sub pipelines. In our scenario, we have two sub pipelines to
manage the promotion of continuous dev versions to release candidates and the promotion of release candidates to final release. A change typically waits at a stage for further processing
according to the transition rules, aligned with defined requirements to meet, which are the Quality Gates, explored next.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;quality-gates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quality-gates&quot; /&gt;Quality Gates&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quality gates allow the software to pass through stages only if it meets their defined requirements. The next illustration shows a staging ladder with quality gates injected. You and
other engaged developers commit code to the version control system (please, use VCS as an abbreviation, not SCM, because the latter is much more) in order to update the central test
environment only if the code satisfies the defined quality requirements; for instance, the local build may need to run successfully and have all tests pass locally. Build, test, and
metrics should pass out of the central development environment, and then automated and manual acceptance tests are needed to pass the system test. In our case, the last quality gate
to pass is the one from the  production mirror to production. Here, for example, specific production tests are done or relevant documents must be filled in and signed.&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/artifactory-jenkins/02.png&quot; alt=&quot;02&quot; title=&quot;A pipeline with quality gates injected.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s mandatory to define the quality requirements in advance and to resist customizing them after the fact, when the software has failed. Quality gates are different at lower and
higher stages; the latter normally consist of a more severe or broader set of quality requirements, and they often include the requirements of the lower gates. The binary repository
manager must underpin corresponding quality gates, while managing the binaries, what we cover next.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post illustrates typical concepts and sample toolchains. For more information, please consult the respective documentation, good books or attend top notch conferences, e.g.
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World, powered by CloudBees&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&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;binary-repository-manager&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#binary-repository-manager&quot; /&gt;Binary repository manager&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A central backbone of the staging ladder is the binary repository manager, e.g. JFrog Artifactory. The binary repository manager manages all binaries including the self-produced
ones (producing view) and the 3rd party ones (consuming view), across all artifact types, in our case a Java EE WAR file and a Docker image. Basic idea here is that the repo manager serves
as a proxy, thus all developers access the repo manager, and not remote binary pools directly, e.g. Maven Central. The binary repository manager offers cross-cutting services,
e.g. role-based access control on specific logical repositories, which may correspond to specific stages of the staging ladder.&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/artifactory-jenkins/03.png&quot; alt=&quot;03&quot; title=&quot;JFrog Artifactory serves as a proxy.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Logical repositories can be generic ones (meaning they are agnostic regarding any tools and platforms, thus you can also just upload the menu of your local canteen) or repos
specific to tools and platforms. In our case, we need a repository for managing the Java EE WAR files and for the Docker images. This can be achieved by&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;a generic repository (preferred for higher stages) or a repo which is aligned with the layout of the Maven build tool, and&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a repository for managing Docker images, which serves as a Docker registry.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our scenario, preparing the staging of artifacts includes the following ramp-up activities&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;Creating two sets of logical repositories, inside JFrog Artifactory, where each set has a repo for the WAR file and a repo for the Docker image, and one set is for managing dev
versions and one set is for release candidate versions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Defining and implementing processes to promote the binaries from the one set of repositories (which is for dev versions) to the other set of repositories (which is for RC versions).
Part of the process is defining roles, and JFrog Artifactory helps you to implement role-based access control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setting up procedures or scripts to bring binaries from one set of repositories to the other set of repositories, reproducibly. Adding meta data to binaries is important if the degree of maturity
of the binary cannot be easily derived from the context.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following illustration shows a JFrog Artifactory instance with the involved logical repos in place. In our simplified example, the repo promotions are supposed to go from
&lt;em&gt;docker-local&lt;/em&gt; to &lt;em&gt;docker-prod-local&lt;/em&gt;, and from &lt;em&gt;libs-release-local&lt;/em&gt; to &lt;em&gt;libs-releases-staging-local&lt;/em&gt;. In our use case, we promote the software in version 1.0.0.&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/artifactory-jenkins/04.png&quot; alt=&quot;04&quot; title=&quot;Logical repos, inside JFrog Artifactory.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another type of binary repository manager is JFrog Bintray, which serves as a universal distribution platform for many technologies. JFrog Bintray can be an interesting choice
if you have strong requirements for scalability and worldwide coverage including IP restrictions and handy features around statistics. Most of the concepts and ramp up activities
 are similar compared to JFrog Artifactory, thus I do not want to repeat them here. Bintray is used by lot of projects e.g. by Groovy, to host their deliverables in the public.
 But keep in mind that you can of course also host your release binaries in JFrog Artifactory.
 In this blog post, I’d like to introduce different options, thus we promote our release candidates to JFrog Artifactory and our releases to JFrog Bintray.
 Bintray has the concept of &lt;em&gt;products&lt;/em&gt;, &lt;em&gt;packages&lt;/em&gt; and &lt;em&gt;versions&lt;/em&gt;. A product can have multiple packages and has different versions. In our example, the product has two packages, namely the Java EE WAR and
 the Docker image, and the concrete version that will be processed is 1.0.0.&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;Some tool features covered in this blog post are available as part of commercial offerings of tool vendors. Examples include the Docker support of JFrog Artifactory or the Firehose Event API of JFrog Bintray.
Please consult the respective documentation for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now it is time to have a deeper look at the pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;implementing-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#implementing-pipelines&quot; /&gt;Implementing Pipelines&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our example pipelines are implemented with Jenkins, including its Blue Ocean and declarative pipelines facilities, JFrog Artifactory and JFrog Bintray. To derive your personal
pipelines, please check your individual requirements and basic conditions to come up with the best solution for your target architecture, and consult the respective documentation for
 more information, e.g. about scripting the tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In case your development versions are built with Maven, and have &lt;em&gt;SNAPSHOT&lt;/em&gt; character, you need to either rebuild the software after setting the release version, as part of
your pipeline, or you solely use Maven releases from the very beginning. Many projects make great experience with morphing Maven snapshot versions into
release versions, as part of the pipeline, by using a dedicated Maven plugin, and externalizing it into a Jenkins shared library. This can look like the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;sl.groovy (excerpt): A Jenkins shared library, to include in Jenkins pipelines.&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    #!/usr/bin/groovy
    def call(args) { &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
       echo &quot;Calling shared library, with ${args}.&quot;
       sh &quot;mvn com.huettermann:versionfetcher:1.0.0:release versions:set -DgenerateBackupPoms=false -f ${args}&quot;  &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;We provide a global variable/function to include it in our pipelines.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The library calls a Maven plugin, which dynamically morphs the snapshot version of a Maven project to a release version.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And including it into the pipeline is then also very straight forward:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;pipeline.groovy (excerpt): A stage calling a Jenkins shared library.&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    stage(&#39;Produce RC&#39;) { &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
        releaseVersion &#39;all/pom.xml&#39; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This stage is part of a scripted pipeline and is dedicated to morphing a Maven snapshot version into a release version, dynamically.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;We call the Jenkins shared library, with a parameter pointing to the Maven POM file, which can be a parent POM.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find the code of the underlying Maven plugin &lt;a href=&quot;https://github.com/michaelhuettermann/sandbox/blob/master/versionfetcher/src/main/java/VersionFetcher/VersionFetcher.java&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s now discuss how to proceed for the release candidates.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;release-candidate-rc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#release-candidate-rc&quot; /&gt;Release Candidate (RC)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The pipeline to promote a dev version to a RC version does contain a couple of different stages, including stages to certify the binaries (meaning labeling it or adding context information) and stages to process the concrete promotion.
The following illustration shows the successful run of the promotion, for software version 1.0.0.&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/artifactory-jenkins/05.png&quot; alt=&quot;05&quot; title=&quot;Promotion to RC. Looks like it succeeded.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We utilize Jenkins Blue Ocean that is a new user experience for Jenkins based on a personalizable, modern design that allows users to graphically create, visualize and diagnose
delivery pipelines. Besides the new approach in general, single Blue Ocean features help to boost productivity dramatically, e.g. to provide log information at your fingertips
and the ability to search pipelines. The stages to perform the promote are as follows starting with the  Jenkins pipeline stage for promoting the WAR file. Keep in mind that all
scripts are parameterized, including variables for versions and Artifactory domain names, which are either injected to the pipeline run by user input or set system wide in the Jenkins admin panel,
and the underlying call is using the JFrog command line interface, &lt;em&gt;CLI&lt;/em&gt; in short. JFrog Artifactory
as well as JFrog Bintray can be used and managed by scripts, based on a &lt;a href=&quot;https://en.wikipedia.org/wiki/Representational_state_transfer&quot;&gt;REST API&lt;/a&gt;. The JFrog CLI
is an abstraction on top of the JFrog REST API, and we show sample usages of both.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;pipeline.groovy (excerpt): Staging WAR file to different logical repository&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    stage(&#39;Promote WAR&#39;) { &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
       steps { &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
          sh &#39;jfrog rt cp --url=https://$ARTI3 --apikey=$artifactory_key --flat=true libs-release-local/com/huettermann/web/$version/ &#39; + &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;
             &#39;libs-releases-staging-local/com/huettermann/web/$version/&#39;
       }
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The dedicated stage for running the promotion of the WAR file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here we have the steps which make up the stage, based on Jenkins declarative pipeline syntax.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Copying the WAR file, with JFrog CLI, using variables, e.g. the domain name of the Artifactory installation. Many options available, check the docs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second stage to explore more is the promotion of the Docker image. Here, I want to show you a different way how to achieve the goal, thus in this use case we utilize the JFrog REST API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;pipeline.grovvy (excerpt): Promote Docker image&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    stage(&#39;Promote Docker Image&#39;) {
          sh &#39;&#39;&#39;curl -H &quot;X-JFrog-Art-Api:$artifactory_key&quot; -X POST https://$ARTI3/api/docker/docker-local/v2/promote &#39;&#39;&#39; + &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
             &#39;&#39;&#39;-H &quot;Content-Type:application/json&quot; &#39;&#39;&#39; + &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
             &#39;&#39;&#39;-d \&#39;{&quot;targetRepo&quot; : &quot;docker-prod-local&quot;, &quot;dockerRepository&quot; : &quot;michaelhuettermann/tomcat7&quot;, &quot;tag&quot;: &quot;\&#39;$version\&#39;&quot;, &quot;copy&quot;: true }\&#39; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;
             &#39;&#39;&#39;
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The shell script to perform the staging of Docker image is based on JFrog REST API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Part of parameters are sent in JSON format.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The payload tells the REST API endpoint what to to, i.e. gives information about &lt;em&gt;target repo&lt;/em&gt; and &lt;em&gt;tag&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the binaries are promoted (and hopefully deployed and tested on respective environments before), we can promote them to become final releases, which I like to call GA.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;general-availability-ga&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#general-availability-ga&quot; /&gt;General Availability (GA)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our scenario, JFrog Bintray serves as the distribution platform to manage and provide binaries for further usage. Bintray can also serve as a Docker registry, or can just
provide binaries for scripted or manual download. There are again different ways how to promote binaries, in this case from the RC repos inside JFrog Artifactory to the GA storage in JFrog Bintray, and I summarize one of those possible ways. First, let’s look at the Jenkins pipeline, showed in the next illustration. The processing is on its way, currently, and we again have a list of linked stages.&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/artifactory-jenkins/06.png&quot; alt=&quot;06&quot; title=&quot;Promotion to GA is running …​&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Zooming in now to the key stages, we see that promoting the WAR file is a set of steps that utilize JFrog REST API. We download the binary from JFrog Artifactory, parameterized,
and upload it to JFrog Bintray.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;pipeline.groovy (excerpt): Promote WAR to Bintray&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    stage(&#39;Promote WAR to Bintray&#39;) {
       steps {
          sh &#39;&#39;&#39;
             curl -u michaelhuettermann:${bintray_key} -X DELETE https://api.bintray.com/packages/huettermann/meow/cat/versions/$version &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
             curl -u michaelhuettermann:${bintray_key} -H &quot;Content-Type: application/json&quot; -X POST https://api.bintray.com/packages/huettermann/meow/cat/$version --data &quot;&quot;&quot;{ &quot;name&quot;: &quot;$version&quot;, &quot;desc&quot;: &quot;desc&quot; }&quot;&quot;&quot; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
             curl -T &quot;$WORKSPACE/all-$version-GA.war&quot; -u michaelhuettermann:${bintray_key} -H &quot;X-Bintray-Package:cat&quot; -H &quot;X-Bintray-Version:$version&quot; https://api.bintray.com/content/huettermann/meow/ &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;
             curl -u michaelhuettermann:${bintray_key} -H &quot;Content-Type: application/json&quot; -X POST https://api.bintray.com/content/huettermann/meow/cat/$version/publish --data &#39;{ &quot;discard&quot;: &quot;false&quot; }&#39; &lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;
          &#39;&#39;&#39;
       }
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;For testing and demo purposes, we remove the existing release version.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Next we create the version in Bintray, in our case the created version is &lt;em&gt;1.0.0&lt;/em&gt;. The value was insert by user while triggering the pipeline.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The upload of the WAR file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Bintray needs a dedicated publish step to make the binary publicly available.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Processing the Docker image is as easy as processing the WAR. In this case, we just push the Docker image to the Docker registry, which is served by JFrog Bintray.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;pipeline.groovy (excerpt): Promote Docker image to Bintray&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    stage(&#39;Promote Docker Image to Bintray&#39;) { &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
       steps {
          sh &#39;docker push $BINTRAYREGISTRY/michaelhuettermann/tomcat7:$version&#39; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
       }
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The stage for promoting the Docker image. Please note, depending on your setup, you may add further stages, e.g. to login to your Docker registry.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The Docker push of the specific version. Note, that also here all variables are parameterized.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We now have promoted the binaries and uploaded them to JFrog Bintray. The overview page of our product lists two packages: the WAR file and the Docker image. Both can be downloaded
now and used, the Docker image can be pulled from the JFrog Bintray Docker registry with native Docker commands.&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/artifactory-jenkins/07.png&quot; alt=&quot;07&quot; title=&quot;Distribution management platform JFrog Bintray holds our binaries: a WAR file and a Docker image, in version 1.0.0.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As part of its graphical visualization capabilitites, Bintray is able to show the single layers of the uploaded Docker images.&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/artifactory-jenkins/08.png&quot; alt=&quot;08&quot; title=&quot;Docker layers of our uploaded Docker image, visualized in JFrog Bintray.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Bintray can also display usage statistics, e.g. download details. Now guess where I’m sitting right now while downloading the binary?&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/artifactory-jenkins/09.png&quot; alt=&quot;09&quot; title=&quot;JFrog Bintray displays download statistics of our binaries.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Besides providing own statistics, Bintray provides the JFrog Firehose Event API. This API streams live usage data, which in turn can be integrated or aggregated with your ecosystem.
In our case, we visualize the data, particularly download, upload, and delete statistics, with the ELK stack, as part of a functional monitoring initiative.&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/artifactory-jenkins/10.png&quot; alt=&quot;10&quot; title=&quot;The ELK stack visualizes real-time data delivered from JFrog Bintray, via JFrog Firehose Event API.&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Crisp, isn’t it?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary&quot; /&gt;Summary&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This closes are quick ride through the world of staging binaries, based on Jenkins. We’ve discussed concepts and example DevOps enabler tools, which can help to implement
 the concepts. Along the way, we discussed some more options how to integrate with ecosystem, e.g. releasing Maven snapshots and functional monitoring with dedicated tools.
 After this appetizer you may want to now consider to double-check your staging processes and toolchains, and maybe you find some room for further adjustments.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://huettermann.net/alm/&quot;&gt;&#39;Agile ALM&#39;, Manning, 2011&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://binary-repositories-comparison.github.io/&quot;&gt;Binary Repository Manager Feature Matrix&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://huettermann.net/devops/&quot;&gt;&#39;DevOps for Developers&#39;, Apress, 2012&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.elastic.co&quot;&gt;ELK&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jfrog.com/artifactory/&quot;&gt;JFrog Artifactory&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jfrog.com/bintray/&quot;&gt;JFrog Bintray&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jfrog.com/confluence/display/CLI/JFrog+CLI&quot;&gt;JFrog CLI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API&quot;&gt;JFrog REST API&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sonatype.com/&quot;&gt;Sonatype Nexus&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/07/03/contributor-summit/</id>
<title>Jenkins World Contributor Summit</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-07-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/07/03/contributor-summit/" />
<author>
<name>daniel-beck</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2017'></category>
<summary>
As in previous years, there&#8217;ll be a contributor summit at Jenkins World 2017:




Let&#8217;s talk about the future of Jenkins and how you can help shape it! The contributor summit is the place where the current and future contributors of the Jenkins project get together. This year, the theme is “working together”. Traditionally, most contributors are plugin maintainers focusing on their own plugins, but it’s important to look at Jenkins as a whole, because that’s how users experience it. There is more to the project beyond writing plugins, and even for plugin developers, there are increasing number of common libraries and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As in previous years, there’ll be a contributor summit at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld&quot;&gt;Jenkins World 2017&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s talk about the future of Jenkins and how you can help shape it! The contributor summit is the place where the current and future contributors of the Jenkins project get together. This year, the theme is “working together”. Traditionally, most contributors are plugin maintainers focusing on their own plugins, but it’s important to look at Jenkins as a whole, because that’s how users experience it. There is more to the project beyond writing plugins, and even for plugin developers, there are increasing number of common libraries and modules that plugins should rely on. In short, we should work better together.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few contributors will prepare some presentations to help clarify what that means, and what all of us can do. And in the afternoon, there will be &quot;unconference&quot; sessions to brainstorm and discuss what we can do and how.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whether you are already a contributor or just thinking about becoming one, please join us for this full day free event.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Details about this year’s agenda are available on the &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/241213280/&quot;&gt;event’s meetup page&lt;/a&gt;.
Attending is free, and no Jenkins World ticket is needed, but RSVP if you’re going to attend to help us plan.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you there!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/06/27/speaker-blog-SAS-jenkins-world/</id>
<title>Extending your Pipeline with Shared Libraries, Global Functions and External Code</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-06-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/06/27/speaker-blog-SAS-jenkins-world/" />
<author>
<name>hinman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2017'></category>
<summary>
This is a guest post by Brent Laster, Senior Manager, Research and Development at
SAS.





Jenkins Pipeline
has fundamentally changed how users can orchestrate their pipelines and workflows.
Essentially, anything that you can do in a script or program can now be done in a Jenkinsfile or in a pipeline script created within the application.
But just because you can do nearly anything directly in those mechanisms doesn&#8217;t mean you necessarily should.


In some cases, it&#8217;s better to abstract the functionality out separately from your main Pipeline.
Previously, the main way to do this in Jenkins itself was through creating plugins.
With Jenkins 2 and the tight incorporation...
</summary>
<content type='html'>
&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;
This is a guest post by Brent Laster, Senior Manager, Research and Development at
&lt;a href=&quot;https://www.sas.com/en_us/home.html&quot;&gt;SAS&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Jenkins Pipeline&lt;/a&gt;
has fundamentally changed how users can orchestrate their pipelines and workflows.
Essentially, anything that you can do in a script or program can now be done in a &lt;code&gt;Jenkinsfile&lt;/code&gt; or in a pipeline script created within the application.
But just because you can do nearly anything directly in those mechanisms doesn’t mean you necessarily should.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In some cases, it’s better to abstract the functionality out separately from your main Pipeline.
Previously, the main way to do this in Jenkins itself was through creating plugins.
With Jenkins 2 and the tight incorporation of Pipeline, we now have another approach – shared libraries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Brent will be
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/ALMq/extending-your-pipeline-with-shared-libraries-global-functions-and-external-code&quot;&gt;presenting&lt;/a&gt;
more of this topic at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in
August, register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 30% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries&quot;&gt;Shared libraries&lt;/a&gt;
provide solutions for a number of situations that can be challenging or time-consuming to deal with in Pipeline.
Among them:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Providing common routines that can be accessed across a number of pipelines or within a designated scope (more on scope later)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Abstracting out complex or restricted code&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Providing a means to execute scripted code from calls in declarative pipelines (where scripted code is not normally allowed)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simplifying calls in a script to custom code that only differ by calling parameters&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To understand how to use shared libraries in Pipeline, we first need to understand how they are constructed.
A shared library for Jenkins consists of a source code repository with a structure like the one below:&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/2017-06-27/jw-speaker-blog-sas-1.png&quot; alt=&quot;jw speaker blog sas 1&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each of the top-level directories has its own purpose.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;strong&gt;resources&lt;/strong&gt; directory can have non-groovy resources that get loaded via the &lt;code&gt;libraryResource&lt;/code&gt; step.
Think of this as a place to store supporting data files such as json files.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;strong&gt;src&lt;/strong&gt; directory uses a structure similar to the standard Java &lt;code&gt;src&lt;/code&gt; layout.
This area is added to the &lt;code&gt;classpath&lt;/code&gt; when a Pipeline that includes this shared library is executed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;strong&gt;vars&lt;/strong&gt; directory holds global variables that should be accessible from pipeline scripts.
A corresponding &lt;code&gt;.txt&lt;/code&gt; file can be included that defines documentation for objects here.
If found, this will be pulled in as part of the documentation in the Jenkins application.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although you might think that it would always be best to define library functions in the src structure, it actually works better in many cases to define them in the vars area.
The notion of a global variable may not correspond very well to a global function, but you can think of it as the function being a global value that can be pulled in and used in your pipeline.
In fact, to work in a declarative style pipeline, having your function in the vars area is the only option.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s look at a simple function that we can create for a shared library.
In this case, we’ll just wrap picking up the location of the Gradle installation from Jenkins and calling the corresponding executable with whatever tasks are passed in as arguments.
The code is below:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;/vars/gbuild.groovy&lt;/div&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&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;s2&quot;&gt;&quot;${tool &#39;gradle3&#39;}/bin/gradle ${args}&quot;&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;Notice that we are using a structured form here with the def call syntax.
This allows us to simply invoke the routine in our pipeline (assuming we have loaded the shared library) based on the name of the file in the vars area.
For example, since we named this file &lt;strong&gt;gbuild.groovy&lt;/strong&gt;, then we can invoke it in our pipeline via a step like 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;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;gbuild&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;clean compileJava&#39;&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;So, how do we get our shared library loaded to use in our pipeline?
The shared library itself is just code in the structure outlined above committed/pushed into a source code repository that Jenkins can access.
In our example, we’ll assume we’ve staged, committed, and pushed this code into a local Git repository on the system at &lt;code&gt;/opt/git/shared-library.git&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Like most other things in Jenkins, we need to first tell Jenkins where this shared library can be found and how to reference it &quot;globally&quot; so that pipelines can reference it specifically.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, though, we need to decide at what scope you want this shared library to be available.
The most common case is making it a &quot;global shared library&quot; so that all Pipelines can access it.
However, we also have the option of only making shared libraries available for projects in a particular Jenkins &lt;strong&gt;Folder&lt;/strong&gt; structure,
or those in a &lt;strong&gt;Multibranch Pipeline&lt;/strong&gt;, or those in a &lt;strong&gt;GitHub Organization&lt;/strong&gt; pipeline project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To keep it simple, we’ll just define ours to be globally available to all pipelines.
Doing this is a two-step process.
We first tell Jenkins what we want to call the library and define some default behavior for Jenkins related to the library,
such as whether we wanted it loaded implicitly for all pipelines.
This is done in the &lt;strong&gt;Global Pipeline Libraries&lt;/strong&gt; section of the &lt;strong&gt;Configure System&lt;/strong&gt; page.&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/2017-06-27/jw-speaker-blog-sas-2.png&quot; alt=&quot;jw speaker blog sas 2&quot; width=&quot;800&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the second part, we need to tell Jenkins where the actual source repository for the shared library is located.
SCM plugins that have been modified to understand how to work with shared libraries are called &quot;&lt;strong&gt;Modern SCM&lt;/strong&gt;&quot;.
The git plugin in one of these updated plugin, so we just supply the information in the same &lt;strong&gt;Configure System&lt;/strong&gt; page.&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/2017-06-27/jw-speaker-blog-sas-3.png&quot; alt=&quot;jw speaker blog sas 3&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After configuring Jenkins so that it can find the shared library repository, we can load the shared library into our pipeline using the &lt;code&gt;@Library(&#39;&amp;lt;library name&amp;gt;&#39;)&lt;/code&gt; annotation.
Since &lt;a href=&quot;https://docs.oracle.com/javase/1.5.0/docs/guide/language/annotations.html&quot;&gt;Annotations&lt;/a&gt;
are designed to annotate something that follows them,
we need to either include a specific import statement, or, if we want to include everything, we can use an underscore character as a placeholder.
So our basic step to load the library in a pipeline would be:&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;nd&quot;&gt;@Library&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Utilities2&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&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;Based on this step, when Jenkins runs our Pipeline, it will first go out to the repository that holds the shared library and clone down a copy to use.
The log output during this part of the pipeline execution would look something like 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&gt;Loading library Utilities2@master
 &amp;gt; git rev-parse --is-inside-work-tree # timeout=10
Setting origin to /opt/git/shared-libraries
 &amp;gt; git config remote.origin.url /opt/git/shared-libraries # timeout=10
Fetching origin...
Fetching upstream changes from origin
 &amp;gt; git --version # timeout=10
using GIT_SSH to set credentials Jenkins2 SSH
 &amp;gt; git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/*
 &amp;gt; git rev-parse master^{commit} # timeout=10
 &amp;gt; git rev-parse origin/master^{commit} # timeout=10
Cloning the remote Git repository
Cloning repository /opt/git/shared-libraries&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then Pipeline can call our shared library &lt;code&gt;gbuild&lt;/code&gt; function and translate it to the desired Gradle build commands.&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;First time build.
Skipping changelog.
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Compile)
[Pipeline] tool
[Pipeline] sh
[gsummit17_lab2-4T357CUTJORMC2TIF7WW5LMRR37F7PM2QRUHXUNSRTWTTRHB3XGA]
Running shell script
+ /usr/share/gradle/bin/gradle clean compileJava -x test
Starting a Gradle Daemon (subsequent builds will be faster)&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 very basic illustration of how using shared libraries work.
There is much more detail and functionality surrounding shared libraries, and extending your pipeline in general, than we can cover here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Be sure to catch my talk on
&lt;a href=&quot;https://jenkinsworld20162017.sched.com/event/ALMq/extending-your-pipeline-with-shared-libraries-global-functions-and-external-code&quot;&gt;Extending your Pipeline with Shared Libraries, Global Functions and External Code&lt;/a&gt;
at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld&quot;&gt;Jenkins World 2017&lt;/a&gt;.
Also, watch for my new book on
&lt;a href=&quot;https://www.amazon.com/Jenkins-Deployment-Pipeline-Generation-Automation/dp/1491979593/ref=sr_1_2?ie=UTF8&amp;amp;qid=1497984947&amp;amp;sr=8-2&amp;amp;keywords=Brent+laster&quot;&gt;Jenkins 2 Up and Running&lt;/a&gt;
which will have a dedicated chapter on this – expected to be available later this year from O’Reilly.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/06/26/share-jenkins-world-keynote-stage/</id>
<title>Come Share the Jenkins World Keynote Stage with Me!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-06-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/06/26/share-jenkins-world-keynote-stage/" />
<author>
<name>kohsuke</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2017'></category>
<summary>
Jenkins World is approaching fast,
and the event staff are all busy preparing.
I&#8217;ve decided to do something different this year as part of my keynote:
I want to invite a few Jenkins users like you come up on stage with me.


There have been amazing developments in Jenkins over the past year.
For my keynote, I want highlight how the new Jenkins
(Pipeline as code with the Jenkinsfile, no more creating jobs,
Blue Ocean)
is different and better than the old Jenkins (freestyle jobs, chaining jobs together, etc.).
All these developments have helped Jenkins users,
and it would be more meaningful to have fellow users, like you, share their...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld&quot;&gt;Jenkins World&lt;/a&gt; is approaching fast,
and the event staff are all busy preparing.
I’ve decided to do something different this year as part of my keynote:
I want to invite a few Jenkins users like you come up on stage with me.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There have been amazing developments in Jenkins over the past year.
For my keynote, I want highlight how the new Jenkins
(Pipeline as code with the &lt;code&gt;Jenkinsfile&lt;/code&gt;, no more creating jobs,
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;)
is different and better than the old Jenkins (freestyle jobs, chaining jobs together, etc.).
All these developments have helped Jenkins users,
and it would be more meaningful to have fellow users, like you, share their stories
about how recent Jenkins improvements like Pipeline and Blue Ocean have positively impacted them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested sharing your story, please complete
&lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScMpoJNDwpDmAqwNUhZT1oRzPs9YZMuPivlUWrMTbI9ZKAOhA/viewform?c=0&amp;amp;w=1&quot;&gt;this form&lt;/a&gt;
so that I can contact you.
This is a great opportunity to let
the rest of the world (and your boss!) hear about your accomplishments.
You’ll also get into Jenkins World for free and get to join me backstage.
If you concerns about traveling to Jenkins World,
I’m happy to discuss helping with that as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I look forward to hearing from you.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/06/14/jenkinsworld-awards-lastcall/</id>
<title>Jenkins World 2017 Community Awards - Last Call for Nominations!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-06-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/06/14/jenkinsworld-awards-lastcall/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2017'></category>
<summary>
This is a guest post by Alyssa Tong, who runs
the Jenkins Area Meetup program and is also responsible for
Marketing &amp; Community Programs at CloudBees, Inc.





We have received a good number of nominations for the Jenkins World 2017 Community Awards. These nominations are indicative of the excellent work Jenkins members are doing for the betterment of Jenkins.


The deadline for nomination is this Friday, June 16.


This will be the first year we are commemorating community members who have
shown excellence through commitment, creative thinking, and contributions to
continue making Jenkins a great open source automation server. The award
categories includes:




Most Valuable Contributor -
This award is...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, who runs
the &lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;Jenkins Area Meetup&lt;/a&gt; program and is also responsible for
Marketing &amp;amp; Community Programs at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have received a good number of nominations for the &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/awards&quot;&gt;Jenkins World 2017 Community Awards&lt;/a&gt;. These nominations are indicative of the excellent work Jenkins members are doing for the betterment of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;The deadline for nomination is this Friday, June 16.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will be the first year we are commemorating community members who have
shown excellence through commitment, creative thinking, and contributions to
continue making Jenkins a great open source automation server. The award
categories includes:&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;Most Valuable Contributor&lt;/strong&gt; -
This award is presented to the Jenkins contributor who has helped move the Jenkins project forward the most through their invaluable feature contributions, bug fixes or plugin development efforts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins Security MVP&lt;/strong&gt; -
This award is presented to the individual most consistently providing excellent security reports or who helped secure Jenkins by fixing security issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Most Valuable Advocate&lt;/strong&gt; -
This award is presented to an individual who has helped advocate for Jenkins through organization of their local Jenkins Area Meetup.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Submit your story, or nominate someone today! Winners will be announced at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2017&lt;/a&gt; in San Francisco on August 28-31.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We look forward to hearing about the great Jenkins work you are doing.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/06/13/blueocean-1-1/</id>
<title>Blue Ocean 1.1 - fast search for pipelines and much more</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-06-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/06/13/blueocean-1-1/" />
<author>
<name>i386</name>
</author>
<category term='blueocean'></category>
<summary>
The Blue Ocean team are proud to announce the release of Blue Ocean 1.1.
 We’ve shipped a tonne of small improvements, features and bug fixes here that
 will make your day-to-day experience with Blue Ocean even smoother.


Today is also the first time we are promoting
our Public Roadmap.
We recognise that using JIRA can be a bit of a pain to track what we are working
 on at a macro level and the Public Roadmap makes it very easy for anyone to
 find out what we are working on. We’ve got some really cool stuff coming,
 so check back here soon!


It’s been...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Blue Ocean team are proud to announce the release of Blue Ocean 1.1.
 We’ve shipped a tonne of small improvements, features and bug fixes here that
 will make your day-to-day experience with Blue Ocean even smoother.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today is also the first time we are promoting
our &lt;a href=&quot;https://www.jenkins.io/projects/blueocean/roadmap&quot;&gt;Public Roadmap&lt;/a&gt;.
We recognise that using JIRA can be a bit of a pain to track what we are working
 on at a macro level and the Public Roadmap makes it very easy for anyone to
 find out what we are working on. We’ve got some really cool stuff coming,
 so check back here soon!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been an insane two months since the launch of Blue Ocean 1.0 and there
 are now officially over 10,000 teams using Blue Ocean  – so here’s a big
 “thank you” to all of you for your support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, lets get to the goods!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;fast-search&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fast-search&quot; /&gt;Fast search&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For those of you who have many pipelines we’ve introduced pipeline fast search
to the pipeline dashboard. Click the search icon to activate and just start
typing what you’re looking for.&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/blueocean/1.1-release/fast-search.gif&quot; alt=&quot;Fast search&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;trigger-reasons&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#trigger-reasons&quot; /&gt;Trigger reasons&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Differentiate at a glance between pipeline runs that have been manually
triggered and by who, triggered automatically by a commit or triggered by any
other means.&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/blueocean/1.1-release/trigger-reasons.png&quot; alt=&quot;Trigger Reasons&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;blockage-reasons&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#blockage-reasons&quot; /&gt;Blockage reasons&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipelines can be blocked from execution for a variety of reasons, including
waiting for executors or other resources to become free. You can see from the
Pipeline Activity, Branch and Result screen why the pipeline is blocked from
execution.&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/blueocean/1.1-release/blockage-reason.png&quot; alt=&quot;Blockage reason&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;history-jump&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#history-jump&quot; /&gt;History jump&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers can quickly jump from the branches tab to the run history for a
specific branch. This makes it more convenient to see historical runs for the
branch within the Pipeline which improves the your ability to trace down
problems.&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/blueocean/1.1-release/history-jump.gif&quot; alt=&quot;History jump&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;analyse-1000s-of-tests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#analyse-1000s-of-tests&quot; /&gt;Analyse 1,000s of tests&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now you can see more than 100 test results for a Pipeline run. This makes
Blue Ocean practical for teams who have invested heavily in testing.
We’ve also dramatically improved loading times for Pipelines with large
numbers of tests so theres no more waiting for the test tab to load.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;custom-run-names-and-descriptions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#custom-run-names-and-descriptions&quot; /&gt;Custom run names and descriptions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers authoring Pipeline using the scripted syntax can set a custom name
and description for Pipeline run. This feature is commonly used to name or
describe a pipeline run that is meaningful in their release management workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, a developer can set the run name to the release version
&lt;code&gt;1.1&lt;/code&gt; and the description to something meaningful, like &lt;code&gt;Final Release&lt;/code&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&gt;currentBuild.displayName = &#39;1.1&#39;
currentBuild.description = ‘Final Release’&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;performance&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#performance&quot; /&gt;Performance&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve been making optimisations for general page speed.
In Blue Ocean 1.1, plugin data was automatically sent to browser and we’ve made
a change so that this data is only sent on the request of plugins. The long and
short of it is that you shouldn’t notice a thing except those Blue Ocean pages
zipping faster into your browser.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;48-bug-fixes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#48-bug-fixes&quot; /&gt;48+ bug fixes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There have been a total of 48 bug improvements, with emphasis on how executing
pipelines behave, and we’ve  invested a large amount of time to improve
automated test coverage of Blue Ocean to ensure reliability in
production settings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a full list of bug fixes and improvements,
see the &lt;a href=&quot;https://issues.jenkins.io/issues/?filter=17643&quot;&gt;JIRA&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;What are you waiting for? &lt;a href=&quot;https://www.jenkins.io/projects/blueocean/&quot;&gt;Try Blue Ocean 1.1 today&lt;/a&gt;&lt;/strong&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/05/18/pipeline-dev-tools/</id>
<title>Pipeline Development Tools</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-05-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/05/18/pipeline-dev-tools/" />
<author>
<name>lnewman</name>
</author>
<category term='blueocean'></category>
<category term='pipeline'></category>
<category term='tutorial'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





I&#8217;ve only been working with Pipeline for about a year.
Pipeline in and of itself has been a huge improvement over old-style Jenkins projects.
As a developer, it has been so great be able work with Jenkins Pipelines
using the same tools I use for writing any other kind of code.


I&#8217;ve also found a number of tools that are super helpful specifically
for developing pipelines. Some were easy to find like the
built-in documentation
and the
Snippet Generator.
Others were not as obvious or were only recently released.
In this post, I&#8217;ll show how a few of those tools...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve only been working with Pipeline for about a year.
Pipeline in and of itself has been a huge improvement over old-style Jenkins projects.
As a developer, it has been so great be able work with Jenkins Pipelines
using the same tools I use for writing any other kind of code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve also found a number of tools that are super helpful specifically
for developing pipelines. Some were easy to find like the
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/getting-started#built-in-documentation&quot;&gt;built-in documentation&lt;/a&gt;
and the
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/getting-started#snippet-generator&quot;&gt;Snippet Generator&lt;/a&gt;.
Others were not as obvious or were only recently released.
In this post, I’ll show how a few of those tools make working with Pipelines
even better.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-blue-ocean-pipeline-editor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-blue-ocean-pipeline-editor&quot; /&gt;The Blue Ocean Pipeline Editor&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The best way to start this list is with the most recent and coolest
arrival in this space: the Blue Ocean Pipeline Editor.  The editor only works
with Declarative Pipelines, but it brings a sleek new user experience to writing
Pipelines.  My recent screencast, released as part of the Blue Ocean Launch,
gives good sense of how useful the editor is:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe width=&quot;852&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/5Nct-jrZBbM?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;command-line-pipeline-linter&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#command-line-pipeline-linter&quot; /&gt;Command-line Pipeline Linter&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the neat features of the Blue Ocean Pipeline Editor is that it does basic
validation on our Declarative Pipelines before they are even committed or Run.
This feature is based on the
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/development#linter&quot;&gt;Declarative Pipeline Linter&lt;/a&gt;
which can be accessed from the command-line even if you don’t have Blue Ocean
installed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I was working on the
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/10/declarative-html-publisher&quot;&gt;Declarative Pipeline: Publishing HTML Reports&lt;/a&gt;
blog post, I was still learning the declarative syntax and I made a lot lot of mistakes.
Getting quick feedback about the whether my Pipeline was in a sane state made writing that blog much easier.
I wrote a simple shell script that would run my Jenkinsfile through the Declarative Pipeline Linter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;pipelint.sh - Linting via HTTP POST using &lt;code&gt;curl&lt;/code&gt;&lt;/div&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;# curl (REST API)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# User&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;bitwisenote-jenkins1

&lt;span class=&quot;c&quot;&gt;# Api key from &quot;/me/configure&quot; on my Jenkins instance&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;JENKINS_USER_KEY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;--my&lt;/span&gt; secret, get your own--

&lt;span class=&quot;c&quot;&gt;# Url for my local Jenkins instance.&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;http://&lt;span class=&quot;nv&quot;&gt;$JENKINS_USER&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$JENKINS_USER_KEY&lt;/span&gt;@localhost:32769 &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;

&lt;span class=&quot;c&quot;&gt;# JENKINS_CRUMB is needed if your Jenkins controller has CRSF protection enabled (which it should)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;JENKINS_CRUMB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;curl &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$JENKINS_URL&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;,//crumb)&quot;&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
curl &lt;span class=&quot;nt&quot;&gt;-X&lt;/span&gt; POST &lt;span class=&quot;nt&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$JENKINS_CRUMB&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;jenkinsfile=&amp;lt;Jenkinsfile&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$JENKINS_URL&lt;/span&gt;/pipeline-model-converter/validate&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This is not secure.  I’m running this locally only.
See &lt;a href=&quot;https://www.jenkins.io/doc/book/managing/cli&quot;&gt;Jenkins CLI&lt;/a&gt; for details on how to do this securely.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this script, I was able to find the error in this this Pipeline without
having to take the time to run it in Jenkins: (Can you spot the mistake?)&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;table class=&quot;linenotable&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;linenos gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groovy&lt;/span&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;options&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Only keep the 10 most recent builds&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;buildDiscarder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logRotator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;numToKeepStr:&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;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;Install&#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;// install required bundles&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bundle install&#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;stage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Build&#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;// build&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bundle exec rake build&#39;&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;success&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;c1&quot;&gt;// Archive the built artifacts&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;archive&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;includes:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;pkg/*.gem&#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;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;step&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// run tests with coverage&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bundle exec rake spec&#39;&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;success&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;c1&quot;&gt;// publish html&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;publishHTML&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;target:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
              &lt;span class=&quot;nl&quot;&gt;allowMissing:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;nl&quot;&gt;alwaysLinkToLastBuild:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;nl&quot;&gt;keepAll:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;nl&quot;&gt;reportDir:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;coverage&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;nl&quot;&gt;reportFiles:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;index.html&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;nl&quot;&gt;reportName:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;RCov Report&#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;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;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Send notifications for result: ${currentBuild.result}&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;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I ran my &lt;code&gt;pipelint.sh&lt;/code&gt; script on this pipeline it reported this error:&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;pipelint.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    46  100    46    0     0   3831      0 --:--:-- --:--:-- --:--:--  4181
Errors encountered validating Jenkinsfile:
WorkflowScript: 30: Unknown stage section &quot;step&quot;. Starting with version 0.5, steps in a stage must be in a steps block. @ line 30, column 5.
       stage (&#39;Test&#39;) {
       ^

WorkflowScript: 30: Nothing to execute within stage &quot;Test&quot; @ line 34, column 5.
       stage (&#39;Test&#39;) {
       ^&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Doh. I forgot the &quot;s&quot; on &lt;code&gt;steps&lt;/code&gt; on line 35. Once I added the &quot;s&quot; and ran
&lt;code&gt;pipelint.sh&lt;/code&gt; again, I got an all clear.&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;pipelint.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    46  100    46    0     0   5610      0 --:--:-- --:--:-- --:--:--  5750
Jenkinsfile successfully validated.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This didn’t mean there weren’t other errors, but for a two second smoke test I’ll take it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;replay&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#replay&quot; /&gt;Replay&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I love being able to use source control to track changes to my Pipelines
right alongside the rest of the code in a project.  There are also times,
when prototyping or debugging, that I need to iterate quickly on a series
of possible Pipeline changes.
The Replay feature let’s me do that and see the results,
without committing those changes to source control.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I wanted to take the previous Pipeline from &lt;code&gt;agent any&lt;/code&gt; to using Docker via
the &lt;code&gt;docker { …​ }&lt;/code&gt; directive, I used the Replay feature to test it out:&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;Selected the previously completed run in the build history&lt;/p&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/doc/book/resources/pipeline/replay-previous-run.png&quot; alt=&quot;Previous Pipeline Run&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Clicked &quot;Replay&quot; in the left menu&lt;/p&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/doc/book/resources/pipeline/replay-left-bar.png&quot; alt=&quot;Replay Left-menu Button&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Made modifications and click &quot;Run&quot;. In this example, I replaced &lt;code&gt;any&lt;/code&gt; with the &lt;code&gt;docker { …​ }&lt;/code&gt; directive.&lt;/p&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/doc/book/resources/pipeline/replay-modified.png&quot; alt=&quot;Replay Left-menu Button&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Checked the results of changes looked good.&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once I worked any bugs out of my Pipeline,
I used Replay to view the Pipeline for the last run and copy it back to my
&lt;code&gt;Jenkinsfile&lt;/code&gt; and create a commit for that change.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&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;This is far from a complete list of the tools out there for working with Pipeline.
There are many more and the number is growing.
For example, one tool  I just recently heard about and haven’t had a chance to delve into
is the
&lt;a href=&quot;https://github.com/lesfurets/JenkinsPipelineUnit&quot;&gt;Pipeline Unit Testing Framework&lt;/a&gt;,
which promises the ability to test Pipelines before running them.
It’s been a fun year and I can’t wait to see what the next year holds for Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;exampleblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How do you work with Pipeline?
Do you have a tool that you feel has greatly improved your development experience
with Pipeline?  I’m interested in hear about others Jenkins user’s favorite ways
of working with Pipeline.  Drop me a line via
&lt;a href=&quot;mail:bitwiseman@gmail.com&quot;&gt;email&lt;/a&gt; or on the
&lt;a href=&quot;https://webchat.freenode.net/?channels=jenkins&quot;&gt;#jenkins&lt;/a&gt; IRC channel.&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/2017/05/15/kubernetes-journey-on-azure/</id>
<title>A journey to Kubernetes on Azure</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-05-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/05/15/kubernetes-journey-on-azure/" />
<author>
<name>olblak</name>
</author>
<category term='puppet'></category>
<category term='kubernetes'></category>
<category term='docker'></category>
<category term='azure'></category>
<summary>
With the
ongoing migration to Azure,
I would like to share my thoughts regarding one of the biggest challenges we
have faced thus far: orchestrating container infrastructure. Many of the
Jenkins project&#8217;s applications are run as Docker containers, making Kubernetes
a logical choice as far as running our containers, but it presents its own set
of challenges. For example, what would the workflow from development to
production look like?


Before going deeper into the challenges, let&#8217;s review the requirements we
started with:



Git

We found it mandatory to keep track of all the infrastructure changes in Git
repositories, including secrets, in order to facilitate reviewing,
validation, rollback, etc of all infra changes.

Tests

Infrastructure contributors...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/18/announcing-azure-partnership/&quot;&gt;ongoing migration to Azure&lt;/a&gt;,
I would like to share my thoughts regarding one of the biggest challenges we
have faced thus far: &lt;strong&gt;orchestrating container infrastructure&lt;/strong&gt;. Many of the
Jenkins project’s applications are run as Docker containers, making Kubernetes
a logical choice as far as running our containers, but it presents its own set
of challenges. For example, what would the workflow from development to
production look like?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before going deeper into the challenges, let’s review the requirements we
started with:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Git&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;We found it mandatory to keep track of all the infrastructure changes in Git
repositories, including secrets, in order to facilitate reviewing,
validation, rollback, etc of all infra changes.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Tests&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Infrastructure contributors are geographically distributed and in different
timezones.  Getting feedback can take time, so we heavily rely on a lot of
tests before any changes can be merged.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Automation&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The change submitter is not necessarily the person who will deploy it.
Repetitive tasks are error prone and a waste of time.
For these reasons, all steps must be automated and stay as simple as possible.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A high level overview of our &quot;infrastructure as code&quot; workflow would look like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Infrastructure as Code Workflow&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;  __________       _________       ______________
  |         |      |        |      |             |
  | Changes | ----&amp;gt;|  Test  |-----&amp;gt;| Deployment  |
  |_________|      |________|  ^   |_____________|
                               |
                        ______________
                       |             |
                       | Validation  |
                       |_____________|&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We identified two possible approaches for implementing our container
orchestration with Kubernetes:&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 Jenkins Way: Jenkins is triggered by a Git commit, runs the tests, and
after validation, Jenkins deploys changes into production.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Puppet Way: Jenkins is triggered by a Git commit, runs the tests, and
after validation, it triggers Puppet to deploy into production.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s discuss these two approaches in detail.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-jenkins-way&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-jenkins-way&quot; /&gt;The Jenkins Way&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Workflow&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;  _________________       ____________________       ______________
  |                |      |                   |      |             |
  |    Github:     |      |     Jenkins:      |      |   Jenkins:  |
  | Commit trigger | ----&amp;gt;| Test &amp;amp; Validation | ----&amp;gt;|  Deployment |
  |________________|      |___________________|      |_____________|&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this approach, Jenkins is used to test, validate, and deploy our Kubernetes
configuration files.  &lt;code&gt;kubectl&lt;/code&gt; can be run on a directory and is idempotent.
This means that we can run it as often as we want: the result will not change.
Theoretically, this is the simplest way. The only thing needed is to run
&lt;code&gt;kubectl&lt;/code&gt; command each time Jenkins detects changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following Jenkinsfile gives an example of this workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;Init&#39;&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;s1&quot;&gt;&#39;curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl&#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;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;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;s1&quot;&gt;&#39;Run tests&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Deploy&#39;&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;s1&quot;&gt;&#39;./kubectl apply -R true -f my_project&#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 class=&quot;paragraph&quot;&gt;
&lt;p&gt;The devil is in the details of course, and it was not as easy as it looked at
first sight.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;order-matters&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#order-matters&quot; /&gt;Order matters&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some resources needed to be deployed before others. A workaround was to use
numbers as file names. But this added extra logic at file name level, 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&gt;project/00-nginx-ingress
project/09-www.jenkins.io&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;portability&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#portability&quot; /&gt;Portability&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The deployment environments needed to be the same across development machines
and the Jenkins host. Although this a well-known problem, it was not easy to
solve.  The more the project grew, the more our scripts needed additional tools
(&lt;code&gt;make&lt;/code&gt;, &lt;code&gt;bats&lt;/code&gt;, &lt;code&gt;jq&lt;/code&gt; &lt;code&gt;gpg&lt;/code&gt;, etc).  The more tools we used, the more issues
appeared because of the different versions used.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another challenge that emerged when dealing with different environments was:
how should we manage environment-specific configurations (dev, prod, etc)?
Would it be better to define different configuration files per environment?
Perhaps, but this means code duplication, or using file templates which would require
more tools (&lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;jinja2&lt;/code&gt;, &lt;code&gt;erb&lt;/code&gt;), and more work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There wasn’t a golden rule we discovered, and the answer is probably somewhere in between.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In any case, the good news is that a &lt;code&gt;Jenkinsfile&lt;/code&gt; provides an easy way to
execute tasks from a Docker image, and an image can contain all the necessary
tools in our environment. We can even use different Docker images for each
stage along the way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the following example, I use the &lt;code&gt;my_env&lt;/code&gt; Docker image. It contains all the
tools needed to test, validate, and deploy changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;my_env:1.0&#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;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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logRotator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;numToKeepStr:&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;n&quot;&gt;disableConcurrentBuilds&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;time:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unit:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;HOURS&#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;triggers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pollSCM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#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;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;Init&#39;&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;// Init everything required to deploy our infra&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make init&#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;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;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 tests to validate changes&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make 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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Deploy&#39;&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;// Deploy changes in production&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make deploy&#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;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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make notify&#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;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;secret-credentials&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#secret-credentials&quot; /&gt;Secret credentials&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Managing secrets is a big subject and brings with it many different
requirements which are very hard to fulfill.  For obvious reasons, we couldn’t
publish the credentials used within the infra project.  On the other hand, we
needed to keep track and share them, particularly for the Jenkins node that
deploys our cluster.  This means that we needed a way to encrypt or decrypt
those credentials depending on permissions, environments, etc.  We analyzed two
different approaches to handle this:&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;Storing secrets in a key management tool like &lt;a href=&quot;https://azure.microsoft.com/en-us/services/key-vault/&quot;&gt;Key Vault&lt;/a&gt; or &lt;a href=&quot;https://www.vaultproject.io/&quot;&gt;Vault&lt;/a&gt; and use them like a Kubernetes &quot;secret&quot; type of resource.&lt;br&gt;
→ Unfortunately, these tools are not yet integrated in Kubernetes. But we may come back to this option later.
&lt;a href=&quot;https://Github.com/kubernetes/kubernetes/issues/10439&quot;&gt;Kubernetes issue: 10439&lt;/a&gt;&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Publishing and encrypting using a public GPG key.&lt;br&gt;
This means that everybody can encrypt credentials for the infrastructure project but only the owner of the private key can decrypt credentials.&lt;br&gt;
This solution implies:&lt;/br&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Scripting: as secrets need to be decrypted at deployment time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Templates: as secret values will change depending on the environment.&lt;br&gt;
→ Each Jenkins node should only have the private key to decrypt secrets associated to its environment.&lt;/br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;scripting&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#scripting&quot; /&gt;Scripting&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, the system we had built was hard to work with.  Our initial
&lt;code&gt;Jenkinsfile&lt;/code&gt; which only ran one &lt;code&gt;kubectl&lt;/code&gt; command slowly become a bunch of
scripts to accommodate for:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Resources needing to be updated only in some situations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Secrets needing to be encrypted/decrypted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tests needing to be run.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the end, the amount of scripts required to deploy the Kubernetes resources
started to become unwieldy and we began asking ourselves: &quot;aren’t we
re-inventing the wheel?&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-puppet-way&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-puppet-way&quot; /&gt;The Puppet Way&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project already uses Puppet, so we decided to look at using Puppet
to orchestrate our container deployment with Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Workflow&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;  _________________       ____________________       _____________
  |                |      |                   |      |            |
  |    Github:     |      |     Jenkins:      |      | Puppet:    |
  | Commit trigger | ----&amp;gt;| Test &amp;amp; Validation | ----&amp;gt;| Deployment |
  |________________|      |___________________|      |____________|&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this workflow, Puppet is used to template and deploy all Kubernetes
configurations files needed to orchestrate our cluster.
Puppet is also used to automate basic &lt;code&gt;kubectl&lt;/code&gt; operations such as &#39;apply&#39; or
&#39;remove&#39; for various resources based on file changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Puppet workflow&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;______________________
|                     |
|  Puppet Code:       |
|    .                |
|    ├── apply.pp     |
|    ├── kubectl.pp   |
|    ├── params.pp    |
|    └── resources    |
|        ├── lego.pp  |
|        └── nginx.pp |
|_____________________|
          |                                        _________________________________
          |                                       |                                |
          |                                       |  Host: Prod orchestrator       |
          |                                       |    /home/k8s/                  |
          |                                       |    .                           |
          |                                       |    └── resources               |
          | Puppet generate workspace             |        ├── lego                |
          └--------------------------------------&amp;gt;|        │   ├── configmap.yaml  |
            Puppet apply workspaces&#39; resources on |        │   ├── deployment.yaml |
          ----------------------------------------|        │   └── namespace.yaml  |
          |                                       |        └── nginx               |
          v                                       |            ├── deployment.yaml |
 ______________                                   |            ├── namespace.yaml  |
 |     Azure:  |                                  |            └── service.yaml    |
 | K8s Cluster |                                  |________________________________|
 |_____________|&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main benefit of this approach is letting Puppet manage the environment and run
common tasks. In the following example, we define a Puppet class for Datadog.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Puppet class for resource Datadog&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;puppet&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Deploy datadog resources on kubernetes cluster
#   Class: profile::kubernetes::resources::datadog
#
#   This class deploy a datadog agent on each kubernetes node
#
#   Parameters:
#     $apiKey:
#       Contain datadog api key.
#       Used in secret template
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;profile::kubernetes::resources::datadog&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;$apiKey&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;base64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;encode&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$::datadog_agent::api_key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;strict&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;){&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;::stdlib&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;profile::kubernetes::params&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;profile::kubernetes::kubectl&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;${profile::kubernetes::params::resources}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/datadog&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;ensure&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;directory&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;owner&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$profile::kubernetes::params::user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;profile::kubernetes::apply&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;datadog/secret.yaml&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;parameters&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&#39;apiKey&#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$apiKey&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;profile::kubernetes::apply&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;datadog/daemonset.yaml&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:}&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;profile::kubernetes::apply&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;datadog/deployment.yaml&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:}&lt;/span&gt;

  &lt;span class=&quot;c&quot;&gt;# As secrets change do not trigger pods update,
&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;# we must reload pods &#39;manually&#39; in order to use updated secrets.
&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;# If we delete a pod defined by a daemonset,
&lt;/span&gt;  &lt;span class=&quot;c&quot;&gt;# this daemonset will recreate pods automatically.
&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Reload datadog pods&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;path&lt;/span&gt;        &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;${profile::kubernetes::params::bin}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;command&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;kubectl delete pods -l app=datadog&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;refreshonly&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;environment&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;KUBECONFIG=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;${profile::kubernetes::params::home}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/.kube/config&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;logoutput&lt;/span&gt;   &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kp&quot;&gt;subscribe&lt;/span&gt;   &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;nc&quot;&gt;Exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;apply datadog/secret.yaml&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
      &lt;span class=&quot;nc&quot;&gt;Exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;apply datadog/daemonset.yaml&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&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;→
&lt;a href=&quot;https://Github.com/jenkins-infra/jenkins-infra/tree/staging/dist/profile/manifests/kubernetes/resources&quot;&gt;More &quot;resources&quot; examples&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s compare the Puppet way with the challenges discovered with the Jenkins
way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;order-matters-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#order-matters-2&quot; /&gt;Order Matters&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Puppet, it becomes easier to define priorities as
Puppet provides relationship meta parameters and the function &#39;require&#39; (see
also:
&lt;a href=&quot;https://docs.puppet.com/puppet/4.9/lang_relationships.html&quot;&gt;Puppet
relationships&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our Datadog example, we can be sure that deployment will respect the following order:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;datadog/secret.yaml -&amp;gt; datadog/daemonset.yaml -&amp;gt; datadog/deployment.yaml&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently, our Puppet code only applies configuration when it detects file
changes.  It would be better to compare local files with the cluster
configuration in order to trigger the required updates, but we haven’t found a
good way to implement this yet.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;portability-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#portability-2&quot; /&gt;Portability&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Puppet is used to configure working environments, it becomes easier to be
sure that all tools are present and correctly configured.  It’s also easier to
replicate environments and run tests on them with tools like
&lt;a href=&quot;https://rspec-puppet.com/&quot;&gt;RSpec-puppet&lt;/a&gt;, &lt;a href=&quot;https://serverspec.org/&quot;&gt;Serverspec&lt;/a&gt; or
&lt;a href=&quot;https://www.vagrantup.com/&quot;&gt;Vagrant&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our Datadog example, we can also easily change the Datadog API key depending
on the environment with &lt;a href=&quot;https://docs.puppet.com/hiera/&quot;&gt;Hiera&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;secret-credentials-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#secret-credentials-2&quot; /&gt;Secret credentials&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we were already using &lt;a href=&quot;https://github.com/crayfishx/hiera-gpg&quot;&gt;Hiera GPG&lt;/a&gt;
with Puppet, we decided to continue to use it, making managing secrets for
containers very simple.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;scripting-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#scripting-2&quot; /&gt;Scripting&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course the Puppet DSL is used, and even if it seems harder at the beginning,
Puppet simplifies a lot the management of Kubernetes configuration files.&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;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;It was much easier to bootstrap the project with a full CI workflow within
Jenkins as long as the Kubernetes project itself stays basic. But as soon as
the project grew, and we started deploying different applications with
different configurations per environment, it became easier to delegate
Kubernetes management to Puppet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any comments feel free to send a message to
&lt;a href=&quot;mailto:jenkins-infra@lists.jenkins-ci.org&quot;&gt;Jenkins Infra mailing list&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;thanks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thanks&quot; /&gt;Thanks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to Lindsay Vanheyste, Jean Marc Meessen, and Damien Duportal for their feedback.&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/2017/05/03/jenkinsworld-2017-awards/</id>
<title>Jenkins World 2017 Community Awards - Open for Nominations!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-05-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/05/03/jenkinsworld-2017-awards/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2017'></category>
<summary>
This is a guest post by Alyssa Tong, who runs
the Jenkins Area Meetup program and is also responsible for
Marketing &amp; Community Programs at CloudBees, Inc.









This year at Jenkins World 2017,
the Jenkins community will celebrate the Most Valuable Contributor, a Jenkins
Security MVP, and the Most Valuable Advocate.


This will be the first year we are commemorating community members who have
shown excellence through commitment, creative thinking, and contributions to
continue making Jenkins a great open source automation server. Special thanks
to CloudBees for the generous donations to make
this program possible.


With that said, the Jenkins
Community Award nomination is currently open. Nominate your story, or that
of a...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, who runs
the &lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;Jenkins Area Meetup&lt;/a&gt; program and is also responsible for
Marketing &amp;amp; Community Programs at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkinsworld-awards/trophies.png&quot; alt=&quot;trophies&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld&quot;&gt;Jenkins World 2017&lt;/a&gt;,
the Jenkins community will celebrate the Most Valuable Contributor, a Jenkins
Security MVP, and the Most Valuable Advocate.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will be the first year we are commemorating community members who have
shown excellence through commitment, creative thinking, and contributions to
continue making Jenkins a great open source automation server. Special thanks
to &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; for the generous donations to make
this program possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With that said, the &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/awards&quot;&gt;&lt;strong&gt;Jenkins
Community Award nomination&lt;/strong&gt;&lt;/a&gt; is currently open. Nominate your story, or that
of a fellow contributor, for recognition at Jenkins World. Ee sure to join us at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld&quot;&gt;Jenkins World 2017&lt;/a&gt; in San
Francisco on August 28-31 to hear the winners announced.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nominations will be accepted until June 16, 2017.
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/awards&quot;&gt;&lt;strong&gt;Nominate someone
today!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/04/27/colombia/</id>
<title>Calling for Colombian Jenkins users!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/27/colombia/" />
<author>
<name>kohsuke</name>
</author>
<category term='feedback'></category>
<category term='general'></category>
<summary>
The Jenkins project has learned that a company is trying to register "Jenkins" as a trademark in Colombia. This is alarming for us, and we are trying to oppose it. In order to do this effectively, we need to hear from Colombian users of Jenkins.





Figure 1. South American visitors to jenkins.io for 2017


The Jenkins project owns a trademark "Jenkins" in the U.S., through a non-profit entity SPI Inc. According to experts on the subject citing the "Washington Convention", our trademark registration in the U.S. does give us some strength in the argument to oppose this. To successfully mount this argument...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has learned that a company is trying to register &quot;Jenkins&quot; as a trademark in Colombia. This is alarming for us, and we are trying to oppose it. In order to do this effectively, &lt;a href=&quot;https://goo.gl/forms/Ekt6YhaaAwhrS9GT2&quot;&gt;we need to hear from Colombian users of Jenkins&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/colombia/south-america-2017.png&quot; alt=&quot;South American traffic to jenkins.io for 2017&quot;&gt;
&lt;/img&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. South American visitors to jenkins.io for 2017&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project owns a trademark &quot;Jenkins&quot; in the U.S., through a non-profit entity &lt;a href=&quot;https://www.spi-inc.org/&quot;&gt;SPI Inc&lt;/a&gt;. According to experts on the subject citing the &quot;Washington Convention&quot;, our trademark registration in the U.S. does give us some strength in the argument to oppose this. To successfully mount this argument however, we need to be able to show that Jenkins has significant usage and awareness in Colombia. Users, installations, meetups, conference talks, anything of that nature will help.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Those of you with the project for a long time might recall that &lt;a href=&quot;https://wiki.jenkins.io/pages/viewpage.action?pageId=53608972&quot;&gt;the name &quot;Jenkins&quot; was born because of a trademark issue with Oracle&lt;/a&gt;. So we are particularly sensitive to the issue is trademarks. We want to make sure the same tragedy won’t happen again.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you know anything about the usage and the name recognition of Jenkins in Colombia, please let us know by &lt;strong&gt;&lt;a href=&quot;https://goo.gl/forms/Ekt6YhaaAwhrS9GT2&quot;&gt;submitting the information here&lt;/a&gt;&lt;/strong&gt;. We know that Jenkins is popular in Colombia, because our website traffic shows that Colombian Jenkins users are the third most frequent visitors to jenkins.io in South America after Brazil and Argentina.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This information will be only shared with the Jenkins project board and those involved in the defense, and for the sole purpose of defending the trademark and nothing more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please help us spread the word. Thanks!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;El proyecto Jenkins se ha enterado de que una compañía está intentando registrar &quot;Jenkins&quot; como marca registrada en Colombia. Esto es alarmante y estamos tratando de oponernos. Para hacerlo de manera efectiva, &lt;a href=&quot;https://goo.gl/forms/Ekt6YhaaAwhrS9GT2&quot;&gt;necesitamos escuchar a los usuarios colombianos de Jenkins&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;El proyecto Jenkins posee una marca registrada &quot;Jenkins&quot; en los Estados Unidos, a través de una entidad sin ánimo de lucro &lt;a href=&quot;https://www.spi-inc.org/&quot;&gt;SPI Inc&lt;/a&gt;. Según los expertos en la materia citando la &quot;Convención de Washington&quot;, nuestro registro de marca en los EE.UU. nos da algo de fuerza para oponernos. Sin embargo, para argumentar con éxito, tenemos que ser capaces de demostrar que Jenkins tiene un uso significativo y es conocido en Colombia. Usuarios, instalaciones, encuentros, conferencias, cualquier cosa de ese tipo ayudará.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aquellos que llevan mucho tiempo con el proyecto pueden recordar que &lt;a href=&quot;https://wiki.jenkins.io/pages/viewpage.action?pageId=53608972&quot;&gt;el nombre &quot;Jenkins&quot; nació debido a un problema de marca con Oracle&lt;/a&gt;. Por lo tanto, estamos especialmente sensibles al tema de las marcas registradas. Queremos asegurarnos de que el mismo problema no vuelva a ocurrir.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si sabe algo sobre el uso y el reconocimiento del nombre Jenkins en Colombia, &lt;strong&gt;&lt;a href=&quot;https://goo.gl/forms/Ekt6YhaaAwhrS9GT2&quot;&gt;por favor háganoslo saber enviando la información aquí&lt;/a&gt;&lt;/strong&gt;. Sabemos que Jenkins es popular en Colombia, porque nuestro sitio web de tráfico muestra que los usuarios colombianos de Jenkins son los terceros visitantes más frecuentes a jenkins.io en América del Sur después de Brasil y Argentina.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Esta información sólo se compartirá con el comité de proyecto de Jenkins y los involucrados en la defensa, y con el único propósito de defender la marca y nada más.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Por favor, ayúdenos a difundir la palabra. ¡Gracias!&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/04/26/security-advisory/</id>
<title>Important security updates for Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/26/security-advisory/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.57 and 2.46.2, that fix several security vulnerabilities, including a critical one.


That critical vulnerability is an unauthenticated remote code execution via the remoting-based CLI.
When I announced the fix for the previous vulnerability of this kind, I announced our plans to revisit the design of the CLI that enabled this class of vulnerabilities.


Since Jenkins 2.54, we now have a new CLI implementation that isn&#8217;t based on remoting, and deprecated its remoting mode.
Despite it being a major feature, we decided to backport it to 2.46.2, so LTS users can also disable the unsafe remoting...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.57 and 2.46.2, that fix several security vulnerabilities, including a critical one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That critical vulnerability is an unauthenticated remote code execution via the remoting-based CLI.
&lt;a href=&quot;https://www.jenkins.io/blog/2016/11/16/security-updates-addressing-zero-day/&quot;&gt;When I announced the fix for the previous vulnerability of this kind&lt;/a&gt;, I announced our plans to revisit the design of the CLI that enabled this class of vulnerabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since Jenkins 2.54, &lt;a href=&quot;https://www.jenkins.io/blog/2017/04/11/new-cli/&quot;&gt;we now have a new CLI implementation that isn’t based on remoting&lt;/a&gt;, and deprecated its remoting mode.
Despite it being a major feature, we decided to backport it to 2.46.2, so LTS users can also disable the unsafe remoting mode while retaining almost all of the CLI’s existing functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-04-26&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.46/#upgrading-to-jenkins-lts-2-46-2&quot;&gt;LTS upgrade guide&lt;/a&gt;.
I recommend you read these documents, &lt;em&gt;especially&lt;/em&gt; if you’re using the CLI with Jenkins LTS, as there are possible side effects of these fixes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/04/20/secure-jenkins-on-azure/</id>
<title>Securing a Jenkins instance on Azure</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/20/secure-jenkins-on-azure/" />
<author>
<name>clguiman</name>
</author>
<category term='azure'></category>
<category term='cloud'></category>
<summary>
This is a guest post by Claudiu Guiman and Eric Jizba,
Software Engineers in the Azure DevOps team at Microsoft. If you have any questions, please email us at azdevopspub@microsoft.com.





One of the most frequently asked questions for managing a Jenkins instance is
"How do I make it secure?" Like any other web application, these issues must be
solved:




How do I securely pass secrets between the browser and the server?


How do I hide certain parts from unauthorized users and show other parts to anonymous users?




This blog post details how to securely connect to a Jenkins instance and how to
setup a read-only public dashboard. ...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/clguimanMSFT&quot;&gt;Claudiu Guiman&lt;/a&gt; and &lt;a href=&quot;https://github.com/EricJizbaMSFT&quot;&gt;Eric Jizba&lt;/a&gt;,
Software Engineers in the &lt;a href=&quot;https://azure.microsoft.com/en-us/try/devops&quot;&gt;Azure DevOps&lt;/a&gt; team at &lt;a href=&quot;https://www.microsoft.com&quot;&gt;Microsoft&lt;/a&gt;. If you have any questions, please email us at &lt;a href=&quot;mailto:azdevopspub@microsoft.com&quot;&gt;azdevopspub@microsoft.com&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most frequently asked questions for managing a Jenkins instance is
&quot;How do I make it secure?&quot; Like any other web application, these issues must be
solved:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How do I securely pass secrets between the browser and the server?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do I hide certain parts from unauthorized users and show other parts to anonymous users?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post details how to securely connect to a Jenkins instance and how to
setup a read-only public dashboard.  We’ll cover topics like: setting up a
reverse proxy, blocking inbound requests to certain URLs and ports, enabling
project-based authorization, and making the Jenkins agents accessible through
the JNLP protocol.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;deploy-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deploy-jenkins&quot; /&gt;Deploy Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The simplest way to deploy a secure Jenkins instance is by using the &lt;a href=&quot;https://aka.ms/jenkins-on-azure&quot;&gt;Azure Marketplace offer&lt;/a&gt;. If you have an existing Jenkins instance or want to setup your instance manually, follow the steps below.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;securely-log-in-to-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#securely-log-in-to-jenkins&quot; /&gt;Securely log in to Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After you’ve deployed your new virtual machine with a hosted Jenkins instance, you will notice that by default the instance listens on port 8080 using &#39;HTTP&#39;. If you want to set up &#39;HTTPS&#39; communication, you will need to provide an SSL certificate. Unfortunately, most certificate authorities are not cheap and other free services like &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let’s Encrypt&lt;/a&gt; have a very small quota (about 20 certificates per week for the entire &#39;azure.com&#39; subdomain). The only other option is to use a self-signed certificate, but then users must explicitly verify and mark your certificate as trusted, which is not recommended.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you do not setup &#39;HTTPS&#39; communication, the best way to make sure the sign-in credentials are not leaked due to a &lt;a href=&quot;https://en.wikipedia.org/wiki/Man-in-the-middle_attack&quot;&gt;Man-in-the-middle&lt;/a&gt; attack is to only log in using SSH tunneling.
An SSH tunnel is an encrypted tunnel created through an SSH protocol connection, which can be used to transfer unencrypted traffic over an unsecured network. Simply run this command:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Linux or Mac&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    ssh -L 8080:localhost:8080 &amp;lt;username&amp;gt;@&amp;lt;domain name&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Windows ( &lt;a href=&quot;https://www.chiark.greenend.org.uk/~sgtatham/putty/&quot;&gt;using PuTTY&lt;/a&gt;)&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    putty.exe -ssh -L 8080:localhost:8080 &amp;lt;username&amp;gt;@&amp;lt;domain name&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This command will open an SSH connection to your remote host and bind remote port 8080 to listen to requests coming from your local machine. Navigate to &lt;a href=&quot;http://localhost:8080&quot; class=&quot;bare&quot;&gt;http://localhost:8080&lt;/a&gt; on your local machine to view your Jenkins dashboard and you’ll be able to log in securely.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;setup-a-reverse-proxy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setup-a-reverse-proxy&quot; /&gt;Setup a reverse proxy&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that you can securely log in to your Jenkins instance, you should prevent people from accidentally authenticating through the public (unsecured) interface. To achieve this, you can setup a reverse proxy on the Jenkins hosting machine that will listen on a different port (80 is the best candidate) and redirect only certain requests to port 8080.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Specifically, it is recommended to block the login and the CLI requests. Some CLI versions fall back to unsecure HTTP connections if they have problems establishing the secured connection. In most cases, users don’t need the CLI and it should be enabled on an as-needed basis.&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;Install Nginx:&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;sudo apt-get update
sudo apt-get install nginx&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the Nginx config file:&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;sudo nano /etc/nginx/sites-enabled/default&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modify the file to configure Nginx to work as a reverse proxy (you’ll need to update &amp;lt;your domain name&amp;gt;):&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;server {
    listen 80;
    server_name &amp;lt;your domain name&amp;gt;;
    # Uncomment the line bellow to change the default 403 error page
    # error_page 403 /secure-jenkins;
    location / {
        proxy_set_header        Host \$host:\$server_port;
        proxy_set_header        X-Real-IP \$remote_addr;
        proxy_set_header        X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto \$scheme;
        proxy_pass              http://localhost:8080;
        proxy_redirect          http://localhost:8080 http://&amp;lt;your domain name&amp;gt;;
        proxy_read_timeout      90;
    }
    #block requests to /cli
    location /cli {
        deny all;
    }
    #block requests to /login
    location ~ /login* {
        deny all;
    }
    # Uncomment the lines bellow to redirect /secure-jenkins
    #location /secure-jenkins {
    #  alias /usr/share/nginx/secure-jenkins;
    #}
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first section tells the Nginx server to listen to any requests that come from port 80. It also contains a commented redirect of the 403 error to a custom location (we’ll get back to this later).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    listen 80;
    server_name &amp;lt;your domain name&amp;gt;;
    # error_page 403 /secure-jenkins;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next section describes the reverse proxy configuration. This tells the Nginx server to take all incoming requests and proxy them to the Jenkins instance that is listening to port 8080 on the local network interface.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    location / {
        proxy_set_header        Host \$host:\$server_port;
        proxy_set_header        X-Real-IP \$remote_addr;
        proxy_set_header        X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto \$scheme;
        proxy_pass              http://localhost:8080;
        proxy_redirect          http://localhost:8080 http://&amp;lt;your domain name&amp;gt;;
        proxy_read_timeout      90;
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last section filters out specific URLs (login, cli) and denies access to them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    location /cli {
        deny all;
    }
    location ~ /login* {
        deny all;
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart Nginx:&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;sudo service nginx restart&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;code&gt;http://&amp;lt;your domain name&amp;gt;&lt;/code&gt; and verify you can access your Jenkins instance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify clicking &#39;login&#39; returns a &#39;403 Forbidden&#39; page. If you want to customize that page, update the Nginx configuration and remove the comments around /secure-jenkins. This will redirect all 403 errors to the file &lt;code&gt;/usr/share/nginx/secure-jenkins&lt;/code&gt;. You can add any content to that file, for example:&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;sudo mkdir /usr/share/nginx/secure-jenkins
echo &quot;Access denied! Use SSH tunneling to log in to your Jenkins instance!&quot; | sudo tee /usr/share/nginx/secure-jenkins/index.html&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
If restart fails or you cannot access your instance, check the error log: &lt;code&gt;cat /var/log/nginx/error.log&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;secure-your-jenkins-dashboard&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#secure-your-jenkins-dashboard&quot; /&gt;Secure your Jenkins dashboard&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you go to &lt;code&gt;http://&amp;lt;your domain name&amp;gt;:8080&lt;/code&gt; you’ll notice you can still
bypass the reverse proxy and access the Jenkins instance directly through an
unsecure channel. You can easily block all inbound requests on port 8080 on
Azure with a
&lt;a href=&quot;https://docs.microsoft.com/azure/virtual-network/virtual-networks-nsg&quot;&gt;Network
Security Group&lt;/a&gt; (NSG).&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;Create the NSG and add it to your existing network interface or to the subnet your Azure Virtual Machine is bound to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add 2 inbound security rules:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Allow requests to port 22 so you can SSH into the machine.&lt;/p&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/2017-04-20/nsg-ssh.png&quot; alt=&quot;nsg ssh&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Allow requests to port 80 so the reverse proxy can be reached&lt;/p&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/2017-04-20/nsg-http.png&quot; alt=&quot;nsg http&quot;&gt;
&lt;/img&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;
By default, all other external traffic will be blocked
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/2017-04-20/nsg-inbound.png&quot; alt=&quot;nsg inbound&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to &lt;code&gt;http://&amp;lt;your domain name&amp;gt;:8080&lt;/code&gt; and verify you cannot connect.&lt;/p&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;
If you don’t want to deploy an Azure Network Security Group, you can block port 8080 using the &lt;a href=&quot;https://help.ubuntu.com/stable/ubuntu-help/net-firewall-on-off.html&quot;&gt;Uncomplicated Firewall (ufw)&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;configure-read-only-access-to-your-dashboard&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-read-only-access-to-your-dashboard&quot; /&gt;Configure read-only access to your dashboard&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After installing Jenkins, the default security strategy is &#39;Logged-in users can do anything&#39;. If you want to allow read-only access to anonymous users, you need to set up Matrix-based security. In this example, we’ll set up a project-based authorization matrix, so that you can make certain projects private and others public.&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;Install the &lt;a href=&quot;https://plugins.jenkins.io/matrix-auth&quot;&gt;Matrix Authorization Strategy Plugin&lt;/a&gt; and restart Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;a href=&quot;http://localhost:8080/configureSecurity/&quot; class=&quot;bare&quot;&gt;http://localhost:8080/configureSecurity/&lt;/a&gt; (&#39;Configure Global Security&#39; page under &#39;Manage Jenkins&#39;) and select &#39;Project-base Matrix Authorization Strategy&#39; from the &#39;Authorization&#39; options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As an example, you can grant read-only access to anonymous users (Overall/Read, Job/Discover and Job/Read should be enough) and grant all logged in users full access in a  group called &#39;authenticated&#39;:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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/2017-04-20/auth-matrix.png&quot; alt=&quot;auth matrix&quot; width=&quot;1000&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;connect-jnlp-based-agents&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#connect-jnlp-based-agents&quot; /&gt;Connect JNLP-based agents&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since your Jenkins instance is only accessible through the reverse proxy on port 80, any Jenkins agents that use the JNLP protocol will not be able to register to the controller anymore. To overcome this problem, all agents must be in the same virtual network as the Jenkins controller and must connect using their private IP (by default, the NSG allows all internal traffic).&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;Make sure that the Jenkins virtual machine will always be assigned the same private IP by going to the &lt;a href=&quot;https://portal.azure.com/&quot;&gt;Azure Portal&lt;/a&gt;, opening the Network Interface of your virtual machine, opening &#39;IP configuration&#39;, and clicking on the configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure the Private IP has a static assignment and restart the virtual machine if necessary.&lt;/p&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/2017-04-20/private-ip.png&quot; alt=&quot;private ip&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Copy the static IP Address and go to &lt;a href=&quot;http://localhost:8080/configure&quot; class=&quot;bare&quot;&gt;http://localhost:8080/configure&lt;/a&gt; (&#39;Configure System&#39; page under &#39;Manage Jenkins&#39;) and update the &#39;Jenkins URL&#39; to point to that private IP (&lt;code&gt;https://10.0.0.5:8080/&lt;/code&gt; in this example)&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now agents can communicate through JNLP. If you want to streamline the process,
you can use the
&lt;a href=&quot;https://plugins.jenkins.io/azure-vm-agents&quot;&gt;Azure VM Agents&lt;/a&gt; plugin,
which automatically deploys agents in the same virtual network
and connects them to the controller.&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/2017/04/18/continuousdelivery-devops-sonarqube/</id>
<title>Delivery Pipelines, with Jenkins 2, SonarQube, and Artifactory</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/18/continuousdelivery-devops-sonarqube/" />
<author>
<name>michaelhuettermann</name>
</author>
<category term='quality'></category>
<category term='sonarqube'></category>
<category term='jenkins'></category>
<category term='artifactory'></category>
<summary>
This is a guest post by Michael Hüttermann. Michael is an expert
in Continuous Delivery, DevOps and SCM/ALM. More information about him at huettermann.net, or
follow him on Twitter: @huettermann.






Continuous Delivery and DevOps are well known and widely spread practices nowadays. It is commonly accepted that it
is crucial to form great teams and define shared goals first and then choose and integrate the tools fitting best to
given tasks. Often it is a mashup of lightweight tools, which are integrated to build up Continuous Delivery pipelines
and underpin DevOps initiatives. In this blog post, we zoom in to an important part of the overall...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/michaelhuettermann&quot;&gt;Michael Hüttermann&lt;/a&gt;. Michael is an expert
in Continuous Delivery, DevOps and SCM/ALM. More information about him at &lt;a href=&quot;http://huettermann.net&quot;&gt;huettermann.net&lt;/a&gt;, or
follow him on Twitter: &lt;a href=&quot;https://twitter.com/huettermann&quot;&gt;@huettermann&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Continuous Delivery and DevOps are well known and widely spread practices nowadays. It is commonly accepted that it
is crucial to form great teams and define shared goals first and then choose and integrate the tools fitting best to
given tasks. Often it is a mashup of lightweight tools, which are integrated to build up Continuous Delivery pipelines
and underpin DevOps initiatives. In this blog post, we zoom in to an important part of the overall pipeline, that is the discipline
often called &lt;em&gt;Continuous Inspection&lt;/em&gt;, which comprises inspecting code and injecting a quality gate on that, and show how artifacts can
be uploaded after the quality gate was met. DevOps enabler tools covered are Jenkins, SonarQube, and Artifactory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-use-case&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-use-case&quot; /&gt;The Use Case&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You already know that quality cannot be injected after the fact, rather it should be part of the process and product from the very beginning.
As a commonly used good practice, it is strongly recommended to inspect the code and make findings visible, as soon as possible.
For that &lt;a href=&quot;https://www.sonarqube.com&quot;&gt;SonarQube&lt;/a&gt; is a great choice. But SonarQube is not just running on any isolated
island, it is integrated in a Delivery Pipeline. As part of the pipeline, the code is inspected, and only if the code is fine according to defined
requirements, in other words: it meets the quality gates, the built artifacts are uploaded to the binary repository manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s consider the following scenario. One of the busy developers has to fix code, and checks in changes to the central
version control system. The day was long and the night short, and against all team commitments the developer
did not check the quality of the code in the local sandbox. Luckily, there is the build engine &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;Jenkins&lt;/a&gt;
which serves as a single point of truth, implementing the Delivery Pipeline with its native pipeline features, and as a handy coincidence
SonarQube has support for Jenkins pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The change triggers a new run of the pipeline. Oh no! The build pipeline broke, and the change is not further processed.
In the following image you see that a defined quality gate was missed. The visualizing is done with Jenkins Blue Ocean.&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/sonarqube-jenkins/01_PipelineFailedBlueOcean.png&quot; alt=&quot;01 PipelineFailedBlueOcean&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;sonarqube-inspection&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sonarqube-inspection&quot; /&gt;SonarQube inspection&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What is the underlying issue? We can open the SonarQube web application and drill down to the finding. In the Java code, obviously a string literal is not placed on the right side.&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/sonarqube-jenkins/02_Finding.png&quot; alt=&quot;02 Finding&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During a team meeting it was decided to define this to be a &lt;em&gt;Blocker&lt;/em&gt;, and SonarQube was configured accordingly. Furthermore, a SonarQube quality gate was created to break any build, if a &lt;em&gt;blocker&lt;/em&gt; was identified. Let’s now quickly look into the code.
Yes, SonarQube is right, there is the issue with the following code snippet.&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/sonarqube-jenkins/03_FindingVisualizedInCode.png&quot; alt=&quot;03 FindingVisualizedInCode&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We do not want to discuss in detail all used tools, and also covering the complete Jenkins build job would be out of scope.
But the interesting extract here in regard of the inspection is the following &lt;em&gt;stage&lt;/em&gt; defined in Jenkins pipeline DSL:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;config.xml: SonarQube inspection&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    stage(&#39;SonarQube analysis&#39;) { &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
        withSonarQubeEnv(&#39;Sonar&#39;) { &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
          sh &#39;mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.3.0.603:sonar &#39; + &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;
          &#39;-f all/pom.xml &#39; +
          &#39;-Dsonar.projectKey=com.huettermann:all:master &#39; +
          &#39;-Dsonar.login=$SONAR_UN &#39; +
          &#39;-Dsonar.password=$SONAR_PW &#39; +
          &#39;-Dsonar.language=java &#39; +
          &#39;-Dsonar.sources=. &#39; +
          &#39;-Dsonar.tests=. &#39; +
          &#39;-Dsonar.test.inclusions=**/*Test*/** &#39; +
          &#39;-Dsonar.exclusions=**/*Test*/**&#39;
        }
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The dedicated stage for running the SonarQube analysis.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Allow to select the SonarQube server you want to interact with.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Running and configuring the scanner, many options available, check the docs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many options are available to integrate and configure SonarQube. Please consult the documentation for alternatives. Same applies to the other covered tools.&lt;/p&gt;
&lt;/div&gt;
&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;sonarqube-quality-gate&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sonarqube-quality-gate&quot; /&gt;SonarQube Quality Gate&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As part of a Jenkins pipeline stage, SonarQube is configured to run and inspect the code. But this is just the first part,
because we now also want to add the quality gate in order to break the build. The next stage is covering exactly that, see
next snippet. The pipeline is paused until the quality gate is computed, specifically the &lt;em&gt;waitForQualityGate&lt;/em&gt; step will pause the
pipeline until SonarQube analysis is completed and returns the quality gate status. In case a quality gate was missed, the build breaks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;config.xml: SonarQube Quality Gate&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    stage(&quot;SonarQube Quality Gate&quot;) { &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
        timeout(time: 1, unit: &#39;HOURS&#39;) { &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
           def qg = waitForQualityGate() &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;
           if (qg.status != &#39;OK&#39;) {
             error &quot;Pipeline aborted due to quality gate failure: ${qg.status}&quot;
           }
        }
    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The defined quality gate stage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A timeout to define when to proceed without waiting for any results for ever.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Here we wait for the OK. Underlying implementation is done with SonarQube’s &lt;em&gt;webhooks&lt;/em&gt; feature.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;This blog post is an appetizer, and scripts are excerpts. For more information, please consult the respective documentation, or a good book, or the great community, or ask your local expert.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since they all work in a wonderful Agile team, the next available colleague just promptly fixes the issue. After checking in
the fixed code, the build pipeline runs again.&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/sonarqube-jenkins/04_PipelineFixedBlueOcean.png&quot; alt=&quot;04 PipelineFixedBlueOcean&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The pipeline was processed successfully, including the SonarQube quality gate, and as the final step, the packaged and tested artifact was
deployed to &lt;a href=&quot;https://www.jfrog.org/artifactory&quot;&gt;Artifactory&lt;/a&gt;. There are a couple of different flexible ways how to upload the artifacts,
the one we use here is using an upload spec to actually collect and upload the artifact which was built at the very beginning of the pipeline.
Also meta information are published to Artifactory, since it is the context which matters and thus we can add valuable labels to the artifact for further processing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;config.xml: Upload to Artifactory&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;stage (&#39;Distribute binaries&#39;) { &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
    def SERVER_ID = &#39;4711&#39; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
    def server = Artifactory.server SERVER_ID
    def uploadSpec = &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;
    &quot;&quot;&quot;
    {
    &quot;files&quot;: [
        {
            &quot;pattern&quot;: &quot;all/target/all-(*).war&quot;,
            &quot;target&quot;: &quot;libs-snapshots-local/com/huettermann/web/{1}/&quot;
        }
      ]
    }
    &quot;&quot;&quot;
    def buildInfo = Artifactory.newBuildInfo() &lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;
    buildInfo.env.capture = true &lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;(5)&lt;/b&gt;
    buildInfo=server.upload(uploadSpec) &lt;i class=&quot;conum&quot; data-value=&quot;6&quot; /&gt;&lt;b&gt;(6)&lt;/b&gt;
    server.publishBuildInfo(buildInfo) &lt;i class=&quot;conum&quot; data-value=&quot;7&quot; /&gt;&lt;b&gt;(7)&lt;/b&gt;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The stage responsible for uploading the binary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The server can be defined Jenkins wide, or as part of the build step, as done here.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;In the upload spec, in JSON format, we define what to deploy to which target, in a fine-grained way.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The build info contains meta information attached to the artifact.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;We want to capture environmental data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;6&quot; /&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Upload of artifact, according to upload spec.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;7&quot; /&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Build info are published as well.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now let’s see check that the binary was deployed to Artifactory, successfully. As part of the context information, also a reference to the
producing Jenkins build job is available for better traceability.&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/sonarqube-jenkins/05_BinaryDeployedInArtifactory.png&quot; alt=&quot;05 BinaryDeployedInArtifactory&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary&quot; /&gt;Summary&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post, we’ve discovered tips and tricks to integrate Jenkins with SonarQube, how to define
Jenkins stages with the Jenkins pipeline DSL, how those stages are visualized with Jenkins Blue Ocean, and how the artifact
was deployed to our binary repository manager Artifactory.
Now I wish you a lot of further fun with your great tools of choice to implement your Continuous Delivery pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&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/&quot;&gt;Jenkins 2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sonarqube.org/&quot;&gt;Sonarqube&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/SonarQube+plugin&quot;&gt;Sonarqube Jenkins plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jfrog.com/artifactory/&quot;&gt;Artifactory&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Artifactory+Plugin&quot;&gt;Jenkins Artifactory plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://huettermann.net/devops/&quot;&gt;&#39;DevOps for Developers&#39;, Apress, 2012&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://huettermann.net/alm/&quot;&gt;&#39;Agile ALM&#39;, Manning, 2011&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/04/12/welcome-to-blue-ocean-dashboard/</id>
<title>Getting Started with the Blue Ocean Dashboard</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/12/welcome-to-blue-ocean-dashboard/" />
<author>
<name>lnewman</name>
</author>
<category term='blueocean'></category>
<category term='ux'></category>
<category term='pipeline'></category>
<category term='tutorial'></category>
<category term='screencast'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Blue Ocean is a new user experience for Jenkins,
and version 1.0 is now live!
Blue Ocean makes Jenkins, and continuous delivery, approachable to all team members.
In my previous post,
I used the Blue Ocean Activity View to track the state of branches and
Pull Requests in one project.
In this video, I&#8217;ll use the Blue Ocean Dashboard get a personalized view of the
areas that of my project that are most important to me,
and also to monitor multiple projects.
Please Enjoy!...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is a new user experience for Jenkins,
and version 1.0 is now live!
Blue Ocean makes Jenkins, and continuous delivery, approachable to all team members.
In my &lt;a href=&quot;https://www.jenkins.io/blog/2017/04/11/welcome-to-blue-ocean-pipeline-activity&quot;&gt;previous post&lt;/a&gt;,
I used the Blue Ocean Activity View to track the state of branches and
Pull Requests in one project.
In this video, I’ll use the Blue Ocean Dashboard get a personalized view of the
areas that of my project that are most important to me,
and also to monitor multiple projects.
Please Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;https://www.youtube-nocookie.com/embed/sm1jLj5lbwk&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;
&lt;/iframe&gt;
&lt;/center&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/04/12/jenkinsworld-agenda-announced/</id>
<title>Jenkins World 2017 Agenda is Live!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/12/jenkinsworld-agenda-announced/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2017'></category>
<summary>
This is a guest post by Alyssa Tong, who runs
the Jenkins Area Meetup program and is also responsible for
Marketing &amp; Community Programs at CloudBees, Inc.






I am excited to announce the agenda for
Jenkins World 2017. This
year’s event promises to have something for everyone - whether you are a
novice, intermediate, or advanced user&#8230;&#8203;you are covered.  Jenkins World 2017
consists of 6 tracks, 60+ Jenkins and DevOps sessions, 40+ industry speakers,
16+ training and workshops.





Here is a sneak peek at Jenkins World 2017:


Show 'n Tell

It’s all about that demo. These sessions are technically advanced with some code sharing, heavy on demos and just a...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;, who runs
the &lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;Jenkins Area Meetup&lt;/a&gt; program and is also responsible for
Marketing &amp;amp; Community Programs at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am excited to announce the agenda for
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2017&lt;/a&gt;. This
year’s event promises to have something for everyone - whether you are a
novice, intermediate, or advanced user…​you are covered.  Jenkins World 2017
consists of 6 tracks, 60+ Jenkins and DevOps sessions, 40+ industry speakers,
16+ training and workshops.&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/jenkinsworld2017/jenkinsworld-shutterfly-speaking.png&quot; alt=&quot;jenkinsworld shutterfly speaking&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is a sneak peek at Jenkins World 2017:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;show-n-tell&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#show-n-tell&quot; /&gt;Show &#39;n Tell&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;It’s all about that demo. These sessions are technically advanced with some code sharing, heavy on demos and just a tad bit of slides.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Plugin Development for Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extending Blue Ocean&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to Use Jenkins Less: How and Why You Can Minimize Your Jenkins Footprint&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Pipeline on your Local Box to Reduce Cycle Time&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/jenkinsworld2017/brian_tweet.png&quot; alt=&quot;brian tweet&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;war-stories&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#war-stories&quot; /&gt;War Stories&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;These are first-hand Jenkins experience and lessons learned. These stories will inspire your innovative solutions.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pipelines At Scale: How Big, How Fast, How Many?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JenkinsPipelineUnit: Test Your Continuous Delivery Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Codifying the Build and Release Process with a Jenkins Pipeline Shared Library&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jumping on the Continuous Delivery Bandwagon: From 100+ FreeStyle Jobs to Pipeline(s) - Tactics, Pitfalls and Woes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/jenkinsworld2017/james_tweet.png&quot; alt=&quot;james tweet&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;trainings-and-workshops&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#trainings-and-workshops&quot; /&gt;Trainings and Workshops&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;(additional fees apply to certain trainings/workshops)&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Introduction to Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Introduction to Plugin Development&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let’s Build a Jenkins Pipeline!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fundamentals of Jenkins and Docker&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins World &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/schedule&quot;&gt;agenda&lt;/a&gt; is packed
with even more sessions, it will be a very informational event.&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/jenkinsworld2017/saldin_tweet.png&quot; alt=&quot;saldin tweet&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;convince-your-boss&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#convince-your-boss&quot; /&gt;Convince your Boss&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We know that attending Jenkins World needs little convincing but just in case
you need a little help to justify your attendance, we’ve created a
&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/jenkinsworld2017convinceyourboss.pdf&quot;&gt;Justify your Trip&lt;/a&gt;
document to help speed up the process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World
2017&lt;/a&gt; with the code &lt;code&gt;JWATONG&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hope to see you there!&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/2017/04/11/welcome-to-blue-ocean-pipeline-activity/</id>
<title>Getting Started with Blue Ocean&#39;s Activity View</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/11/welcome-to-blue-ocean-pipeline-activity/" />
<author>
<name>lnewman</name>
</author>
<category term='blueocean'></category>
<category term='ux'></category>
<category term='pipeline'></category>
<category term='tutorial'></category>
<category term='screencast'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Blue Ocean is a new user experience for Jenkins,
and version 1.0 is now live!
Blue Ocean makes Jenkins, and continuous delivery, approachable to all team members.
In my previous post,
I showed how easy it is to create and edit Declarative Pipelines using the Blue Ocean Visual Pipeline Editor.
In this video, I&#8217;ll use the Blue Ocean Activity View to track the
state of branches and Pull Requests in one project.
Blue Ocean makes it so much easier to find the logs I need to triage failures.


Please Enjoy!  In my
next video,
I&#8217;ll switch from looking at...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is a new user experience for Jenkins,
and version 1.0 is now live!
Blue Ocean makes Jenkins, and continuous delivery, approachable to all team members.
In my &lt;a href=&quot;https://www.jenkins.io/blog/2017/04/06/welcome-to-blue-ocean-editor&quot;&gt;previous post&lt;/a&gt;,
I showed how easy it is to create and edit Declarative Pipelines using the Blue Ocean Visual Pipeline Editor.
In this video, I’ll use the Blue Ocean Activity View to track the
state of branches and Pull Requests in one project.
Blue Ocean makes it so much easier to find the logs I need to triage failures.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please Enjoy!  In my
&lt;a href=&quot;https://www.jenkins.io/blog/2017/04/12/welcome-to-blue-ocean-dashboard&quot;&gt;next video&lt;/a&gt;,
I’ll switch from looking at a single project to monitoring multiple projects with
the Blue Ocean Dashboard.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;https://www.youtube-nocookie.com/embed/ZJZW0j2eTQY&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;
&lt;/iframe&gt;
&lt;/center&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/04/11/new-cli/</id>
<title>New, safer CLI in 2.54</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/11/new-cli/" />
<author>
<name>daniel-beck</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<category term='remoting'></category>
<summary>
In response to the zero-day vulnerability we fixed in November, I wrote the following:




Moving forward, the Jenkins security team is revisiting the design of the Jenkins CLI over the coming weeks to prevent this class of vulnerability in the future.
If you are interested in participating in that discussion, please join in on the jenkinsci-dev@ mailing list.




In early February, several project contributors met after FOSDEM for a one day hackathon.
I looked into the feasibility of a purely SSH-based CLI.
While I considered the experiment to be a success, it was far from ready to be used in a production environment.


A few weeks...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In response to the &lt;a href=&quot;https://www.jenkins.io/blog/2016/11/16/security-updates-addressing-zero-day/&quot;&gt;zero-day vulnerability we fixed in November&lt;/a&gt;, I wrote the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Moving forward, the Jenkins security team is revisiting the design of the Jenkins CLI over the coming weeks to prevent this class of vulnerability in the future.
If you are interested in participating in that discussion, please join in on the jenkinsci-dev@ mailing list.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In early February, several &lt;a href=&quot;https://www.jenkins.io/blog/2017/03/16/fosdem-event-report&quot;&gt;project contributors met after FOSDEM for a one day hackathon&lt;/a&gt;.
I looked into the feasibility of a purely SSH-based CLI.
While I considered &lt;a href=&quot;https://github.com/daniel-beck/jenkins-ssh-cli&quot;&gt;the experiment&lt;/a&gt; to be a success, it was far from ready to be used in a production environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few weeks later, long-time contributor and Jenkins security team member &lt;a href=&quot;https://github.com/jglick/&quot;&gt;Jesse Glick&lt;/a&gt; &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/ijnIr8LhBG0/CrdANP8eEAAJ&quot;&gt;took over&lt;/a&gt;, and &lt;a href=&quot;https://gist.github.com/jglick/9721427da892a9b2f75dc5bc09f8e6b3&quot;&gt;published a detailed proposal for a new, simple CLI protocol without remoting&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In just a month, he implemented his proposal, and I’m very happy to announce that this new implementation of the Jenkins CLI has now made it into 2.54!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Existing &lt;code&gt;jenkins-cli.jar&lt;/code&gt; clients should continue working as before, unless an administrator disables the remoting connection mode in &lt;em&gt;Configure Global Security&lt;/em&gt;.
That said, we recommend you download the new &lt;code&gt;jenkins-cli.jar&lt;/code&gt; in Jenkins, and use its new &lt;code&gt;-http&lt;/code&gt; mode.
With few (now deprecated) exceptions, CLI commands work like before.
This will allow you to disable the remoting mode for the CLI on the Jenkins controller to prevent similar vulnerabilities in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;SSH-based CLI use should be unaffected by this change.
Note that new Jenkins instances now start with the SSH server port disabled, and the configuration option for that was moved into &lt;em&gt;Configure Global Security&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can learn all about the CLI and its new behavior in &lt;a href=&quot;https://www.jenkins.io/doc/book/managing/cli&quot;&gt;the Jenkins handbook&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/04/10/security-advisory/</id>
<title>Important Scripting-related Security Advisory</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/10/security-advisory/" />
<author>
<name>daniel-beck</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<summary>
These are not security fixes you can apply blindly. We strongly recommend you read this post, as well as the security advisory to understand what the vulnerabilities are, whether and how they affect you, and what to expect when upgrading plugins.





Multiple Jenkins plugins received updates today that fix several security vulnerabilities or other security-related issues:




Email Extension (Email-ext)


Environment Injector (EnvInject)


Extensible Choice Parameter


Groovy


Job DSL


Lockable Resources


Matrix Authorization


Role Strategy


Warnings




We also included some plugins that received security fixes in the past that haven&#8217;t been mentioned in a security advisory before:




Active Choices (uno-choice)


Extended Choice Parameter


Groovy Postbuild


Groovy Label Assignment




Additionally, we included other plugins in the advisory that...
</summary>
<content type='html'>
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
These are not security fixes you can apply blindly. We strongly recommend you read this post, as well as the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-04-10/&quot;&gt;security advisory&lt;/a&gt; to understand what the vulnerabilities are, whether and how they affect you, and what to expect when upgrading plugins.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Multiple Jenkins plugins received updates today that fix several security vulnerabilities or other security-related issues:&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/email-ext&quot;&gt;Email Extension (Email-ext)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/envinject&quot;&gt;Environment Injector (EnvInject)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/extensible-choice-parameter&quot;&gt;Extensible Choice Parameter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/groovy&quot;&gt;Groovy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/job-dsl&quot;&gt;Job DSL&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/lockable-resources&quot;&gt;Lockable Resources&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/matrix-auth&quot;&gt;Matrix Authorization&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/role-strategy&quot;&gt;Role Strategy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/warnings&quot;&gt;Warnings&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;We also included some plugins that received security fixes in the past that haven’t been mentioned in a security advisory before:&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://wiki.jenkins.io/display/JENKINS/Active+Choices+Plugin&quot;&gt;Active Choices (uno-choice)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/extended-choice-parameter&quot;&gt;Extended Choice Parameter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/groovy-postbuild&quot;&gt;Groovy Postbuild&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/groovy-label-assignment&quot;&gt;Groovy Label Assignment&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, we included other plugins in the advisory that are not getting updated today, but whose vulnerabilities are similar to those of plugins getting fixed.
In total, over 30 plugins are part of the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-04-10/&quot;&gt;advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While there are fixes for other vulnerabilities as well, the majority of the advisory (and the rest of this blog post) is about arbitrary code execution vulnerabilities in Jenkins plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;background&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#background&quot; /&gt;Background&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins administrators have long been able to use the Groovy script console and related functionality to execute arbitrary code in Jenkins for diagnostic or otherwise administrative purposes.
Rather than having to rely on plugins implementing the desired functionality, experienced Jenkins admins were able to run a number of scripts as needed to implement various administrative features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This bled over into plugins:
It’s just &lt;em&gt;easy&lt;/em&gt; for a plugin developer to build on top of Groovy and let the users figure out exactly what they want to do.
Unfortunately, for a long time, there was no technology in Jenkins to limit what could be done in Groovy scripts, so anywhere Groovy would be executed, arbitrary code could be executed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We were treating this as a security issue for the first time in the fix for SECURITY-125, about two years ago, something that first required splitting off the Matrix Project type from core into a plugin, and making use of &lt;a href=&quot;https://plugins.jenkins.io/script-security&quot;&gt;Script Security Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, other plugins weren’t integrating with Script Security plugin.
And even diligent administrators who understand the problem of arbitrary code execution via Groovy scripts may not be able to tell whether a given plugin is affected:
In some cases, you’d need to dive into the source code to see whether, and how, it uses Groovy in a way that can be exploited by regular users to perform actions they otherwise wouldn’t be allowed to do.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-the-advisory&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-the-advisory&quot; /&gt;About the advisory&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Broadly speaking, there are three levels of severity for scripting related vulnerabilities in Jenkins:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The lowest severity ones are those that confuse &lt;em&gt;Overall/Administer&lt;/em&gt; and &lt;em&gt;Overall/Run Scripts&lt;/em&gt; permissions.
These are irrelevant for most Jenkins instances.
More on that later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The next level up are vulnerabilities that effectively grant the ability to run arbitrary scripts to users who are able to configure jobs.
While these users aren’t administrators, they have a nontrivial level of permissions, so are &lt;em&gt;somewhat&lt;/em&gt; trusted.
This is often a difficult configuration to adequately secure, but it’s a supported configuration, and any plugin that undermines the security of this configuration will be treated as having a vulnerability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The most severe ones are those that require little or no access to Jenkins to successfully exploit.
This typically does require the &lt;em&gt;Overall/Read&lt;/em&gt; permission to access certain endpoints, but Pipeline as Code may allow people with SCM commit access to exploit scripting related weaknesses as well.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Arbitrary code execution is a serious enough issue that publishing a security advisory for just a few plugins would actually be detrimental to overall security:
Malicious users would be able to review the fixes we do publish, and try to find other plugins affected by a similar vulnerability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-04-10/&quot;&gt;The advisory issued today&lt;/a&gt; lists all plugins we could find that implement any arbitrary code execution vulnerability (i.e. all three levels described above).
As this affects over 30 plugins, many of them not actively maintained, the problem exceeds the capacity of the Jenkins security team to address them all.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For that reason, &lt;a href=&quot;https://www.jenkins.io/security&quot;&gt;the Jenkins security team&lt;/a&gt; decided that we would fix as many of the plugins as we can handle, and leaving the others to their maintainers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-proceed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-proceed&quot; /&gt;How to proceed&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We strongly advise administrators to review the list of affected plugins in the advisory, and look for any plugins that are installed on their instances.
It is very likely there’s at least one plugin installed that is affected by this.
If you’re on Jenkins 2.40 or newer, or Jenkins LTS 2.32.2 or newer, a warning will appear that informs you about vulnerable plugins you currently have installed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you’ve determined which plugins you use are included in the advisory, you need to determine whether it is something that affects your particular setup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If the vulnerability confuses &lt;em&gt;Overall/Administer&lt;/em&gt; and &lt;em&gt;Overall/Run Scripts&lt;/em&gt;, but all administrators of your Jenkins instance are able to run scripts anyway, this vulnerability is not a problem for you.
This is the case in the vast majority of Jenkins instances.
Only custom setups, typically to allow for hosted Jenkins services, don’t grant &lt;em&gt;Overall/Run Scripts&lt;/em&gt; permission to administrators.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the vulnerability allows users with the permission to e.g. configure jobs to execute arbitrary code, it is only a problem if there are users that have the lower permission (e.g. &lt;em&gt;Item/Configure&lt;/em&gt;) but not the higher (&lt;em&gt;Overall/Run Scripts&lt;/em&gt;).
Simple authorization strategies like &lt;em&gt;Logged in users can do anything&lt;/em&gt; are therefore not affected by this issue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Even vulnerabilities that require no notable permissions in Jenkins may have prerequisites to be exploitable.
For example, &lt;em&gt;Overall/Read&lt;/em&gt; access may be required, but only granted to users who are also administrators, or in Pipeline as Code setups, everyone with SCM commit access may also be a Jenkins administrator.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The above should guide your decision how urgently you should upgrade affected plugins with a fix, or disable affected plugins without a fix.
Remember that you may decide in the future to reconfigure Jenkins in a way that makes previously irrelevant permission distinctions a huge problem, so it is not a good idea to continue using vulnerable plugin versions indefinitely.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After deciding to upgrade a plugin, review the advisory and the plugin documentation for information about the migration.
The scripts provided in &lt;a href=&quot;https://github.com/jenkinsci-cert/security-advisory-2017-04-10&quot;&gt;this GitHub repository&lt;/a&gt; may help you in determining whether you’re using affected features.
If you’re not using any of the affected features, it’s likely that there won’t be any problems and you can just upgrade.
If you are using affected features, you should carefully read the documentation on how the upgrade works: Affected plugin features may effectively be disabled until an administrator approves the scripts in use, potentially resulting in build failures.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;distributing-vulnerable-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#distributing-vulnerable-plugins&quot; /&gt;Distributing vulnerable plugins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, there’s the issue of distribution:
The Jenkins project historically has performed little to no oversight over the plugins that are being published.
This is a direct consequence of the &lt;a href=&quot;https://www.jenkins.io/project/governance&quot;&gt;governance document&lt;/a&gt;, which gives plugin maintainers a lot of control over their plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That said, in exceptional circumstances, the Jenkins project can, and should, protect its users:
If a plugin maintainer were to upload a clearly malicious plugin, we wouldn’t stand by the side and continue distributing it.
In the case of plugins with known (unintended) vulnerabilities, this obviously becomes more difficult.
This has been &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/NaAqqChOVmY/BvA_TuzjAQAJ&quot;&gt;discussed in the abstract a while back&lt;/a&gt; on the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-dev mailing list&lt;/a&gt;, and the majority of participants in that discussion agreed that we should suspend distribution of vulnerable plugins if the security team doesn’t have the capacity to address the problem, and the vulnerability would remain unfixed otherwise.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We decided to temporarily suspend distribution of plugins via the Jenkins project update sites if they allow users with lower privileges (no &lt;em&gt;Overall/Administer&lt;/em&gt;) to execute arbitrary code.
Users who really need to download these plugins can do so via our &lt;a href=&quot;https://repo.jenkins-ci.org/&quot;&gt;Artifactory Maven repository&lt;/a&gt;.
Once an affected plugin receives a fix, we’d of course resume distribution via the update sites.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Plugins that mistake &lt;em&gt;Overall/Administer&lt;/em&gt; and &lt;em&gt;Overall/Run Scripts&lt;/em&gt; continue being distributed, albeit with &lt;a href=&quot;https://www.jenkins.io/blog/2017/01/10/security-warnings/&quot;&gt;a warning shown to Jenkins administrators&lt;/a&gt;, as the setup required for this to make a difference is pretty rare.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, we were unable to adequately inform all plugin maintainers before publication of the advisory, so there are several plugins with fewer than 500 installations that are actively maintained but whose maintainers we didn’t contact prior to this advisory.
For that, I am really sorry, and can only ask for understanding from the maintainers of affected plugins.
The number of affected plugins and the coordination and review required simply exceeded our capabilities.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/04/10/jenkins-has-upgraded-to-java-8/</id>
<title>Starting with 2.54, Jenkins now requires Java 8</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/10/jenkins-has-upgraded-to-java-8/" />
<author>
<name>batmat</name>
</author>
<category term='java8'></category>
<summary>
We announced in January
that Jenkins would be upgrading its Java runtime dependency to Java 8 this
year. After a sizable amount of preparation, this week&#8217;s release of
Jenkins 2.54 is the first weekly release to require
a Java 8 runtime.


For users of the weekly release, this means that Jenkins 2.54 must have
a Java 8 runtime installed on the system in order to
run. Those using the
jenkinsci/jenkins:latest
Docker container won&#8217;t need to take any action, as the Java runtime environment
is already bundled in the container.


In addition to upgrading the Java Runtime Environment for the controller, any
connected agents must upgrade to a Java 8 runtime environment.


The Long-Term...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We &lt;a href=&quot;https://www.jenkins.io/blog/2017/01/17/Jenkins-is-upgrading-to-Java-8/&quot;&gt;announced in January&lt;/a&gt;
that Jenkins would be upgrading its Java runtime dependency to Java 8 this
year. After a sizable amount of preparation, this week’s release of
&lt;a href=&quot;https://www.jenkins.io/changelog/#v2.54&quot;&gt;Jenkins &lt;strong&gt;2.54&lt;/strong&gt;&lt;/a&gt; is the first weekly release to require
a Java 8 runtime.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For users of the &lt;em&gt;weekly&lt;/em&gt; release, this means that Jenkins 2.54 &lt;strong&gt;must&lt;/strong&gt; have
a Java 8 runtime installed on the system in order to
run. Those using the
&lt;a href=&quot;https://hub.docker.com/r/jenkinsci/jenkins&quot;&gt;jenkinsci/jenkins:latest&lt;/a&gt;
Docker container won’t need to take any action, as the Java runtime environment
is already bundled in the container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to upgrading the Java Runtime Environment for the controller, any
connected &lt;strong&gt;agents&lt;/strong&gt; must upgrade to a Java 8 runtime environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/changelog-stable&quot;&gt;Long-Term Support&lt;/a&gt; (LTS) release line however, has
not yet been updated to require Java 8. We are expecting the first LTS release
to require Java 8 in June.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;compatibility-notes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#compatibility-notes&quot; /&gt;Compatibility Notes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Using the Maven project type with Java 7&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users with jobs configured with the &quot;Maven project&quot; type may not be able to use
Java 7 for their Maven jobs. The correct behavior is &lt;strong&gt;not guaranteed&lt;/strong&gt; so
proceed at your own risk. The Maven Project uses Jenkins Remoting to establish
&quot;interceptors&quot; within the Maven executable. Because of this, Maven uses
Remoting and other Jenkins core classes, and this behavior may break an update.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See also:
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40990&quot;&gt;JENKINS-40990&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Java 9 compatibility&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this point, Jenkins does not yet support Java 9 development releases.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As always, if you have questions please ask on the
&lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-users@ mailing list&lt;/a&gt; or
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/How+to+report+an+issue&quot;&gt;report
an issue&lt;/a&gt; in JIRA.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&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/blog/2016/11/22/what-jvm-versions-are-running-jenkins-the-return/&quot;&gt;JVM statistics post back in November 2016&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/17/Jenkins-is-upgrading-to-Java-8/&quot;&gt;Official announcement blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Original &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/27624&quot;&gt;JIRA ticket for this upgrade&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://groups.google.com/forum/?utm_medium=email&amp;amp;utm_source=footer#!msg/jenkinsci-dev/fo5nKLhZK5U/Zb9jHpBJBQAJ&quot;&gt;6 months, 82 messages, thread on the Jenkins developers mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://groups.google.com/forum/?utm_medium=email&amp;amp;utm_source=footer#!msg/jenkinsci-users/R6SGnW7MY6A/25MBJ9a2CQAJ&quot;&gt;announcement on the Jenkins users mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/2802&quot;&gt;Pull request on &lt;em&gt;Jenkins core&lt;/em&gt;&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/2017/04/06/welcome-to-blue-ocean-editor/</id>
<title>Getting Started with Blue Ocean&#39;s Visual Pipeline Editor</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/06/welcome-to-blue-ocean-editor/" />
<author>
<name>lnewman</name>
</author>
<category term='blueocean'></category>
<category term='ux'></category>
<category term='pipeline'></category>
<category term='tutorial'></category>
<category term='screencast'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Blue Ocean is a new user experience for Jenkins,
and version 1.0 is now live!
Blue Ocean makes Jenkins, and continuous delivery, approachable to all team members.
In my previous post,
I explained how to install Blue Ocean on your local Jenkins instance and switch to using Blue Ocean.
As promised, here&#8217;s a screencast that picks up where that post left off.
Starting from a clean Jenkins install, the video below will guide you through
creating and running your first Pipeline in Blue Ocean with the Visual Pipeline Editor.


Please Enjoy! In my next video, I&#8217;ll go over...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is a new user experience for Jenkins,
and version 1.0 is now live!
Blue Ocean makes Jenkins, and continuous delivery, approachable to all team members.
In my &lt;a href=&quot;https://www.jenkins.io/blog/2017/04/05/welcome-to-blue-ocean&quot;&gt;previous post&lt;/a&gt;,
I explained how to install Blue Ocean on your local Jenkins instance and switch to using Blue Ocean.
As promised, here’s a screencast that picks up where that post left off.
Starting from a clean Jenkins install, the video below will guide you through
creating and running your first Pipeline in Blue Ocean with the Visual Pipeline Editor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please Enjoy! In my next video, I’ll go over the
&lt;a href=&quot;https://www.jenkins.io/blog/2017/04/11/welcome-to-blue-ocean-pipeline-activity&quot;&gt;Blue Ocean Pipeline Activity View&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;https://www.youtube-nocookie.com/embed/5Nct-jrZBbM&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;
&lt;/iframe&gt;
&lt;/center&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/04/05/welcome-to-blue-ocean/</id>
<title>Getting Started with Blue Ocean</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/05/welcome-to-blue-ocean/" />
<author>
<name>lnewman</name>
</author>
<category term='blueocean'></category>
<category term='ux'></category>
<category term='pipeline'></category>
<category term='tutorial'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Welcome to Blue Ocean 1.0!


In case you&#8217;ve been heads down on other projects
for the past 10 months,
Blue Ocean is a new user experience for Jenkins,
and version 1.0 was released today!
Blue Ocean makes Jenkins, and continuous delivery, approachable to all team members.
I&#8217;ve been working with it for the past several months, and I can tell you it is amazing.
I wish all the interactions with Jenkins were as easy as this:









10 minutes to Blue Ocean


Blue Ocean is simple to install and will work on basically any Jenkins 2 instance (version 2.7 or...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;welcome-to-blue-ocean-1-0&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#welcome-to-blue-ocean-1-0&quot; /&gt;Welcome to Blue Ocean 1.0!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In case you’ve been heads down on other projects
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/26/introducing-blue-ocean/&quot;&gt;for the past 10 months&lt;/a&gt;,
Blue Ocean is a new user experience for Jenkins,
and version 1.0 was released today!
Blue Ocean makes Jenkins, and continuous delivery, approachable to all team members.
I’ve been working with it for the past several months, and I can tell you it is amazing.
I wish all the interactions with Jenkins were as easy as this:&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/doc/book/resources/blueocean/intro/new-pipeline-box.png&quot; alt=&quot;It’s time to create your first Pipeline!&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;10-minutes-to-blue-ocean&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#10-minutes-to-blue-ocean&quot; /&gt;10 minutes to Blue Ocean&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is simple to install and will work on basically any Jenkins 2 instance (version 2.7 or later).
Even better, it runs side-by-side with the existing Jenkins web UI -
you can switch back and forth between them whenever you like.
There’s really no risk.
If you have a Jenkins instance and a good network connection,
in 10 minutes you could be using Blue Ocean.&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;Login to your Jenkins server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Manage Jenkins&lt;/strong&gt; in the sidebar then &lt;strong&gt;Manage Plugins&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose the &lt;strong&gt;Available&lt;/strong&gt; tab and use the search bar to find &lt;strong&gt;Blue Ocean&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click the checkbox in the Install column&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click either &lt;strong&gt;Install without restart&lt;/strong&gt; or &lt;strong&gt;Download now and install after
restart&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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/doc/book/resources/blueocean/intro/blueocean-plugins-filtered.png&quot; alt=&quot;Installing Blue Ocean&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After you install Blue Ocean, you can start using it
by clicking on &lt;strong&gt;Open Blue Ocean&lt;/strong&gt; in the navigation bar of the
Jenkins web UI, or you can navigate directly to Blue Ocean by adding
&lt;code&gt;/blue&lt;/code&gt; to your Jenkins URL, for example &lt;code&gt;&lt;a href=&quot;https://ci.jenkins.io/blue&quot; class=&quot;bare&quot;&gt;https://ci.jenkins.io/blue&lt;/a&gt;&lt;/code&gt;.&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/doc/book/resources/blueocean/intro/open-blue-ocean-link.png&quot; alt=&quot;Opening Blue Ocean&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have to go back to the &quot;classic&quot; Jenkins UI,
there’s an &quot;exit&quot; icon located at the top of every page in Blue Ocean.&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/doc/book/resources/blueocean/intro/go-to-classic-icon.png&quot; alt=&quot;Returning to the &amp;quot;classic&amp;quot; web UI&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dive-in&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dive-in&quot; /&gt;Dive in!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s it! You now have a working Blue Ocean installation.
Take a look around at your Pipelines and activity, or try creating a new Pipeline.
I think you’ll be pleasantly surprised at how intuitive and helpful Blue Ocean can be.
Blue Ocean is so cool, I never want to leave it.
Over the next few days, I’ll be publishing a series of videos,
showing some common Jenkins use cases and how Blue Ocean makes them clearer and easier than ever before.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay Tuned!&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/2017/04/05/say-hello-blueocean-1-0/</id>
<title>Say hello to Blue Ocean 1.0</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-04-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/04/05/say-hello-blueocean-1-0/" />
<author>
<name>i386</name>
</author>
<category term='blueocean'></category>
<category term='ux'></category>
<category term='pipeline'></category>
<summary>
Back in May 2016 we announced our intent
to rethink the Jenkins User experience with the Blue Ocean project and today
the Jenkins project are pleased to announce the general
availability of Blue Ocean 1.0.


Blue Ocean is an entirely new, modern and fun way for developers to use Jenkins
that has been built from the ground up to help teams of any size approach
Continuous Delivery. Easily installed as a plugin for Jenkins and integrated
with Jenkins Pipeline, it is available from today for production use.


Since the start of the beta at Jenkins World 2016 in September there are now
over 7400+ installations making use of Blue...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back in May 2016 &lt;a href=&quot;https://www.jenkins.io/blog/2016/05/26/introducing-blue-ocean/&quot;&gt;we announced our intent&lt;/a&gt;
to rethink the Jenkins User experience with the Blue Ocean project and today
the Jenkins project are pleased to announce the general
availability of Blue Ocean 1.0.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is an entirely new, modern and fun way for developers to use Jenkins
that has been built from the ground up to help teams of any size approach
Continuous Delivery. Easily installed as a plugin for Jenkins and integrated
with Jenkins Pipeline, it is available from today for production use.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the start of the beta at Jenkins World 2016 in September there are now
over 7400+ installations making use of Blue Ocean. This wouldn’t be possible
without the support of the entire Jenkins developer and
user community - so thank you for your support!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is available today from the update center and also as a
Docker image - &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;why not give it a try?&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;https://www.youtube-nocookie.com/embed/k_fVlU1FwP4?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Visual Pipeline Editing&lt;/strong&gt; - Team members of any skill level can create continuous
delivery pipelines from start to finish, with just several clicks, using the
intuitive, visual pipeline editor. Any pipeline created with the visual editor
can also be edited in your favorite text editor
bringing all the benefits of Pipeline as Code.&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/blueocean/press/pipeline-editor.png&quot; alt=&quot;Editor&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Pipeline Visualization&lt;/strong&gt; - Developers can visually represent pipelines in a way
that anyone on the team can understand - even your boss’s boss - improving
clarity into the continuous delivery process for the whole organization.
The visualization helps you focus on what the pipeline does, not how it does it.&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/blueocean/press/pipeline-visualization.png&quot; alt=&quot;Pipeline visualization&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Pinpoint Troubleshooting&lt;/strong&gt; - Blue Ocean enables developers to locate automation
problems instantly, without endlessly scanning through logs or navigating
through many screens, so you can get back to building the next big thing.&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/blueocean/press/pipeline-diagnosis.png&quot; alt=&quot;Pinpoint Troubleshooting&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;GitHub and Git Integration&lt;/strong&gt; - Pipelines are created for all feature branches
and pull requests, with their status reported back to GitHub.
The whole team has visibility into whether changes need work or are good to go.&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/blueocean/press/github-status.png&quot; alt=&quot;Github integration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Personalization&lt;/strong&gt; – Every team member can make Jenkins their own by customizing
the dashboard so that they only see those pipelines that matter to them.
Favoriting any pipeline or branch in Blue Ocean will show a favourite card on
the dashboard so you can see its status at a glance.&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/blueocean/press/personalization.png&quot; alt=&quot;Personalized dashboard&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just one more thing – I’d like to pay special thanks to:&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;The Core team&lt;/strong&gt; – to Keith Zantow, Thorsten Scherler, Tom Fennelly,
Ivan Meredith, Josh McDonald, Vivek Pandey, Brody Maclean and Cliff Meyers.
Each of and everyone of you have brought your own passion, expertise and flair
to the project – and it shows. It’s been crazy fun and I hope working on
Blue Ocean is something you look back on fondly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins Developers&lt;/strong&gt; past and present – we recognise that we are standing on
the shoulders of giants and none of this wouldn’t be possible without your
hard work and dedication to free &amp;amp; open source software and Jenkins.
Here’s to the next 10 years 🍻 !&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CloudBees&lt;/strong&gt; – in particular, Sacha Labourey (CEO), Harpreet Singh
(VP of Product) and Spike Washburn (VP of Engineering) whose dedication to
Jenkins, Open Source and continued faith in the vision and team made all of
this possible, and of course Bob Bickel (Advisor) who dared us to dream big.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Michael Neale&lt;/strong&gt; – who drank all the kool-aide and is just as obsessed with
and dedicated to Blue Ocean as I am. This project would never have shipped
without his hand steady at the tiller. I couldn’t ask for a better friend
and partner-in-crime.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tyler Croy&lt;/strong&gt; – for guiding the project and myself on how to do open source
The Right Way™. Tyler works tirelessly behind the scenes to to make Jenkins
awesome and it wouldn’t be possible to keep this show running without
his help and sage-like advice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kohsuke Kawaguchi&lt;/strong&gt; – For creating Jenkins, getting Blue Ocean off of
the ground, his tour of Tokyo and above all, his trust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins Users&lt;/strong&gt; – your enthusiasm for better development tools which
kept our spirits and momentum up when the days grew long and things
looked tough. We couldn’t ask for a better, more appreciative or
passionate group of people. Hopefully we’ve done our job and you can get
back to building your next big thing!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next stop, some well needed rest &amp;amp; recovery then back to to making
Jenkins one of the experiences for software developers worldwide!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in joining us to make Blue Ocean a great user experience
for Jenkins, please join the Blue Ocean development
team on link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&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;/br&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/03/24/jenkins-community-survey/</id>
<title>The State of Jenkins - 2016 Community Survey</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-03-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/03/24/jenkins-community-survey/" />
<author>
<name>brao</name>
</author>
<category term='community'></category>
<category term='survey'></category>
<category term='continuous delivery'></category>
<summary>
This is a guest post by Bhavani Rao, Marketing Manager at CloudBees






Last fall, prior to Jenkins World, CloudBees conducted a
Community Survey.
We received over 1200 responses, and thanks to this input, we have some
interesting insights into how Jenkins users and their use of Jenkins are
evolving.


Based on the survey&#8217;s results, Jenkins is increasingly being used to support
continuous delivery (CD). Adoption of Jenkins 2, which featured "Pipeline as code" and
encouraged users to adopt Jenkins Pipeline, has
skyrocketed to more than half of all Jenkins installations.  Other data
remained consistent with findings year-to-year, for example, the number of
Jenkins users continues to increase and 90% of...
</summary>
<content type='html'>
&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;This is a guest post by Bhavani Rao, Marketing Manager at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last fall, prior to Jenkins World, CloudBees conducted a
&lt;a href=&quot;https://www.jenkins.io/blog/2016/09/09/take-the-2016-jenkins-survey-blog/&quot;&gt;Community Survey&lt;/a&gt;.
We received over &lt;strong&gt;1200&lt;/strong&gt; responses, and thanks to this input, we have some
interesting insights into how Jenkins users and their use of Jenkins are
evolving.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Based on the survey’s results, Jenkins is increasingly being used to support
continuous delivery (CD). Adoption of Jenkins 2, which featured &quot;Pipeline as code&quot; and
encouraged users to adopt &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Jenkins Pipeline&lt;/a&gt;, has
skyrocketed to more than half of all Jenkins installations.  Other data
remained consistent with findings year-to-year, for example, the number of
Jenkins users continues to increase and 90% of survey respondents still
consider Jenkins mission-critical.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/files/2016-jenkins-community-survey.pdf&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-community-survey/2016-survey-mission-critical.png&quot; alt=&quot;90% consider Jenkins mission-critical&quot; /&gt;
&lt;/a&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/files/2016-jenkins-community-survey.pdf&quot;&gt;Get the survey infographic PDF&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/files/2016-jenkins-community-survey-responses.pdf&quot;&gt;Get the complete survey results in PDF&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;Here are some of the key findings:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;85% of respondants indicated that Jenkins usage had increased&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;30% of organizations with more than 50 software projects used Jenkins in 2016 as compared to 16% in 2015&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An impressive 46% of respondents were running Jenkins 2.x, eight months after
its release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adoption of &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Jenkins Pipeline&lt;/a&gt; for continuous delivery
(CD) is accelerating, 54% of respondents who have adopted CD are using Pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;61% of respondents are deploying changes to production at least once per week&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Linux is the platform of choice for builds, favored by 85% of respondents&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;85% of respondants use Git as the source code repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Half of respondents are deploying applications directly to the cloud, with Amazon Web Services as the favored platform&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We want to thank everyone for completing the survey, and congratulations to
Iker Garcia for winning a free pass to
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2017&lt;/a&gt; and to
Dave Leifer for winning the Amazon gift card.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re looking forward to creating a 2017 Community Survey later this year and
hearing more from users at Jenkins World 2017 in San Francisco, we hope to
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;see you there!&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/03/21/toulousejam-pipeline-workshop/</id>
<title>Pipeline Workshop &amp; Hackergarten @ ToulouseJAM Feedback</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-03-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/03/21/toulousejam-pipeline-workshop/" />
<author>
<name>batmat</name>
</author>
<category term='hackergarten'></category>
<category term='jam'></category>
<category term='meetup'></category>
<category term='feedback'></category>
<summary>
Earlier this month, a full-day event about Jenkins Pipeline was organized in Toulouse, France with the Toulouse JAM.


After a warm-up on the previous Tuesday where Michaël Pailloncy had given a talk at the local Toulouse Devops user group about Jenkins Pipeline ecosystem, we were ready for more digging :-).







The agenda


We had planned the day in two parts:




Morning would be a more driven workshop with slides &amp; exercises to be completed


Pizzas &amp; beverages to split the day :-)


Afternoon would be somehow like an Unconference, where people basically decide by themselves what they want to work on.




We planned to have 30 attendees....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Earlier this month, a full-day event about Jenkins Pipeline was organized in &lt;a href=&quot;https://www.google.fr/maps/place/Toulouse/@43.6006786,1.3628012,12z/data=!3m1!4b1!4m5!3m4!1s0x12aebb6fec7552ff:0x406f69c2f411030!8m2!3d43.604652!4d1.444209&quot;&gt;Toulouse, France&lt;/a&gt; with the &lt;a href=&quot;https://www.meetup.com/fr-FR/Toulouse-Jenkins-Area-Meetup/events/237089783/&quot;&gt;Toulouse JAM&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a warm-up on the previous Tuesday where Michaël Pailloncy had given a talk at the local &lt;a href=&quot;https://www.meetup.com/fr-FR/Toulouse-DevOps/events/237859268/&quot;&gt;Toulouse Devops user group about Jenkins Pipeline ecosystem&lt;/a&gt;, we were ready for more digging :-).&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/2017-03-toulousejam-workshop/workshop-overview-1.jpg&quot; alt=&quot;workshop overview 1&quot; width=&quot;30%&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2017-03-toulousejam-workshop/workshop-overview-2.jpg&quot; alt=&quot;workshop overview 2&quot; width=&quot;30%&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2017-03-toulousejam-workshop/workshop-overview-3.jpg&quot; alt=&quot;workshop overview 3&quot; width=&quot;30%&quot; /&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-agenda&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-agenda&quot; /&gt;The agenda&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had planned the day in two parts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Morning would be a more driven workshop with slides &amp;amp; exercises to be completed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pizzas &amp;amp; beverages to split the day :-)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Afternoon would be somehow like an &lt;a href=&quot;https://en.wikipedia.org/wiki/Unconference&quot;&gt;Unconference&lt;/a&gt;, where people basically decide by themselves what they want to work on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We planned to have 30 attendees. We ended up having 25.
We considered having more people, but finally decided that for a first time it would be better to start not too big.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;infrastructure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#infrastructure&quot; /&gt;Infrastructure&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Infrastructure was sponsored by &lt;a href=&quot;https://www.digitalocean.com/&quot;&gt;DigitalOcean&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For each attendee, &lt;a href=&quot;https://github.com/ToulouseJAM/jam-workshop-infra&quot;&gt;we provisioned&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One Controller, preconfigured to be able to dynamically provision agents.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One staging &lt;em&gt;environment&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One production &lt;em&gt;environment&lt;/em&gt;
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One SonarQube instance&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;workshop-content-infrastructure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#workshop-content-infrastructure&quot; /&gt;Workshop content &amp;amp; infrastructure&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After an initial quick &lt;a href=&quot;https://docs.google.com/presentation/d/1FKkraQdr4oxRephVnItUmOUe9pBeC0dRfZXCxqoubg0/edit&quot;&gt;presentation to settle context and remind some general things about Continuous Delivery and Jenkins&lt;/a&gt;, we started the workshop per se.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is composed of 3 parts, &lt;a href=&quot;https://github.com/ToulouseJAM/workshop-resources&quot;&gt;which are readable here&lt;/a&gt; &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_2&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_2&quot; title=&quot;View footnote.&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;, but very few people were able to start the part 3.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;hackergarten-unconference&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hackergarten-unconference&quot; /&gt;Hackergarten / Unconference&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we let people decide what they wanted to work on during the afternoon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2017-03-toulousejam-workshop/subdividing-per-interest.jpg&quot; alt=&quot;subdividing per interest&quot; width=&quot;50%&quot; /&gt; We decided to use post-its: each attendee would write down what they wanted to work on, one idea per post-it (max 2 per person).
Then, we dropped those onto a white-board and tried grouping those by theme.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the end, overall, the following themes went out:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hack on Jenkins development &amp;amp; Contribute to Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Complete the workshops&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work on use-case oriented things&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work on Docker &amp;amp; Pipeline join usages&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hackergarten&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hackergarten&quot; /&gt;Hackergarten&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2017-03-toulousejam-workshop/hackergarten.jpg&quot; alt=&quot;hackergarten&quot; width=&quot;40%&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many &lt;a href=&quot;https://accounts.jenkins.io/&quot;&gt;Jenkins accounts&lt;/a&gt; were created, and many JIRA and pull requests were filed.
It was nice to see people asking questions like: &quot;so, should I create a JIRA issue for this?&quot; or &quot;how do I interact with people&quot;.
Pretty generic &quot;how do I work on open source software&quot; questions sometimes, but important because you felt like people were genuinely interested and needed not much to start contributing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are the pull requests filed during this afternoon:&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/blueocean-pipeline-editor-plugin/pull/30&quot;&gt;blueocean-pipeline-editor-plugin#30&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/2785/&quot;&gt;jenkins#2785&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/2786/&quot;&gt;jenkins#2786&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/2787/&quot;&gt;jenkins#2787&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/2788/&quot;&gt;jenkins#2788&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;You can see that though most of the PRs were typo-related, the one that got merged first was the one about code :-).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2017-03-toulousejam-workshop/bobblehead.jpg&quot; alt=&quot;bobblehead&quot; width=&quot;30%&quot; /&gt; So, &lt;a href=&quot;https://github.com/jviolas&quot;&gt;Jeremie Violas&lt;/a&gt; wins the Bobble Head as &lt;a href=&quot;https://twitter.com/toulousejam/status/839606221338464256&quot;&gt;promised&lt;/a&gt;!&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;why-so-many-typo-related-prs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-so-many-typo-related-prs&quot; /&gt;Why so many typo-related PRs?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Simply because people were somehow encouraged to find some to get used to the
round trip of: fixing an issue and filing the associated pull request, rinse &amp;amp;
repeat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I do think this is also a pretty nice and simple first step to understand how
to build Jenkins and start interacting with the community.&lt;/p&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;the-result&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-result&quot; /&gt;The result&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;People seemed pretty happy and we got some nice comments like &quot;now I have a clearer vision of what this Pipeline thing is about&quot;.
Some attendees also dropped nice comments on the meetup page.
So it’s cool because when you’re doing such things on your free time, it’s the main reward you can get.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re an attendee to such events, don’t forget to thank people organizing
those, and more importantly to provide constructive feedback.  We are generally
eager to know what could be done better for next time.&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;Overall we are very happy with the energy of that day, and we definitely plan to set up a new session in the next few months, probably with a bit more people.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some thoughts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Infrastructure: when you plan to have many VM per attendee, double-check the limits your Cloud Provider may have by default. I had bumped it to 250 the day before the workshop, and asked for another one to 500 &lt;strong&gt;during&lt;/strong&gt; the workshop (though in the end, 250 was probably enough, but this’ll give room for the next time with more people :-)).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Logistics: warning, secret ahead: this is very time consuming.
Not necessarily the amount of work itself, more that it implies very big latency.
For instance, give it 2 to 3 weeks minimum to have answers about sponsoring in general. Pinging again in case of no answer after 2 days would probably be seen as rude, and possibly lead to make things worse for obvious reasons, so plan ahead.&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;thank-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thank-you&quot; /&gt;Thank you&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.digitalocean.com&quot;&gt;DigitalOcean&lt;/a&gt; for sponsoring the Infrastructure&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We got way more than 100 VMs running at the same time during the day thanks to their help!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.harrycow.com/&quot;&gt;HarryCow Coworking&lt;/a&gt; for hosting the event&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; for sponsoring the food for all the participants&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Also for providing a bunch of goodies: stickers and T-Shirts for everybody&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; for providing stickers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. For the sake of the simplicity of the workshop, those &lt;em&gt;environments&lt;/em&gt; were actually a single VM: the goal was here to illustrate what we could do using Jenkins Pipeline, discussing scalability or more involved deployment techniques was obviously out of scope.
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_2&quot;&gt;
&lt;a href=&quot;#_footnoteref_2&quot;&gt;2&lt;/a&gt;. in French only for now, but translating it into English to make it possibly shared and reusable among JAMs is being discussed
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/03/20/security-updates/</id>
<title>Security updates for multiple Jenkins plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-03-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/03/20/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<summary>
Multiple Jenkins plugins received updates today that fix several security vulnerabilities:




Active Directory


Distributed Fork


Email Extension (Email-ext)


Mailer


SSH Build Agents




For an overview of what was fixed, see the security advisory.


Additionally, we also published a security notice for the following plugin and recommend that users disable and uninstall it:




Pipeline: Classpath Step




This plugin is not part of the Pipeline suite of plugins, despite its name. It&#8217;s installed on just several hundred instances.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Multiple Jenkins plugins received updates today that fix several security vulnerabilities:&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/active-directory&quot;&gt;Active Directory&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/distfork&quot;&gt;Distributed Fork&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/email-ext&quot;&gt;Email Extension (Email-ext)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/mailer&quot;&gt;Mailer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/ssh-slaves&quot;&gt;SSH Build Agents&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;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-03-20&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, we also published a security notice for the following plugin and recommend that users disable and uninstall it:&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://wiki.jenkins.io/display/JENKINS/Pipeline+Classpath+Step+Plugin&quot;&gt;Pipeline: Classpath Step&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;This plugin is not part of the Pipeline suite of plugins, despite its name. It’s installed on just several hundred instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/03/17/blueocean-devlog-mar3/</id>
<title>Blue Ocean Dev Log: March Week #3</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-03-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/03/17/blueocean-devlog-mar3/" />
<author>
<name>michaelneale</name>
</author>
<category term='blueocean'></category>
<summary>
We&#8217;re counting down the weeks until Blue Ocean 1.0,
and we&#8217;re getting close!  In this past week, the first release candidate
has gone out to the Update Center, along with a new
Pipeline Editor plugin. The Blue Ocean
Pipeline Editor is its own plugin which integrates into Blue Ocean, so this was
a coordinated release with Blue Ocean 1.0 rc1.





Noteworthy this week:




RC1 includes the Blue Ocean Pipeline Editor, which is integrates support for
branch editing and saving the Pipeline back to GitHub (also referred to as
"round-tripping").


Many dependencies have been upgraded


Per-stage raw logs can be downloaded, this will be included in the next
release.


Editor design improvements


Fixes for...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re counting down the weeks until &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; 1.0,
and we’re getting close!  In this past week, the first &lt;strong&gt;release candidate&lt;/strong&gt;
has gone out to the Update Center, along with a new
&lt;a href=&quot;https://plugins.jenkins.io/blueocean-pipeline-editor&quot;&gt;Pipeline Editor plugin&lt;/a&gt;. The Blue Ocean
Pipeline Editor is its own plugin which integrates into Blue Ocean, so this was
a coordinated release with Blue Ocean 1.0 rc1.&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/blueocean-dev-log/editor-mar-1.png&quot; alt=&quot;Editing a Pipeline&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Noteworthy this week:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RC1 includes the Blue Ocean Pipeline Editor, which is integrates support for
branch editing and saving the Pipeline back to GitHub (also referred to as
&quot;round-tripping&quot;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many dependencies have been upgraded&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Per-stage raw logs can be downloaded, this will be included in the next
release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Editor design improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixes for overflowing text&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new sleeker favorite card design has been released, so you can fit
more favorites on your screen!&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/blueocean-dev-log/favorites-mar-1.png&quot; alt=&quot;Pipeline Favorites&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Blue Ocean Pipeline Editor is better integrated into a few different
screens in Blue Ocean. For example, you can open the editor from the results
screen (top right):&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/blueocean-dev-log/editor-topbar-link.png&quot; alt=&quot;Editing a Pipeline&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or open the editor from branch listings:&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/blueocean-dev-log/editor-run-listing-link.png&quot; alt=&quot;Editing a Pipeline&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Up next:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;More bug-bashing! Please join us in testing the release candidate.
Instructions for trying Blue Ocean can be found on
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;our project page&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another release candidate&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping to make Blue Ocean a great user experience for
Jenkins, please join the Blue Ocean development team on
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/03/16/fosdem-event-report/</id>
<title>FOSDEM 2017 Wrap-up</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-03-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/03/16/fosdem-event-report/" />
<author>
<name>rtyler</name>
</author>
<category term='fosdem'></category>
<category term='event'></category>
<summary>
In early February numerous free and open source developers from around the
world traveled to Brussels, Belgium, for arguably the largest event of its
kind:
FOSDEM. Among the thousands of hackers in attendance
were a dozen or so Jenkins contributors. We have attended the event in the
past, but this year we had a blizzard of activity spanning four days around the FOSDEM
weekend.





Figure 1. City Hall, photo by Kohsuke Kawaguchi


One of our "accidental traditions" has become a
happy hour
the Friday night before FOSDEM truly begins at Cafe Le Roy d&#8217;Espagne on Grand
Place right in the middle of Brussels. Conveniently located a few hundred meters away from...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In early February numerous free and open source developers from around the
world traveled to Brussels, Belgium, for arguably the largest event of its
kind:
&lt;a href=&quot;https://fosdem.org&quot;&gt;FOSDEM&lt;/a&gt;. Among the thousands of hackers in attendance
were a dozen or so Jenkins contributors. We have attended the event in the
past, but this year we had a blizzard of activity spanning four days around the FOSDEM
weekend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/12508267@N00/32449169840/in/album-72157680098353926/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2328/32449169840_f8fec9c11a_z.jpg&quot; alt=&quot;Brussels City Hall&quot; /&gt;
&lt;/a&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. City Hall, photo by Kohsuke Kawaguchi&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of our &quot;accidental traditions&quot; has become a
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/236370435/&quot;&gt;happy hour&lt;/a&gt;
the Friday night before FOSDEM truly begins at Cafe Le Roy d’Espagne on Grand
Place right in the middle of Brussels. Conveniently located a few hundred meters away from the
&lt;a href=&quot;https://fosdem.org/2017/beerevent/&quot;&gt;FOSDEM Beer Event&lt;/a&gt;
at Delirium Cafe, each year we are inevitably joined by friends from other open
source projects who know they’re welcome to join us for a few drinks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/12508267@N00/31987111834/in/album-72157680098353926/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/1/497/31987111834_39773bc5ab_z.jpg&quot; alt=&quot;Happy hour at Cafe Le Roy&quot; /&gt;
&lt;/a&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Cafe Le Roy, photo by Kohsuke Kawaguchi&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After dinner and drinks, a few of us decided it would be a good idea (it
wasn’t) to walk over to check out the FOSDEM Beer Event and &lt;em&gt;maybe&lt;/em&gt; have just
one more beer. For the uninitiated, Belgian beers tend to be strong, as the FOSDEM organizers warn:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unlike some other beers, Belgian beer is not just coloured water. Some beers
contain significant quantities of alcohol and will give you a pounding
hangover.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, some of us seem to re-learn this lesson each year at FOSDEM!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Bright and early the following day, FOSDEM really kicked off with keynotes and
the project tables lining a number of corridors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/12508267@N00/32706234821/in/album-72157680098353926/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2035/32706234821_2997a98b52_z.jpg&quot; alt=&quot;Busy FOSDEM hall&quot; /&gt;
&lt;/a&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. A busy hall at FOSDEM, photo by Kohsuke Kawaguchi&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the Jenkins project’s table we typically spend two full days answering questions,
showing off the latest and greatest Jenkins features, and of course handing out
Jenkins stickers. The table is where many contributors, myself included, have
a rare opportunity to talk with dozens of enthusiastic Jenkins users from
across the broader open source community. This year we were very fortunate to have a
tremendous number of contributors available at the table to answer hundreds of
questions throughout the two days of FOSDEM.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to thank everybody by name, but the entire weekend was such a blur
that I’m not sure I would be able to remember everybody who helped! We couldn’t have
had a successful event without their support, so many thanks to all the
contributors who helped!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the Jenkins project table, we had two contributors present in
the
&lt;a href=&quot;https://fosdem.org/2017/schedule/track/testing_and_automation/&quot;&gt;Testing and Automation&lt;/a&gt;
devroom, which I helped organize in between answering Jenkins questions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;declarative-pipelines-in-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#declarative-pipelines-in-jenkins&quot; /&gt;Declarative Pipelines in Jenkins&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first presentation was a stellar introduction to
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Declarative Pipelines&lt;/a&gt;
in Jenkins, by long-time contributor and primary developer of Declarative
Pipeline support,
&lt;a href=&quot;https://github.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
    &lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube-nocookie.com/embed/utztUGvZ_EA&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;using-containers-for-building-and-testing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-containers-for-building-and-testing&quot; /&gt;Using Containers for Building and Testing&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Later in the day,
&lt;a href=&quot;https://github.com/carlossg&quot;&gt;Carlos Sanchez&lt;/a&gt;,
another long-time contributor, maintainer of the
&lt;a href=&quot;https://plugins.jenkins.io/kubernetes&quot;&gt;Kubernetes plugin&lt;/a&gt; and a number of Jenkins- and Maven-related
Docker containers, provided a great overview of the current state of using
containers for building and testing in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
    &lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube-nocookie.com/embed/YjTG9imfbOU&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a very busy two days at FOSDEM, a few contributors remained in Brussels
for a day-long
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/236370750/&quot;&gt;Post-FOSDEM Contributor Hackathon&lt;/a&gt;
sponsored by CloudBees, Inc. and
&lt;a href=&quot;https://www.betacowork.com/&quot;&gt;Betacowork Brussels&lt;/a&gt;. Trying to cram lots of
hacking into a single day is challenging, so the day was mostly filled with
discussions, some light prototyping, and a bit of recovery from the hectic
weekend at FOSDEM. :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/12508267@N00/32015233063/in/album-72157680098353926/&quot;&gt;&lt;img src=&quot;https://c1.staticflickr.com/3/2087/32015233063_47128bac1c_z.jpg&quot; alt=&quot;Daniel presented at the hackathon&quot; /&gt;
&lt;/a&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. Daniel Beck presenting on CLI prototyping, photo by Kohsuke Kawaguchi&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;thanks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thanks&quot; /&gt;Thanks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course I would like to extend many thanks to all the contributors who
participated in the various FOSDEM related events, but I would call special
attention to the logistics and planning work done by contributors Alyssa Tong,
Damien Duportal, and Olivier Vernin. Thanks to their work coordinating all the
plans, reservations, and schedules, we had a flawless weekend
of high-intensity Jenkins discussion, advocacy, and hacking.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope to see everybody back in Brussels next year for FOSDEM 2018!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/03/10/blueocean-devlog-mar2/</id>
<title>Blue Ocean Dev Log: March Week #2</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-03-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/03/10/blueocean-devlog-mar2/" />
<author>
<name>michaelneale</name>
</author>
<category term='blueocean'></category>
<summary>
We&#8217;re counting down the weeks until Blue Ocean 1.0.
This week was one of continuing consolidation and polish. We also released b25
(beta #25), a collectors edition. The next version we will likely release will
be a release candidate (RC). The b25 release however contained a number of
fixes and features, such as branch filtering.







Some other updates of note from this past week:




Updated a bunch of dependencies around Pipeline and fixed a whole lot
of long standing bugs.


Some work went on to make acceptance tests run on varied browsers via
Sauce Labs thanks to
@halkeye!


The Blue Ocean Pipeline Editor had its
Save to SCM/GitHub functionality
merged to master branch....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re counting down the weeks until &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; 1.0.
This week was one of continuing consolidation and polish. We also released b25
(beta #25), a collectors edition. The next version we will likely release will
be a release candidate (RC). The b25 release however contained a number of
fixes and features, such as branch filtering.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/blueocean-dev-log/edit-action-items.png&quot; alt=&quot;Editing a Pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some other updates of note from this past week:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Updated a bunch of dependencies around Pipeline and fixed a whole lot
of long standing bugs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some work went on to make acceptance tests run on varied browsers via
&lt;a href=&quot;https://saucelabs.com&quot;&gt;Sauce Labs&lt;/a&gt; thanks to
&lt;a href=&quot;https://github.com/halkeye&quot;&gt;@halkeye&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Blue Ocean Pipeline Editor had its
&lt;a href=&quot;https://github.com/jenkinsci/blueocean-pipeline-editor-plugin/pull/29&quot;&gt;Save to SCM/GitHub functionality&lt;/a&gt;
merged to master branch.  It won’t be released to the Update Center until the
next Blue Ocean release, there are a few more things to iron out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As the Blue Ocean Pipeline Editor is now considered to be part of Blue Ocean
now, more people are kicking the tires, and starting to
&lt;a href=&quot;https://github.com/jenkinsci/blueocean-pipeline-editor-plugin/pull/30&quot;&gt;contribute
fixes to improve it&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The swishy &quot;Blue Ocean&quot; logo is gone, Jenkins branding is back (mixed feelings!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixes for concurrent users of input&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixes for handling errors around favoriting of Pipelines and more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speeding up creation of Multibranch Pipelines via the new &quot;Creation&quot; flow.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And of course, a nice pretty screenshot of editing and saving a Multibranch
Pipeline with the Blue Ocean Pipeline Editor:&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/blueocean-dev-log/editor-save-dialog.png&quot; alt=&quot;Editing and saving a Pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Up next for the Blue Ocean project:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;More consolidation and polish.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A first release candidate out the door (!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New, sleeker, favorite card design, possibly a table design too.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also note that there are changelogs maintained and visible on the
&lt;a href=&quot;https://plugins.jenkins.io/blueocean&quot;&gt;Blue Ocean plugin page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping to make Blue Ocean a great user experience for
Jenkins, please join the Blue Ocean development team on
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/03/03/blueocean-devlog-mar1/</id>
<title>Blue Ocean Dev Log: March Week #1</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-03-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/03/03/blueocean-devlog-mar1/" />
<author>
<name>michaelneale</name>
</author>
<category term='blueocean'></category>
<summary>
We&#8217;re counting down the weeks until Blue Ocean 1.0.
This week was relatively quiet with a few people away for a few days, and
mostly about consolidation. There was a beta late last week, so this week we
thought we would let people have a rest from the upgrade treadmill for once.


One notable feature that has recently landed is "escaping to Classic" When you
see the exit symbol (door with arrow) it will take you to an equivalent page in
classic Jenkins (if one exists). You will notice this in a few places in the
app now.







Some other things that made it to master branch which...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re counting down the weeks until &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; 1.0.
This week was relatively quiet with a few people away for a few days, and
mostly about consolidation. There was a beta late last week, so this week we
thought we would let people have a rest from the upgrade treadmill for once.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One notable feature that has recently landed is &quot;escaping to Classic&quot; When you
see the exit symbol (door with arrow) it will take you to an equivalent page in
classic Jenkins (if one exists). You will notice this in a few places in the
app now.&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/blueocean-dev-log/escape.png&quot; alt=&quot;Escaping to Classic&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some other things that made it to &lt;code&gt;master&lt;/code&gt; branch which have not yet been
released in a beta:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An API to save/branch to GitHub was finished, and tested with &quot;round
tripping&quot; with the Editor in some form&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New compact form of duration reporting (old style was too verbose for
most screens)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a bug with input submissions with concurrent browser sessions which was
quite a tricky bug to chase down!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Only show Admin link when appropriate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many many bug fixes and polishing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There has also been an uptick in activity on the
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter channel&lt;/a&gt; with an
increased number of questions about usage and Pipelines. But also questions
from people starting to extend, or add features, to Blue Ocean, which is very
nice to see.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/halkeye&quot;&gt;Gavin Mogan&lt;/a&gt; has been looking at integrating
the &lt;a href=&quot;https://plugins.jenkins.io/sauce-ondemand&quot;&gt;Sauce OnDemand&lt;/a&gt; plugin into Blue Ocean for better
browser-test reporting. Tangentially related, we also are planning to improve
browser-testing in Blue Ocean as well. What is perhaps more exciting is that
more people, like &lt;a href=&quot;https://github.com/dragoonis&quot;&gt;Paul Dragoonis&lt;/a&gt; and
&lt;a href=&quot;https://github.com/m4dc4p&quot;&gt;other folks&lt;/a&gt;, are starting to contribute some
fixes which have been lingering around for a while.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Up Next:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Round trip Blue Ocean Pipeline Editor changes with load/save&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bundling the Blue Ocean Pipeline Editor with the &quot;aggregator&quot; Blue Ocean
plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some release candidates!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping to make Blue Ocean a great user experience for
Jenkins, please join the Blue Ocean development team on
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/24/blueocean-devlog-feb4/</id>
<title>Blue Ocean Dev Log: February Week #4</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/24/blueocean-devlog-feb4/" />
<author>
<name>michaelneale</name>
</author>
<category term='blueocean'></category>
<summary>
We&#8217;re counting down the weeks until Blue Ocean 1.0.
In all the excitement I forgot to post
a dev log last week, so I will make up for it this week.


In the last 10 days, 2 betas went out: b22 and b23, and a preview release of
the editor. We expect the next release will be named a release candidate (we
know there is still more to go in, but want to signal that things are getting
into the final stages!). The
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-Gitter chat room is
getting busier, so join in!


Also last week, the Blue Ocean Pipeline Editor was presented at the
Jenkins Online Meetup,
embedded below.





Feature Highlights



You can...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re counting down the weeks until &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; 1.0.
&lt;a href=&quot;https://lh3.googleusercontent.com/-bjL2WHXNstg/WK9nTFR2ydI/AAAAAAAABtI/L01g534dxcM_Ya3jYgvyxcipmTerRoqYwCLcB/s1600/clint.jpg&quot;&gt;In all the excitement I forgot to post&lt;/a&gt;
a dev log last week, so I will make up for it this week.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the last 10 days, 2 betas went out: b22 and b23, and a preview release of
the editor. We expect the next release will be named a release candidate (we
know there is still more to go in, but want to signal that things are getting
into the final stages!). The
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter chat room&lt;/a&gt; is
getting busier, so join in!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also last week, the Blue Ocean Pipeline Editor was presented at the
&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;Jenkins Online Meetup&lt;/a&gt;,
embedded below.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/0suw2NaBFus?start=1960&amp;amp;rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;feature-highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#feature-highlights&quot; /&gt;Feature Highlights&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can now create Pipelines from GitHub in Blue Ocean. Either one
Pipeline at a time, or let it discover all your Pipelines for a GitHub Organization.&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/blueocean-dev-log/creating-pipeline-from-github.png&quot; alt=&quot;Creating a Pipeline from GitHub&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When you press the &quot;Create&quot; button, it will open the new creation flow
by default now; the feature was previously hidden behind a feature switch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can filter the activity screen by branch! That way you can see a
history of Pipeline runs for just one branch.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/blueocean-dev-log/branch-filtering.png&quot; alt=&quot;Filtering a branch&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you like long names for stages - it now won’t pollute the screen
when space is at a premium (truncated names on screen).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blue Ocean events (&lt;a href=&quot;https://github.com/jenkinsci/sse-gateway-plugin&quot;&gt;SSE&lt;/a&gt;) should now work on Microsoft Edge again&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can see durations when you hover the mouse over indicators&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Up next:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A release candidate is expected soon&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integration work with the Editor to save to branches&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some updates to the design around tables&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bundling of the Editor with Blue Ocean&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t forget, there is also a Blue Ocean Docker image published weekly with
usually the latest released version. If you have Docker installed, this can
be as simple as:&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;docker run -p 8080:8080 jenkinsci/blueocean*&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then browse to &lt;a href=&quot;http://localhost:8080/blue&quot;&gt;localhost:8080/blue&lt;/a&gt; - possibly
the quickest way to try things.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping to make Blue Ocean a great user experience for
Jenkins, please join the Blue Ocean development team on
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/23/declarative-saucelabs-xunit/</id>
<title>Browser testing and conditional logic in Declarative Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/23/declarative-saucelabs-xunit/" />
<author>
<name>lnewman</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='xunit'></category>
<category term='nightwatch'></category>
<category term='saucelabs'></category>
<category term='selenium'></category>
<category term='declarative'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Declare Your Pipelines!
Declarative Pipeline 1.0 is here!
This is the fourth post in a series showing some of the cool features of
Declarative Pipeline.


In the
previous post,
we integrated several notification services into a Declarative Pipeline.
We kept our Pipeline clean and easy to understand
by using a shared library to make a custom step called sendNotifications
that we called at the start and end of our Pipeline.


In this blog post, we&#8217;ll start by translating the Scripted Pipeline in the sample project I worked with
in
"Browser-testing with Sauce OnDemand and Pipeline"
and
"xUnit and Pipeline"
to Declarative.
We&#8217;ll make our Pipeline clearer...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Declare Your Pipelines!&lt;/strong&gt;
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/03/declarative-pipeline-ga/&quot;&gt;Declarative Pipeline 1.0 is here&lt;/a&gt;!
This is the fourth post in a series showing some of the cool features of
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/15/declarative-notifications/&quot;&gt;previous post&lt;/a&gt;,
we integrated several notification services into a Declarative Pipeline.
We kept our Pipeline clean and easy to understand
by using a shared library to make a custom step called &lt;code&gt;sendNotifications&lt;/code&gt;
that we called at the start and end of our Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post, we’ll start by translating the Scripted Pipeline in the sample project I worked with
in
&quot;&lt;a href=&quot;https://www.jenkins.io/blog/2016/08/29/sauce-pipeline/&quot;&gt;Browser-testing with Sauce OnDemand and Pipeline&lt;/a&gt;&quot;
and
&quot;&lt;a href=&quot;https://www.jenkins.io/blog/2016/10/31/xunit-reporting/&quot;&gt;xUnit and Pipeline&lt;/a&gt;&quot;
to Declarative.
We’ll make our Pipeline clearer by adding an &lt;code&gt;environment&lt;/code&gt; directive
to define some environment variables, and then moving some code to a shared library.
Finally, we’ll look at using the &lt;code&gt;when&lt;/code&gt; directive to add simple conditional behavior to our Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setup&quot; /&gt;Setup&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The setup for this post uses the same repository as the two posts above,
&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js&quot;&gt;my fork&lt;/a&gt;
of the
&lt;a href=&quot;https://github.com/saucelabs-sample-test-frameworks/JS-Nightwatch.js&quot;&gt;JS-Nightwatch.js sample project&lt;/a&gt;.
I’ve once again created a branch specifically for this blog post,
this time called
&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js/tree/blog/declarative/sauce&quot;&gt;&lt;code&gt;blog/declarative/sauce&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Like the two posts above, this Pipeline will use the
&lt;a href=&quot;https://plugins.jenkins.io/xunit&quot;&gt;xUnit&lt;/a&gt; and
&lt;a href=&quot;https://plugins.jenkins.io/sauce-ondemand&quot;&gt;Sauce OnDemand&lt;/a&gt; plugins.
The xUnit plugin only needs to be installed, the Sauce OnDemand needs additional configuration.
Follow
&lt;a href=&quot;https://wiki.saucelabs.com/display/DOCS/Installing+and+Configuring+the+Sauce+OnDemand+Plugin+for+Jenkins&quot;&gt;Sauce Labs&#39; configuration instructions&lt;/a&gt;
to create an account with Sauce Labs and add your Sauce Labs credentials to Jenkins.
The Sauce OnDemand plugin will automatically install
&lt;a href=&quot;https://wiki.saucelabs.com/display/DOCS/Sauce+Connect+Proxy&quot;&gt;Sauce Connect&lt;/a&gt;
for us when we call it from our Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Be sure to you have the latest version of the
&lt;a href=&quot;https://plugins.jenkins.io/sauce-ondemand&quot;&gt;Sauce OnDemand&lt;/a&gt; plugin (1.160 or newer).
It has several fixes required for this post.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a shared library, I’ve still got the one from the
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/15/declarative-notifications/&quot;&gt;previous post&lt;/a&gt;.
To set up this &quot;Global Pipeline Library,&quot; navigate to &quot;Manage Jenkins&quot; → &quot;Configure System&quot;
in the Jenkins web UI.
Once there, under &quot;Global Pipeline Libraries&quot;, add a new library.
Then set the name to &lt;code&gt;bitwiseman-shared&lt;/code&gt;, point it at my repository,
and set the default branch for the library to &lt;code&gt;master&lt;/code&gt;.&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/2017-02-15/shared-library.png&quot; alt=&quot;Global Pipeline Library&quot; width=&quot;800&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;reducing-complexity-with-declarative&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reducing-complexity-with-declarative&quot; /&gt;Reducing Complexity with Declarative&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve been following along through this series,
this first step will be quite familiar by now.
We’ll start from the Pipeline we had at the end of the xUnit post
and translate it to Declarative.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
    agent any
    options {
        &lt;span style=&quot;color:#777&quot;&gt;// Nightwatch.js supports color output, so wrap add his option&lt;/span&gt;
        ansiColor &lt;span style=&quot;color:#606&quot;&gt;colorMapName&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;XTerm&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }
    stages {
        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;) {
            steps {
                &lt;span style=&quot;color:#777&quot;&gt;// Install dependencies&lt;/span&gt;
                sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;npm install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            }
        }
        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;) {
            steps {
                &lt;span style=&quot;color:#777&quot;&gt;// Add sauce credentials&lt;/span&gt;
                sauce(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;f0a6b8ad-ce30-4cba-bf9a-95afbc470a8a&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
                    &lt;span style=&quot;color:#777&quot;&gt;// Start sauce connect&lt;/span&gt;
                    sauceconnect() {
                        &lt;span style=&quot;color:#777&quot;&gt;// Run selenium tests using Nightwatch.js&lt;/span&gt;
                        &lt;span style=&quot;color:#777&quot;&gt;// Ignore error codes. The junit publisher will cover setting build status.&lt;/span&gt;
                        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;./node_modules/.bin/nightwatch -e chrome,firefox,ie,edge --test tests/guineaPig.js || true&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
                    }
                }
            }
            post {
                always {
                    step([&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;XUnitBuilder&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
                        &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;thresholds&lt;/span&gt;: [
                            [&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;SkippedThreshold&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;failureThreshold&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;],
                            &lt;span style=&quot;color:#777&quot;&gt;// Allow for a significant number of failures&lt;/span&gt;
                            &lt;span style=&quot;color:#777&quot;&gt;// Keeping this threshold so that overwhelming failures are guaranteed&lt;/span&gt;
                            &lt;span style=&quot;color:#777&quot;&gt;//     to still fail the build&lt;/span&gt;
                            [&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;FailedThreshold&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;failureThreshold&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]],
                        &lt;span style=&quot;color:#606&quot;&gt;tools&lt;/span&gt;: [[&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;JUnitType&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;pattern&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;reports/**&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]]])

                    saucePublisher()
                }
            }
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;node {
    stage &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    checkout scm

    &lt;span style=&quot;color:#777&quot;&gt;// Install dependencies&lt;/span&gt;
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;npm install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

    stage &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color:#777&quot;&gt;// Add sauce credentials&lt;/span&gt;
    sauce(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;f0a6b8ad-ce30-4cba-bf9a-95afbc470a8a&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
        &lt;span style=&quot;color:#777&quot;&gt;// Start sauce connect&lt;/span&gt;
        sauceconnect() {

            &lt;span style=&quot;color:#777&quot;&gt;// List of browser configs we&#39;ll be testing against.&lt;/span&gt;
            &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;def&lt;/span&gt; platform_configs = [
                &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;chrome&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
                &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;firefox&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
                &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;ie&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
                &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;edge&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            ].join(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)

            &lt;span style=&quot;color:#777&quot;&gt;// Nightwatch.js supports color output, so wrap this step for ansi color&lt;/span&gt;
            wrap([&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;AnsiColorBuildWrapper&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;colorMapName&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;XTerm&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]) {
                &lt;span style=&quot;color:#777&quot;&gt;// Run selenium tests using Nightwatch.js&lt;/span&gt;
                &lt;span style=&quot;color:#777&quot;&gt;// Ignore error codes. The junit publisher will cover setting build status.&lt;/span&gt;
                sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;./node_modules/.bin/nightwatch -e &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;platform_configs&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt; --test tests/guineaPig.js || true&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            }

            step([&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;XUnitBuilder&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
                &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;thresholds&lt;/span&gt;: [
                    [&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;SkippedThreshold&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;failureThreshold&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;],
                    &lt;span style=&quot;color:#777&quot;&gt;// Allow for a significant number of failures&lt;/span&gt;
                    &lt;span style=&quot;color:#777&quot;&gt;// Keeping this threshold so that overwhelming failures are guaranteed&lt;/span&gt;
                    &lt;span style=&quot;color:#777&quot;&gt;//     to still fail the build&lt;/span&gt;
                    [&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;FailedThreshold&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;failureThreshold&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]],
                &lt;span style=&quot;color:#606&quot;&gt;tools&lt;/span&gt;: [[&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;JUnitType&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;pattern&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;reports/**&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]]])

            saucePublisher()
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&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/2017-02-23/blue-ocean.png&quot; alt=&quot;Blue Ocean Run&quot; width=&quot;800&quot;&gt;
&lt;/img&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/2017-02-23/sauce-report.png&quot; alt=&quot;SauceLabs Test Report&quot; width=&quot;800&quot;&gt;
&lt;/img&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;
Blue Ocean doesn’t support displaying SauceLabs test reports yet
(see &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/42242&quot;&gt;JENKINS-42242&lt;/a&gt;).
To view the report above, I had to switch back to the stage view of this run.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;elevating-settings-using-environment&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#elevating-settings-using-environment&quot; /&gt;Elevating Settings using &lt;code&gt;environment&lt;/code&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each time we’ve moved a project from Scripted Pipeline to Declarative,
we’ve found the cleaner format of Declarative Pipeline highlights the less
clear parts of the existing Pipeline.
In this case, the first thing that jumps out at me is that the parameters of the
Saucelabs and Nightwatch execution are hardcoded and buried down in the middle of our Pipeline.
This is a relatively short Pipeline, so it isn’t terribly hard to find them,
but as this pipeline grows and changes it would be better if those values were kept separate.
In Scripted, we’d have defined some variables,
but Declarative doesn’t allow us to define variables in the usual Groovy sense.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;environment&lt;/code&gt; directive let’s us set some environment variables
and use them later in our pipeline.
As you’d expect, the &lt;code&gt;environment&lt;/code&gt; directive is just a set of name-value pairs.
Environment variables are accessible in Pipeline via &lt;code&gt;env.variableName&lt;/code&gt; (or just &lt;code&gt;variableName&lt;/code&gt;)
and in shell scripts as standard environment variables, typically &lt;code&gt;$variableName&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s move the list of browsers, the test filter, and the sauce credential string to environment variables.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;environment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;saucelabsCredentialId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;f0a6b8ad-ce30-4cba-bf9a-95afbc470a8a&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sauceTestFilter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;tests/guineaPig.js&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;platformConfigs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;chrome,firefox,ie,edge&#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;cm&quot;&gt;/* ... unchanged ... */&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;s2&quot;&gt;&quot;Test&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;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// Add sauce credentials&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sauce&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;saucelabsCredentialId&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;c1&quot;&gt;// Start sauce connect&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;sauceconnect&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;c1&quot;&gt;// Run selenium tests using Nightwatch.js&lt;/span&gt;
                        &lt;span class=&quot;c1&quot;&gt;// Ignore error codes. The junit publisher will cover setting build status.&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./node_modules/.bin/nightwatch -e ${env.platformConfigs} --test ${env.sauceTestFilter} || true&quot;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&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;post&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ... unchanged ... */&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;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;This double-quoted string causes Groovy to replace the variables with their
literal values before passing to &lt;code&gt;sh&lt;/code&gt;.
This could also be written using singe-quotes:
&lt;code&gt;sh &#39;./node_modules/.bin/nightwatch -e $platformConfigs --test $sauceTestFilter || true&#39;&lt;/code&gt;.
With a single quoted string, the string is passed as written to the shell,
and then &lt;strong&gt;the shell&lt;/strong&gt; does the variable substitution.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;moving-complex-code-to-shared-libraries&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#moving-complex-code-to-shared-libraries&quot; /&gt;Moving Complex Code to Shared Libraries&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that we have settings separated from the code, we can do some code clean up.
Unlike the previous post, we don’t have any repeating code,
but we do have some distractions.
The nesting of &lt;code&gt;sauce&lt;/code&gt;, &lt;code&gt;sauceconnect&lt;/code&gt;, and &lt;code&gt;sh nightwatch&lt;/code&gt; seems excessive,
and that xUnit &lt;code&gt;step&lt;/code&gt; is a bit ugly as well.
Let’s move those into our shared library as custom steps with parameters.
We’ll change the &lt;code&gt;Jenkinsfile&lt;/code&gt; in our main project,
and add the custom steps to a branch named
&lt;code&gt;blog/declarative/sauce&lt;/code&gt; in our library repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;nd&quot;&gt;@Library&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;bitwiseman-shared@blog/declarative/sauce&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* ... unchanged ... */&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;s2&quot;&gt;&quot;Test&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;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sauceNightwatch&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;saucelabsCredentialId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;platformConfigs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sauceTestFilter&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;n&quot;&gt;xUnitPublishResults&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;reports/**&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;cm&quot;&gt;/* failWhenSkippedExceeds */&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;cm&quot;&gt;/* failWhenFailedExceeds */&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;saucePublisher&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;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;vars/sauceNightwatch.groovy&lt;/div&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&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;n&quot;&gt;sauceCredential&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;n&quot;&gt;platforms&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&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;n&quot;&gt;testFilter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&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;platforms&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;platforms&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;-e &#39;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;platforms&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&#39;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;testFilter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testFilter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;--test &#39;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testFilter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&#39;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Add sauce credentials&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sauce&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sauceCredential&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;c1&quot;&gt;// Start sauce connect&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sauceconnect&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;c1&quot;&gt;// Run selenium tests using Nightwatch.js&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// Ignore error codes. The junit publisher will cover setting build status.&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./node_modules/.bin/nightwatch ${platforms} ${testFilter} || true&quot;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&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;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;In this form, this could not be written using a literal single-quoted string.
Here, &lt;code&gt;platforms&lt;/code&gt; and &lt;code&gt;testFilter&lt;/code&gt; are groovy variables, not environment variables.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;vars/xUnitPublishResults.groovy&lt;/div&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&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;n&quot;&gt;pattern&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Integer&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;failWhenSkippedExceeds&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Integer&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;failWhenFailedExceeds&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;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;XUnitBuilder&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;thresholds:&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;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SkippedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureThreshold:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;failWhenSkippedExceeds&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()],&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// Allow for a significant number of failures&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// Keeping this threshold so that overwhelming failures are guaranteed&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;//     to still fail the build&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;FailedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureThreshold:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;failWhenFailedExceeds&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;toString&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;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;JUnitType&#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;n&quot;&gt;pattern&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;running-conditional-stages-using-when&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-conditional-stages-using-when&quot; /&gt;Running Conditional Stages using &lt;code&gt;when&lt;/code&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a sample web testing project.
We probably wouldn’t deploy it like we would production code,
but we might still want to deploy somewhere,
by publishing it to an artifact repository, for example.
This project is hosted on GitHub and uses feature branches and pull requests to make changes.
I’d like to use the same Pipeline for feature branches, pull requests, and the master branch,
but I only want to deploy from master.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Scripted, we’d wrap a &lt;code&gt;stage&lt;/code&gt; in an &lt;code&gt;if-then&lt;/code&gt; and check if the branch for
the current run is named &quot;master&quot;.
Declarative doesn’t support that kind of general conditional behavior.
Instead, it provides a
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#when&quot;&gt;&lt;code&gt;when&lt;/code&gt; directive&lt;/a&gt;
that can be added to &lt;code&gt;stage&lt;/code&gt; sections.
The &lt;code&gt;when&lt;/code&gt; directive supports several types of conditions, including a &lt;code&gt;branch&lt;/code&gt; condition,
where the stage will run when the branch name matches the specified pattern.
That is exactly what we need here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;stages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* ... unchanged ... */&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;Deploy&#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;branch&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;master&#39;&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;Placeholder for deploy steps.&#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;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When we run our Pipeline with this new stage, we get the following outputs:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Log output for &#39;feature/test&#39; branch&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;...
Finished Sauce Labs test publisher
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
Stage &#39;Deploy&#39; skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Log output for &#39;master&#39; branch&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;...
Finished Sauce Labs test publisher
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] echo
Placeholder for deploy steps.
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
...&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;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;I have to say, our latest Declarative Pipeline turned out extremely well.
I think someone coming from Freestyle jobs, with little to no experience with Pipeline or Groovy,
would still be able to look at this Declarative Pipeline and make sense of what it is doing.
We’ve added new functionality to our Pipeline while making it easier to understand
and maintain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope you’ve learned as much as I have during this blog series.
I’m excited to see that even in the short time since Declarative 1.0 was released,
teams are already using it in make improvements similar to what those we’ve covered in this series.
Thanks for reading!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://plugins.jenkins.io/xunit&quot;&gt;xUnit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/sauce-ondemand&quot;&gt;Sauce OnDemand&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/pipeline-model-definition&quot;&gt;Declarative Pipeline plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline Syntax Reference&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js/tree/blog/declarative/sauce&quot;&gt;Pipeline source for this post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bitwiseman/jenkins-pipeline-shared/tree/blog/declarative/sauce&quot;&gt;Pipeline Shared Library source for this post&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/2017/02/15/pipeline-editor-preview/</id>
<title>Say Hello to the Blue Ocean Pipeline Editor</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/15/pipeline-editor-preview/" />
<author>
<name>i386</name>
</author>
<category term='blueocean'></category>
<category term='editor'></category>
<category term='declarative'></category>
<category term='pipeline'></category>
<summary>
Back in September 2016 we announced the availability of the Blue Ocean beta
and the forthcoming Visual Pipeline Editor. We are happy to announce that you can try
the Pipeline Editor preview release today.


What is it?

The Visual Pipeline Editor is the simplest way for anyone wanting to get started with
creating Pipelines in Jenkins. It&#8217;s also a great way for advanced Jenkins users
to start adopting pipeline. It allows developers to break up their pipeline into different
 stages and parallelize tasks that can occur at the same time - graphically.
 The rest is up to you.


A pipeline you create visually will produce a Declarative...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/09/19/blueocean-beta-declarative-pipeline-pipeline-editor/&quot;&gt;Back in September 2016 we announced the availability of the Blue Ocean beta&lt;/a&gt;
and the forthcoming Visual Pipeline Editor. We are happy to announce that you can try
the Pipeline Editor preview release today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-is-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-it&quot; /&gt;What is it?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Visual Pipeline Editor is the simplest way for anyone wanting to get started with
creating Pipelines in Jenkins. It’s also a great way for advanced Jenkins users
to start adopting pipeline. It allows developers to break up their pipeline into different
 stages and parallelize tasks that can occur at the same time - graphically.
 The rest is up to you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A pipeline you create visually will produce a &lt;a href=&quot;https://www.jenkins.io/blog/2017/02/03/declarative-pipeline-ga/&quot;&gt;Declarative Pipeline&lt;/a&gt; Jenkinsfile for you and
 the Jenkinsfile is stored within a Git repository where it is versioned with your application code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are not sure what a Jenkins Pipeline or a Jenkinsfile is, why not check out the &lt;a href=&quot;https://www.jenkins.io/doc/&quot;&gt;new guided tour&lt;/a&gt; to learn more about 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/blueocean/editor-1.png&quot; alt=&quot;The Editor&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-are-we-doing-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-are-we-doing-next&quot; /&gt;What are we doing next?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are working hard to provide feature parity between the Declarative Pipeline syntax and the visual editor. The next phase is to integrate the editor into Blue Ocean so that you don’t have to leave the UI and commit the Jenkinsfile to your repository to complete authoring your pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Blue Ocean, you will be able to edit a &lt;code&gt;Jenkinsfile&lt;/code&gt;
for a branch directly from within the user interface using the Visual Pipeline Editor. When you are done authoring your pipeline, the pipeline definition will be saved back to your repository as a &lt;code&gt;Jenkinsfile&lt;/code&gt;. You can edit the Pipeline again using the Visual Editor or from your favorite text editor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are hoping to deliver this level of integration into Blue Ocean and the
Visual Pipeline Editor over the next few months, so be sure to check regularly for updates in
the Jenkins plugin manager.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;get-the-preview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-the-preview&quot; /&gt;Get the Preview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Visual Pipeline Editor is available in preview today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To try it out today:&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;Install the &lt;code&gt;Blue Ocean beta&lt;/code&gt; and &lt;code&gt;Blue Ocean Pipeline Editor&lt;/code&gt; from the Jenkins plugin manager&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on the &lt;code&gt;Open Blue Ocean&lt;/code&gt; button and then the &lt;code&gt;Pipeline Editor&lt;/code&gt; in the main navigation&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are looking forward to your feedback to help make the Visual Pipeline Editor
the easiest way to get started with Jenkins Pipeline. To report bugs or to
request features &lt;a href=&quot;https://www.jenkins.io/projects/blueocean#join-the-community&quot;&gt;please follow the instructions on the project page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And don’t forget to join us on our Gitter community chat &lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://app.gitter.im/#/room/#jenkinsci_blueocean-plugin:gitter.im?utm_source=badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=pr-badge&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/blueocean-plugin.svg&quot; alt=&quot;blueocean plugin&quot; /&gt;&lt;/a&gt;
- drop by and say hello!&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/15/declarative-notifications/</id>
<title>Declarative Pipeline: Notifications and Shared Libraries</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/15/declarative-notifications/" />
<author>
<name>lnewman</name>
</author>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='declarative'></category>
<category term='plugins'></category>
<category term='notifications'></category>
<category term='slack'></category>
<category term='hipchat'></category>
<category term='emailext'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Declare Your Pipelines!
Declarative Pipeline 1.0 is here!
This is the third post in a series showing some of the cool features of
Declarative Pipeline.


In the
previous post,
we converted a Scripted Pipeline to a Declarative Pipeline, adding descriptive stages
and post sections.  In one of those post blocks, we included a placeholder for
sending notifications.


In this blog post, we&#8217;ll repeat what I did in
"Sending Notifications in Pipeline
but this time in Declarative Pipeline.
First we&#8217;ll integrate calls to notification services Slack, HipChat, and Email into our Pipeline.
Then we&#8217;ll refactor those calls into a single Step in a...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Declare Your Pipelines!&lt;/strong&gt;
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/03/declarative-pipeline-ga/&quot;&gt;Declarative Pipeline 1.0 is here&lt;/a&gt;!
This is the third post in a series showing some of the cool features of
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/10/declarative-html-publisher/&quot;&gt;previous post&lt;/a&gt;,
we converted a Scripted Pipeline to a Declarative Pipeline, adding descriptive stages
and &lt;code&gt;post&lt;/code&gt; sections.  In one of those &lt;code&gt;post&lt;/code&gt; blocks, we included a placeholder for
sending notifications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post, we’ll repeat what I did in
&quot;&lt;a href=&quot;https://www.jenkins.io/blog/2016/07/18/pipeline-notifications/&quot;&gt;Sending Notifications in Pipeline&lt;/a&gt;
but this time in Declarative Pipeline.
First we’ll integrate calls to notification services Slack, HipChat, and Email into our Pipeline.
Then we’ll refactor those calls into a single Step in a Shared Library, which
we’ll reuse as needed, keeping our &lt;code&gt;Jenkinsfile&lt;/code&gt; concise and understandable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setup&quot; /&gt;Setup&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The setup for this post is almost the same as
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/10/declarative-html-publisher/&quot;&gt;my previous Declarative Pipeline post&lt;/a&gt;.
I’ve used a new branch in
&lt;a href=&quot;https://github.com/bitwiseman/hermann&quot;&gt;my fork&lt;/a&gt; of the
&lt;a href=&quot;https://github.com/reiseburo/hermann&quot;&gt;Hermann project&lt;/a&gt;:
&lt;a href=&quot;https://github.com/bitwiseman/hermann/tree/blog/declarative/notifications&quot;&gt;&lt;code&gt;blog/declarative/notifications&lt;/code&gt;&lt;/a&gt;.
I’d already set up a Multibranch Pipeline and pointed it at my repository,
so the new branch will be picked up and built automatically.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I still have my notification targets (where we’ll send notifications) that I created for the
&quot;&lt;a href=&quot;https://www.jenkins.io/blog/2016/07/18/pipeline-notifications/&quot;&gt;Sending Notifications in Pipeline&lt;/a&gt;&quot; blog post.
Take a look at that post to review how I setup the
&lt;a href=&quot;https://plugins.jenkins.io/slack&quot;&gt;Slack&lt;/a&gt;,
&lt;a href=&quot;https://plugins.jenkins.io/hipchat&quot;&gt;HipChat&lt;/a&gt;,
and &lt;a href=&quot;https://plugins.jenkins.io/email-ext&quot;&gt;Email-ext&lt;/a&gt;
plugins to use those channels.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;adding-notifications&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adding-notifications&quot; /&gt;Adding Notifications&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll start from the same Pipeline we had at the end of the previous post.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This Pipeline works quite well, except it doesn’t print anything at the start of
the run, and that final &lt;code&gt;always&lt;/code&gt; directive only prints a message to the console log.
Let’s start by getting the notifications working like we did in the original post.
We’ll just copy-and-paste the three notification steps (with different parameters)
to get the notifications working for started, success, and failure.&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;cm&quot;&gt;/* ... unchanged ... */&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;Start&#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;// send build started notifications&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;slackSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FFFF00&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;STARTED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// send to HipChat&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;hipchatSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;YELLOW&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;notify:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;STARTED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// send to email&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;emailext&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;STARTED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&amp;lt;p&amp;gt;STARTED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;:&amp;lt;/p&amp;gt;
              &amp;lt;p&amp;gt;Check console output at &amp;amp;QUOT;&amp;lt;a href=&#39;${env.BUILD_URL}&#39;&amp;gt;${env.JOB_NAME} [${env.BUILD_NUMBER}]&amp;lt;/a&amp;gt;&amp;amp;QUOT;&amp;lt;/p&amp;gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nl&quot;&gt;recipientProviders:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DevelopersRecipientProvider&#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;cm&quot;&gt;/* ... unchanged ... */&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;success&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;slackSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#00FF00&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SUCCESSFUL: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

      &lt;span class=&quot;n&quot;&gt;hipchatSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;GREEN&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;notify:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SUCCESSFUL: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

      &lt;span class=&quot;n&quot;&gt;emailext&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SUCCESSFUL: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&amp;lt;p&amp;gt;SUCCESSFUL: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;:&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt;Check console output at &amp;amp;QUOT;&amp;lt;a href=&#39;${env.BUILD_URL}&#39;&amp;gt;${env.JOB_NAME} [${env.BUILD_NUMBER}]&amp;lt;/a&amp;gt;&amp;amp;QUOT;&amp;lt;/p&amp;gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;recipientProviders:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DevelopersRecipientProvider&#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;failure&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;slackSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FF0000&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;FAILED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

      &lt;span class=&quot;n&quot;&gt;hipchatSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;RED&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;notify:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;FAILED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

      &lt;span class=&quot;n&quot;&gt;emailext&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;FAILED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&amp;lt;p&amp;gt;FAILED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;:&amp;lt;/p&amp;gt;
            &amp;lt;p&amp;gt;Check console output at &amp;amp;QUOT;&amp;lt;a href=&#39;${env.BUILD_URL}&#39;&amp;gt;${env.JOB_NAME} [${env.BUILD_NUMBER}]&amp;lt;/a&amp;gt;&amp;amp;QUOT;&amp;lt;/p&amp;gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;recipientProviders:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DevelopersRecipientProvider&#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;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2017-02-15/blueocean-notifications.png&quot; alt=&quot;Blue Ocean Run with Notifications&quot; width=&quot;800&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;moving-notifications-to-shared-library&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#moving-notifications-to-shared-library&quot; /&gt;Moving Notifications to Shared Library&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This new Pipeline works and our Declarative Pipeline sends notifications; however,
it is extremely ugly. In the original post using Scripted Pipeline,
I defined a single method that I called at both the start and end of the pipeline.
I’d like to do that here as well, but Declarative doesn’t support creating methods
that are accessible to multiple stages.
For this, we’ll need to turn to
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;Shared Libraries&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Shared Libraries, as the name suggests,
let Jenkins Pipelines share code instead of copying it to each new project.
Shared Libraries are not specific to Declarative; they were released in their
current form several months ago and were useful in Scripted Pipeline.
Due to Declarative Pipeline’s lack of support for defining methods,
Shared Libraries take on a vital role.  They are the only supported way within
Declarative Pipeline to define methods or classes that we want to use in more than one stage.&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;The lack of support for defining methods that are accessible in multiple stages,
is a known issue, with at least two JIRA tickets:
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41335&quot;&gt;JENKINS-41335&lt;/a&gt; and
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41396&quot;&gt;JENKINS-41396&lt;/a&gt;.
For this series, I chose to stick to using features that are fully supported
in Declarative Pipeline at this time.
The internet has plenty of hacked together solutions that &lt;strong&gt;happen to work today&lt;/strong&gt;,
but I wanted to highlight current best practices and dependable solutions.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;setting-up-a-shared-library&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-up-a-shared-library&quot; /&gt;Setting up a Shared Library&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve created a simple shared library repository for this series of posts, called
&lt;a href=&quot;https://github.com/bitwiseman/jenkins-pipeline-shared&quot;&gt;jenkins-pipeline-shared&lt;/a&gt;.
The shared library functionality has too many configuration options to cover in one post.
I’ve chosen to configure this library as a &quot;Global Pipeline Library,&quot;
accessible from any project on my Jenkins controller.
To setup a &quot;Global Pipeline Library,&quot; I navigated to &quot;Manage Jenkins&quot; → &quot;Configure System&quot;
in the Jenkins web UI.
Once there, under &quot;Global Pipeline Libraries&quot;, I added a new library.
I then set the name to &lt;code&gt;bitwiseman-shared&lt;/code&gt;, pointed it at my repository,
and set the default branch for the library to &lt;code&gt;master&lt;/code&gt;,
but I’ll override that in my &lt;code&gt;Jenkinsfile&lt;/code&gt;.&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/2017-02-15/shared-library.png&quot; alt=&quot;Global Pipeline Library&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;moving-the-code-to-the-library&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#moving-the-code-to-the-library&quot; /&gt;Moving the Code to the Library&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Adding a Step to a library involves creating a file with the name of our Step,
adding our code to a &lt;code&gt;call()&lt;/code&gt; method inside that file,
and replacing the appropriate code in our &lt;code&gt;Jenkinsfile&lt;/code&gt; with the new Step calls.
Libraries can be set to load &quot;implicitly,&quot;
making their default branch automatically available to all Pipelines,
or they can be loaded manually using a &lt;code&gt;@Library&lt;/code&gt; annotation.
The branch for implicitly loaded libraries can also be overridden using the &lt;code&gt;@Library&lt;/code&gt; annotation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The minimal set of dependencies for &lt;code&gt;sendNotifications&lt;/code&gt; means we can
basically copy-and-paste the code from the original blog post.
We’ll check this change into a branch in the library named
&lt;code&gt;blog/declarative/notifications&lt;/code&gt;, the same as my branch in the &lt;code&gt;hermann&lt;/code&gt; repository.
This will let us make changes on the master branch later without breaking this example.
We’ll then use the &lt;code&gt;@Library&lt;/code&gt; directive to tell Jenkins to use that branch’s version
of the library with this Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;&lt;span style=&quot;color:#34b&quot;&gt;#!groovy&lt;/span&gt;
&lt;span style=&quot;color:#007&quot;&gt;@Library&lt;/span&gt;(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bitwiseman-shared@blog/declarative/notifications&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) _ &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/span&gt;

pipeline {
  agent {
    &lt;span style=&quot;color:#777&quot;&gt;// Use docker container&lt;/span&gt;
    docker {
      image &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;ruby:2.3&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }
  }
  options {
    &lt;span style=&quot;color:#777&quot;&gt;// Only keep the 10 most recent builds&lt;/span&gt;
    buildDiscarder(logRotator(&lt;span style=&quot;color:#606&quot;&gt;numToKeepStr&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;))
  }
  stages {
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Start&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// send build started notifications&lt;/span&gt;
        sendNotifications &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;STARTED&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// install required bundles&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// build&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle exec rake build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }

      post {
        success {
          &lt;span style=&quot;color:#777&quot;&gt;// Archive the built artifacts&lt;/span&gt;
          archive &lt;span style=&quot;color:#606&quot;&gt;includes&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;pkg/*.gem&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
        }
      }
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// run tests with coverage&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle exec rake spec&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }

      post {
        success {
          &lt;span style=&quot;color:#777&quot;&gt;// publish html&lt;/span&gt;
          publishHTML &lt;span style=&quot;color:#606&quot;&gt;target&lt;/span&gt;: [
              &lt;span style=&quot;color:#606&quot;&gt;allowMissing&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;alwaysLinkToLastBuild&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;keepAll&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;reportDir&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;coverage&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;reportFiles&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;index.html&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;reportName&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;RCov Report&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            ]
        }
      }
    }
  }
  post {
    always {
      sendNotifications currentBuild.result
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;_&lt;/code&gt; here is intentional.
&lt;a href=&quot;https://en.wikipedia.org/wiki/Java_annotation&quot;&gt;Java/Groovy Annotations&lt;/a&gt;
such as &lt;code&gt;@Library&lt;/code&gt; must be applied to an element.
That is often a &lt;code&gt;using&lt;/code&gt; statement, but that isn’t needed here so by convention we use an &lt;code&gt;\_&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;vars/sendNotifications.groovy&lt;/div&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;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/usr/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;groovy&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/**
 * Send notifications based on build status string
 */&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&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;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;STARTED&#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;c1&quot;&gt;// build status of null means successful&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SUCCESS&#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Default values&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colorName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;RED&#39;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FF0000&#39;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${buildStatus}: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;&quot;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${subject} (${env.BUILD_URL})&quot;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;details&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&amp;lt;p&amp;gt;${buildStatus}: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;:&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Check console output at &amp;amp;QUOT;&amp;lt;a href=&#39;${env.BUILD_URL}&#39;&amp;gt;${env.JOB_NAME} [${env.BUILD_NUMBER}]&amp;lt;/a&amp;gt;&amp;amp;QUOT;&amp;lt;/p&amp;gt;&quot;&quot;&quot;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Override default values based on build status&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;STARTED&#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;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;YELLOW&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FFFF00&#39;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SUCCESS&#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;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;GREEN&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#00FF00&#39;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;RED&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FF0000&#39;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Send notifications&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;slackSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;hipchatSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;notify:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;emailext&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;to:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bitwiseman@bitwiseman.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;recipientProviders:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DevelopersRecipientProvider&#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;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/2017-02-15/blueocean-notifications-finished.png&quot; alt=&quot;Global Pipeline Library&quot; width=&quot;800&quot;&gt;
&lt;/img&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/2017-02-15/popups.png&quot; alt=&quot;HipChat and Slack Popups&quot;&gt;
&lt;/img&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/2017-02-15/mailcatcher.png&quot; alt=&quot;MailCatcher List&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;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;In this post we added notifications to our Declarative Pipeline.
We wanted to move our repetitive notification code into a method;
however, Declarative Pipeline prevented us from defining a method in our &lt;code&gt;Jenkinsfile&lt;/code&gt;.
Instead, with the help of the Shared Library feature,
we were able to define a &lt;code&gt;sendNotifications&lt;/code&gt; Step that we could call from our &lt;code&gt;Jenkinsfile&lt;/code&gt;.
This maintained the clarity of our Pipeline and will let us easily reuse this Step in other projects.
I was pleased to see how little the resulting Pipeline differed from where we started.
The changes were restricted to the start and end of the file with no reformatting elsewhere.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the next post, we’ll cover more about shared libraries and how to
run Sauce OnDemand with xUnit Reporting in Declarative Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://plugins.jenkins.io/pipeline-model-definition&quot;&gt;Declarative Pipeline plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline Syntax Reference&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries/&quot;&gt;Shared Library reference&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bitwiseman/hermann/tree/blog/declarative/notifications&quot;&gt;Pipeline source for this post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bitwiseman/jenkins-pipeline-shared/tree/blog/declarative/notifications&quot;&gt;Pipeline Shared Library source for this post&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/2017/02/10/declarative-html-publisher/</id>
<title>Declarative Pipeline: Publishing HTML Reports</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/10/declarative-html-publisher/" />
<author>
<name>lnewman</name>
</author>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='declarative'></category>
<category term='plugins'></category>
<category term='ruby'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Declare Your Pipelines!
Declarative Pipeline 1.0 is here!
This is the second post in a series showing some of the cool features of
Declarative Pipeline.


In the
previous blog post,
we created a simple Declarative Pipeline.
In this blog post, we&#8217;ll go back and look at the Scripted Pipeline for the
Publishing HTML Reports in Pipeline blog post.
We&#8217;ll convert that Pipeline to Declarative syntax (including properties), go
into more detail on the post section, and then we&#8217;ll use the agent
directive to switch our Pipeline to run in Docker.


Setup


For this post, I&#8217;m going to use the
blog/add-declarative/html
branch of
my fork of the
hermann...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Declare Your Pipelines!&lt;/strong&gt;
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/03/declarative-pipeline-ga/&quot;&gt;Declarative Pipeline 1.0 is here&lt;/a&gt;!
This is the second post in a series showing some of the cool features of
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/07/declarative-maven-project/&quot;&gt;previous blog post&lt;/a&gt;,
we created a simple Declarative Pipeline.
In this blog post, we’ll go back and look at the Scripted Pipeline for the
&lt;a href=&quot;https://www.jenkins.io/blog/2016/07/01/html-publisher-plugin/&quot;&gt;Publishing HTML Reports in Pipeline&lt;/a&gt; blog post.
We’ll convert that Pipeline to Declarative syntax (including &lt;code&gt;properties&lt;/code&gt;), go
into more detail on the &lt;code&gt;post&lt;/code&gt; section, and then we’ll use the &lt;code&gt;agent&lt;/code&gt;
directive to switch our Pipeline to run in Docker.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setup&quot; /&gt;Setup&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this post, I’m going to use the
&lt;a href=&quot;https://github.com/bitwiseman/hermann/tree/blog/declarative/html&quot;&gt;&lt;code&gt;blog/add-declarative/html&lt;/code&gt;&lt;/a&gt;
branch of
&lt;a href=&quot;https://github.com/bitwiseman/hermann&quot;&gt;my fork&lt;/a&gt; of the
&lt;a href=&quot;https://github.com/reiseburo/hermann&quot;&gt;hermann project&lt;/a&gt;.
I’ve set up a Multibranch Pipeline and pointed it at my repository
the same as did it previous post.
Also the same as before, I’ve set this Pipeline’s Git configuration to
automatically &quot;Clean after checkout&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This time we already have a Pipeline checked in.
I’ll run it a few times to get a baseline.&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/2017-02-10/scripted-build.png&quot; alt=&quot;Stage view&quot;&gt;
&lt;/img&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/2017-02-10/scripted-rcov.png&quot; alt=&quot;RCov Report&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;converting-to-declarative&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#converting-to-declarative&quot; /&gt;Converting to Declarative&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s start by converting the Scripted Pipeline straight to Declarative.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
  agent any &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/span&gt;
  options {
    &lt;span style=&quot;color:#777&quot;&gt;// Keep the 10 most recent builds&lt;/span&gt;
    buildDiscarder(logRotator(&lt;span style=&quot;color:#606&quot;&gt;numToKeepStr&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)) &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/span&gt;
  }
  stages {
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/span&gt;
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// install required gems&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

        &lt;span style=&quot;color:#777&quot;&gt;// build and run tests with coverage&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle exec rake build spec&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

        &lt;span style=&quot;color:#777&quot;&gt;// Archive the built artifacts&lt;/span&gt;
        archive &lt;span style=&quot;color:#606&quot;&gt;includes&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;pkg/*.gem&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

        &lt;span style=&quot;color:#777&quot;&gt;// publish html&lt;/span&gt;
        publishHTML &lt;span style=&quot;color:#606&quot;&gt;target&lt;/span&gt;: [
            &lt;span style=&quot;color:#606&quot;&gt;allowMissing&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;alwaysLinkToLastBuild&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;keepAll&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;reportDir&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;coverage&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;reportFiles&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;index.html&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;reportName&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;RCov Report&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
          ]
      }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;properties([[&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;BuildDiscarderProperty&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
                &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;strategy&lt;/span&gt;: [&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;LogRotator&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;numToKeepStr&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]]]) &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/span&gt;

node { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/span&gt;
  stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/span&gt;

    &lt;span style=&quot;color:#777&quot;&gt;// Checkout&lt;/span&gt;
    checkout scm &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/span&gt;

    &lt;span style=&quot;color:#777&quot;&gt;// install required gems&lt;/span&gt;
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

    &lt;span style=&quot;color:#777&quot;&gt;// build and run tests with coverage&lt;/span&gt;
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle exec rake build spec&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

    &lt;span style=&quot;color:#777&quot;&gt;// Archive the built artifacts&lt;/span&gt;
    archive &lt;span style=&quot;color:#606&quot;&gt;includes&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;pkg/*.gem&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

    &lt;span style=&quot;color:#777&quot;&gt;// publish html&lt;/span&gt;
    publishHTML [
        &lt;span style=&quot;color:#606&quot;&gt;allowMissing&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
        &lt;span style=&quot;color:#606&quot;&gt;alwaysLinkToLastBuild&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
        &lt;span style=&quot;color:#606&quot;&gt;keepAll&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;,
        &lt;span style=&quot;color:#606&quot;&gt;reportDir&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;coverage&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
        &lt;span style=&quot;color:#606&quot;&gt;reportFiles&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;index.html&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
        &lt;span style=&quot;color:#606&quot;&gt;reportName&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;RCov Report&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      ]

  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Select where to run this Pipeline, in this case &quot;any&quot; agent, regardless of label.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Declarative automatically performs a checkout of source code on the agent,
whereas Scripted Pipeline users must explicitly call &lt;code&gt;checkout scm&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Set the Pipeline option to preserve the ten most recent runs.
This overrides the default behavior from the Multibranch parent of this Pipeline.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Run the &quot;Build&quot; stage.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/2017-02-10/declarative-build.png&quot; alt=&quot;Stage view&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that we have this Pipeline in Declarative form, let’s take a minute to do a
little clean up.  We’ll split out the &lt;code&gt;bundle&lt;/code&gt; actions a little more and move
steps into logically grouped stages.  Rather than having one monolithic &quot;Build&quot;
stage, we’ll have details for each stage.  As long as we’re prettying things
up, let’s switch to using &lt;a href=&quot;https://www.jenkins.io/projects/blueocean/&quot;&gt;Blue Ocean&lt;/a&gt; to view our
builds, as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
  agent any
  options {
    &lt;span style=&quot;color:#777&quot;&gt;// Keep the 10 most recent builds&lt;/span&gt;
    buildDiscarder(logRotator(&lt;span style=&quot;color:#606&quot;&gt;numToKeepStr&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;))
  }
  stages {
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// install required gems&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// build&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle exec rake build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

        &lt;span style=&quot;color:#777&quot;&gt;// Archive the built artifacts&lt;/span&gt;
        archive &lt;span style=&quot;color:#606&quot;&gt;includes&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;pkg/*.gem&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// run tests with coverage&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle exec rake spec&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

        &lt;span style=&quot;color:#777&quot;&gt;// publish html&lt;/span&gt;
        publishHTML &lt;span style=&quot;color:#606&quot;&gt;target&lt;/span&gt;: [
            &lt;span style=&quot;color:#606&quot;&gt;allowMissing&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;alwaysLinkToLastBuild&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;keepAll&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;reportDir&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;coverage&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;reportFiles&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;index.html&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;reportName&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;RCov Report&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
          ]
      }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&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/2017-02-10/declarative-stages.png&quot; alt=&quot;Blue Ocean View&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;using-post-sections&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-post-sections&quot; /&gt;Using &lt;code&gt;post&lt;/code&gt; sections&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This looks pretty good, but if we think about it
the &lt;code&gt;archive&lt;/code&gt; and &lt;code&gt;publishHTML&lt;/code&gt; steps are really post-stage actions.
They should only occur when the rest of their stage succeeds.
As our Pipeline gets more complex we might need to add actions that always happen
even if a stage or the Pipeline as a whole fail.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Scripted Pipeline, we would use &lt;code&gt;try-catch-finally&lt;/code&gt;,
but we cannot do that in Declarative.
One of the defining features of the Declarative Pipeline
is that it does not allow script-based control structures
such as &lt;code&gt;for&lt;/code&gt; loops, &lt;code&gt;if-then-else&lt;/code&gt; blocks, or &lt;code&gt;try-catch-finally&lt;/code&gt; blocks.
Of course, internally Step implementations can still contain whatever conditional logic they want,
but the Declarative Pipeline cannot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of free-form conditional logic,
Declarative Pipeline provides a set of Pipeline-specific controls:
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#when&quot;&gt;&lt;code&gt;when&lt;/code&gt; directives&lt;/a&gt;, which we’ll look at in
a later blog post in this series, control whether to execute the steps in a stage,
and
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#post&quot;&gt;&lt;code&gt;post&lt;/code&gt; sections&lt;/a&gt;
control which actions to take based on result of a single stage
or a whole Pipeline.  &lt;code&gt;post&lt;/code&gt; supports a number of
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#post-conditions&quot;&gt;run conditions&lt;/a&gt;,
including &lt;code&gt;always&lt;/code&gt; (execute no matter what) and &lt;code&gt;changed&lt;/code&gt;
(execute when the result differs from previous run).
We’ll use &lt;code&gt;success&lt;/code&gt; to run &lt;code&gt;archive&lt;/code&gt; and &lt;code&gt;publishHTML&lt;/code&gt; when their respective stages complete.
We’ll also use an &lt;code&gt;always&lt;/code&gt; block with a placeholder for sending notifications,
which I’ll implement in the next blog post.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
  agent any
  options {
    &lt;span style=&quot;color:#777&quot;&gt;// Only keep the 10 most recent builds&lt;/span&gt;
    buildDiscarder(logRotator(&lt;span style=&quot;color:#606&quot;&gt;numToKeepStr&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;))
  }
  stages {
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// install required gems&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// build&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle exec rake build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }

      post {
        success {
          &lt;span style=&quot;color:#777&quot;&gt;// Archive the built artifacts&lt;/span&gt;
          archive &lt;span style=&quot;color:#606&quot;&gt;includes&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;pkg/*.gem&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
        }
      }
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        &lt;span style=&quot;color:#777&quot;&gt;// run tests with coverage&lt;/span&gt;
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bundle exec rake spec&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }

      post {
        success {
          &lt;span style=&quot;color:#777&quot;&gt;// publish html&lt;/span&gt;
          publishHTML &lt;span style=&quot;color:#606&quot;&gt;target&lt;/span&gt;: [
              &lt;span style=&quot;color:#606&quot;&gt;allowMissing&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;alwaysLinkToLastBuild&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;keepAll&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;reportDir&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;coverage&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;reportFiles&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;index.html&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
              &lt;span style=&quot;color:#606&quot;&gt;reportName&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;RCov Report&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            ]
        }
      }
    }
  }
  post {
    always {
      echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Send notifications for result: &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;currentBuild.result&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&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;switching-agent-to-run-in-docker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#switching-agent-to-run-in-docker&quot; /&gt;Switching &lt;code&gt;agent&lt;/code&gt; to run in Docker&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;agent&lt;/code&gt; can actually accept
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#agent-parameters&quot;&gt;several other parameters&lt;/a&gt; instead of &lt;code&gt;any&lt;/code&gt;.
We could filter on &lt;code&gt;label &quot;some-label&quot;&lt;/code&gt;, for example,
which would be the equivalent of &lt;code&gt;node (&#39;some-label&#39;)&lt;/code&gt; in Scripted Pipeline.
However, &lt;code&gt;agent&lt;/code&gt; also lets us just as easily switch to using a Docker container,
which replaces a more complicated set of changes in Scripted Pipeline:&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;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Use docker container&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ruby:2.3&#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;cm&quot;&gt;/* ... unchanged ... */&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;If I needed to, I could add a &lt;code&gt;label&lt;/code&gt; filter under &lt;code&gt;docker&lt;/code&gt;
to select a node to host the Docker container.
I already have Docker available on all my agents, so I don’t need &lt;code&gt;label&lt;/code&gt; -
this works as is.
As you can see below, the Docker container spins up at the start of the run
and the pipeline runs inside it.  Simple!&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/2017-02-10/declarative-docker.png&quot; alt=&quot;Docker Container Started&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;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;At first glance, the Declarative Pipeline’s removal of control structures seems
like it would be too constrictive.  However, it replaces those structures with
facilities like the &lt;code&gt;post&lt;/code&gt; section, that give us reasonable control over the
flow of our Pipeline while still improving readability and maintainability.
In the next blog post, we’ll add notifications to this pipeline
and look at how to use Shared Libraries with Declarative
Pipeline to share code and keep Pipelines easy to understand.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&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/pipeline-model-definition&quot;&gt;Declarative Pipeline plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline Syntax Reference&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bitwiseman/hermann/tree/blog/declarative/html&quot;&gt;Pipeline source for this post&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/10/blueocean-devlog-feb2/</id>
<title>Blue Ocean Dev Log: February Week #2</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/10/blueocean-devlog-feb2/" />
<author>
<name>michaelneale</name>
</author>
<category term='blueocean'></category>
<summary>
We&#8217;re counting down the weeks until
Blue Ocean
1.0, which is planned for the end of March. If you hadn&#8217;t picked up on the hint
in my
previous post,
most of the Blue Ocean development team is in Australia, where it is currently
the middle of summer. As I write this it is about 1000 degrees outside.
Emergency measures such as air-conditioning and beer have been deployed in
order to continue Blue Ocean development.


This week featured a new beta with the
SCM API
changes; many bug fixes, and some version bumps went out in beta 22. We also
got some fresh new designs coming soon, though not in time for beta...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re counting down the weeks until
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;
1.0, which is planned for the end of March. If you hadn’t picked up on the hint
in my
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/03/blueocean-devlog-feb/&quot;&gt;previous post&lt;/a&gt;,
most of the Blue Ocean development team is in Australia, where it is currently
the middle of summer. As I write this it is about 1000 degrees outside.
Emergency measures such as air-conditioning and beer have been deployed in
order to continue Blue Ocean development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week featured a new beta with the
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/06/scm-api-2-take2/&quot;&gt;SCM API&lt;/a&gt;
changes; many bug fixes, and some version bumps went out in beta 22. We also
got some fresh new designs coming soon, though not in time for beta 22.&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/blueocean-dev-log/new-design-overview.png&quot; alt=&quot;Overview&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some development highlights:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Beta 22 went out featuring the new
&lt;a href=&quot;https://github.com/jenkinsci/blueocean-plugin/commit/b8c8fb1080117f1c0448b0cfdb831543a109f4f8&quot;&gt;SCM API&lt;/a&gt;
with better use of GitHub API rate limits.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A fix for publishing of
&lt;a href=&quot;https://plugins.jenkins.io/pubsub-light&quot;&gt;Server Side Events&lt;/a&gt;
that made one CPU spin up to 100% was fixed (not good unless you want to heat up
your room)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some new refinements to the design merged to the master branch (see images below).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beta 22 featured the 1.0 version of
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/03/declarative-pipeline-ga/&quot;&gt;Declarative Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An
&lt;a href=&quot;https://github.com/jenkinsci/blueocean-plugin/commit/99524c36afedfb11150ac20d26c6b1d4e01b714a&quot;&gt;Australian translation&lt;/a&gt;
was added; really critical stuff, I know..&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Acceptance Test Harness (ATH) was stabilised a bit and it now covers
creating Pipelines from Git, which we talked about in
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/27/blueocean-dev-log-jan4/&quot;&gt;late January&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://plugins.jenkins.io/blueocean-pipeline-editor&quot;&gt;Visual Pipeline Editor&lt;/a&gt; was released to the main Update Center
as a preview release, ready to play with!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some small performance improvements&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m looking forward to those fancy new designs making their way into an
upcoming release too.&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/blueocean-dev-log/new-design-success.png&quot; alt=&quot;Successful Pipeline&quot; /&gt;&lt;/span&gt;
&lt;/p&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/blueocean-dev-log/new-design-failure.png&quot; alt=&quot;Failing Pioeline&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lovely! Hopefully you see more green than I do…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anyways, up next for Blue Ocean:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Creation of Pipelines from GitHub, including auto-discovery of new Pipelines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Closer to a &quot;release candidate&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Working on filtering the activity view for &quot;per branch&quot; views&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Better reporting of durations of stages, steps, and runs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping to make Blue Ocean a great user experience for
Jenkins, please join the Blue Ocean development team on
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/08/jenkins-datadog-plugin/</id>
<title>Monitor Jenkins jobs with the Datadog plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/08/jenkins-datadog-plugin/" />
<author>
<name>echang26</name>
</author>
<category term='plugins'></category>
<category term='monitoring'></category>
<summary>
This is a guest post by Emily Chang, Technical Author at Datadog. A modified version of this article was originally posted on the
Datadog blog.






If you&#8217;re using Jenkins to continuously integrate changes into your projects, it&#8217;s helpful to be able to quickly identify build failures and assess their impact on other components of your stack.


Datadog&#8217;s plugin helps users monitor and alert on the performance of their Jenkins builds, right alongside the rest of their infrastructure and applications.


As shown in the out-of-the-box dashboard below, the Datadog plugin provides a bird&#8217;s-eye view of job history and trends. You can use Datadog to:




Set alerts...
</summary>
<content type='html'>
&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;This is a guest post by Emily Chang, Technical Author at Datadog. A modified version of this article was originally posted on the
&lt;a href=&quot;https://datadoghq.com/blog/monitor-jenkins-datadog&quot;&gt;Datadog blog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re using Jenkins to continuously integrate changes into your projects, it’s helpful to be able to quickly identify build failures and assess their impact on other components of your stack.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Datadog’s plugin helps users monitor and alert on the performance of their Jenkins builds, right alongside the rest of their infrastructure and applications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As shown in the out-of-the-box dashboard below, &lt;a href=&quot;https://plugins.jenkins.io/datadog&quot;&gt;the Datadog plugin&lt;/a&gt; provides a bird’s-eye view of job history and trends. You can use Datadog to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set alerts for important build failures&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Identify trends in build durations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Correlate Jenkins events with performance metrics from other parts of your infrastructure in order to identify and resolve issues&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/jenkins-datadog-plugin/jenkins-screenboard.png&quot; alt=&quot;Jenkins default dashboard in Datadog&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;track-jenkins-build-status-in-real-time&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#track-jenkins-build-status-in-real-time&quot; /&gt;Track Jenkins build status in real-time&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you install the &lt;a href=&quot;https://plugins.jenkins.io/datadog&quot;&gt;Datadog plugin&lt;/a&gt;, Jenkins activities (when a build starts, fails, or succeeds) will start appearing in your &lt;a href=&quot;https://www.datadoghq.com/blog/filter-datadog-events-stream-pinpoint-events-infrastructure&quot;&gt;Datadog event stream&lt;/a&gt;. You will also see what percentage of builds failed within the same job, so that you can quickly spot which jobs are experiencing a higher rate of failure than others.&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/jenkins-datadog-plugin/jenkins-event-stream.png&quot; alt=&quot;Jenkins events in Datadog event stream&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Remember to blacklist any jobs you don’t want to track by indicating them in your plugin configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Datadog’s out-of-the-box Jenkins dashboard includes a status widget that displays the count of all jobs that have run in the past day, grouped by success or failure. To explore further, you can also click on the widget to view the individual jobs that have failed or succeeded in the past day.&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/jenkins-datadog-plugin/check-status-widget.png&quot; alt=&quot;Jenkins jobs tagged by result success or failure&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The dashboard also displays the proportion of successful vs. failed builds, along with the total number of job runs completed over the past four hours.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Datadog enables you to &lt;a href=&quot;https://docs.datadoghq.com/guides/eventcorrelation/&quot;&gt;correlate Jenkins events&lt;/a&gt; with application performance metrics to investigate the root cause of an issue. For example, the screenshot below shows that average CPU on the app servers increased sharply after a Jenkins build was completed and deployed (indicated by the pink bar). Your team can use this information as a starting point to investigate if code changes in the corresponding release may be causing issues.&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/jenkins-datadog-plugin/avgcpu_image.png&quot; alt=&quot;Jenkins build affects CPU graph&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;visualize-job-duration-metrics&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#visualize-job-duration-metrics&quot; /&gt;Visualize job duration metrics&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every time a build is completed, the plugin collects the build duration as a metric that you can aggregate by job name or any other tag, and graph over time. In the screenshot below, we can view the average job durations in the past four hours, sorted in decreasing order:&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/jenkins-datadog-plugin/jenkins-job-durations-toplist.png&quot; alt=&quot;Jenkins job durations ranked in Datadog&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also graph and visualize trends in build durations for each job by using Datadog’s &lt;a href=&quot;https://www.datadoghq.com/blog/visualizing-trends-regression-lines&quot;&gt;&lt;code&gt;robust_trend()&lt;/code&gt; linear regression function&lt;/a&gt;, as shown in the screenshot below. This graph indicates which jobs&#39; durations are trending longer over time, so that you can investigate if there appears to be a problem. If you’re experimenting with changes to your CI pipeline, consulting this graph can help you track the effects of those changes over time.&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/jenkins-datadog-plugin/jenkins-job-duration-trends.png&quot; alt=&quot;Jenkins build duration trends graph&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;use-tags-to-monitor-your-jenkins-jobs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-tags-to-monitor-your-jenkins-jobs&quot; /&gt;Use tags to monitor your Jenkins jobs&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tags add custom dimensions to your monitoring, so you can focus on what’s important to you right now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every Jenkins event, metric, and service check is auto-tagged with &lt;code&gt;job&lt;/code&gt;, &lt;code&gt;result&lt;/code&gt;, and &lt;code&gt;branch&lt;/code&gt; (if applicable). You can also enable the optional &lt;code&gt;node&lt;/code&gt; tag in the plugin settings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of version 0.5.0, the &lt;a href=&quot;https://github.com/DataDog/jenkins-datadog-plugin/blob/master/CHANGELOG.md&quot;&gt;plugin supports custom tags&lt;/a&gt;. This update was developed by one of our open source contributors, &lt;a href=&quot;https://github.com/MadsNielsen&quot;&gt;Mads Nielsen&lt;/a&gt;. Many thanks to Mads for helping us implement this feature!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can create custom tags for the name of the application you’re building, your particular team name (e.g. &lt;code&gt;team=licorice&lt;/code&gt;), or any other info that matters to you. For example, if you have multiple jobs that perform nightly builds, you might want to create a descriptive tag that distinguishes them from other types of jobs.&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/jenkins-datadog-plugin/tagging.png&quot; alt=&quot;add tags to jenkins datadog plugin&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As shown in the configuration settings above, you can add custom tags, formatted as &lt;code&gt;key=value&lt;/code&gt;, in two ways:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;in a text file (saved in the workspace for the job)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;in a list of properties in the text box&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;set-up-the-datadog-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#set-up-the-datadog-plugin&quot; /&gt;Set up the Datadog plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Datadog plugin requires Jenkins 1.580.1 or newer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Jenkins, navigate to &lt;strong&gt;Manage Jenkins &amp;gt; Manage Plugins.&lt;/strong&gt;&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/jenkins-datadog-plugin/jenkins_signup1.png&quot; alt=&quot;signup step 1&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Search for &lt;strong&gt;Datadog Plugin&lt;/strong&gt; and check the box to install 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/jenkins-datadog-plugin/jenkins_signup2b.png&quot; alt=&quot;signup step 2&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Jenkins, go to &lt;strong&gt;Manage Jenkins &amp;gt; Configure System.&lt;/strong&gt;&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/jenkins-datadog-plugin/jenkins_signup3.png&quot; alt=&quot;signup step 3&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Scroll down to the &lt;strong&gt;Datadog Plugin&lt;/strong&gt; section, and paste your API key in the text box. You can copy this from the &lt;a href=&quot;https://app.datadoghq.com/account/login?next=%2Faccount%2Fsettings#api&quot;&gt;API Keys&lt;/a&gt; page of your Datadog account. Click &lt;strong&gt;Test Key&lt;/strong&gt; to confirm that the plugin recognizes your API key.&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/jenkins-datadog-plugin/jenkins_signup4.png&quot; alt=&quot;signup step 4&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Save your changes, and you’re all set!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;get-started&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-started&quot; /&gt;Get started&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re already using Datadog, you can start monitoring Jenkins jobs by following the &lt;a href=&quot;https://app.datadoghq.com/account/settings#integrations/jenkins&quot;&gt;instructions here&lt;/a&gt; to download the Datadog plugin. If you’re not using Datadog yet, here’s a &lt;a href=&quot;https://app.datadoghq.com/signup&quot;&gt;14-day free trial&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/07/gsoc2017-announcement/</id>
<title>Google Summer Of Code 2017: Call for mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/07/gsoc2017-announcement/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='gsoc'></category>
<category term='events'></category>
<category term='general'></category>
<category term='gsoc2017'></category>
<summary>
On behalf of the GSoC Org Admin team I am happy to announce that we are going to apply to
Google Summer of Code (GSoC) again this year.
In GSoC high-profile students work in open-source projects for several months under mentorship of organization members.


We are looking for mentors and project ideas.
So yes, we are looking for you :)


Conditions


As a mentor, you will be asked to:




lead the project in the area of their interest


actively participate in the project during student selection, community bonding and coding phases (March - August)


work in teams of 2+ mentors per 1 each student


dedicate a consistent and significant amount...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the GSoC Org Admin team I am happy to announce that we are going to apply to
&lt;a href=&quot;https://developers.google.com/open-source/gsoc/&quot;&gt;Google Summer of Code (GSoC) again this year&lt;/a&gt;.
In GSoC high-profile students work in open-source projects for several months under mentorship of organization members.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are looking for mentors and project ideas.
So yes, we are looking for you :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conditions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conditions&quot; /&gt;Conditions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a mentor, you will be asked to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;lead the project in the area of their interest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;actively participate in the project during student selection, community bonding and coding phases (March - August)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;work in teams of 2+ mentors per 1 each student&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;dedicate a consistent and significant amount of time, especially during the coding phase (&lt;em&gt;~5 hours&lt;/em&gt; per week in the team of two mentors)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mentorship does not require strong expertise in Jenkins plugin development.
The main objective is to guide students and to get them involved into the Jenkins community.
If your mentor team requires any specific expertise, GSoC org admins will do their best in order to find advisors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-do-you-get&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-do-you-get&quot; /&gt;What do you get?&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;A student, who works within the area of your interest on full-time for several months&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Joint projects with Jenkins experts, lots of fun and ability to study something together&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Limited edition of swags from Google and Jenkins project&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maybe: Participation in GSoC Mentor Summit in California with expense coverage (depends on project results and per-project quotas)&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;requirements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#requirements&quot; /&gt;Requirements&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;passionate about Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;interested in being a mentor or advisor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ready to dedicate time &amp;amp;&amp;amp; have no major unavailability periods planned to this summer&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We expect mentors to be available by email during 75% of working days in the May-August timeframe&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Your project idea is:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;about code (though it may and likely should include some documentation and testing work)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;about Jenkins (plugins, core, infrastructure, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;potentially doable by a student in 3-4 months&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;how-to-apply&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-apply&quot; /&gt;How to apply&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested, drop the Email to the Jenkins Developer mailing list with the &lt;em&gt;GSoC2017&lt;/em&gt; prefix.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Briefly describe your project idea (a couple of sentences) and required qualifications from students. Examples: &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016#GoogleSummerOfCode2016-Projectideas&quot;&gt;GSoC2016&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/projects/gsoc&quot;&gt;GSoC2017 - current project ideas&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you already have a co-mentor(s), please mention them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Having several project ideas is fine. Having no specific ideas is also fine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;Disclaimer: We cannot guarantee that all projects happen, it depends on student application results and the number of project slots.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://developers.google.com/open-source/gsoc/&quot;&gt;Google Summer of Code page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc&quot;&gt;Jenkins GSoC Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016#GoogleSummerOfCode2016-Projectideas&quot;&gt;GSoC2016 project ideas&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/gsoc2016&quot;&gt;GSoC2016 page&lt;/a&gt; (project results and more info)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/07/declarative-maven-project/</id>
<title>Declarative Pipeline for Maven Projects</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/07/declarative-maven-project/" />
<author>
<name>lnewman</name>
</author>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='declarative'></category>
<category term='maven'></category>
<category term='java'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Declare Your Pipelines!
Declarative Pipeline 1.0 is here!
This is first in a series of blog posts that will show some of the cool features of
Declarative Pipeline.
For several of these posts, I&#8217;ll be revisiting some of my
previous posts
on using various plugins with (Scripted) Pipeline,
and seeing how those are implemented in Declarative Pipeline.


To start though, let&#8217;s get familiar with the basic structure of a Declarative Pipeline
by creating a simple Pipeline for a Maven-based Java project - the
Jenkins JUnit plugin.
We&#8217;ll create a minimal Declarative Pipeline,
add the settings needed to install Maven and the JDK,
and...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Declare Your Pipelines!&lt;/strong&gt;
&lt;a href=&quot;https://www.jenkins.io/blog/2017/02/03/declarative-pipeline-ga/&quot;&gt;Declarative Pipeline 1.0 is here&lt;/a&gt;!
This is first in a series of blog posts that will show some of the cool features of
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline&lt;/a&gt;.
For several of these posts, I’ll be revisiting some of my
&lt;a href=&quot;https://www.jenkins.io/blog/2016/07/18/pipeline-notifications/&quot;&gt;previous posts&lt;/a&gt;
on using various plugins with (Scripted) Pipeline,
and seeing how those are implemented in Declarative Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To start though, let’s get familiar with the basic structure of a Declarative Pipeline
by creating a simple Pipeline for a Maven-based Java project - the
&lt;a href=&quot;https://plugins.jenkins.io/junit&quot;&gt;Jenkins JUnit plugin&lt;/a&gt;.
We’ll create a minimal Declarative Pipeline,
add the settings needed to install Maven and the JDK,
and finally we’ll actually run Maven to build the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;set-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#set-up&quot; /&gt;Set up&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Declarative, it is still possible to run Pipelines edited directly in the
Jenkins web UI, but one of the key features of &quot;Pipeline as Code&quot; is
checking-in and being able to track changes.  For this post, I’m going to use
the
&lt;a href=&quot;https://github.com/bitwiseman/junit-plugin/tree/blog/add-declarative-pipeline&quot;&gt;&lt;code&gt;blog/add-declarative-pipeline&lt;/code&gt;&lt;/a&gt;
branch of
&lt;a href=&quot;https://github.com/bitwiseman/junit-plugin&quot;&gt;my fork&lt;/a&gt; of the JUnit plugin.
I’m going to set up a Multi-branch Pipeline and point it at my repository.&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/2017-02-07/junit-config.png&quot; alt=&quot;JUnit Multi-branch Pipeline Configuration&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve also set this Pipeline’s Git configuration to automatically &quot;clean after
checkout&quot; and to only keep the ten most recent runs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;writing-a-minimal-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#writing-a-minimal-pipeline&quot; /&gt;Writing a Minimal Pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As has been said before, Declarative Pipeline provides a more structured,
&quot;opinionated&quot; way to create Pipelines. I’m going to start by creating a minimal
Declarative Pipeline and adding it to my branch.  Below is a minimal Pipeline
(with annotations) that just prints a message:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/span&gt;
    agent any &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/span&gt;
    stages { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/span&gt;
        stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;(5)&lt;/b&gt;&lt;/span&gt;
            steps { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;6&quot; /&gt;&lt;b&gt;(6)&lt;/b&gt;&lt;/span&gt;
               echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;This is a minimal pipeline.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;7&quot; /&gt;&lt;b&gt;(7)&lt;/b&gt;&lt;/span&gt;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;node { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/span&gt;
    checkout scm &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/span&gt;
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;(5)&lt;/b&gt;&lt;/span&gt;
        echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;This is a minimal pipeline.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;6&quot; /&gt;&lt;b&gt;(6)&lt;/b&gt;&lt;/span&gt;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;All Declarative Pipelines start with a &lt;code&gt;pipeline&lt;/code&gt; section.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Select where to run this Pipeline, in this case &quot;any&quot; agent, regardless of label.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Declarative automatically performs a checkout of source code on the agent,
whereas Scripted Pipeline users must explicitly call &lt;code&gt;checkout scm&lt;/code&gt;,&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A Declarative Pipeline is defined as a series of stages.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Run the &quot;Build&quot; stage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;6&quot; /&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Each stage in a Declarative Pipeline runs a series of steps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;7&quot; /&gt;&lt;b&gt;7&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Run the &lt;code&gt;echo&lt;/code&gt; step to print a message in the Console Output.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;
If you are familiar with Scripted Pipeline, you can toggle the above
Declarative code sample to show the Scripted equivalent.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once I add the Pipeline above to my &lt;code&gt;Jenkinsfile&lt;/code&gt; and run &quot;Branch Indexing&quot;, my
Jenkins will pick it up and run run it.  We see that the Declarative Pipeline
has added stage called &quot;Declarative: Checkout SCM&quot;:&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/2017-02-07/junit-minimal.png&quot; alt=&quot;Minimal Declarative Pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This a &quot;dynamic stage&quot;, one of several the kinds that Declarative Pipeline adds
as needed for clearer reporting.  In this case, it is a stage in which the
Declarative Pipeline automatically checkouts out source code on the agent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see above, we didn’t have to tell it do any of this,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Console Output&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;[Pipeline] node
Running on osx_mbp in /Users/bitwiseman/jenkins/agents/osx_mbp/workspace/blog_add-declarative-pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Checkout SCM)
[Pipeline] checkout
Cloning the remote Git repository
{ ... truncated 20 lines ... }
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] echo
This is a minimal pipeline
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Declarative Pipeline syntax is a little more verbose than the equivalent Scripted Pipeline,
but the added detail gives a clearer, more consistent view of what the Pipeline is supposed to do.
It also gives us a structure into which we can add more configuration details about this Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;adding-tools-to-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adding-tools-to-pipeline&quot; /&gt;Adding Tools to Pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next thing we’ll add in this Pipeline is a &lt;code&gt;tools&lt;/code&gt; section to let us use
Maven.  The &lt;code&gt;tools&lt;/code&gt; section is one of several sections we can add under
&lt;code&gt;pipeline&lt;/code&gt;, which affect the configuration of the rest of the Pipeline.  (We’ll
look at the others, including &lt;code&gt;agent&lt;/code&gt;, in later posts.) Each tool entry will
make whatever settings changes, such as updating &lt;code&gt;PATH&lt;/code&gt; or other environment
variables, to make the named tool available in the current pipeline.  It will
also automatically install the named tool if that tool is configured to do so
under &quot;Managing Jenkins&quot; → &quot;Global Tool Configuration&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
    agent any
    tools { &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/span&gt;
        maven &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Maven 3.3.9&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/span&gt;
        jdk &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;jdk8&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;&lt;/span&gt;
    }
    stages {
        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Initialize&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            steps {
                sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;
                    echo &quot;PATH = ${PATH}&quot;
                    echo &quot;M2_HOME = ${M2_HOME}&quot;
                &lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&#39;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/span&gt;
            }
        }

        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            steps {
                echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;This is a minimal pipeline.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt; section for adding tool settings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Configure this Pipeline to use the Maven version matching &quot;Maven 3.3.9&quot;
(configured in &quot;Managing Jenkins&quot; → &quot;Global Tool Configuration&quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Configure this Pipeline to use the Maven version matching &quot;jdk8&quot;
(configured in &quot;Managing Jenkins&quot; → &quot;Global Tool Configuration&quot;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;These will show the values of &lt;code&gt;PATH&lt;/code&gt; and &lt;code&gt;M2_HOME&lt;/code&gt; environment variables.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When we run this updated Pipeline the same way we ran the first, we see that
the Declarative Pipeline has added another stage called &quot;Declarative: Tool
Install&quot;: In the console output, we see that during this particular stage &quot;Maven 3.3.9&quot; gets installed,
and the &lt;code&gt;PATH&lt;/code&gt; and &lt;code&gt;M2_HOME&lt;/code&gt; environment variables are set:&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/2017-02-07/junit-tools.png&quot; alt=&quot;Declarative Pipeline with Tools Section&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Console Output&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;{ ... truncated lines ... }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Tool Install)
[Pipeline] tool
Unpacking https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
to /Users/bitwiseman/jenkins/agents/osx_mbp/tools/hudson.tasks.Maven_MavenInstallation/Maven_3.3.9
on osx_mbp
[Pipeline] envVarsForTool
[Pipeline] tool
[Pipeline] envVarsForTool
[Pipeline] }
[Pipeline] // stage
{ ... }
PATH = /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/bin:/Users/bitwiseman/jenkins/agents/osx_mbp/tools/hudson.tasks.Maven_MavenInstallation/Maven_3.3.9/bin:...
M2_HOME = /Users/bitwiseman/jenkins/agents/osx_mbp/tools/hudson.tasks.Maven_MavenInstallation/Maven_3.3.9
{ ... }&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;running-a-maven-build&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-a-maven-build&quot; /&gt;Running a Maven Build&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, running a Maven build is trivial.  The &lt;code&gt;tools&lt;/code&gt; section already added
Maven and JDK8 to the &lt;code&gt;PATH&lt;/code&gt;, all we need to do is call &lt;code&gt;mvn install&lt;/code&gt;.  It
would be nice if I could split the build and the tests into separate stages,
but Maven is famous for not liking when people do that, so I’ll leave it alone
for now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead, let’s load up the results of the build using the JUnit plugin,
however the version that was just built, sorry.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
    agent any
    tools {
        maven &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Maven 3.3.9&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
        jdk &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;jdk8&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }
    stages {
        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Initialize&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            steps {
                sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;
                    echo &quot;PATH = ${PATH}&quot;
                    echo &quot;M2_HOME = ${M2_HOME}&quot;
                &lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&#39;&#39;&lt;/span&gt;&lt;/span&gt;
            }
        }

        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            steps {
                sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;mvn -Dmaven.test.failure.ignore=true install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/span&gt;
            }
            post {
                success {
                    junit &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;target/surefire-reports/**/*.xml&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/span&gt;
                }
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;node {
    checkout scm

    &lt;span style=&quot;color:#0a8;font-weight:bold&quot;&gt;String&lt;/span&gt; jdktool = tool &lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;jdk8&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;type&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;hudson.model.JDK&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;def&lt;/span&gt; mvnHome = tool &lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;mvn&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;

    &lt;span style=&quot;color:#777&quot;&gt;/* Set JAVA_HOME, and special PATH variables. */&lt;/span&gt;
    &lt;span style=&quot;color:#0a8;font-weight:bold&quot;&gt;List&lt;/span&gt; javaEnv = [
        &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;PATH+MVN=&lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;jdktool&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;/bin:&lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;mvnHome&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;/bin&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
        &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;M2_HOME=&lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;mvnHome&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,
        &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;JAVA_HOME=&lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;jdktool&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    ]

    withEnv(javaEnv) {
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Initialize&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;
            echo &quot;PATH = ${PATH}&quot;
            echo &quot;M2_HOME = ${M2_HOME}&quot;
        &lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&#39;&#39;&lt;/span&gt;&lt;/span&gt;
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;try&lt;/span&gt; {
            sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;mvn -Dmaven.test.failure.ignore=true install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
        } &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;catch&lt;/span&gt; (e) {
            currentBuild.result = &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;FAILURE&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
        }
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Post&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; (currentBuild.result == &lt;span style=&quot;color:#069&quot;&gt;null&lt;/span&gt; || currentBuild.result == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;SUCCESS&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            junit &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;target/surefire-reports/**/*.xml&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;  &lt;span style=&quot;color:#777&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/span&gt;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Call &lt;code&gt;mvn&lt;/code&gt;, the version configured by the &lt;code&gt;tools&lt;/code&gt; section will be first on the path.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;If the maven build succeeded, archive the JUnit test reports for display in the Jenkins web UI.
We’ll discuss the
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#post&quot;&gt;&lt;code&gt;post&lt;/code&gt; section&lt;/a&gt; in detail in the next blog post.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;
If you are familiar with Scripted Pipeline, you can toggle the above
Declarative code sample to show the Scripted equivalent.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below is the console output for this last revision:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Console Output&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code&gt;{ ... truncated lines ... }
+ mvn install
[INFO] Scanning for projects...
[WARNING] The POM for org.jenkins-ci.tools:maven-hpi-plugin:jar:1.119 is missing, no dependency information available
[WARNING] Failed to build parent project for org.jenkins-ci.plugins:junit:hpi:1.20-SNAPSHOT
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building JUnit Plugin 1.20-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-hpi-plugin:1.119:validate (default-validate) @ junit ---
[INFO]
[INFO] --- maven-enforcer-plugin:1.3.1:display-info (display-info) @ junit ---
[INFO] Maven Version: 3.3.9
[INFO] JDK Version: 1.8.0_92 normalized as: 1.8.0-92
[INFO] OS Info: Arch: x86_64 Family: mac Name: mac os x Version: 10.12.3
[INFO]
{ ... }
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:25 min
[INFO] Finished at: 2017-02-06T22:43:41-08:00
[INFO] Final Memory: 84M/1265M
[INFO] ------------------------------------------------------------------------&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;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;The new Declarative syntax is a significant step forward for Jenkins Pipeline.
It trades some verbosity and constraints for much greater clarity and
maintainability.  In the coming weeks, I’ll be adding new blog posts
demonstrating various features of the Declarative syntax along with some recent
Jenkins Pipeline improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&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/pipeline-model-definition&quot;&gt;Declarative Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline&quot;&gt;Declarative Pipeline Syntax Reference&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/junit&quot;&gt;Jenkins JUnit plugin&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/06/scm-api-2-take2/</id>
<title>SCM API 2.0 Release Take 2</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/06/scm-api-2-take2/" />
<author>
<name>stephenc</name>
</author>
<category term='development'></category>
<category term='plugins'></category>
<summary>
In January we
announced the release of SCM API 2.0.
After the original release was published we identified four new high-impact
issues.  We decided to remove the new versions of the plugins from the update
center until those issues could be resolved. The issues have now been resolved
and the plugins are now available from the update center.


Summary for busy Jenkins Administrators


Upgrading should make multi-branch projects much better.  When you are ready to
upgrade you must ensure that you upgrade all the required plugins.  If you miss
some, just upgrade them and restart to fix the issue. And of course, it&#8217;s
always a good idea...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In January we
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/17/scm-api-2/&quot;&gt;announced the release of SCM API 2.0&lt;/a&gt;.
After the original release was published we identified four new high-impact
issues.  We decided to remove the new versions of the plugins from the update
center until those issues could be resolved. The issues have now been resolved
and the plugins are now available from the update center.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-for-busy-jenkins-administrators&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-for-busy-jenkins-administrators&quot; /&gt;Summary for busy Jenkins Administrators&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Upgrading should make multi-branch projects much better.  When you are ready to
upgrade you must ensure that you upgrade all the required plugins.  If you miss
some, just upgrade them and restart to fix the issue. And of course, it’s
always a good idea to take a backup of your &lt;code&gt;JENKINS_HOME&lt;/code&gt; before upgrading any
plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the list below, version numbers in &lt;strong&gt;bold&lt;/strong&gt; indicate a change from the
original version in the
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/17/scm-api-2/&quot;&gt;original announcement&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Folders Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;strong&gt;5.17&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;SCM API Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;strong&gt;2.0.2&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Branch API Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;strong&gt;2.0.2&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Git Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;This depends on the exact release line of the Git plugin that you are using.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Following the 2.6.x release line: &lt;strong&gt;2.6.4&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Following the 3.0.x release line (&lt;em&gt;recommended&lt;/em&gt;): &lt;strong&gt;3.0.4&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Mercurial Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;1.58 or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub Branch Source Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;strong&gt;2.0.1&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;BitBucket Branch Source Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;strong&gt;2.0.2&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub Organization Folders Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;1.6&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Pipeline Multibranch Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;strong&gt;2.12&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are using the &lt;a href=&quot;https://plugins.jenkins.io/blueocean&quot;&gt;Blue Ocean plugin&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Blue Ocean Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;strong&gt;1.0.0-b22&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other plugins that may require updating:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub API Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;1.84 or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;1.25.0 or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you upgrade to Branch API 2.0.x and you have either the GitHub Branch Source or the BitBucket Branch Source plugins &lt;strong&gt;and&lt;/strong&gt; you do not upgrade those instances to the 2.0.x line then your Jenkins instance will fail to start-up correctly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The solution is just to upgrade the GitHub Branch Source or the BitBucket Branch Source plugin (as appropriate) to the 2.0.x line.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After an upgrade you will see the data migration warning (see the screenshot in
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41608&quot;&gt;JENKINS-41608&lt;/a&gt; for an
example) this is normal and expected.  The unreadable data will be removed by
the next scan / index or can be removed manually using the &lt;em&gt;Discard Unreadable
Data&lt;/em&gt; button.  The warning will disappear on the next restart after the
unreadable data has been removed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please update to the versions listed above. If you want to know more about the
issues and how they were resolved, see the next section.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;analysis-of-the-issues&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#analysis-of-the-issues&quot; /&gt;Analysis of the issues&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The issues described below are resolved with these plugin releases:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Folders Plugin: &lt;strong&gt;5.17&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SCM API Plugin: &lt;strong&gt;2.0.2&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Branch API Plugin: &lt;strong&gt;2.0.2&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git Plugin: &lt;strong&gt;Either&lt;/strong&gt; &lt;strong&gt;2.6.4&lt;/strong&gt; &lt;strong&gt;or&lt;/strong&gt; &lt;strong&gt;3.0.4&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub Branch Source Plugin: &lt;strong&gt;2.0.1&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BitBucket Branch Source Plugin: &lt;strong&gt;2.0.2&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline Multibranch Plugin: &lt;strong&gt;2.12&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;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41121&quot;&gt;JENKINS-41121: GitHub Branch Source upgrade can cause a lot of rebuilds&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Migration of GitHub branches from 1.x to 2.x resulted in a change of the
implementation class used to identify branches.  Some other other bugs in
Branch API had been fixed and the combined effect resulted in a rebuild of all
GitHub Branches (not PRs) after an upgrade to GitHub Branch Source Plugin
2.0.0.  This rebuild was referred to as a &quot;build storm&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Resolution:&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;The SCM API plugin was enhanced to add an extension point that allows for a second round of data migration when upgrading.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The second round of data migration allows plugins implementing the SCM API contract to fix implementation class issues in context.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Branch API plugin was enhanced to use this new extension point.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The GitHub Branch Source plugin was enhanced to provide an implementation of this extension point.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41255&quot;&gt;JENKINS-41255: Upgrading from a navigator that did not assign consistent source ids to a version that does assign consistent source ids causes a build storm on first scan&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The GitHub Branch Source and BitBucket Branch Source plugins in 1.x were not
assigning consistent IDs to multi-branch projects discovered in an Organization
Folder.  Both plugins were fixed in 2.0.0 to assign consistent IDs as a change
of ID would result in a rebuild of all projects.  What was missed is that the
very first scan of an Organization Folder after an upgrade will change the
randomly assigned ID assigned by the 1.x plugins into the consistent ID
assigned by the 2.0.0 plugins and consequently trigger a rebuild of all
branches. This rebuild was referred to as a &quot;build storm&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Resolution:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Branch API plugin was enhanced to detect the case where a branch source has
been changed but the change is only changing the ID.  When such changes are
identified, the downstream references of the ID are all updated which will
prevent a build storm.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41313&quot;&gt;JENKINS-41313: On first index after upgrade to 2.0.0 all open PRs are rebuilt&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The BitBucket Branch Source 1.x did not store all the information about PRs
that is required by the SCM API 2.0.x model.  This could well have resulted in
subtle effects when manually triggering a rebuild of a merge PR if the PR’s
target branch has been modified after the PR branch was first detected by
Jenkins. Consequently, as the information is required, BitBucket Branch Source
plugin 2.0.0 populated the information with dummy values which would force the
correct information to be retrieved.  The side-effect is that all PR branches
would be rebuilt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Resolution:&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;The changes in SCM API 2.0.2 introduced to resolve JENKINS-41121 provided a path to resolve this issue without causing a rebuild of all PR branches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The BitBucket Branch Source plugin was enhanced to provide an implementation of the new SCM API extension point that connects to BitBucket and retrieves the missing information.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41124&quot;&gt;JENKINS-41124: Can’t get a human readable job name anymore&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During initial testing of the Branch API 2.0.0 release an issue was identified
with how Organization Folders handled unusual names.  None of the existing
implementations of the &lt;code&gt;SCMNavigator&lt;/code&gt; API could generate such unusual names due
to form validation on GitHub / BitBucket replacing unusual characters with &lt;code&gt;-&lt;/code&gt;
when creating a repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It would be irresponsible to rely on external services sanitizing their input
data for the correct operation of Organization Folders.  Consequently, in
Branch API 2.0.0 the names were all transformed into URL safe names, with the
original URLs still resolving to the original projects so that any existing
saved links would remain functional.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quite a number of people objected to this change of URL scheme.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Resolution:&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;There has been a convention in Jenkins that the on-disk storage structure for
jobs mirrors the URL structure. This is only a convention and there is nothing specific in the code that
mandates following the convention.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Folders Plugin was enhanced to allow for computed folders (where the item
names are provided by an external source) to provide a strategy to use when
generating the on-disk storage names as well as the URL component names for
the folder’s child items.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Branch API plugin was enhanced to use this new strategy for name transformation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The net effect of this change is that the URLs remain the same as for 1.x but
the on-disk storage uses transformed names that are future proofed against
any new SCMNavigator implementations where the backing service allows names
that are problematic to use as filesystem directory names.&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;Side-effect:&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;The Branch API 2.0.0 approach handled the transformation of names by renaming the items using the Jenkins Item rename API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Branch API 2.0.2 approach does not rename the child items as it is only the on-disk storage location that is moved.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This means that the Jenkins Item rename API cannot be used.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this time, the only known side-effect is in the  &lt;a href=&quot;https://plugins.jenkins.io/jobConfigHistory&quot;&gt;Job Configuration History&lt;/a&gt; plugin.
The configuration history of each child item will still be tracked going
forward after the upgrade.  The pre-upgrade configuration history is also
retained.  Because the Jenkins Item rename API cannot be used to flag the
configuration file location change, there is no association between the
pre-upgrade history chain and the post-upgrade history chain.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/03/declarative-pipeline-ga/</id>
<title>Declarative Pipeline Syntax 1.0 is now available</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/03/declarative-pipeline-ga/" />
<author>
<name>hrmpw</name>
</author>
<category term='pipeline'></category>
<category term='blueocean'></category>
<summary>
This is a guest post by
Patrick Wolf,
Director of Product Management at
CloudBees
and contributor to
the Jenkins project.






I am very excited to announce the addition of
Declarative Pipeline syntax
1.0 to
Jenkins Pipeline.
We think this new syntax will enable everyone involved in DevOps, regardless of expertise,
to participate in the continuous delivery process. Whether creating, editing or reviewing
a pipeline, having a straightforward structure helps to understand and predict the
flow of the pipeline and provides a common foundation across all pipelines.


Pipeline as Code


Pipeline as Code was one of the pillars of the Jenkins 2.0 release and an
essential part of implementing continuous delivery (CD). Defining all of the
stages of...
</summary>
<content type='html'>
&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;This is a guest post by
&lt;a href=&quot;https://github.com/HRMPW&quot;&gt;Patrick Wolf&lt;/a&gt;,
Director of Product Management at
&lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;
and contributor to
the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am very excited to announce the addition of
&lt;a href=&quot;https://plugins.jenkins.io/pipeline-model-definition&quot;&gt;Declarative Pipeline syntax&lt;/a&gt;
1.0 to
&lt;a href=&quot;https://plugins.jenkins.io/workflow-aggregator&quot;&gt;Jenkins Pipeline.&lt;/a&gt;
We think this new syntax will enable everyone involved in DevOps, regardless of expertise,
to participate in the continuous delivery process. Whether creating, editing or reviewing
a pipeline, having a straightforward structure helps to understand and predict the
flow of the pipeline and provides a common foundation across all pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;pipeline-as-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-as-code&quot; /&gt;Pipeline as Code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline as Code was one of the pillars of the Jenkins 2.0 release and an
essential part of implementing continuous delivery (CD). Defining all of the
stages of an application’s CD pipeline within a &lt;code&gt;Jenkinsfile&lt;/code&gt; and checking it
into the repository with the application code provides all of the benefits
inherent in source control management (SCM):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Retain history of all changes to Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rollback to a previous Pipeline version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;View diffs and merge changes to the Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test new Pipeline steps in branches&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the same Pipeline on a different Jenkins server&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;getting-started-with-declarative-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-started-with-declarative-pipeline&quot; /&gt;Getting Started with Declarative Pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We recommend people begin using it for all their Pipeline definitions in Jenkins.
The plugin has been available for use and testing starting with the 0.1 release that was debuted at
&lt;a href=&quot;https://www.cloudbees.com/introducing-new-way-define-jenkins-pipelines&quot;&gt;Jenkins World&lt;/a&gt;
in September. Since then, it has already been installed in over 5,000 Jenkins
environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you haven’t tried Pipeline or have considered Pipeline in the past, I
believe this new syntax is much more approachable with an easier adoption curve
to quickly realize all of the benefits of Pipeline as Code. In addition, the
pre-defined structure of Declarative makes it possible to create and edit
Pipelines with a graphical user interface (GUI). The Blue Ocean team is
actively working on a
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/20/blueocean-dev-log-jan2/#editor&quot;&gt;Visual Pipeline Editor&lt;/a&gt;
which will be included in an upcoming release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have already begun using Pipelines in Jenkins, I believe that this new
alternative syntax can help expand that usage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The original syntax for defining Pipelines in Jenkins is a Groovy DSL that
allows most of the features of full
&lt;a href=&quot;https://en.wikipedia.org/wiki/Imperative_programming&quot;&gt;imperative programming&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This syntax is still fully supported and is now
referred to as &quot;Scripted Pipeline Syntax&quot; to distinguish it from &quot;Declarative
Pipeline Syntax.&quot; Both use the same underlying execution engine in Jenkins and
both will generate the same results in
&lt;a href=&quot;https://plugins.jenkins.io/pipeline-stage-view&quot;&gt;Pipeline Stage View&lt;/a&gt;
or Blue Ocean visualizations. All existing
&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps&quot;&gt;Pipeline steps&lt;/a&gt;,
Global Variables, and
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/shared-libraries&quot;&gt;Shared Libraries&lt;/a&gt;
can be used in either. You can now create more cookie-cutter Pipelines and
extend the power of Pipeline to all users regardless of Groovy expertise.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;declarative-pipeline-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#declarative-pipeline-features&quot; /&gt;Declarative Pipeline Features&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://en.wikipedia.org/wiki/Lint_%28software%29&quot;&gt;Syntax Checking&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Immediate runtime syntax checking with explicit error messages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API endpoint for linting a &lt;code&gt;Jenkinsfile&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CLI command to lint a &lt;code&gt;Jenkinsfile&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/docker-workflow&quot;&gt;Docker Pipeline integration&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run all stages in a single container.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run each stage in a different container.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easy configuration&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Quickly define parameters for your Pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quickly define environment variables and credentials for your Pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quickly define options (such as timeout, retry, build discarding) for your Pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Round trip editing with the Visual Pipeline Editor (watch for preview release shortly).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Conditional actions&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Send notifications or take actions depending upon success or failure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Skip stages based on branches, environment, or other Boolean expression.
release shortly)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;where-can-i-learn-more&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-can-i-learn-more&quot; /&gt;Where Can I Learn More?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Be on the lookout for future blog posts detailing specific examples of
scenarios or features in Declarative Pipeline. Andrew Bayer, one of the primary
developers behind Declarative Pipeline, will be presenting at
&lt;a href=&quot;https://fosdem.org/2017/schedule/event/declarative_pipeline/&quot;&gt;FOSDEM&lt;/a&gt;
in Brussels, Belgium this weekend. We have also scheduled an online
&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/237317346/&quot;&gt;Jenkins Meetup (JAM)&lt;/a&gt;
later this month to demo the features of Declarative Pipeline and give a sneak
peek at the upcoming Blue Ocean Pipeline Editor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the meantime, all the
&lt;a href=&quot;https://www.jenkins.io/doc/&quot;&gt;Pipeline documentation&lt;/a&gt;
has been updated to incorporate a
&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/tour/hello-world&quot;&gt;Guided Tour&lt;/a&gt;,
and a
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/syntax&quot;&gt;Syntax Reference&lt;/a&gt;
with numerous examples to help you get on your way to using Pipeline.  Simply
upgrade to the latest version, 2.5 or later of the Pipeline in Jenkins to
enable all of these great features.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/03/blueocean-devlog-feb/</id>
<title>Blue Ocean Dev Log: February Week #1</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/03/blueocean-devlog-feb/" />
<author>
<name>michaelneale</name>
</author>
<category term='blueocean'></category>
<summary>
With only a couple of months left before
Blue Ocean
1.0, which is planned for the end of March, I have
been
highlighting
some of the good work being finished up by the developers hacking on Blue
Ocean.


This week was a grab bag of important behind-the-scenes features and finalising
the preview of the editor. The merge of the SCM API changes also made it in.
The editor has the new sheets style of editing (there will be blogs and more on
this in the next few weeks):





Some highlights:




Fix to async loading of resources like translations, so screens don&#8217;t
"flash" when they are loaded (i18n improvement)


Links in notifications can be configured...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With only a couple of months left before
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;
1.0, which is planned for the end of March, I have
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/13/blueocean-dev-log-jan/&quot;&gt;been&lt;/a&gt;
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/20/blueocean-dev-log-jan2/&quot;&gt;highlighting&lt;/a&gt;
some of the good work being finished up by the developers hacking on Blue
Ocean.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week was a grab bag of important behind-the-scenes features and finalising
the preview of the editor. The merge of the SCM API changes also made it in.
The editor has the new sheets style of editing (there will be blogs and more on
this in the next few weeks):&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/blueocean-dev-log/editor-feb-1.png&quot; alt=&quot;Blue Ocean Editor&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some highlights:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fix to async loading of resources like translations, so screens don’t
&quot;flash&quot; when they are loaded (i18n improvement)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Links in notifications can be configured to point to classic or
Blue Ocean screens&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Time reporting works better when browser clock is out of sync with
server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SECURITY-380 was backported into a small fix for those that aren’t
running the latest LTS (but you should ideally be running it)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SCM API changes finally landed - this will be in beta 22 which should
hit the update centers soon. This should make things work better with
GitHub rate limits.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beta 21 was released&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The editor reached &quot;preview&quot; release state ready for use with the newly
announced &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/tour/hello-world&quot;&gt;Declarative Pipeline&lt;/a&gt; stuff.&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 right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/blueocean-dev-log/serenity.jpg&quot; alt=&quot;Serenity&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, a reference to Australian pop culture had to be removed, sadly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Up Next:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Some cosmetic changes around headers to make it much nicer and clearer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Favorite improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub Org-based Pipeline creation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Editor available in the general update center&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beta 22 with SCM improvements and no more GitHub rate limit hassles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many fixes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improvements to the Acceptance Test Harness to reduce the number of false-positives.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping to make Blue Ocean a great user experience for
Jenkins, please join the Blue Ocean development team on
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/01/security-updates/</id>
<title>Security updates for Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/01/security-updates/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins, versions 2.44 and 2.32.2, that fix a high severity and several medium and low severity issues.


For an overview of what was fixed, see the security advisory.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our LTS upgrade guide.
I strongly recommend you read these documents, as there are a few possible side effects of these fixes.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins, versions 2.44 and 2.32.2, that fix a high severity and several medium and low severity issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2017-02-01/&quot;&gt;security advisory&lt;/a&gt;.
For an overview on the possible impact of these changes on upgrading Jenkins LTS, see our &lt;a href=&quot;https://www.jenkins.io/doc/upgrade-guide/2.32/#upgrading-to-jenkins-lts-2-32-2&quot;&gt;LTS upgrade guide&lt;/a&gt;.
I strongly recommend you read these documents, as there are a few possible side effects of these fixes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/content/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice/</id>
<title>Best Practices for Scalable Pipeline Code</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-02-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice/" />
<author>
<name>svanoort</name>
</author>
<category term='pipeline'></category>
<category term='performance'></category>
<category term='scalability'></category>
<summary>
This is a guest post by Sam Van Oort,
Software Engineer at CloudBees and contributor to
the Jenkins project.






Today I&#8217;m going to show you best practices to write scalable and robust Jenkins Pipelines. This is drawn from a
combination of work with the internals of Pipeline and observations with large-scale users.


Pipeline code works beautifully for its intended role of automating
build/test/deploy/administer tasks.  As it is pressed into more complex roles
and unanticipated uses, some users hit issues.  In these cases, applying the
best practices can make the difference between:




A single controller running
hundreds
of concurrent builds on low end hardware (4 CPU cores and 4 GB...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/svanoort&quot;&gt;Sam Van Oort&lt;/a&gt;,
Software Engineer at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; and contributor to
the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today I’m going to show you best practices to write scalable and robust Jenkins Pipelines. This is drawn from a
combination of work with the internals of Pipeline and observations with large-scale users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline code works beautifully for its intended role of automating
build/test/deploy/administer tasks.  As it is pressed into more complex roles
and unanticipated uses, some users hit issues.  In these cases, applying the
best practices can make the difference between:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A single controller running
&lt;a href=&quot;https://www.cloudbees.com/so-you-want-build-worlds-biggest-jenkins-cluster&quot;&gt;hundreds
of concurrent builds&lt;/a&gt; on low end hardware (4 CPU cores and 4 GB of
heap)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Running a couple dozen builds and bringing a controller to its knees or
crashing it…​even with 16+ CPU cores and 20+ GB of heap!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This has been seen in the wild.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;fundamentals&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fundamentals&quot; /&gt;Fundamentals&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To understand Pipeline behavior you must understand a few points about
how it executes.&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;Except for the steps themselves, all of the Pipeline logic, the Groovy conditionals, loops, etc execute on the controller. Whether simple &lt;em&gt;or&lt;/em&gt; complex! Even inside a &lt;code&gt;node&lt;/code&gt; block!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Steps&lt;/em&gt; may use executors to do work where appropriate, but each
step has a small on-controller overhead too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline code is written as Groovy but the execution model is
radically transformed at compile-time to Continuation Passing Style
(CPS).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This transformation provides valuable safety and durability
guarantees for Pipelines, but it comes with trade-offs:&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;Steps can invoke Java and execute fast and efficiently, but Groovy
is &lt;em&gt;much&lt;/em&gt; slower to run than normal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Groovy logic requires far more memory, because an object-based
syntax/block tree is kept in memory.&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;Pipelines persist the program and its state frequently to be able to
survive failure of the controller.&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From these we arrive at a set of best practices to make pipelines more
effective.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;best-practices-for-Pipeline-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#best-practices-for-Pipeline-code&quot; /&gt;Best Practices For Pipeline Code&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;Think of Pipeline code as glue:&lt;/strong&gt; just enough Groovy code to connect
together the Pipeline steps and integrate tools, and no more.&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;This makes code easier to maintain, more robust against bugs, and
reduces load on controllers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Keep it simple:&lt;/strong&gt; limit the amount of complex logic embedded in the
Pipeline itself (similarly to a shell script) and avoid treating it as a
general-purpose programming language.&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;Pipeline restricts all variables to &lt;code&gt;Serializable&lt;/code&gt; types, so keeping
Pipeline logic simple helps avoid a &lt;code&gt;NotSerializableException&lt;/code&gt; - see
appendix at the bottom.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;@NonCPS&lt;/code&gt;-annotated functions for slightly more complex work.&lt;/strong&gt;
This means more involved processing, logic, and transformations. This
lets you leverage additional Groovy &amp;amp; functional features for more
powerful, concise, and performant code.&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;This still runs on controllers so be mindful of complexity, but is much
faster than native Pipeline code because it doesn’t provide durability
and uses a faster execution model. Still, be mindful of the CPU cost and
offload to executors for complex work (see below).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@NonCPS&lt;/code&gt; functions can use a much broader subset of the Groovy
language, such as iterators and functional features, which makes them
more terse and fast to write.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@NonCPS&lt;/code&gt; functions should not use Pipeline steps internally, however
you can store the result of a Pipeline step to a variable and use it
that as the input to a &lt;code&gt;@NonCPS&lt;/code&gt; function.&lt;/p&gt;
&lt;div class=&quot;olist lowerroman&quot;&gt;
&lt;ol class=&quot;lowerroman&quot; type=&quot;i&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; It’s not guaranteed that use of a step will generate an
error (there is an open RFE to implement that), but you should not rely
on that behavior. You may see improper handling of exceptions, in
particular.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;While normal Pipeline is restricted to serializable local variables
(see appendix at bottom), &lt;code&gt;@NonCPS&lt;/code&gt; functions can use more complex,
nonserializable types internally (for example regex matchers, etc). Parameters
and return types should still be Serializable, however.&lt;/p&gt;
&lt;div class=&quot;olist lowerroman&quot;&gt;
&lt;ol class=&quot;lowerroman&quot; type=&quot;i&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; improper usages are not guaranteed to raise an error with
normal Pipeline (optimizations may mask the issue), but it is unsafe to
rely on this behavior.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prefer external scripts/tools for complex or CPU-expensive
processing&lt;/strong&gt; rather than Groovy language features. This offloads work
from the controller to external executors, allowing for easy scale-out of
hardware resources. It is also generally easier to test because these
components can be tested in isolation without the full on-controller
execution environment.&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;Many software vendors will provide easy command-line clients for
their tools in various programming languages. These are often robust,
performant, and easy to use. Plugins offer another option (see below).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shell or batch steps are often the easiest way to integrate these
tools, which can be written in any language. For example: &lt;code&gt;sh “java -jar
client.jar $endPointUrl $inputData”&lt;/code&gt; for a Java client, or &lt;code&gt;sh “python
jiraClient.py $issueId $someParam”&lt;/code&gt; for a Python client.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gotcha: especially avoid Pipeline XML or JSON parsing using Groovy’s &lt;code&gt;XmlSlurper&lt;/code&gt; and &lt;code&gt;JsonSlurper&lt;/code&gt;!  Strongly prefer command-line tools or scripts.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;olist lowerroman&quot;&gt;
&lt;ol class=&quot;lowerroman&quot; type=&quot;i&quot;&gt;
&lt;li&gt;
&lt;p&gt;The Groovy implementations are complex and as a result more brittle in Pipeline use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;XmlSlurper&lt;/code&gt; and &lt;code&gt;JsonSlurper&lt;/code&gt; can carry a high memory and CPU cost in pipelines&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;xmllint and xmlstartlet are command-line tools offering XML extraction via xpath&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stedolan.github.io/jq/&quot;&gt;jq&lt;/a&gt; offers the same functionality for JSON&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These extraction tools may be coupled to curl or wget for fetching information from an HTTP API&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Examples of other places to use command-line tools:&lt;/p&gt;
&lt;div class=&quot;olist lowerroman&quot;&gt;
&lt;ol class=&quot;lowerroman&quot; type=&quot;i&quot;&gt;
&lt;li&gt;
&lt;p&gt;Templating large files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nontrivial integration with external APIs (for bigger vendors,
consider a Jenkins plugin if a quality offering exists)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simulations/complex calculations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Business logic&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consider existing plugins for external integrations.&lt;/strong&gt; Jenkins has a
wealth of plugins, especially for source control, artifact management,
deployment systems, and systems automation. These can greatly reduce the
amount of Pipeline code to maintain. Well-written plugins may be
faster and more robust than Pipeline equivalents.&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;Consider both plugins and command-line clients (above) — one may be
easier than the other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugins may be of widely varying quality. Look at the number of installations and how frequently and recently updates appear in the changelog. Poorly-maintained plugins
with limited installations may actually be worse than writing a little
custom Pipeline code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a last resort, if there is a good-quality plugin that is not
Pipeline-enabled, it is &lt;a href=&quot;https://www.jenkins.io/blog/2016/05/25/update-plugin-for-pipeline/&quot;&gt;fairly easy to write a Pipeline wrapper&lt;/a&gt; to
integrate it or write a custom step that will invoke it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assume things will go wrong:&lt;/strong&gt; don’t rely on workspaces being clean
of the remnants from previous executions, clean explicitly where needed.
Make use of timeouts and retry steps (that’s what they’re there for).&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;Within a git repository, &lt;code&gt;git clean -fdx&lt;/code&gt; is a good way to
accomplish this and reduces the amount of SCM cloning&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DO use parameterized Pipelines and variables to make your Pipeline
scripts more reusable.&lt;/strong&gt; Passing in parameters is especially helpful for
handling different environments and should be preferred to applying
conditional lookup logic; however, try to limit parameterized pipelines invoking each other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Try to limit business logic embedded in Pipelines.&lt;/strong&gt; To some extent
this is inevitable, but try to focus on tasks to complete instead,
because this yields more maintainable, reusable, and often more
performant Pipeline code.&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;One code smell that points to a problem is many hard-coded
constants. Consider taking advantage of the options above to refactor
code for better composability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For complex cases, consider using Jenkins integration options
(plugins, Jenkins API calls, invoking input steps externally) to offload
implementation of more complex business rules to an external system if
they fit more naturally there.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please, think of these as guidelines, not strict rules – Jenkins
Pipeline provides a great deal of power and flexibility, and it’s there
to be used.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Breaking enough of these rules at scale can cause controllers to fail by
placing an unsustainable load on them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For additional guidance, I also recommend
&lt;a href=&quot;https://www.cloudbees.com/need-speed-building-Pipelines-be-faster&quot;&gt;this
Jenkins World talk&lt;/a&gt;
on how to engineer Pipelines for speed and performance:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;appendix-serializable-vs.-non-serializable-types&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#appendix-serializable-vs.-non-serializable-types&quot; /&gt;Appendix: Serializable vs. Non-Serializable Types:&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To assist with Pipeline development, here are common serializable and
non-serializable types, to assist with deciding if your logic can be CPS
or should be in a &lt;code&gt;@NonCPS&lt;/code&gt; function to avoid issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Common Serializable Types (safe everywhere):&lt;/strong&gt;&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;All primitive types and their object wrappers: byte, boolean, int,
double, short, char&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Strings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;enums&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Arrays of serializable types&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ArrayLists and normal Groovy Lists&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sets: HashSet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maps: normal Groovy Map, HashMap, TreeMap&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exceptions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;URLs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dates&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regex Patterns (compiled patterns)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Common non-Serializable Types (only safe in &lt;code&gt;@NonCPS&lt;/code&gt; functions):&lt;/strong&gt;&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;Iterators: this is a common problem. You need to use C-style loop, i.e.
&lt;code&gt;for(int i=0; i&amp;lt;max; i++){&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regex Matchers (you can use the
built-in functions in String, etc, just not the Matcher itself)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; &lt;code&gt;JsonObject&lt;/code&gt;, &lt;code&gt;JsonSlurper&lt;/code&gt;, etc in Groovy 2+ (used in some 2.x+
versions of Jenkins).&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;This is due to an internal implementation change — earlier versions may serialize.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&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/2017/01/27/blueocean-dev-log-jan4/</id>
<title>Blue Ocean Dev Log: January Week #4</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/27/blueocean-dev-log-jan4/" />
<author>
<name>michaelneale</name>
</author>
<category term='blueocean'></category>
<summary>
As we get closer to
Blue Ocean
1.0, which is planned for the end of March, I have
started
highlighting
some of the good stuff that has been going on. This week was 10 steps forward, and about 1.5 backwards&#8230;&#8203;


There were two releases this week, b19 and b20. Unfortunately, b20 had to
be released shortly after b19 hit the Update Center as an incompatible API
change in a 3rd party plugin was discovered.


Regardless, the latest b20 has a lot of important improvements, and some
very nice new features.







A first cut of the "Create Pipeline" UX, seen above, allowing you to create Git
based Multibranch Pipelines like you have never...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we get closer to
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;
1.0, which is planned for the end of March, I have
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/13/blueocean-dev-log-jan/&quot;&gt;started&lt;/a&gt;
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/20/blueocean-dev-log-jan2/&quot;&gt;highlighting&lt;/a&gt;
some of the good stuff that has been going on. This week was 10 steps forward, and about 1.5 backwards…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were two releases this week, &lt;code&gt;b19&lt;/code&gt; and &lt;code&gt;b20&lt;/code&gt;. Unfortunately, &lt;code&gt;b20&lt;/code&gt; had to
be released shortly after &lt;code&gt;b19&lt;/code&gt; hit the Update Center as an incompatible API
change in a 3rd party plugin was discovered.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regardless, the latest &lt;code&gt;b20&lt;/code&gt; has a &lt;strong&gt;lot&lt;/strong&gt; of important improvements, and some
very nice new features.&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/blueocean-dev-log/pipeline-creation-flow.png&quot; alt=&quot;Creating a Pipeline in Blue Ocean&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A first cut of the &quot;Create Pipeline&quot; UX, seen above, allowing you to create Git
based &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/multibranch/&quot;&gt;Multibranch Pipelines&lt;/a&gt; like you have never seen before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Handling network disconnections from the browser to server (eg server
restart, network etc) gracefully with a nice UI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More precise time information for steps and running Pipelines.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More information when a Pipeline is blocked on infrastructure, such as when
the Pipeline is waiting for an agent to become available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a really embarrassing typo (a prize if you spot it).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test reports now include stdout and stderr&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Better support for parallel visualisation, such as when a &lt;code&gt;parallel&lt;/code&gt; step exists outside of a stage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Visual Editor also had another release, with the &quot;sheets&quot; visual component
and better validation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;creation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creation&quot; /&gt;Creation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently this is hidden behind a
&lt;a href=&quot;https://en.wikipedia.org/wiki/Feature_toggle&quot;&gt;feature toggle&lt;/a&gt;,
to access append &lt;code&gt;?blueCreate&lt;/code&gt; to the URL in you browser, and then press the
&quot;New Pipeline&quot; button. Currently it lets you quickly create a Pipeline from
Git, add credentials, etc, in a very nice UX. More SCM types are being added to
support this.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;reconnectdisconnect&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#reconnectdisconnect&quot; /&gt;Reconnect/disconnect&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/blueocean-dev-log/connection-lost.png&quot; alt=&quot;Lost connection&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Blue Ocean is a very &quot;live&quot; style of UX, if your network becomes
unavailable, or the server is restarted, it is good to know in case you
were staring at the screen waiting for something to happen (don’t you have
anything better to do??). When this happens, now you get a polite message,
and then when the connection is restored, even if you are waiting for a
Pipeline run to finish, it will then notice this, and refresh things for
you:&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/blueocean-dev-log/connection-ok.png&quot; alt=&quot;Reconnected&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note the opacity changes to make it clear even if you don’t see the little
message. Very nice addition for those of us who work on a train far to often.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;up-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#up-next&quot; /&gt;Up next&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What is up next:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SCM Api changes should land, making things much better for users of
GitHub, Bitbucket, and many more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creating Pipelines from GitHub (including automatic discovery).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lots of fixes and enhancements in the Pipeline from all over the place&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More ATH &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; coverage against regressions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More Visual Editor releases as Declarative Pipeline reaches version 1.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improvements to i18n&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was also a couple of &quot;alternative beta&quot; releases in the &quot;Experimental
Update Center&quot; to help test the new SCM API improvements for better use of
GitHub APIs (based on
&lt;a href=&quot;https://github.com/jenkinsci/blueocean-plugin/pull/742&quot;&gt;this branch&lt;/a&gt;)
I do not recommend trying this branch unless you know what you are doing,
as this will migrate some data, but help testing it would be appreciated!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping to make Blue Ocean a great user experience for
Jenkins, please join the Blue Ocean development team on
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. Acceptance Test Harness
&lt;/div&gt;
&lt;/hr&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/2017/01/20/blueocean-dev-log-jan2/</id>
<title>Blue Ocean Dev Log: January Week #3</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/20/blueocean-dev-log-jan2/" />
<author>
<name>michaelneale</name>
</author>
<category term='blueocean'></category>
<summary>
As we get closer to
Blue Ocean
1.0, which is planned for the end of March, I have started
highlighting
some of the good stuff that has been going on, and this week was a very busy week.


A new Blue Ocean beta (b18) was released with:




Parameterized pipelines are now supported!


i18n improvements


Better support for matrix and the evil (yet somehow still used) Maven project type (don&#8217;t use it!)


SSE fixes for IE and Edge browsers


An alpha release of the Visual Editor for Jenkinsfiles on top of
Declarative Pipeline
has snuck into the "experimental" update center. Andrew will be talking
about Declarative Pipelines at
FOSDEM next week.




Parameterized Pipelines


You would know this...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we get closer to
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;
1.0, which is planned for the end of March, I have started
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/13/blueocean-dev-log-jan/&quot;&gt;highlighting&lt;/a&gt;
some of the good stuff that has been going on, and this week was a &lt;em&gt;very&lt;/em&gt; busy week.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A new Blue Ocean beta (&lt;strong&gt;b18&lt;/strong&gt;) was released with:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Parameterized pipelines are now supported!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;i18n improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Better support for matrix and the &lt;em&gt;evil&lt;/em&gt; (yet somehow still used) Maven project type (don’t use it!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Server-sent_events&quot;&gt;SSE&lt;/a&gt; fixes for IE and Edge browsers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An alpha release of the Visual Editor for Jenkinsfiles on top of
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/12/declarative-pipeline-beta-2/&quot;&gt;Declarative Pipeline&lt;/a&gt;
has snuck into the &quot;experimental&quot; update center. Andrew will be talking
about Declarative Pipelines at
&lt;a href=&quot;https://fosdem.org/2017/schedule/event/declarative_pipeline/&quot;&gt;FOSDEM next week&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;parameterized-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#parameterized-pipelines&quot; /&gt;Parameterized Pipelines&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You would know this if you followed
&lt;a href=&quot;https://twitter.com/ThorScherler&quot;&gt;Thorsten’s twitter account&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/post-images/blueocean-dev-log/start-with-parameters.png&quot; alt=&quot;Starting with parameters from @thorscherler&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That twitter account is mostly pics of Thorsten in running gear, but
occasionally he announces new features as they land.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you run a pipeline that requires parameters, it will popup a dialog
like this no matter where you run it from. Most input types are supported
(similar to input), with a planned extension point for custom input types.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;editor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#editor&quot; /&gt;Editor&lt;/h3&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/blueocean-dev-log/gui-editor.png&quot; alt=&quot;Pipeline Editor plugin&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A very-very early version of the
&lt;a href=&quot;https://github.com/jenkinsci/blueocean-pipeline-editor-plugin&quot;&gt;Blue Ocean Pipeline Editor plugin&lt;/a&gt;
that will set your hair on fire of the editor is in the experimental update
center.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Declarative pipelines are still not at version 1.0 status, but will be
shortly. This editor allows you to roundtrip Jenkinsfiles written in this
way, so they can be edited as text, or visually. The steps available are
discovered form the installed plugins. One to watch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, &lt;strong&gt;what’s next?&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;Creation of Git Pipelines, and likely GitHub too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Show parallel branches that aren’t in a stage visually&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Show stderr/out in test reports&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Show more information when Jenkins is &quot;busy&quot;, such as when agents are coming online, in the Pipeline view&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping to make Blue Ocean a great user experience for
Jenkins, please join the Blue Ocean development team on
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&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/2017/01/19/converting-conditional-to-pipeline/</id>
<title>Converting Conditional Build Steps to Jenkins Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/" />
<author>
<name>lnewman</name>
</author>
<category term='pipeline'></category>
<category term='freestyle'></category>
<category term='plugins'></category>
<category term='conditional-build-step'></category>
<category term='tutorial'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Introduction


With all the new developments in
Jenkins Pipeline (and
Declarative Pipeline on the horizon),
it&#8217;s easy to forget what we did to create "pipelines" before
Pipeline.
There are number of plugins, some that have been around since the very beginning,
that enable users to create "pipelines" in Jenkins.
For example, basic job chaining worked well in many cases, and the
Parameterized Trigger plugin
made chaining more flexible.
However, creating chained jobs with conditional behavior was
still one of the harder things to do in Jenkins.


The
Conditional BuildStep plugin
is a powerful tool that has allowed Jenkins users to write Jenkins jobs with complex...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&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;With all the new developments in
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/&quot;&gt;Jenkins Pipeline&lt;/a&gt; (and
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/12/declarative-pipeline-beta-2/&quot;&gt;Declarative Pipeline on the horizon&lt;/a&gt;),
it’s easy to forget what we did to create &quot;pipelines&quot; before
&lt;strong&gt;Pipeline&lt;/strong&gt;.
There are number of plugins, some that have been around since the very beginning,
that enable users to create &quot;pipelines&quot; in Jenkins.
For example, basic job chaining worked well in many cases, and the
&lt;a href=&quot;https://plugins.jenkins.io/parameterized-trigger&quot;&gt;Parameterized Trigger plugin&lt;/a&gt;
made chaining more flexible.
However, creating chained jobs with conditional behavior was
still one of the harder things to do in Jenkins.&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/conditional-buildstep&quot;&gt;Conditional BuildStep plugin&lt;/a&gt;
is a powerful tool that has allowed Jenkins users to write Jenkins jobs with complex conditional logic.
In this post, we’ll take a look at how we might converting Freestyle jobs that
include conditional build steps to Jenkins Pipeline.
Unlike Freestyle jobs, implementing conditional operations in Jenkins Pipeline is trivial,
but matching the behavior of complex conditional build steps will require a bit more care.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;graphical-programming&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#graphical-programming&quot; /&gt;Graphical Programming&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Conditional BuildStep plugin lets users add conditional logic to Freestyle
jobs from within the Jenkins web UI.  It does this by:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Adding two types of Conditional BuildStep (&quot;Single&quot; and &quot;Multiple&quot;) -
these build steps contain one or more other build steps to be run when the configured
condition is met&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding a set of Condition operations -
these control whether the Conditional BuildStep execute the contained step(s)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Leveraging the Token Macro facility -
these provide values to the Conditions for evaluation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the example below, this project will run the shell script step when the value of the
&lt;code&gt;REQUESTED_ACTION&lt;/code&gt; token equals &quot;greeting&quot;.&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/2017-01-19/freestyle-conditional-param.png&quot; alt=&quot;Freestyle Job Parameters&quot; width=&quot;800&quot;&gt;
&lt;/img&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/2017-01-19/freestyle-conditional-config.png&quot; alt=&quot;Freestyle Job Conditional BuildStep&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s the output when I run this project with &lt;code&gt;REQUESTED_ACTION&lt;/code&gt; set to &quot;greeting&quot;:&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;Run condition [Strings match] enabling prebuild for step [Execute shell]
Strings match run condition: string 1=[greeting], string 2=[greeting]
Run condition [Strings match] enabling perform for step [Execute shell]
[freestyle-conditional] $ /bin/sh -xe /var/folders/hp/f7yc_mwj2tq1hmbv_5n10v2c0000gn/T/hudson5963233933358491209.sh
+ echo &#39;Hello, bitwiseman!&#39;
Hello, bitwiseman!
Finished: SUCCESS&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And when I pass the value &quot;silence&quot;:&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;Run condition [Strings match] enabling prebuild for step [Execute shell]
Strings match run condition: string 1=[silence], string 2=[greeting]
Run condition [Strings match] preventing perform for step [Execute shell]
Finished: SUCCESS&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 simple example but the conditional step can contain any regular build step.
When combined with other plugins, it can control whether to send notifications,
gather data from other sources, wait for user feedback, or call other projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Conditional BuildStep plugin does a great job of leveraging strengths of
the Jenkins web UI, Freestyle jobs, and UI-based programming,
but it is also hampered by their limitations.
The Jenkins web UI can be clunky and confusing at times.
Like the steps in any Freestyle job, these conditional steps are only
stored and viewable in Jenkins.
They are not versioned with other product or build code and can’t be code reviewed.
Like any number of UI-based programming tools, it has to make trade-offs between clarity
and flexibility: more options or clearer presentation.
There’s only so much space on the screen.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;converting-to-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#converting-to-pipeline&quot; /&gt;Converting to Pipeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Pipeline, on the other hand, enables users to implement their pipeline as code.
Pipeline code can be written directly in the Jenkins Web UI or in any text editor.
It is a full-featured programming language,
which gives users access to much broader set of conditional statements
without the restrictions of UI-based programming.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, taking the example above, the Pipeline equivalent is:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
    agent any
    parameters {
        choice(
            &lt;span style=&quot;color:#606&quot;&gt;choices&lt;/span&gt;: [&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;greeting&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; , &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;silence&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;],
            &lt;span style=&quot;color:#606&quot;&gt;description&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;REQUESTED_ACTION&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)
    }

    stages {
        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Speak&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            when {
                &lt;span style=&quot;color:#777&quot;&gt;// Only say hello if a &quot;greeting&quot; is requested&lt;/span&gt;
                expression { params.REQUESTED_ACTION == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;greeting&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; }
            }
            steps {
                echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Hello, bitwiseman!&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;properties ([
    parameters ([
        choice (
            &lt;span style=&quot;color:#606&quot;&gt;choices&lt;/span&gt;: [&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;greeting&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;silence&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;],
            &lt;span style=&quot;color:#606&quot;&gt;description&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            name : &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;REQUESTED_ACTION&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)
    ])
])

node {
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Speak&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
        &lt;span style=&quot;color:#777&quot;&gt;// Only say hello if a &quot;greeting&quot; is requested&lt;/span&gt;
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; (params.REQUESTED_ACTION == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;greeting&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Hello, bitwiseman!&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I run this project with &lt;code&gt;REQUESTED_ACTION&lt;/code&gt; set to &quot;greeting&quot;, here’s the output:&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;[Pipeline] node
Running on osx_mbp in /Users/bitwiseman/jenkins/agents/osx_mbp/workspace/pipeline-conditional
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Speak)
[Pipeline] echo
Hello, bitwiseman!
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I pass the value &quot;silence&quot;, the only change is &quot;Hello, bitwiseman!&quot; is not printed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some might argue that the Pipeline code is a bit harder to understand on first reading.
Others would say the UI is just as confusing if not more so.
Either way, the Pipeline representation is considerably more compact than the Jenkins UI presentation.
Pipeline also lets us add helpful comments, which we can’t do in the Freestyle UI.
And we can easily put this Pipeline in a &lt;code&gt;Jenkinsfile&lt;/code&gt; to be code-reviewed, checked-in, and versioned
along with the rest of our code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conditions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conditions&quot; /&gt;Conditions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The previous example showed the &quot;Strings match&quot; condition and its Pipeline equivalent.
Let’s look at couple more interesting conditions and their Jenkins Pipeline equivalents.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;boolean-condition&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#boolean-condition&quot; /&gt;Boolean condition&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You might think that a boolean condition would be the simplest condition, but it isn’t.
Since it works with string values from tokens, the Conditional BuildStep plugin offers
a number of ways to indicate true or false.
Truth is a case insensitive match of one of the following:
&lt;code&gt;1&lt;/code&gt; (the number one), &lt;code&gt;Y&lt;/code&gt;, &lt;code&gt;YES&lt;/code&gt;, &lt;code&gt;T&lt;/code&gt;, &lt;code&gt;TRUE&lt;/code&gt;, &lt;code&gt;ON&lt;/code&gt; or &lt;code&gt;RUN&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline can duplicate these, but depending on the scenario we might consider
whether a simpler expression would suffice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;when {
    &lt;span style=&quot;color:#777&quot;&gt;// case insensitive regular expression for truthy values&lt;/span&gt;
    expression { &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; token ==~ &lt;span style=&quot;background-color:hsla(300,100%,50%,0.06)&quot;&gt;&lt;span style=&quot;color:#404&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#808&quot;&gt;(?i)(Y|YES|T|TRUE|ON|RUN)&lt;/span&gt;&lt;span style=&quot;color:#404&quot;&gt;/&lt;/span&gt;&lt;/span&gt; }
}
steps {
    &lt;span style=&quot;color:#777&quot;&gt;/* step */&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;&lt;span style=&quot;color:#777&quot;&gt;// case insensitive regular expression for truthy values&lt;/span&gt;
&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; (token ==~ &lt;span style=&quot;background-color:hsla(300,100%,50%,0.06)&quot;&gt;&lt;span style=&quot;color:#404&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#808&quot;&gt;(?i)(Y|YES|T|TRUE|ON|RUN)&lt;/span&gt;&lt;span style=&quot;color:#404&quot;&gt;/&lt;/span&gt;&lt;/span&gt;) {
    &lt;span style=&quot;color:#777&quot;&gt;/* step */&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;sect3&quot;&gt;
&lt;h4 id=&quot;logical-or-of-conditions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#logical-or-of-conditions&quot; /&gt;Logical &quot;OR&quot; of conditions&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This condition wraps other conditions.
It takes their results as inputs and performs a logical &quot;or&quot; of the results.
The &lt;code&gt;AND&lt;/code&gt; and &lt;code&gt;NOT&lt;/code&gt; conditions do the same, performing their respective operations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;when {
    &lt;span style=&quot;color:#777&quot;&gt;// A or B&lt;/span&gt;
    expression { &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; A || B }
}
steps {
    &lt;span style=&quot;color:#777&quot;&gt;/* step */&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;&lt;span style=&quot;color:#777&quot;&gt;// A or B&lt;/span&gt;
&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; (A || B) {
    &lt;span style=&quot;color:#777&quot;&gt;/* step */&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;sect2&quot;&gt;
&lt;h3 id=&quot;tokens&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tokens&quot; /&gt;Tokens&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tokens can be considerably more work than conditions.
There are more of them and they cover a much broader range of behaviors.
The previous example showed one of the simpler cases, accessing a build parameter,
where the token has a direct equivalent in Pipeline.
However, many tokens don’t have direct equivalents,
some take a parameters (adding to their complexity),
and some provide information that is simply not exposed in Pipeline yet.
So, determining how to migrate tokens needs to be done on case-by-case basis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s look at a few examples.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;file-token&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#file-token&quot; /&gt;&quot;FILE&quot; token&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Expands to the contents of a file. The file path is relative to the build workspace root.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;${FILE,path=&quot;PATH&quot;}&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This token maps directly to the &lt;code&gt;readFile&lt;/code&gt; step.
The only difference is the file path for &lt;code&gt;readFile&lt;/code&gt; is relative to the
current working directory on the agent, but that is the workspace root by default.
No problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;when {
    expression { &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; readFile(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;pom.xml&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;).contains(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;mycomponent&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) }
}
steps {
    &lt;span style=&quot;color:#777&quot;&gt;/* step */&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;&lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; (readFile(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;pom.xml&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;).contains(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;mycomponent&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)) {
    &lt;span style=&quot;color:#777&quot;&gt;/* step */&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;sect3&quot;&gt;
&lt;h4 id=&quot;git_branch&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#git_branch&quot; /&gt;GIT_BRANCH&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Expands to the name of the branch that was built.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt; (descriptions omitted): &lt;em&gt;all&lt;/em&gt;, &lt;em&gt;fullName&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This information may or may not be exposed in Pipeline.  If you’re using the
&lt;a href=&quot;https://plugins.jenkins.io/workflow-multibranch&quot;&gt;Pipeline Multibranch plugin&lt;/a&gt;
&lt;code&gt;env.BRANCH_NAME&lt;/code&gt; will give similar basic information, but doesn’t offer the parameters.
There are also
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/35230&quot;&gt;several&lt;/a&gt;
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/24141&quot;&gt;issues&lt;/a&gt;
filed around &lt;code&gt;GIT_*&lt;/code&gt; tokens in Pipeline.
Until they are addressed fully, we can follow the pattern shown in
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-examples/blob/master/pipeline-examples/gitcommit/gitcommit.groovy&quot;&gt;pipeline-examples&lt;/a&gt;,
executing a shell to get the information we need.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Pipeline&lt;/div&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;GIT_BRANCH&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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;returnStdout:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;script:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;git rev-parse --abbrev-ref HEAD&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;trim&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 class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;changes_since_last_success&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#changes_since_last_success&quot; /&gt;CHANGES_SINCE_LAST_SUCCESS&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Displays the changes since the last successful build.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Parameters&lt;/strong&gt; (descriptions omitted):
&lt;em&gt;reverse&lt;/em&gt;, &lt;em&gt;format&lt;/em&gt;, &lt;em&gt;changesFormat&lt;/em&gt;, &lt;em&gt;showPaths&lt;/em&gt;, &lt;em&gt;pathFormat&lt;/em&gt;,
&lt;em&gt;showDependencies&lt;/em&gt;, &lt;em&gt;dateFormat&lt;/em&gt;, &lt;em&gt;regex&lt;/em&gt;, &lt;em&gt;replace&lt;/em&gt;, &lt;em&gt;default&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not only is the information provided by this token not exposed in Pipeline,
the token has ten optional parameters, including format strings and regular expression
searches. There are a number of ways we might get similar information in Pipeline.
Each have their own particular limitations and ways they differ from the token output.
Then we’ll need to consider how each of the parameters changes the output.
If nothing else, translating this token is clearly beyond the scope of this post.&lt;/p&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;slightly-more-complex-example&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#slightly-more-complex-example&quot; /&gt;Slightly More Complex Example&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s do one more example that shows some of these conditions and tokens.
This time we’ll perform different build steps depending on what branch we’re building.
We’ll take two build parameters: &lt;code&gt;BRANCH_PATTERN&lt;/code&gt; and &lt;code&gt;FORCE_FULL_BUILD&lt;/code&gt;.
Based on &lt;code&gt;BRANCH_PATTERN&lt;/code&gt;, we’ll checkout a repository.
If we’re building on the &lt;code&gt;master&lt;/code&gt; branch or the user checked &lt;code&gt;FORCE_FULL_BUILD&lt;/code&gt;,
we’ll call three other builds in parallel
(&lt;code&gt;full-build-linux&lt;/code&gt;, &lt;code&gt;full-build-mac&lt;/code&gt;, and &lt;code&gt;full-build-windows&lt;/code&gt;),
wait for them to finish, and report the result.
If we’re not building on the &lt;code&gt;master&lt;/code&gt; branch and the user did not check &lt;code&gt;FORCE_FULL_BUILD&lt;/code&gt;,
we’ll print a message saying we skipped the full builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;freestyle&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#freestyle&quot; /&gt;Freestyle&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s the configuration for Freestyle version.
(It’s pretty long.  Feel free to &lt;a href=&quot;#longer-pipeline&quot;&gt;skip down to the Pipeline version&lt;/a&gt;):&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;The Pipeline version of this job determines the &lt;code&gt;GIT_BRANCH&lt;/code&gt; branch by
running a shell script that returns the current local branch name.
This means that the Pipeline version must checkout to a local branch (not a detached head).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Freestyle version of this job does not require a local branch, &lt;code&gt;GIT_BRANCH&lt;/code&gt; is set automatically.
However, to maintain functional parity, the Freestyle version of this job includes
&quot;Checkout to Specific Local Branch&quot; as well.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/2017-01-19/freestyle-conditional-long-full.png&quot; alt=&quot;Longer Freestyle Job&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;longer-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#longer-pipeline&quot; /&gt;Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s the equivalent Pipeline:&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;Freestyle version of this job is not stored in source control.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In general, the Pipeline version of this job would be stored in source control,
would &lt;code&gt;checkout scm&lt;/code&gt;, and would run that same repository.
However, to maintain functional parity, the Pipeline version shown does a checkout
from source control but is not stored in that repository.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
    agent any
    parameters {
        string (
            &lt;span style=&quot;color:#606&quot;&gt;defaultValue&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;description&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            name : &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;BRANCH_PATTERN&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)
        booleanParam (
            &lt;span style=&quot;color:#606&quot;&gt;defaultValue&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;description&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            name : &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;FORCE_FULL_BUILD&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)
    }

    stages {
        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Prepare&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            steps {
                checkout([&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GitSCM&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
                    &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;branches&lt;/span&gt;: [[&lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;origin/&lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;BRANCH_PATTERN&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;]],
                    &lt;span style=&quot;color:#606&quot;&gt;doGenerateSubmoduleConfigurations&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
                    &lt;span style=&quot;color:#606&quot;&gt;extensions&lt;/span&gt;: [[&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;LocalBranch&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]],
                    &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;submoduleCfg&lt;/span&gt;: &lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;[]&lt;/span&gt;,
                    &lt;span style=&quot;color:#606&quot;&gt;userRemoteConfigs&lt;/span&gt;: [[
                        &lt;span style=&quot;color:#606&quot;&gt;credentialsId&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bitwiseman_github&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
                        &lt;span style=&quot;color:#606&quot;&gt;url&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;https://github.com/bitwiseman/hermann&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]]])
            }
        }

        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            when {
                expression {
                    GIT_BRANCH = &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;origin/&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; + sh(&lt;span style=&quot;color:#606&quot;&gt;returnStdout&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;script&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;git rev-parse --abbrev-ref HEAD&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;).trim()
                    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; GIT_BRANCH == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;origin/master&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; || params.FORCE_FULL_BUILD
                }
            }
            steps {
                &lt;span style=&quot;color:#777&quot;&gt;// Freestyle build trigger calls a list of jobs&lt;/span&gt;
                &lt;span style=&quot;color:#777&quot;&gt;// Pipeline build() step only calls one job&lt;/span&gt;
                &lt;span style=&quot;color:#777&quot;&gt;// To run all three jobs in parallel, we use &quot;parallel&quot; step&lt;/span&gt;
                &lt;span style=&quot;color:#777&quot;&gt;// https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel&lt;/span&gt;
                parallel (
                    &lt;span style=&quot;color:#606&quot;&gt;linux&lt;/span&gt;: {
                        build &lt;span style=&quot;color:#606&quot;&gt;job&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;full-build-linux&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;parameters&lt;/span&gt;: [string(&lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GIT_BRANCH_NAME&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;value&lt;/span&gt;: GIT_BRANCH)]
                    },
                    &lt;span style=&quot;color:#606&quot;&gt;mac&lt;/span&gt;: {
                        build &lt;span style=&quot;color:#606&quot;&gt;job&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;full-build-mac&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;parameters&lt;/span&gt;: [string(&lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GIT_BRANCH_NAME&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;value&lt;/span&gt;: GIT_BRANCH)]
                    },
                    &lt;span style=&quot;color:#606&quot;&gt;windows&lt;/span&gt;: {
                        build &lt;span style=&quot;color:#606&quot;&gt;job&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;full-build-windows&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;parameters&lt;/span&gt;: [string(&lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GIT_BRANCH_NAME&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;value&lt;/span&gt;: GIT_BRANCH)]
                    },
                    &lt;span style=&quot;color:#606&quot;&gt;failFast&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;)
            }
        }
        stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build Skipped&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
            when {
                expression {
                    GIT_BRANCH = &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;origin/&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; + sh(&lt;span style=&quot;color:#606&quot;&gt;returnStdout&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;script&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;git rev-parse --abbrev-ref HEAD&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;).trim()
                    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; !(GIT_BRANCH == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;origin/master&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; || params.FORCE_FULL_BUILD)
                }
            }
            steps {
                echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Skipped full build.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;properties ([
    parameters ([
        string (
            &lt;span style=&quot;color:#606&quot;&gt;defaultValue&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;description&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            name : &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;BRANCH_PATTERN&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;),
        booleanParam (
            &lt;span style=&quot;color:#606&quot;&gt;defaultValue&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;description&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            name : &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;FORCE_FULL_BUILD&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;)
    ])
])

node {
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Prepare&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
        checkout([&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GitSCM&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
            &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;branches&lt;/span&gt;: [[&lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;origin/&lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;BRANCH_PATTERN&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;]],
            &lt;span style=&quot;color:#606&quot;&gt;doGenerateSubmoduleConfigurations&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;extensions&lt;/span&gt;: [[&lt;span style=&quot;color:#F00;background-color:#FAA&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;class&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;LocalBranch&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]],
            &lt;span style=&quot;color:#B06;font-weight:bold&quot;&gt;submoduleCfg&lt;/span&gt;: &lt;span style=&quot;color:#339;font-weight:bold&quot;&gt;[]&lt;/span&gt;,
            &lt;span style=&quot;color:#606&quot;&gt;userRemoteConfigs&lt;/span&gt;: [[
                &lt;span style=&quot;color:#606&quot;&gt;credentialsId&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bitwiseman_github&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;,
                &lt;span style=&quot;color:#606&quot;&gt;url&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;https://github.com/bitwiseman/hermann&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;]]])
    }

    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
        GIT_BRANCH = &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;origin/&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; + sh(&lt;span style=&quot;color:#606&quot;&gt;returnStdout&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;script&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;git rev-parse --abbrev-ref HEAD&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;).trim()
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; (GIT_BRANCH == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;origin/master&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; || params.FORCE_FULL_BUILD) {

            &lt;span style=&quot;color:#777&quot;&gt;// Freestyle build trigger calls a list of jobs&lt;/span&gt;
            &lt;span style=&quot;color:#777&quot;&gt;// Pipeline build() step only calls one job&lt;/span&gt;
            &lt;span style=&quot;color:#777&quot;&gt;// To run all three jobs in parallel, we use &quot;parallel&quot; step&lt;/span&gt;
            &lt;span style=&quot;color:#777&quot;&gt;// https://jenkins.io/doc/pipeline/examples/#jobs-in-parallel&lt;/span&gt;
            parallel (
                &lt;span style=&quot;color:#606&quot;&gt;linux&lt;/span&gt;: {
                    build &lt;span style=&quot;color:#606&quot;&gt;job&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;full-build-linux&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;parameters&lt;/span&gt;: [string(&lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GIT_BRANCH_NAME&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;value&lt;/span&gt;: GIT_BRANCH)]
                },
                &lt;span style=&quot;color:#606&quot;&gt;mac&lt;/span&gt;: {
                    build &lt;span style=&quot;color:#606&quot;&gt;job&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;full-build-mac&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;parameters&lt;/span&gt;: [string(&lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GIT_BRANCH_NAME&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;value&lt;/span&gt;: GIT_BRANCH)]
                },
                &lt;span style=&quot;color:#606&quot;&gt;windows&lt;/span&gt;: {
                    build &lt;span style=&quot;color:#606&quot;&gt;job&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;full-build-windows&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;parameters&lt;/span&gt;: [string(&lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GIT_BRANCH_NAME&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;value&lt;/span&gt;: GIT_BRANCH)]
                },
                &lt;span style=&quot;color:#606&quot;&gt;failFast&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;false&lt;/span&gt;)

        } &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;else&lt;/span&gt; {
            echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Skipped full build.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&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&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;As I said before, the Conditional BuildStep plugin is great.
It provides a clear, easy to understand way to add conditional logic to any Freestyle job.
Before Pipeline, it was one of the few plugins to do this and it remains one of the most popular plugins.
Now that we have Pipeline, we can implement conditional logic directly in code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is blog post discussed how to approach converting conditional build steps to Pipeline
and showed a couple concrete examples.  Overall, I’m pleased with the results so far.
I found scenarios which could not easily be migrated to Pipeline, but even those
are only more difficult, rather than impossible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next thing to do is add a section to the
&lt;a href=&quot;https://www.jenkins.io/doc/book/&quot;&gt;Jenkins Handbook&lt;/a&gt; documenting the Pipeline
equivalent of all of the Conditions and the most commonly used Tokens.
Look for it soon!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://plugins.jenkins.io/conditional-buildstep&quot;&gt;Conditional BuildStep plugin&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/2017/01/17/scm-api-2/</id>
<title>SCM API turns 2.0 and what that means for you</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/17/scm-api-2/" />
<author>
<name>stephenc</name>
</author>
<category term='development'></category>
<category term='plugins'></category>
<summary>
The regressions
discovered after release have now been resolved and this post has been updated with the correct plugin version numbers.


See this post for more details.






We are announcing the
SCM API
2.0.x and
Branch API
2.0.x release lines.


Downstream of this there are also some great improvements to a number of popular plugins including:




GitHub Branch Source


BitBucket branch source


Git


Mercurial


Pipeline Multibranch


GitHub Organization Folders




There are some gotcha&#8217;s that Jenkins administrators will need to be aware of.








Always take a backup of your JENKINS_HOME before upgrading any plugins.





We want to give you the whole story, but the take home message is this:




When updating the
SCM API
and/or
Branch API
plugins to the 2.0.x release lines,...
</summary>
<content type='html'>
&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;The &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41121&quot;&gt;regressions
discovered after release&lt;/a&gt; have now been resolved and this post has been updated with the correct plugin version numbers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.jenkins.io/blog/2017/02/06/scm-api-2-take2/&quot;&gt;this post&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are announcing the
&lt;a href=&quot;https://plugins.jenkins.io/scm-api&quot;&gt;SCM API&lt;/a&gt;
2.0.x and
&lt;a href=&quot;https://plugins.jenkins.io/branch-api&quot;&gt;Branch API&lt;/a&gt;
2.0.x release lines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Downstream of this there are also some great improvements to a number of popular plugins including:&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/github-branch-source&quot;&gt;GitHub Branch Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/cloudbees-bitbucket-branch-source&quot;&gt;BitBucket branch source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/git&quot;&gt;Git&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/mercurial&quot;&gt;Mercurial&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/workflow-multibranch&quot;&gt;Pipeline Multibranch&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/github-organization-folder&quot;&gt;GitHub Organization Folders&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;There are some gotcha’s that Jenkins administrators will need to be aware of.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Always take a backup of your &lt;code&gt;JENKINS_HOME&lt;/code&gt; before upgrading any plugins.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We want to give you the whole story, but the take home message is this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When updating the
&lt;a href=&quot;https://plugins.jenkins.io/scm-api&quot;&gt;SCM API&lt;/a&gt;
and/or
&lt;a href=&quot;https://plugins.jenkins.io/branch-api&quot;&gt;Branch API&lt;/a&gt;
plugins to the 2.0.x release lines, if you have any of the
&lt;a href=&quot;https://plugins.jenkins.io/github-organization-folder&quot;&gt;GitHub Organization Folders&lt;/a&gt;,
&lt;a href=&quot;https://plugins.jenkins.io/github-branch-source&quot;&gt;GitHub Branch Source&lt;/a&gt;
and/or
&lt;a href=&quot;https://plugins.jenkins.io/cloudbees-bitbucket-branch-source&quot;&gt;BitBucket branch source&lt;/a&gt;
plugins installed then you &lt;strong&gt;must&lt;/strong&gt; upgrade them &lt;strong&gt;all&lt;/strong&gt; to 2.0.x at the same time or Bad Things™ will happen.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— A Jenkins Administrator
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Do NOT upgrade some of these plugins but not others!
Doing so may cause your jobs to fail to load.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you don’t care about the hows and whys, you can just skip down to &lt;a href=&quot;#tldr&quot;&gt;this section&lt;/a&gt; but if you are curious…​ here we go!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-back-story&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-back-story&quot; /&gt;The back-story&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Way back in September 2013 we announced the
&lt;a href=&quot;https://www.jenkins.io/blog/2013/09/23/literate-builds-wtf/&quot;&gt;Literate plugin&lt;/a&gt;,
as an experimental new way of modeling branch development in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you are performing an experiment, the recommendation is to do just enough work to let you perform the test.
However, the culture in Jenkins is to always try and produce reusable components that others can use in ways you have not anticipated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So when releasing the initial version of the
&lt;a href=&quot;https://plugins.jenkins.io/literate&quot;&gt;Literate plugin&lt;/a&gt;
we also separated the Literate specific bits from the SCM specific concepts and multi-branch concepts.
These were lower level concepts were organized into the following plugins:&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/scm-api&quot;&gt;SCM API&lt;/a&gt; -
which was intended to be a plugin to hold a next generation API for interacting with source control systems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/branch-api&quot;&gt;Branch API&lt;/a&gt; -
which was intended to be a plugin to hold the multi-branch functionality that was abstracted from the usage by the Literate plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition, we released updates to three of the more common SCM plugins which included implementations of the SCM API:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Git plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Subversion plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mercurial plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While there was some interest in the Literate plugin, it did not gain much traction - there are only 39 Jenkins instances running the Literate plugin as of December 2016.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In terms of the reusable components, we had only made a minimal implementation with some limitations:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Very basic event support - events can only trigger a re-scan of the entire repository.
This was acceptable at the time because the only three implementations use a local cache of the remote state so re-scanning is quick.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No implementation of the &lt;code&gt;SCMFileSystem&lt;/code&gt; API.
As a result it is not possible for plugins like
&lt;a href=&quot;https://plugins.jenkins.io/workflow-multibranch&quot;&gt;Pipeline Multibranch&lt;/a&gt;
to get the &lt;code&gt;Jenkinsfile&lt;/code&gt; from the remote repository without needing to checkout the repository into a workspace.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No documentation on how plugin developers are supposed to implement the SCM API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No documentation on how plugin developers are supposed to consume the SCM API (if they wanted to do something like Branch API but not the same way as Branch API)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No documentation on how plugin developers are supposed to implement the Branch API to create their own multi-branch project types&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No documentation on for users on how the Branch API based project types are expected to work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Roll forward to November 2015 and Jenkins Pipeline got a release of the
&lt;a href=&quot;https://plugins.jenkins.io/workflow-multibranch&quot;&gt;Pipeline Multibranch&lt;/a&gt;.
It seems that pairing Pipeline with Branch API style multi-branch is much more successful than Literate - there are close to 60,000 instances running the pipeline multi-branch plugin as of December 2016.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There also were two new SCM plugins implementing the SCM API:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GitHub Branch Source Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BitBucket Branch Source Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unlike the previous implementations of the SCM API, however, these plugins do not maintain a local cache of the repository state.
Rather they make queries via the GitHub / BitBucket REST APIs on demand.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The above design decision exposed one of the initial MVP compromises of the SCM API plugin: &lt;em&gt;very basic event support&lt;/em&gt;.
Under the SCM API 1.x model, the only event that an &lt;code&gt;SCMSource&lt;/code&gt; can signal is &lt;em&gt;something changed, go look at everything again&lt;/em&gt;.
When you are accessing an API that only allows 5,000 API calls per hour, performing a full scan of the entire repository just to pick up a change in one branch does not make optimum usage of that 5,000 calls/hour rate limit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we decided that perhaps the SCM API and Branch API plugins have left their Minimum Viability Experiment state and the corresponding limitations should be addressed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;enter-scm-api-2-0-x-and-branch-api-2-0-x&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enter-scm-api-2-0-x-and-branch-api-2-0-x&quot; /&gt;Enter SCM API 2.0.x and Branch API 2.0.x&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So what has changed in the
&lt;a href=&quot;https://plugins.jenkins.io/scm-api&quot;&gt;SCM API&lt;/a&gt;
2.0.x and
&lt;a href=&quot;https://plugins.jenkins.io/branch-api&quot;&gt;Branch API&lt;/a&gt;
2.0.x release lines?
These plugin releases include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;documentation on how plugin developers are supposed to
&lt;a href=&quot;https://github.com/jenkinsci/scm-api-plugin/blob/master/docs/implementation.adoc&quot;&gt;implement the SCM API&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;documentation on how plugin developers are supposed to
&lt;a href=&quot;https://github.com/jenkinsci/scm-api-plugin/blob/master/docs/consumer.adoc&quot;&gt;consume the SCM API&lt;/a&gt;
(if they wanted to do something like Branch API but not the same way as Branch API)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;documentation on how plugin developers are supposed to
&lt;a href=&quot;https://github.com/jenkinsci/branch-api-plugin/blob/master/docs/implementation.adoc&quot;&gt;implement the Branch API&lt;/a&gt;
to create their own multi-branch project types&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;generic documentation for users on
&lt;a href=&quot;https://github.com/jenkinsci/branch-api-plugin/blob/master/docs/user.adoc&quot;&gt;how Branch API based project types are intended to work&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a full featured
&lt;a href=&quot;https://github.com/jenkinsci/scm-api-plugin/blob/master/src/main/java/jenkins/scm/api/SCMEvent.java&quot;&gt;event system&lt;/a&gt;
that allows implementers to provide fine grained notifications to consumers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/scm-api-plugin/tree/master/src/test/java/jenkins/scm/api&quot;&gt;lots&lt;/a&gt;
&lt;a href=&quot;https://github.com/jenkinsci/scm-api-plugin/tree/master/src/test/java/jenkins/scm/impl&quot;&gt;and&lt;/a&gt;
&lt;a href=&quot;https://github.com/jenkinsci/branch-api-plugin/tree/master/src/test/java/integration&quot;&gt;lots&lt;/a&gt;
of new automated tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a &lt;a href=&quot;https://github.com/jenkinsci/scm-api-plugin/tree/master/src/test/java/jenkins/scm/impl/mock&quot;&gt;mock implementation&lt;/a&gt;
of the SCM API to help consumers of the SCM API test their usage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition, we have upgraded the following plugins to include the new fine-grained event support:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Git Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mercurial Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ok, that was the good news.
Here is the bad news.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We found out that the GitHub Branch Source and BitBucket Branch Source plugins had made invalid assumptions about how to implement the SCM API.
To be clear, this was not the plugin developers fault: at the time there was no documentation on how to implement the SCM API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But fixing the issues that we found means that you have to be careful about which specific combinations of plugin versions you have installed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;SCM API Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Technically, the 2.0.x line of this plugin is both API and on-disk compatible with plugins compiled against older version lines.&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, the 1.x lines of both the GitHub Branch Source and BitBucket Branch Source plugins have hard-coded assumptions about internal implementation of the SCM API that are no longer valid in the 2.0.x line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you upgrade to SCM API 2.0.x and you have either the GitHub Branch Source or the BitBucket Branch Source plugins &lt;strong&gt;and&lt;/strong&gt; you do not upgrade those instances to the 2.0.x line then your Jenkins instance will fail to start-up correctly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The solution is just to upgrade the GitHub Branch Source or the BitBucket Branch Source plugin (as appropriate) to the 2.0.x line.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you upgrade the SCM API plugin to the 2.0.x line and do not upgrade the Branch API plugin to the 2.0.x line then you will not get any of the benefits of the new version of the SCM API plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Branch API Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The 2.0.x line of this plugin makes on-disk file format changes that mean you will be unable to roll back to the 1.x line after an upgrade without restoring the old data files from a back-up.
Technically, the API is compatible with plugins compiled against older version lines.&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 1.x lines of both the GitHub Branch Source and BitBucket Branch Source plugins have implemented hacks that make assumptions about internal implementation of the Branch API that are no longer valid in the 2.0.x line.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline Multibranch plugin made a few minor invalid assumptions about how to implement a Multibranch project type.
For example, if you do not upgrade the Pipeline Multibranch plugin in tandem then you will be unable to manually delete an orphaned item before the orphaned item retention strategy runs, which should be significantly less frequently with the new event support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you upgrade to Branch API 2.0.x and you have either the GitHub Branch Source or the BitBucket Branch Source plugins &lt;strong&gt;and&lt;/strong&gt; you do not upgrade those instances to the 2.0.x line then your Jenkins instance will fail to start-up correctly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The solution is just to upgrade the GitHub Branch Source or the BitBucket Branch Source plugin (as appropriate) to the 2.0.x line.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Git Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The new releases of this plugin are both API and on-disk compatible with plugins compiled against the previous releases.&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2.0.x lines of both the GitHub Branch Source and BitBucket Branch Source plugins require that you upgrade your Git Plugin to one of the versions that supports SCM API 2.0.x.
In general, the required upgrade will be performed automatically when you upgrade your GitHub Branch Source and BitBucket Branch Source plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Mercurial Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The new release of this plugin is both API and on-disk compatible with plugins compiled against the previous releases.&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2.0.x line of the BitBucket Branch Source plugins require that you upgrade your Mercurial Plugin to the 2.0.x line.
In general, the required upgrade will be performed automatically when you upgrade your  BitBucket Branch Source plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;BitBucket Branch Source Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The 2.0.x line of this plugin makes on-disk file format changes that mean you will be unable to roll back to the 1.x line after an upgrade without restoring the old data files from a back-up.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub Branch Source Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The 2.0.x line of this plugin makes on-disk file format changes that mean you will be unable to roll back to the 1.x line after an upgrade without restoring the old data files from a back-up.&lt;/p&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you upgrade to GitHub Branch Source 2.0.x and you have the GitHub Organization Folders plugin installed, you must upgrade that plugin to the tombstone release.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub Organization Folders Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;The functionality of this plugin has been migrated to the GitHub Branch Source plugin.
You will need to upgrade to the tombstone release in order to ensure all the data has been migrated to the classes in the GitHub Branch Source plugin.&lt;/p&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you have upgraded to the tombstone version and all GitHub Organization Folders have had a full scan completed successfully, you can disable and uninstall the GitHub Organization Folders plugin.
There will be no more releases of this plugin after the tombstone.
The tombstone is only required for data migration.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;tldr&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tldr&quot; /&gt;Summary for busy Jenkins Administrators&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Upgrading should make multi-branch projects much better.
When you are ready to upgrade you must ensure that you upgrade all the required plugins.
If you miss some, just upgrade them and restart to fix the issue.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Folders Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;span class=&quot;line-through&quot;&gt;5.16&lt;/span&gt; &lt;strong&gt;5.17&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;SCM API Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;span class=&quot;line-through&quot;&gt;2.0.1&lt;/span&gt; &lt;strong&gt;2.0.2&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Branch API Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;span class=&quot;line-through&quot;&gt;2.0.0&lt;/span&gt; &lt;strong&gt;2.0.2&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Git Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;strong&gt;Either&lt;/strong&gt; &lt;span class=&quot;line-through&quot;&gt;2.6.2&lt;/span&gt; &lt;strong&gt;2.6.4&lt;/strong&gt; or newer in the 2.6.x line &lt;strong&gt;or&lt;/strong&gt; &lt;span class=&quot;line-through&quot;&gt;3.0.2&lt;/span&gt; &lt;strong&gt;3.0.4&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Mercurial Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;2.0.0 or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub Branch Source Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;span class=&quot;line-through&quot;&gt;2.0.0&lt;/span&gt; &lt;strong&gt;2.0.1&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;BitBucket Branch Source Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;span class=&quot;line-through&quot;&gt;2.0.0&lt;/span&gt; &lt;strong&gt;2.0.2&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub Organization Folders Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;1.6&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Pipeline Multibranch Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;span class=&quot;line-through&quot;&gt;2.10&lt;/span&gt; &lt;strong&gt;2.12&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are using the &lt;a href=&quot;https://plugins.jenkins.io/blueocean&quot;&gt;Blue Ocean plugin&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Blue Ocean Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;&lt;strong&gt;1.0.0-b22&lt;/strong&gt; or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other plugins that may require updating:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub API Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;1.84 or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;GitHub Plugin&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;1.25.0 or newer&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After an upgrade you will see the data migration warning (see the screenshot in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/41608&quot;&gt;JENKINS-41608&lt;/a&gt; for an example) this is normal and expected.
The unreadable data will be removed by the next scan / index or can be removed manually using the &lt;em&gt;Discard Unreadable Data&lt;/em&gt; button.
The warning will disappear on the next restart after the unreadable data has been removed.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-for-busy-jenkins-users&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-for-busy-jenkins-users&quot; /&gt;Summary for busy Jenkins users&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;SCM API 2.0.x adds fine-grained event support.
This should significantly improve the responsiveness of multi-branch projects.
This should significantly reduce your GitHub API rate limit usage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are using the
&lt;a href=&quot;https://plugins.jenkins.io/github-branch-source&quot;&gt;GitHub Branch Source&lt;/a&gt;
or
&lt;a href=&quot;https://plugins.jenkins.io/github-organization-folder&quot;&gt;GitHub Organization Folders&lt;/a&gt;
plugins then upgrading will &lt;strong&gt;significantly&lt;/strong&gt; reduce the API calls made by Jenkins to GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are using any of the upgraded SCM plugins (e.g. Git, Mercurial, GitHub Branch Source, BitBucket Branch Source) then upgrading will &lt;strong&gt;significantly&lt;/strong&gt; improve the responsiveness to push event notifications.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;summary-for-busy-scm-plugin-developers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#summary-for-busy-scm-plugin-developers&quot; /&gt;Summary for busy SCM plugin developers&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You should read the new
&lt;a href=&quot;https://github.com/jenkinsci/scm-api-plugin/blob/master/docs/implementation.adoc&quot;&gt;documentation&lt;/a&gt;
on how plugin developers are supposed to implement the SCM API&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;where-to-now-dear-literate-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-to-now-dear-literate-plugin&quot; /&gt;Where to now dear Literate Plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The persistent reader may be wondering what happens now to the Literate plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me, the logical heir of the Literate Plugin is the
&lt;a href=&quot;https://plugins.jenkins.io/pipeline-model-definition&quot;&gt;Pipeline Model Definition plugin&lt;/a&gt;.
This new plugin has the advantage of an easy to read pipeline syntax with the extra functionality that I suspect was preventing people from adopting Literate.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The good news is that the Pipeline Model Definition already has 5000 installations as of December 2016 and I expect up-take to keep on growing.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/01/17/Jenkins-is-upgrading-to-Java-8/</id>
<title>Jenkins Upgrades To Java 8</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/17/Jenkins-is-upgrading-to-Java-8/" />
<author>
<name>batmat</name>
</author>
<category term='java8'></category>
<category term='upgrade'></category>
<summary>
In the next few months, Jenkins will require Java 8 as its runtime.


Back in
last November,
we discussed interesting statistics showing that Jenkins was now running Java 8
on a majority of its running instances.


Timeline


Here is how we plan to roll that baseline upgrade in the next few months.




Now: Announce the intention publicly.


April, 2017: Drop support for Java 7 in Jenkins weekly.
With the current rhythm, that means 2.52 will most likely be the first weekly to require Java 8.


June 2017: First LTS version requiring Java 8 is published.
This should be something around 2.60.1.










If you are still running Java 7, you will not be...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;In the next few months, Jenkins will require Java 8 as its runtime.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back in
&lt;a href=&quot;https://www.jenkins.io/blog/2016/11/22/what-jvm-versions-are-running-jenkins-the-return/&quot;&gt;last November&lt;/a&gt;,
we discussed interesting statistics showing that Jenkins was now running Java 8
on a majority of its running instances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;timeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#timeline&quot; /&gt;Timeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is how we plan to roll that baseline upgrade in the next few months.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Now: Announce the intention publicly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;April, 2017: Drop support for Java 7 in Jenkins weekly.
With the current rhythm, that means &lt;em&gt;2.52&lt;/em&gt; will most likely be the first weekly to require Java 8.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;June 2017: First LTS version requiring Java 8 is published.
This should be something around &lt;em&gt;2.60.1&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
If you are still running Java 7, you will not be able to upgrade to the latest LTS version after some date probably around May 2017.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;why-upgrade-to-java-8&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-upgrade-to-java-8&quot; /&gt;Why Upgrade to Java 8&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Balancing those numbers with many other criteria:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Java 7 has been now end-of-lifed for 18+ months&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;People are already moving away from Java 7, as show the numbers&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;52.8%&lt;/em&gt; of instances were already running Java 8 back in last November, and now reaching &lt;a href=&quot;https://stats.jenkins.io/plugin-installation-trend/jvms.json&quot;&gt;&lt;em&gt;58%&lt;/em&gt; two months later&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If we only look at Jenkins 2.x, then we reach &lt;em&gt;72%&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java 8 runtime is known from the field to be more stable&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many developers have been wanting to be allowed to leverage the improvements that Java 8 provides to the language and platform
(lambdas, Date/Time API…​ just to name a few).
Being also a developer community, we want Jenkins to be appealing to contributors.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have questions or feedback about this announcement, please feel free to post it to the Jenkins developers mailing list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/01/13/blueocean-dev-log-jan/</id>
<title>Blue Ocean Dev Log: January Week #2</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/13/blueocean-dev-log-jan/" />
<author>
<name>michaelneale</name>
</author>
<category term='blueocean'></category>
<summary>
As we get closer to
Blue Ocean
1.0, which is planned for the end of March, I figured it would be great to
highlight some of the good stuff that has been going on. It&#8217;s been a
busy-as-usual week as everyone comes back from vacation.  A couple of new betas
went out this week. Of note:




input to Pipelines is now supported, a much asked for feature (see below)


A new French translation


Some optimisations (especially around reducing number of HTTP calls). We
have started using
gtmetrix.com
to measure changes on
"dogfood"
to get some numbers around optimisations on the web tier.


And a grab bag of other great bug fixes.









Also a bunch...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we get closer to
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;
1.0, which is planned for the end of March, I figured it would be great to
highlight some of the good stuff that has been going on. It’s been a
busy-as-usual week as everyone comes back from vacation.  A couple of new betas
went out this week. Of note:&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;input&lt;/code&gt; to Pipelines is now supported, a much asked for feature (see below)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new French translation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some optimisations (especially around reducing number of HTTP calls). We
have started using
&lt;a href=&quot;https://gtmetrix.com&quot;&gt;gtmetrix.com&lt;/a&gt;
to measure changes on
&lt;a href=&quot;https://ci.blueocean.io&quot;&gt;&quot;dogfood&quot;&lt;/a&gt;
to get some numbers around optimisations on the web tier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And a grab bag of other great bug fixes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/blueocean/input-step.png&quot; alt=&quot;Using the input step in Blue Ocean&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also a bunch of work has been done to support parameterized pipelines, as
well as creation of new multibranch pipelines (both are much asked for).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is also now an &quot;official&quot; Docker image being published to
&lt;a href=&quot;https://hub.docker.com/r/jenkinsci/blueocean/&quot;&gt;Docker Hub&lt;/a&gt;. The Pipeline
building the container is run weekly and will be picking up newly tagged
releases of Blue Ocean.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Running the latest can be as simple as:&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;docker run -p 8888:8080 jenkinsci/blueocean:latest&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/blueocean/logo-yarrr.png&quot; alt=&quot;Jenkins yarrr&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is built on the incredibly popular
&lt;a href=&quot;https://hub.docker.com/_/jenkins/&quot;&gt;official &quot;jenkins&quot; image&lt;/a&gt;
(10M pulls can’t all be wrong!). The container also has tags available (e.g.
&lt;code&gt;jenkinsci/blueocean:1.0.0-b16&lt;/code&gt;) for grabbing a specific released version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Up next for Blue Ocean development as we march towards 1.0:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Support for parameterized jobs. For which a bunch of api work has already been
done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Creation of the new Pipeline GUI&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Preview release of the Visual Editor for
&lt;a href=&quot;https://www.jenkins.io/blog/2017/01/12/declarative-pipeline-beta-2/&quot;&gt;Declarative Pipeline&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new header design will be applied&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping to make Blue Ocean a great user experience for
Jenkins, please join the Blue Ocean development team on
link:https://app.gitter.im/#/room/#jenkinsci_blueocean-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;Gitter&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/01/12/declarative-pipeline-beta-2/</id>
<title>Declarative Pipeline Syntax Beta 2 release</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/12/declarative-pipeline-beta-2/" />
<author>
<name>abayer</name>
</author>
<category term='plugins'></category>
<category term='pipeline'></category>
<summary>
This week, we released the second beta of the new
Declarative Pipeline syntax,
available in the Update Center now as version 0.8.1 of Pipeline: Model Definition.
You can read more about Declarative Pipeline
in the blog post introducing the first beta
from December, but we wanted to update you all on the syntax changes in the
second beta. These syntax changes are the last compatibility-breaking changes to
the syntax before the 1.0 release planned for February, so you can safely start
using the 0.8.1 syntax now without needing to change it when 1.0 is released.


A full syntax reference is available on the wiki as well.


Syntax Changes


Changed "agent" configuration...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week, we released the second beta of the new
&lt;a href=&quot;https://plugins.jenkins.io/pipeline-model-definition&quot;&gt;Declarative Pipeline syntax&lt;/a&gt;,
available in the Update Center now as version 0.8.1 of &lt;em&gt;Pipeline: Model Definition&lt;/em&gt;.
You can read more about Declarative Pipeline
&lt;a href=&quot;https://www.jenkins.io/blog/2016/12/19/declarative-pipeline-beta/&quot;&gt;in the blog post introducing the first beta&lt;/a&gt;
from December, but we wanted to update you all on the syntax changes in the
second beta. These syntax changes are the last compatibility-breaking changes to
the syntax before the 1.0 release planned for February, so you can safely start
using the 0.8.1 syntax now without needing to change it when 1.0 is released.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A full syntax reference is &lt;a href=&quot;https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Syntax-Reference&quot;&gt;available on the wiki&lt;/a&gt; as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;syntax-changes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#syntax-changes&quot; /&gt;Syntax Changes&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;changed-agent-configuration-to-block-structure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#changed-agent-configuration-to-block-structure&quot; /&gt;Changed &quot;agent&quot; configuration to block structure&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to support more detailed and clear configuration of agents, as well as
making agent syntax more consistent with the rest of the Declarative Pipeline
syntax, we’ve moved the agent configuration into blocks. The &lt;code&gt;agent any&lt;/code&gt; and
&lt;code&gt;agent none&lt;/code&gt; configurations work the same as previously, but &lt;code&gt;label&lt;/code&gt;, &lt;code&gt;docker&lt;/code&gt;
and &lt;code&gt;dockerfile&lt;/code&gt; now look like the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just specifying a label is simple.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;agent {
    label &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;some-label&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re just specifying a Docker image, you can use this simple syntax.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;agent {
    docker &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;ubuntu:16.04&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you are specifying a label or other arguments, docker looks like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;agent {
    docker {
        image &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;ubuntu:16.04&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        label &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;docker-label&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        args &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;-v /tmp:/tmp -p 8000:8000&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you’re building an image from &quot;Dockerfile&quot; in your repository and
don’t care what node is used or have additional arguments, you can again
use a simple syntax.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;agent {
    dockerfile &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you’re building an image from a different file, or have a label or other
arguments, use the following syntax:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;agent {
    dockerfile {
        filename &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;OtherDockerfile&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        label &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;docker-label&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        args &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;-v /tmp:/tmp -p 8000:8000&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&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;sect2&quot;&gt;
&lt;h3 id=&quot;improved-when-conditions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#improved-when-conditions&quot; /&gt;Improved &quot;when&quot; conditions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We introduced the &lt;code&gt;when&lt;/code&gt; section a couple releases ago, but have made some
changes to its syntax here in 0.8.1. We wanted to add some simpler ways to
specify common conditions, and that required we re-work the syntax accordingly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;branch&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#branch&quot; /&gt;Branch&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most common conditions is running a stage only if you’re on a
specific branch. You can also use wildcards like &quot;*/master&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;when {
    branch &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;master&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&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;sect3&quot;&gt;
&lt;h4 id=&quot;environment&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#environment&quot; /&gt;Environment&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another built-in condition is the environment condition, which checks to see
if a given environment variable is set to a given value.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;when {
    environment &lt;span style=&quot;color:#606&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;SOME_ENV_VAR&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;value&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;SOME_VALUE&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&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;sect3&quot;&gt;
&lt;h4 id=&quot;expression&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#expression&quot; /&gt;Expression&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, there’s the expression condition, which resolves an arbitrary
Pipeline expression. If the return value of that expression isn’t false or
null, the stage will execute.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;when {
    expression {
        echo &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Should I run?&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;foo&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;bar&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&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;sect2&quot;&gt;
&lt;h3 id=&quot;options-replaces-properties-and-wrappers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#options-replaces-properties-and-wrappers&quot; /&gt;&quot;options&quot; replaces &quot;properties&quot; and &quot;wrappers&quot;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve renamed the &lt;code&gt;properties&lt;/code&gt; section to &lt;code&gt;options&lt;/code&gt;, due to needing to add new
Declarative-specific options and to cut down on confusion. The &lt;code&gt;options&lt;/code&gt; section
is now where you’ll put general Pipeline options like &lt;code&gt;buildDiscarder&lt;/code&gt;,
Declarative-specific options like &lt;code&gt;skipDefaultCheckout&lt;/code&gt;, and block-scoped steps
that should wrap the execution of the entire build, like &lt;code&gt;timeout&lt;/code&gt; or
&lt;code&gt;timestamps&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;
options {
    buildDiscarder(logRotator(&lt;span style=&quot;color:#606&quot;&gt;numToKeepStr&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;))
    skipDefaultCheckout()
    timeout(&lt;span style=&quot;color:#606&quot;&gt;time&lt;/span&gt;: &lt;span style=&quot;color:#00D&quot;&gt;5&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;unit&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;MINUTES&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&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&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;heading-towards-1-0&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#heading-towards-1-0&quot; /&gt;Heading towards 1.0!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we may still add more functionality to the Declarative Pipeline syntax,
we won’t be making any changes to existing syntax for the 1.0 release. This
means that any pipelines you write against the 0.8.1 syntax will keep working
for the foreseeable future without any changes. So if you’re already using
Declarative Pipelines, make sure to update your `Jenkinsfile`s after upgrading
to 0.8.1, and if you haven’t been using Declarative Pipelines yet, install the
&lt;a href=&quot;https://plugins.jenkins.io/pipeline-model-definition&quot;&gt;&lt;em&gt;Pipeline: Model Definition&lt;/em&gt;&lt;/a&gt; plugin and
give them a try!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/01/11/jenkins-world-2017-cfp/</id>
<title>Jenkins World 2017 Call for Papers is Open</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/11/jenkins-world-2017-cfp/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2017'></category>
<summary>
The largest Jenkins event, Jenkins
World is coming to San Francisco, California on August 28 - 31, 2017, at the
Marriott Marquis.  This conference will feature two days of hands-on training,
workshops, and certification exams followed by two more days with five tracks
of technical sessions from Jenkins and DevOps experts from around the world.


Inspire your peers and colleagues by sharing your expertise and experience as
one of the Jenkins World speakers.
The Call for Papers is open, last
day for submitted a proposal is March 5th, 2017.


Compared to Jenkins World 2016, what&#8217;s new for
2017?  Two tracks are now dedicated to "show and tell." These...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.papercall.io/jenkins-world-2017&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/125x125.png&quot; alt=&quot;125x125&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The largest Jenkins event, &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins
World&lt;/a&gt; is coming to San Francisco, California on &lt;strong&gt;August 28 - 31, 2017&lt;/strong&gt;, at the
Marriott Marquis.  This conference will feature two days of hands-on training,
workshops, and certification exams followed by two more days with five tracks
of technical sessions from Jenkins and DevOps experts from around the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Inspire your peers and colleagues by sharing your expertise and experience as
one of the Jenkins World speakers.
&lt;a href=&quot;https://www.papercall.io/jenkins-world-2017&quot;&gt;The Call for Papers is open&lt;/a&gt;, last
day for submitted a proposal is &lt;strong&gt;March 5th, 2017.&lt;/strong&gt;&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/tags/jenkinsworld/&quot;&gt;Compared to Jenkins World 2016&lt;/a&gt;, what’s new for
2017?  Two tracks are now dedicated to &quot;show and tell.&quot; These sessions are
technically advanced with code sharing, heavy on demos, and only a few slides.
If you are like most of us - driven to learn, share, and collaborate…​we’d
like to hear from you!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to your amazing proposal(s)!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.papercall.io/jenkins-world-2017&quot;&gt;&lt;strong&gt;Submit your proposal here!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/01/10/security-warnings/</id>
<title>Security warnings in Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/10/security-warnings/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
Jenkins 2.40 was released earlier this week, and readers of the
changelog
will have noticed that it now includes the ability to show security warnings
published by the configured update site.  But what does that mean?


In the past, we&#8217;ve notified users about security issues in Jenkins and in
plugins through various means: Emails to the
jenkinsci-advisories mailing list
(which I recommend you subscribe to), blog posts, and, recently, emails to the
oss-security mailing list.  But I still wanted to increase the reach of our
notifications, to make sure Jenkins admins are informed quickly about possible
security problems on their instances.  The logical next step was to...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.40 was released earlier this week, and readers of the
&lt;a href=&quot;https://www.jenkins.io/changelog&quot;&gt;changelog&lt;/a&gt;
will have noticed that it now includes the ability to show security warnings
published by the configured update site.  But what does that mean?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the past, we’ve notified users about security issues in Jenkins and in
plugins through various means: Emails to the
&lt;a href=&quot;https://groups.google.com/d/forum/jenkinsci-advisories&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt;
(which I recommend you subscribe to), blog posts, and, recently, emails to the
oss-security mailing list.  But I still wanted to increase the reach of our
notifications, to make sure Jenkins admins are informed quickly about possible
security problems on their instances.  The logical next step was to include
these notifications in Jenkins itself, and that feature has been added in
Jenkins 2.40.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today we enabled the publication of warnings on our update sites: Once Jenkins
2.40 (or newer) refreshes its cache of update site metadata, it may now inform
you that you’re using a vulnerable plugin that should be updated or removed.
Right now, these aren’t previously unknown warnings, but reference security
advisories for plugin vulnerabilities that have been published over the past few
years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will of course continue to publish security advisories using the mailing
list of the same name, as well other means.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay safe!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2017/01/10/jenkins-lifx-notifier-plugin/</id>
<title>Learning plugin development by improving the LIFX notifier plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2017-01-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2017/01/10/jenkins-lifx-notifier-plugin/" />
<author>
<name>vgaidarji</name>
</author>
<category term='plugins'></category>
<category term='lifx'></category>
<summary>
This is a
cross
post by Veaceslav Gaidarji, open source
developer and contributor to the Jenkins and Bitrise projects.






Some time ago I encountered a LIFX smart bulbs.
These are the bulbs with a chip inside - 50% bulb, 50% chip. There are mobile
applications for easy configuration and remote control of the bulb. Nothing
special here, it simply works and is very convenient to have such bulbs in
dormitory.


Brilliant idea time



99% of ideas which come to our minds either were already implemented by someone
else or they are useless.



&#8212; Veaceslav Gaidarji



And as it always happens, the developer inside me generated an idea which, as
it always happens, was implemented...
</summary>
<content type='html'>
&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;This is a
&lt;a href=&quot;http://vgaidarji.me/blog/2017/01/02/jenkins-lifx-notifier-plugin/&quot;&gt;cross
post&lt;/a&gt; by &lt;a href=&quot;https://github.com/vgaidarji&quot;&gt;Veaceslav Gaidarji&lt;/a&gt;, open source
developer and contributor to the Jenkins and Bitrise projects.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some time ago I encountered a &lt;a href=&quot;https://www.lifx.com&quot;&gt;LIFX&lt;/a&gt; smart bulbs.
These are the bulbs with a chip inside - 50% bulb, 50% chip. There are mobile
applications for easy configuration and remote control of the bulb. Nothing
special here, it simply works and is very convenient to have such bulbs in
dormitory.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;brilliant-idea-time&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#brilliant-idea-time&quot; /&gt;Brilliant idea time&lt;/h3&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;99% of ideas which come to our minds either were already implemented by someone
else or they are useless.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Veaceslav Gaidarji
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And as it always happens, the developer inside me generated an idea which, as
it always happens, was implemented by someone else already.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The idea was: to connect a LIFX bulb to Jenkins server and update the color
according to a job’s state.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before starting to work on such Jenkins plugin, I searched for similar projects
on Google and the first links pointed me to existing
&lt;a href=&quot;https://plugins.jenkins.io/lifx-notifier&quot;&gt;LIFX notifier plugin&lt;/a&gt;
and a
&lt;a href=&quot;https://www.cloudbees.com/blog/lifx-smart-lightbulb-build-notifier-plugin&quot;&gt;blog post&lt;/a&gt;
from
&lt;a href=&quot;https://github.com/michaelneale&quot;&gt;Michael Neale&lt;/a&gt;
 who created the plugin. Michael’s post describes exactly what I had in mind.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this point I had 2 options:&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;forget&lt;/strong&gt; about building something new and just use the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;improve&lt;/strong&gt; existing plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First option is always easy and effortless, but second one is more challenging.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;improving-an-existing-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#improving-an-existing-plugin&quot; /&gt;Improving an existing plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The existing &lt;a href=&quot;https://plugins.jenkins.io/lifx-notifier&quot;&gt;LIFX notifier plugin&lt;/a&gt;
did its job really well and I was able to connect my bulb to Jenkins and test
it. But it wasn’t complete and had no configurable at all, therefore no
possibility to change the colors.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, I read Jenkins contribution guidelines, which
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hosting+Plugins#HostingPlugins-Requesthosting&quot;&gt;encourage&lt;/a&gt;
developers to improve existing plugins (if any) and not create other versions
of plugins with similar functionality. Then I contacted the plugin author, Michael Neale,
via email and kindly asked for the contributor access in GitHub
for the existing plugin version. After a short discussion about my plans on this
plugin, Michael added me as a contributor to GitHub
&lt;a href=&quot;https://github.com/jenkinsci/lifx-notifier-plugin&quot;&gt;repo&lt;/a&gt; and wished me
good luck. Thanks Michael!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I wanted to improve the LIFX notifier plugin to add the ability
customize the colors (&lt;code&gt;in progress&lt;/code&gt;, &lt;code&gt;build success&lt;/code&gt; and &lt;code&gt;build failure&lt;/code&gt;). This
is not a hard task actually.
A &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins&quot;&gt;1000+&lt;/a&gt; plugins were
developed for Jenkins by the hackers like me, which means that I should have no
problem to do it as well.
Fortunately for me, I have used some plugins already which had a UI similar to
that I had planned to add to the LIFX notifier, such as:&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;&lt;a href=&quot;https://github.com/jenkinsci/hockeyapp-plugin&quot;&gt;HockeyApp&lt;/a&gt; plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/fabric-beta-publisher-plugin&quot;&gt;Fabric Beta publisher&lt;/a&gt; plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Different &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins#Plugins-Buildnotifiers&quot;&gt;Build notifiers&lt;/a&gt; plugins&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Reviewing the code for these plugins, plus Jenkins
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+tutorial&quot;&gt;plugin
development documentation&lt;/a&gt;, and of course looking over
&lt;a href=&quot;https://commons.apache.org/proper/commons-jelly/&quot;&gt;Jelly components&lt;/a&gt; helped
me to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Better understand the Jenkins architecture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn how Jenkins plugins work in general.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn how to create the UI components for a plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn how to subscribe to Jenkins job state changes using appropriate
extension points.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a few weeks I’ve finished my plugin modifications and added unit tests for
its major parts.  As a result, the plugin now has a UI configuration section in
&lt;code&gt;Post-build Actions&lt;/code&gt; which is self descriptive:&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/2017-01-02/plugin-configuration.png&quot; alt=&quot;plugin configuration&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last step was to prepare new plugin version and publish it to the world!
The Jenkins
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hosting+Plugins&quot;&gt;&quot;Hosting
plugins&quot;&lt;/a&gt; document describes step by step process of how to publish a plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;This includes many steps which should be respected very carefully.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&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;demo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demo&quot; /&gt;Demo&lt;/h3&gt;
&lt;div class=&quot;videoblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/Zdtf8M5yCgM?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 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;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was my first experience in Jenkins plugins development. I should say that
&lt;strong&gt;steep learning curve is high enough&lt;/strong&gt;, and sometimes is really hard to find
answers on appearing questions. But in general it’s all about &lt;code&gt;Java&lt;/code&gt;, &lt;code&gt;XML&lt;/code&gt;,
&lt;code&gt;Maven&lt;/code&gt; and &lt;strong&gt;it’s a lot of fun&lt;/strong&gt; developing Jenkins plugins.&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/lifx-notifier&quot;&gt;LIFX notifier page&lt;/a&gt;
for more information about the latest releases!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Bonus&lt;/strong&gt;: &lt;a href=&quot;https://bitrise.io&quot;&gt;bitrise.io&lt;/a&gt; users, I’ve developed &lt;a href=&quot;https://github.com/vgaidarji/steps-lifx-notifier&quot;&gt;step LIFX notifier&lt;/a&gt; for bitrise as well.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/12/31/what-a-year/</id>
<title>Thank you for an amazing 2016</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-12-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/12/31/what-a-year/" />
<author>
<name>rtyler</name>
</author>
<category term='jam'></category>
<category term='jenkins2'></category>
<category term='pipeline'></category>
<category term='blueocean'></category>
<category term='azure'></category>
<category term='gsoc'></category>
<category term='new-year-blogpost'></category>
<summary>
I do not think it is an exaggeration to say: 2016 was the best year yet for the
Jenkins project. Since the first commit in 2006, the project has reached a
number of significant milestones in its ten years but we have never experienced
the breadth of major milestones in such a short amount of time. From
Jenkins 2
and
Blue Ocean
to the
Google Summer of Code
and
Jenkins World,


I wanted to take a moment and celebrate the myriad of accomplishments which
couldn&#8217;t have happened without the help from everybody who participates in the
Jenkins project. The 1,300+ contributors to the
jenkinsci GitHub organization,
the 4,000+ members of the
developers mailing list,
the 8,000+ members...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/jenkins-happy-new-year.png&quot; alt=&quot;Happy New Year from Jenkins&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I do not think it is an exaggeration to say: 2016 was the best year yet for the
Jenkins project. Since the first commit in 2006, the project has reached a
number of significant milestones in its ten years but we have never experienced
the breadth of major milestones in such a short amount of time. From
&lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;Jenkins 2&lt;/a&gt;
and
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;
to the
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc&quot;&gt;Google Summer of Code&lt;/a&gt;
and
&lt;a href=&quot;https://jenkinsworld.com&quot;&gt;Jenkins World&lt;/a&gt;,&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I wanted to take a moment and celebrate the myriad of accomplishments which
couldn’t have happened without the help from everybody who participates in the
Jenkins project. The &lt;strong&gt;1,300+&lt;/strong&gt; contributors to the
&lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;jenkinsci GitHub organization&lt;/a&gt;,
the &lt;strong&gt;4,000+&lt;/strong&gt; members of the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;developers mailing list&lt;/a&gt;,
the &lt;strong&gt;8,000+&lt;/strong&gt; members of the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-users&quot;&gt;users mailing list&lt;/a&gt;,
and countless others who have reported issues, submitted pull requests, and
presented at meetups and conferences.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-2&quot; /&gt;Jenkins 2&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Through the course of 2016, the Jenkins project published 16
&lt;a href=&quot;https://www.jenkins.io/changelog-stable&quot;&gt;LTS releases&lt;/a&gt;
and 54
&lt;a href=&quot;https://www.jenkins.io/changelog&quot;&gt;Weekly releases&lt;/a&gt;.
Of those 70 releases, the most notable may have been the
&lt;a href=&quot;https://www.jenkins.io/blog/2016/04/26/jenkins-20-is-here/&quot;&gt;Jenkins 2.0 release&lt;/a&gt;
which was published in April.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2 made Pipeline as Code front-and-center in the user experience,
introduced a new &quot;Getting Started&quot; experience, and included a number of other
small UI improvements, all while maintaining backwards compatibility with
existing Jenkins environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since April, we have released a number of LTS
releases using Jenkins 2 as a baseline, meaning the Jenkins project no longer
maintains &lt;em&gt;any&lt;/em&gt; 1.x release lines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The
&lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline&quot;&gt;Pipeline&lt;/a&gt;
efforts have continued to gain steam since April, covered on this blog with a
number of
&lt;a href=&quot;https://www.jenkins.io/blog/tags/pipeline/&quot;&gt;posts tagged &quot;pipeline&quot;&lt;/a&gt;. Closing out 2016 with the
announcement of the beta for
&lt;a href=&quot;https://www.jenkins.io/blog/2016/12/19/declarative-pipeline-beta/&quot;&gt;Declarative Pipeline syntax&lt;/a&gt;
which is expected in early 2017.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;blue-ocean&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#blue-ocean&quot; /&gt;Blue Ocean&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hot on the heels of Jenkins 2 announcement
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;&quot;Blue Ocean, a new user experience for Jenkins&quot;&lt;/a&gt;,
was
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/26/introducing-blue-ocean/&quot;&gt;open sourced in May&lt;/a&gt;.
Blue Ocean is a new project that rethinks the user experience of Jenkins.
Designed from the ground up for Jenkins Pipeline and compatible with Freestyle
jobs. The goal for the project is to reduce clutter and increase clarity for
every member of a team using Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Blue Ocean beta can be installed from the Update Center and can be run in
production Jenkins environments alongside the existing UI. It adds the new user experience under
&lt;a href=&quot;https://ci.jenkins.io/blue/&quot;&gt;/blue&lt;/a&gt; in the environment but does not disturb the existing UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is expected to reach &quot;1.0&quot; in the first half of 2017.&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/blueocean/pipeline-run.png&quot; alt=&quot;Blue Ocean&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;azure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#azure&quot; /&gt;Azure&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also in May of 2016, the Jenkins project announced an exciting
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/18/announcing-azure-partnership/&quot;&gt;Partnership with Microsoft&lt;/a&gt;
to run our project infrastructure on
&lt;a href=&quot;https://azure.com&quot;&gt;Azure&lt;/a&gt;. While the migration of Jenkins project
infrastructure into Azure is still on-going, there have been some notable
milestones reached already:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;End-to-end TLS encrypted delivery for Debian/openSUSE/Red Hat repositories which are
configured to use &lt;code&gt;&lt;a href=&quot;https://pkg.jenkins.io&quot; class=&quot;bare&quot;&gt;https://pkg.jenkins.io&lt;/a&gt;&lt;/code&gt; by the end-user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Major capacity improvements to
&lt;a href=&quot;https://ci.jenkins.io&quot;&gt;ci.jenkins.io&lt;/a&gt;
providing on-demand Ubuntu and Windows build/test infrastructure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A full continuous delivery Pipeline for all Azure-based infrastructure using
&lt;a href=&quot;https://twitter.com/agentdero/status/809467253548687360&quot;&gt;Terraform from Jenkins&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 migration to Azure is expected to complete in 2017.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;google-summer-of-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#google-summer-of-code&quot; /&gt;Google Summer of Code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the first time in the history of the project, Jenkins was accepted into
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc&quot;&gt;Google Summer of Code&lt;/a&gt;
2016. Google Summer of Code (GSoC) is an annual, international, program
which encourages college-aged students to participate with open source projects
during the summer break between classes. Students accepted into the program
receive a stipend, paid by Google, to work well-defined projects to improve or
enhance the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In exchange, numerous Jenkins community members volunteered as &quot;mentors&quot; for
students to help integrate them into the open source community and succeed in
completing their summer projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A lot was learned during the summer which we look forward to applying to Google
Summer of Code 2017&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-world&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-world&quot; /&gt;Jenkins World&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In September, over &lt;strong&gt;one thousand&lt;/strong&gt; people attended
&lt;a href=&quot;https://jenkinsworld.com&quot;&gt;Jenkins World&lt;/a&gt;,
in Santa Clara, California.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/NXjeHeIYRRI&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-jenkins-world-wrap/demo-crowd.jpg&quot; alt=&quot;Demo Crowd&quot; width=&quot;480&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following the event,
&lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam&lt;/a&gt;
posted a series of blog posts which highlight some of the fantastic content
shared by Jenkins users and contributors from around the world, such as:&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/2016/09/29/jenkins-world-2016-wrap-up-experts-demos/&quot;&gt;The demos from the &quot;Experts&quot;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/09/27/jenkins-world-2016-wrap-up-scaling/&quot;&gt;Sessions on Scaling Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/09/24/jenkins-world-2016-wrap-up-pipeline/&quot;&gt;Using Jenkins Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/09/30/jenkins-world-2016-wrap-up-complete/&quot;&gt;The Contributor Summit&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;Jenkins World was the first global event of its kind for Jenkins, it brought users
and contributors together to exchange ideas on the current state of the
project, celebrate accomplishments of the past year, and look ahead at all the
exiting enhancements coming down the pipe(line).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was such a smashing success that
&lt;a href=&quot;https://jenkinsworld.com&quot;&gt;Jenkins World 2017&lt;/a&gt;
is already scheduled for &lt;strong&gt;August 30-31st&lt;/strong&gt; in San Francisco, California.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jam&quot; /&gt;JAM&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, 2016 saw tremendous growth in the number of
&lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;Jenkins Area Meetups&lt;/a&gt;
(JAMs) hosted around the world. JAMs are local meetups intended to bring
Jenkins users and contributors together for socializing and learning. JAMs are
organized by local Jenkins community members who have a passion for sharing new
Jenkins concepts, patterns and tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Driven by current Jenkins Events Officer,
&lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;,
and the dozens of passionate organizers, JAMs have become a great way to meet
other Jenkins users near you.&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/2016-in-review/jam-worldwide-2016.png&quot; alt=&quot;Jenkins Around the World Meetups&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we don’t yet have JAMs on each of the seven continents, you can always join the
&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup&quot;&gt;Jenkins Online Meetup&lt;/a&gt;.
Though we’re hoping more groups will be founded near you in 2017!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am personally grateful for the variety and volume of contributions made by
thousands of people to the Jenkins project this year. I believe I can speak for
project founder,
&lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;,
in stating that the Jenkins community has grown beyond our anything we could
have imagined five years ago, let alone ten!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are number of ways to
&lt;a href=&quot;https://www.jenkins.io/participate/&quot;&gt;participate&lt;/a&gt;
in the Jenkins project, so if you didn’t have an opportunity to join in during
2016, we hope to see you next year!&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&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/2016/12/20/jenkins-puppet-enterprise-plugin/</id>
<title>Continuous Delivery with Jenkins and Puppet Enterprise</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-12-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/12/20/jenkins-puppet-enterprise-plugin/" />
<author>
<name>ccaum</name>
</author>
<category term='continuousdelivery'></category>
<category term='puppet'></category>
<category term='pipeline'></category>
<category term='puppetenterprise'></category>
<summary>
This is a guest post by Carl Caum,
who works at Puppet and created the
Puppet Enterprise Pipeline plugin.






During PuppetConf 2016, myself and Brian Dawson from CloudBees announced the
plugin:puppet-enterprise-pipeline[Puppet Enterprise
plugin for Jenkins Pipeline].
Let&#8217;s take a look at how the plugin makes it trivial to use Puppet to perform
some or all of the deployment tasks in continuous delivery pipelines.


Jenkins Pipeline introduced an amazing world where the definition for a
pipeline is managed from the same version control repository as the code
delivered by the pipeline. This is a powerful idea, and one I felt complemented
Puppet&#8217;s automation strengths. I wanted to make it trivial to control...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/ccaum&quot;&gt;Carl Caum&lt;/a&gt;,
who works at &lt;a href=&quot;https://puppet.com&quot;&gt;Puppet&lt;/a&gt; and created the
&lt;a href=&quot;https://plugins.jenkins.io/puppet-enterprise-pipeline&quot;&gt;Puppet Enterprise Pipeline plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During PuppetConf 2016, myself and Brian Dawson from CloudBees announced the
plugin:puppet-enterprise-pipeline[Puppet Enterprise
plugin for Jenkins Pipeline].
Let’s take a look at how the plugin makes it trivial to use Puppet to perform
some or all of the deployment tasks in continuous delivery pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Pipeline introduced an amazing world where the definition for a
pipeline is managed from the same version control repository as the code
delivered by the pipeline. This is a powerful idea, and one I felt complemented
Puppet’s automation strengths. I wanted to make it trivial to control Puppet
Enterprise’s orchestration and infrastructure code management capabilities, as
well as set hierarchical configuration data and use Puppet’s inventory data
system as a source of truth – all from a Pipeline script. The result was the
Puppet Enterprise plugin, which fully buys into the Pipeline ideals by
providing methods to control the different capabilities in Puppet Enterprise.
The methods provide ways to query
&lt;a href=&quot;https://docs.puppet.com/puppetdb/4.3/&quot;&gt;PuppetDB&lt;/a&gt;, set
&lt;a href=&quot;https://docs.puppet.com/hiera/3.2/&quot;&gt;Hiera&lt;/a&gt; key/value pairs, deploy
Puppet code environments with
&lt;a href=&quot;https://docs.puppet.com/pe/latest/code_mgr.html&quot;&gt;Code Management&lt;/a&gt;, and kick off orchestrated Puppet runs with the
&lt;a href=&quot;https://docs.puppet.com/pe/latest/app_orchestration_overview.html&quot;&gt;Orchestrator&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-puppet-enterprise-for-jenkins-pipeline-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-puppet-enterprise-for-jenkins-pipeline-plugin&quot; /&gt;The Puppet Enterprise for Jenkins Pipeline plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Puppet Enterprise for Jenkins Pipeline plugin itself has zero system
dependencies. You need only to install the plugin from the update center. The
plugin uses APIs available in Puppet Enterprise to do its work. Since the
PuppetDB query, Code Management, and Orchestrator APIs are all
backed by Puppet Enterprise’s role-based access control (RBAC) system, it’s
easy to restrict what pipelines are allowed to control in Puppet Enterprise. To
learn more about RBAC in Puppet Enterprise,
&lt;a href=&quot;https://docs.puppet.com/pe/latest/rbac_intro.html&quot;&gt;read the docs here.&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;configuring&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuring&quot; /&gt;Configuring&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Configuring the plugin is fairly straight forward. It takes three simple steps:&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;Set the address of the Puppet server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a Jenkins credential with a Pupppet Enterprise RBAC authentication token&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure the Hiera backend&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;set-the-puppet-enterprise-server-address&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#set-the-puppet-enterprise-server-address&quot; /&gt;Set the Puppet Enterprise Server Address&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Go to Jenkins &amp;gt; Manage Jenkins &amp;gt; Puppet Enterprise page. Put the DNS address of
the Puppet server in the &lt;strong&gt;Puppet Master Address&lt;/strong&gt; text field. Click the &lt;strong&gt;Test
Connection&lt;/strong&gt; button to verify the server is reachable, the Puppet CA certificate
is retrievable, and HTTPS connections are successful. Once the test succeeds,
Click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;create-a-jenkins-credentials-entry&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#create-a-jenkins-credentials-entry&quot; /&gt;Create a Jenkins Credentials Entry&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin uses the Jenkins built-in credentials system (the plain-credentials
plugin) to store and refer RBAC tokens to Puppet Enterprise for authentication
and authorization. First, generate an RBAC token in Puppet Enterprise by
following
&lt;a href=&quot;https://docs.puppet.com/pe/latest/rbac_token_auth.html#generating-a-token-for-use-by-a-service&quot;&gt;the
instructions on the docs site.&lt;/a&gt; Next, create a new Jenkins Credentials item
with Kind &lt;strong&gt;Secret text&lt;/strong&gt; and the &lt;strong&gt;Secret&lt;/strong&gt; value the Puppet Enterprise RBAC
token. It’s highly recommended to give the credential an ID value that’s
descriptive and identifiable. You’ll use it in your Pipeline scripts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In your Jenkinsfile, use the &lt;code&gt;puppet.credentials&lt;/code&gt; method to set all future Puppet
methods to use the RBAC token. 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;puppet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;credentials&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;pe-team-token&#39;&lt;/span&gt;&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;configure-the-hiera-backend&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-the-hiera-backend&quot; /&gt;Configure the Hiera Backend&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin exposes an HTTP API for performing Hiera data lookups for key/value
pairs managed by Pipeline jobs. To configure Hiera on the Puppet compile
master(s) to query the Jenkins Hiera data store backend, use the
&lt;a href=&quot;https://github.com/crayfishx/hiera-http&quot;&gt;hiera-http&lt;/a&gt; backend. On the
Puppet Enterprise compile master(s), run the following commands:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;/opt/puppetlabs/puppet/bin/gem install hiera-http
/opt/puppetlabs/bin/puppetserver gem install hiera-http&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now you can configure the /etc/puppetlabs/puppet/hiera.yaml file. The following
configuration instructs Hiera to first look to the Hiera yaml files in the
Puppet code’s environment, then fall back to the http backend. The http backend
will first query the Hiera data store API looking for the key in the scope with
the same name as the node. If nothing’s found, look for the key in the node’s
environments. You can use any Facter fact to match scope names.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;:backends:
  - yaml
  - http

:http:
  :host: jenkins.example.com
  :port: 8080
  :output: json
  :use_auth: true
  :auth_user: &amp;lt;user&amp;gt;
  :auth_pass: &amp;lt;pass&amp;gt;
  :cache_timeout: 10
  :failure: graceful
  :paths:
    - /hiera/lookup?path=%{clientcert}&amp;amp;key=%{key}
    - /hiera/lookup?path=%{environment}&amp;amp;key=%{key}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, restart the pe-puppetserver process to pick up the new configs:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;/opt/puppetlabs/bin/puppet resource service pe-puppetserver ensure=stopped
/opt/puppetlabs/bin/puppet resource service pe-puppetserver ensure=running&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;hiera-http-authentication&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hiera-http-authentication&quot; /&gt;Hiera HTTP Authentication&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If Jenkins&#39; Global Security is configured to allow unauthenticated read-only
access, the &#39;use_auth&#39;, &#39;auth_pass&#39;, and &#39;auth_user&#39; parameters are
unnecessary. Otherwise, create a local Jenkins user that has permissions to
view the Hiera Data Lookup page and use that user’s credentials for the
hiera.yaml configuration.&lt;/p&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;querying-the-infrastructure&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#querying-the-infrastructure&quot; /&gt;Querying the infrastructure&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;PuppetDB is an extensive data store that holds every bit of information Puppet
generates and collects across every system Puppet is installed on. PuppetDB
provides a sweet query language called
&lt;a href=&quot;https://docs.puppet.com/puppetdb/4.3/api/query/v4/pql.html&quot;&gt;PQL.&lt;/a&gt; With PQL,
you can ask complex questions of your infrastructure such as &quot;How many
production Red Hat systems are there with the openssl package installed?&quot; or
&quot;What us-west-2c nodes with the MyApp role that were created in the last 24
hours?&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This can be a powerful tool for parts of your pipeline where you need to
perform specific operations on subsets of the infrastructure like draining a
loadbalancer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s an example using the &lt;code&gt;puppet.query&lt;/code&gt; method:&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;results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;puppet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;
  inventory[certname] {
    facts.os.name = &quot;RedHat&quot; and
    facts.ec2_metadata.placement.availability-zone = &quot;us-west-2c&quot; and
    facts.uptime_hours &amp;lt; 24
  }&#39;&#39;&#39;&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 query returns an array of matching items. The results can be
iterated on, and even passed to a series of &lt;code&gt;puppet.job&lt;/code&gt; calls. For example, the
following code will query all nodes in production that experienced a failure on
the last Puppet run.&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;results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;puppet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;nodes { latest_report_status = &quot;failed&quot; and catalog_environment = &quot;production&quot;}&#39;&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;Note that once you can use closures in Pipeline scripts, doing the above
example will be much simpler.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;creating-an-orchestrator-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-an-orchestrator-job&quot; /&gt;Creating an orchestrator job&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The orchestration service in Puppet Enterprise is a tool to perform
orchestrated Puppet runs across as broad or as targeted an infrastructure as
you need at different parts of a pipeline. You can use the orchestrator to
update applications in an environment, or update a specific list of nodes, or
update nodes across a set of nodes that match certain criteria. In each
scenario, Puppet will always push distributed changes in the correct order by
respecting the cross-node dependencies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To create a job in the Puppet orchestrator from a Jenkins pipeline, use the
&lt;code&gt;puppet.job&lt;/code&gt; method. The &lt;code&gt;puppet.job&lt;/code&gt; method will create a new orchestrator job,
monitor the job for completion, and determine if any Puppet runs failed. If
there were failures, the pipeline will fail.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following are just some examples of how to run Puppet orchestration jobs against the infrastructure you need to target.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Target an entire environment:&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;puppet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;job&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;production&#39;&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;Target instances of an application in production:&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;puppet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;job&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;production&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;application:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Myapp&#39;&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;Target a specific list of nodes:&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;puppet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;job&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;production&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;nodes:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;db.example.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;appserver01.example.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;appserver02.example.com&#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;Target nodes matching a complex set if criteria:&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;puppet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;job&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;production&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;query:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;inventory[certname] { facts.os.name = &quot;RedHat&quot; and facts.ec2_metadata.placement.availability-zone = &quot;us-west-2c&quot; and uptime_hours &amp;lt; 24 }&#39;&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 you can see, the &lt;code&gt;puppet.job&lt;/code&gt; command means you can be as broad or as targeted
as you need to be for different parts of your pipeline. There are many other
options you can add to the &lt;code&gt;puppet.job&lt;/code&gt; method call, such as setting the Puppet
runs to noop, or giving the orchestrator a maximum concurrency limit.
&lt;a href=&quot;https://puppet.com/product/capabilities/application-orchestration&quot;&gt;Learn
more about the orchestrator here.&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;updating-puppet-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#updating-puppet-code&quot; /&gt;Updating Puppet code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re using Code Management in Puppet Enterprise (and you should), you can
ensure that all the modules, site manifests, Hiera data, and roles and profiles
are staged, synced, and ready across all your Puppet masters, direct from your
Jenkins pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To update Puppet code across all Puppet masters, use the &lt;code&gt;puppet.codeDeploy&lt;/code&gt; method:&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;puppet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;codeDeploy&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;staging&#39;&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;a href=&quot;https://puppet.com/product/capabilities/code-management&quot;&gt;Learn more Code Management in Puppet Enterprise here.&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;setting-hiera-values&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setting-hiera-values&quot; /&gt;Setting Hiera values&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin includes an experimental feature to set Hiera key/value pairs. There
are many cases where you need to promote information through a pipeline, such
as a build version or artifact location. Doing so is very difficult in Puppet,
since data promotion almost always involves changing Hiera files and committing
to version control.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin exposes an HTTP API endpoint that Hiera can query using the
hiera-http backend. With the backend configured on the Puppet master(s),
key/value pairs can be set to scopes. A scope is arbitrary and can be anything
you like, such as a Puppet environment, a node’s certname, or the name of a
Facter fact like operatingsystem or domain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To set a Hiera value from a pipeline, use the &lt;code&gt;puppet.hiera&lt;/code&gt; method.&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;puppet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;hiera&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;scope:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;staging&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;key:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;build-version&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;value:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;BUILD_ID&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;Now you can set the same key with the same value to the production scope later
in the pipeline, followed by a call to &lt;code&gt;puppet.job&lt;/code&gt; to push the change out.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;examples&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#examples&quot; /&gt;Examples&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/jenkinsci/puppet-enterprise-pipeline-plugin/tree/master/examples&quot;&gt;plugin’s
Github repository&lt;/a&gt; contains a set of example Pipeline scripts. Feel free to
issue pull requests to add your own scripts!&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 pretty excited to see how this is going to help simplify continuous
delivery pipelines. I encourage everyone to get started with continuous
delivery today, even if it’s just a simple pipeline. As your practices evolve,
you can begin to add automated tests, automate away manual checkpoints, start
to incorporate InfoSec tests, and include phases for practices like patch
management that require lots of manual approvals, verifications and rollouts.
You’ll be glad you did.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/12/19/declarative-pipeline-beta/</id>
<title>Announcing the beta of Declarative Pipeline Syntax</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-12-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/12/19/declarative-pipeline-beta/" />
<author>
<name>hrmpw</name>
</author>
<category term='pipeline'></category>
<category term='blueocean'></category>
<summary>
Last week we released version 0.7.1 of the
Pipeline-Model-Definition
plugin and wanted to crown it as the official Beta version of the Declarative
Pipeline syntax. Although it has been available in the update center
since August,
we continue to solidify the syntax. We feel this release is getting
very close to the final version and should not change much before 1.0. However,
it is still a Beta so further tweaks are possible.









A release (0.8.0) is planned for early January 2017 which will finalize the
syntax with the following changes:
JENKINS-40524,
JENKINS-40370,
JENKINS-40462,
JENKINS-40337






What is Declarative Pipeline?


All the way back at Jenkins World in September, Andrew Bayer presented a
sneak peak
of a new syntax...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week we released version 0.7.1 of the
&lt;a href=&quot;https://plugins.jenkins.io/pipeline-model-definition&quot;&gt;&lt;em&gt;Pipeline-Model-Definition&lt;/em&gt;&lt;/a&gt;
plugin and wanted to crown it as the official Beta version of the Declarative
Pipeline syntax. Although it has been available in the update center
&lt;a href=&quot;https://www.jenkins.io/blog/2016/09/19/blueocean-beta-declarative-pipeline-pipeline-editor/&quot;&gt;since August&lt;/a&gt;,
we continue to solidify the syntax. We feel this release is getting
very close to the final version and should not change much before 1.0. However,
it is still a Beta so further tweaks are possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A release (0.8.0) is planned for early January 2017 which will finalize the
syntax with the following changes:
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40524&quot;&gt;JENKINS-40524&lt;/a&gt;,
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40370&quot;&gt;JENKINS-40370&lt;/a&gt;,
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40462&quot;&gt;JENKINS-40462&lt;/a&gt;,
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40337&quot;&gt;JENKINS-40337&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-declarative-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-declarative-pipeline&quot; /&gt;What is Declarative Pipeline?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All the way back at Jenkins World in September, Andrew Bayer presented a
&lt;a href=&quot;https://www.cloudbees.com/introducing-new-way-define-jenkins-pipelines&quot;&gt;sneak peak&lt;/a&gt;
of a new syntax for constructing Pipelines. We are calling this new syntax
Declarative Pipeline to differentiate it from the existing Scripted Pipeline
syntax that has always been a part of Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After listening to many Jenkins users over the last year we felt that, while
Pipeline Script provides tremendous power, flexibility, and extensibility, the
learning curve for Scripted Pipeline was steep for users new to either Jenkins
or Pipeline. Beginning users wanting to take advantage of all the features
provided by Pipeline and Jenkinsfiles were required to learn Scripted Pipeline
or remain limited to the functionality provided by Freestyle jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Declarative Pipeline does not replace Scripted Pipeline but extends Pipeline it
with a pre-defined structure to let users focus entirely on the &lt;code&gt;steps&lt;/code&gt;
required at each &lt;code&gt;stage&lt;/code&gt; without needing to worry about scripting every aspect
of the pipeline. Granular flow-control is extremely powerful and Scripted
Pipeline syntax will always be part of Pipeline but it’s not for everyone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Declarative Pipeline enables all users to connect simple, declarative blocks
that define agents (including Docker), post actions, environment
settings, credentials and all stages that make up the pipeline. Best of all,
because this Declarative syntax is part of Pipeline, all build steps and build
wrappers available in Plugins or loaded from Shared Libraries are also
available as &lt;code&gt;steps&lt;/code&gt; in Declarative.&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;Below is an example of a pipeline in Declarative syntax. You can also switch the view to show the same pipeline in Scripted syntax.
 The Declarative syntax has a more straightforward structure that is easier to grok by users not versed in Groovy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
  agent  &lt;span style=&quot;color:#606&quot;&gt;label&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;has-docker&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;dockerfile&lt;/span&gt;: &lt;span style=&quot;color:#069&quot;&gt;true&lt;/span&gt;
  environment {
    GIT_COMMITTER_NAME = &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;jenkins&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    GIT_COMMITTER_EMAIL = &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;jenkins@jenkins.io&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
  }
  stages {
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;) {
      steps {
        sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;mvn clean install -Dmaven.test.failure.ignore=true&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }
    }
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Archive&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;){
      steps {
        archive &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;*/target/**/*&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
        junit &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;*/target/surefire-reports/*.xml&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      }
    }
  }
  post {
    always {
      deleteDir()
    }
    success {
      mail &lt;span style=&quot;color:#606&quot;&gt;to&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;me@example.com&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;subject&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;SUCCESS: &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;currentBuild.fullDisplayName&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;body&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Yay, we passed.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    }
    failure {
      mail &lt;span style=&quot;color:#606&quot;&gt;to&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;me@example.com&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;subject&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;FAILURE: &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;currentBuild.fullDisplayName&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;body&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Boo, we failed.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;withEnv([&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GIT_COMMITTER_NAME = jenkins&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;,&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;GIT_COMMITTER_EMAIL = jenkins@jenkins.io&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;]) {
  node(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;has-docker&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;try&lt;/span&gt; {
      checkout scm &lt;span style=&quot;color:#777&quot;&gt;// checks out Dockerfile and source code&lt;/span&gt;
      &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;def&lt;/span&gt; myImage = docker.build &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;my-environment:snapshot&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      myImage.inside {
        stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
          sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;mvn clean install -Dmaven.test.failure.ignore=true&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
        }
        stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Archive&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
          archive &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;*/target/**/*&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
          junit &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;*/target/surefire-reports/*.xml&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
        }
      }
      &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; (currentBuild.result == &lt;span style=&quot;color:#069&quot;&gt;null&lt;/span&gt; || currentBuild.result == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;SUCCESS&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
        mail &lt;span style=&quot;color:#606&quot;&gt;to&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;me@example.com&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;subject&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;SUCCESS: &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;currentBuild.fullDisplayName&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;body&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Yay, we passed.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
      }
    }
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;catch&lt;/span&gt; (exc) {
      mail &lt;span style=&quot;color:#606&quot;&gt;to&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;me@example.com&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;subject&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;FAILURE: &lt;/span&gt;&lt;span style=&quot;background-color:hsla(0,0%,0%,0.07);color:black&quot;&gt;&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;${&lt;/span&gt;currentBuild.fullDisplayName&lt;span style=&quot;font-weight:bold;color:#666&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;color:#606&quot;&gt;body&lt;/span&gt;: &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;Boo, we failed.&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
    }
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;finally&lt;/span&gt; {
      deleteDir()
    }
  }
}&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;how-can-you-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-you-help&quot; /&gt;How can you help?&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;Install the latest version of the
&lt;a href=&quot;https://plugins.jenkins.io/pipeline-model-definition&quot;&gt;&lt;em&gt;Pipeline-Model-Definition&lt;/em&gt;&lt;/a&gt; plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read the documentation:
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/getting%20started&quot;&gt;Getting Started&lt;/a&gt; and
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/SYNTAX.md&quot;&gt;Syntax overview&lt;/a&gt;.
(These documents will be incorporated into the Jenkins.io documentation.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Convert some of your existing Pipeline scripts into Declarative&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Log any issues or enhancements you have
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/40493&quot;&gt;here&lt;/a&gt;
for the syntax, the execution, or the documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ask questions. You can send questions to the
&lt;a href=&quot;mailto:jenkinsci-users@googlegroups.com&quot;&gt;users mailing list&lt;/a&gt;
or visit the &lt;code&gt;#jenkins&lt;/code&gt; channel on IRC.&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;how-will-this-work-with-blue-ocean&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-will-this-work-with-blue-ocean&quot; /&gt;How will this work with Blue Ocean?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is all about Pipelines in Jenkins. Running, displaying, and soon,
creating Pipelines.  Blue Ocean will be able to run and display Pipelines
written in this new syntax just like any other Pipeline works today. However,
because Declarative Pipeline includes a pre-defined structure, or model, it is
now possible to create and edit pipelines with a GUI editor.&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/blueocean/pipeline-editor.png&quot; alt=&quot;Pipeline Editor&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although we plan to launch 1.0 of Declarative Pipeline before Blue Ocean 1.0 is
officially available, we expect to have a working Beta of the Editor available
to play with. The combination of a simple syntax and an intuitive editor
should make creating Jenkins Pipelines a breeze.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;happy-holidays&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#happy-holidays&quot; /&gt;Happy Holidays&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope everyone has a great end of the year and a Happy New Year. With
Declarative Pipeline and
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;
we expect great things for Jenkins in 2017!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/12/10/monthly-jam-recap-november/</id>
<title>Monthly JAM Recap - November 2016</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-12-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/12/10/monthly-jam-recap-november/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jam'></category>
<category term='meetup'></category>
<summary>
As we near the end of the year, the number of November JAMs show that the
Jenkins community isn&#8217;t slowing down for holiday season. We had a number of
excellent events hosted around the world this November with plenty of great
stories and presentations shared by the various members of the world-wide
Jenkins community.


Melbourne, Australia JAM

Melbourne JAM leaders,
Raisa
and
Bhuva
hosted Blue Ocean for the inaugural meeting. Attendees learned the values of
Blue Ocean, a project that rethinks the user experience of Jenkins, modeling
and presenting the process of software delivery by surfacing information that
is important to development teams with as few clicks as possible, while still
staying true to...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we near the end of the year, the number of November JAMs show that the
Jenkins community isn’t slowing down for holiday season. We had a number of
excellent events hosted &lt;em&gt;around the world&lt;/em&gt; this November with plenty of great
stories and presentations shared by the various members of the world-wide
Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;melbourne-australia-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#melbourne-australia-jam&quot; /&gt;Melbourne, Australia JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Melbourne JAM leaders,
&lt;a href=&quot;https://www.meetup.com/Melbourne-Jenkins-Area-Meetup/members/192742554/&quot;&gt;Raisa&lt;/a&gt;
and
&lt;a href=&quot;https://www.meetup.com/Melbourne-Jenkins-Area-Meetup/members/77780422/&quot;&gt;Bhuva&lt;/a&gt;
hosted Blue Ocean for the inaugural meeting. Attendees learned the values of
Blue Ocean, a project that rethinks the user experience of Jenkins, modeling
and presenting the process of software delivery by surfacing information that
is important to development teams with as few clicks as possible, while still
staying true to the extensibility that Jenkins always has had as a core value.
Thank you &lt;a href=&quot;https://github.com/i386&quot;&gt;James Dumay&lt;/a&gt; for stopping by to take part in
the inauguration.&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/monthly-jam-nov-2016/melbourne.png&quot; alt=&quot;Melbourne JAM&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;singapore-singapore-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#singapore-singapore-jam&quot; /&gt;Singapore, Singapore JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the members  who had several years of experience using Jenkins (since
Hudson days in fact) to present some basics on Continuous Integration with
GitHub. It was targeted at new members who are starting out with Jenkins. We
understand that we cannot always serve advanced topics to cater to the
experienced users and neglect the newbies so this session was targeted to help
give new users an introduction to Jenkins. It went well with about 15-20
attendees and we hope to run some hands-on workshops in 2017. Some members were
looking forward to freebies like stickers and T-shirts too!&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/monthly-jam-nov-2016/singapore-prep.png&quot; alt=&quot;Singapore JAM prep&quot;&gt;
&lt;/img&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/monthly-jam-nov-2016/singapore-jam.png&quot; alt=&quot;Singapore JAM&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;moscow-russia-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#moscow-russia-jam&quot; /&gt;Moscow, Russia JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Moscow JAM leaders,
&lt;a href=&quot;https://twitter.com/tolkv&quot;&gt;Kirill Tolkachev&lt;/a&gt;
and
&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;
led the inaugural meeting with
a packed full agenda. Oleg began the meeting with an update on Jenkins 2 what improvements users can expect and what
enhancements are in the works within the Jenkins project. Following Oleg, Kirill shared
how his team in Alfa Laboratory used Jenkins to improve CD/DevOps in their
projects (with Jenkins Pipeline, Job DSL and
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;
), the problems they experienced and how they fixed them. Then Oleg talked
about Jenkins Pipeline internals, main features and recent changes in the
ecosystem. It was followed up by a discussion of large-scale Jenkins instances
at the after-party.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The recording of the event can be found
&lt;a href=&quot;https://www.youtube.com/playlist?list=PLTur3n9C14XFbfD2gT3CRcwBwobKOvRHJ&quot;&gt;on YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;milan-italy-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#milan-italy-jam&quot; /&gt;Milan, Italy JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first meetup was a great opportunity to meet local Jenkins fans to learn
and share Jenkins experiences at a local cafe.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;san-francisco-california-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#san-francisco-california-jam&quot; /&gt;San Francisco, California JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt;
performed a 30 minutes live Pipeline coding demo to a relatively novice
audience (though all had used Jenkins). A good amount of questions from the
audience  which conveyed an appetite for the content being presented.
&lt;a href=&quot;https://twitter.com/RyanWallner&quot;&gt;Ryan Wallner&lt;/a&gt;,
presenter from ClusterHQ, also gave a demo based around Pipeline talking about
ClusterHQ’s &quot;Fli&quot; integration with a delivery pipeline.&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/monthly-jam-nov-2016/IMG_0999.JPG&quot; alt=&quot;ClusterHQ &amp;amp; Jenkins stickers&quot;&gt;
&lt;/img&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/monthly-jam-nov-2016/IMG_1004.JPG&quot; alt=&quot;Tyler presenting&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;washington-dc-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#washington-dc-jam&quot; /&gt;Washington, DC JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There was a fantastic 90% showup rate at this month’s meetup - 58 RSVPs and 52
in attendance was pretty impressive. All this may be due to Fannie Mae’s story
- the success of how they used Jenkins for CI/CD as part of their DevOps
adoption. Afterwards, there was a lot of interests and further discussions
taking place. Next month’s host will be Freddie Mac.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;seattle-washington-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#seattle-washington-jam&quot; /&gt;Seattle, Washington JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Long time Jenkins community member and Seattle JAM leader,
&lt;a href=&quot;https://github.com/khaido&quot;&gt;Khai Do&lt;/a&gt; showed how OpenStack uses &quot;Jenkins Job
Builder&quot; to manage and run thousands of Jenkins jobs per day in their
multi-controller CI/CD system.  He also compared
&lt;a href=&quot;https://docs.openstack.org/infra/jenkins-job-builder/&quot;&gt;Jenkins Job Builder&lt;/a&gt;
with other Jenkins &quot;Infrastructure-as-code&quot; technologies - Jenkins Pipeline and
Jenkins JobDSL. It was followed by an in-depth Q&amp;amp;A and discussion session.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dallasforth-worth-texas-dfw-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dallasforth-worth-texas-dfw-jam&quot; /&gt;Dallas/Forth Worth, Texas (DFW) JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The November DFW JAM was the most strongly attended of the year! DFW JAM leader,
&lt;a href=&quot;https://github.com/ericsmalling&quot;&gt;Eric Smalling&lt;/a&gt; discussed the benefits of
dynamic build agents and demonstrated various ways to implement them such as
the EC2 and Docker plugins. There was a lot of interest and discussion,
especially around Docker and the ability it provides to have ephemeral agents
with very little provisioning time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The recording can be downloaded from
&lt;a href=&quot;https://drive.google.com/file/d/0BzW9GvvtcA5naDRNeXVDOTY0X28/view&quot;&gt;Gooel Drive&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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/projects/jam&quot;&gt;Start a JAM&lt;/a&gt; in your city if there isn’t one already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;JAM member&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become an &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;online JAM member&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be a JAM speaker or sponsor. Let us know &lt;a href=&quot;mailto:jenkinsci-jam@googlegroups.com&quot;&gt;jenkinsci-jam@googlegroups.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beginners+Guide+to+Contributing&quot;&gt;Jenkins project contributor&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/12/09/december-jenkins-events/</id>
<title>Upcoming December Jenkins Events</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-12-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/12/09/december-jenkins-events/" />
<author>
<name>alyssat</name>
</author>
<category term='events'></category>
<category term='jam'></category>
<summary>
Happy Holidays! A special shout out to all JAM leaders who continue to keep
local activities going in December.


Online JAM



December 14 | Live Demos: Pipeline, Git, and Blue Ocean





North America



December 7 | Seattle JAM: Jenkins at Microsoft


December 14 | Los Angeles JAM: Jenkins Days


December 14 | Guadalajara JAM: Jenkins &amp; Docker





Australia



December 14 | Melbourne JAM: Meeting at AWS Office





Links



Start a JAM in your city if there isn&#8217;t one already.


Become a JAM member


Become an online JAM member


Speak or sponsor at a JAM. Contact us at jenkinsci-jam@googlegroups.com


Become a Jenkins project contributor...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Happy Holidays! A special shout out to all JAM leaders who continue to keep
local activities going in December.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;online-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#online-jam&quot; /&gt;Online JAM&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;December 14 | &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/235898656/&quot;&gt;Live Demos: Pipeline, Git, and Blue Ocean&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;north-america&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#north-america&quot; /&gt;North America&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;December 7 | Seattle JAM: &lt;a href=&quot;https://www.meetup.com/Seattle-Jenkins-Area-Meetup/events/235189240/&quot;&gt;Jenkins at Microsoft&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;December 14 | Los Angeles JAM: &lt;a href=&quot;https://www.meetup.com/Los-Angeles-Jenkins-Area-Meetup/events/235925065/&quot;&gt;Jenkins Days&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;December 14 | Guadalajara JAM: &lt;a href=&quot;https://www.meetup.com/Guadalajara-Jenkins-Area-Meetup/events/234929920/&quot;&gt;Jenkins &amp;amp; Docker&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;australia&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#australia&quot; /&gt;Australia&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;December 14 | Melbourne JAM: &lt;a href=&quot;https://www.meetup.com/Melbourne-Jenkins-Area-Meetup/events/235872607/&quot;&gt;Meeting at AWS Office&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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/projects/jam&quot;&gt;Start a JAM&lt;/a&gt; in your city if there isn’t one already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://www.meetup.com/pro/jenkins/&quot;&gt;JAM member&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become an &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;online JAM member&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speak or sponsor at a JAM. Contact us at &lt;a href=&quot;mailto:jenkinsci-jam@googlegroups.com&quot;&gt;jenkinsci-jam@googlegroups.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beginners+Guide+to+Contributing&quot;&gt;Jenkins project contributor&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/11/22/what-jvm-versions-are-running-jenkins-the-return/</id>
<title>What JVM versions are running Jenkins? 2016 Update!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-11-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/11/22/what-jvm-versions-are-running-jenkins-the-return/" />
<author>
<name>batmat</name>
</author>
<category term='statistics'></category>
<summary>
Like for last year&#8217;s article about the same subject, yet another recent discussion about finally requiring Java 8 to run future versions Jenkins pushed me to gather some more factual data around it.








What follows contains some opinions or statements which may not be seen as purely factual or neutral. Note that this represents by no mean the general position of the Jenkins governance board. This is solely my opinion as a contributor based on the data I gathered, and what I feel from the feedback of the community at large.





Java 8 now the most used version, and growing


If we look...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Like for &lt;a href=&quot;https://www.jenkins.io/blog/2015/11/03/what-jvm-versions-are-running-jenkins/&quot;&gt;last year’s article about the same subject&lt;/a&gt;, yet another &lt;a href=&quot;https://groups.google.com/forum/?utm_medium=email&amp;amp;utm_source=footer#!msg/jenkinsci-dev/fo5nKLhZK5U/Zb9jHpBJBQAJ&quot;&gt;recent discussion about finally requiring Java 8 to run future versions Jenkins&lt;/a&gt; pushed me to gather some more factual data around it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
What follows contains some opinions or statements which may not be seen as purely factual or neutral. Note that this represents by no mean the general position of the Jenkins governance board. This is solely my opinion as a contributor based on the data I gathered, and what I feel from the feedback of the community at large.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;java-8-now-the-most-used-version-and-growing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#java-8-now-the-most-used-version-and-growing&quot; /&gt;Java 8 now the most used version, and growing&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If we look at the global numbers, Java 8 runtimes now represent 52.8% of the Jenkins instances running, which have not opted out of anonymous usage statistics.&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/2016-jvm-versions/2016-jvm-stats-all.png&quot; alt=&quot;2016 jvm stats all&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And if you look at the trend, Java 8 is clearly growing fast.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;zooming-into-the-jenkins-2-x-instances-subset&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#zooming-into-the-jenkins-2-x-instances-subset&quot; /&gt;Zooming into the Jenkins 2.x instances subset&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, if you look at that picture, though already interesting and showing a clear trend towards Java 8 runtime adoption, some might argue it’s being too nice to older JREs.
The reasoning could be: instances running (very) old Jenkins versions may not be the ones you want to look at when trying to plan the future of an opensource project:
those are indeed probably not going to upgrade in general anyway, or when they do, upgrading the JRE would be a small thing compared to the rest to be tested with such a gap.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, if we only keep the instances running Jenkins 2.x, then the proportion of Java 8 goes to almost 70% compared to Java 7 (Jenkins 2.x requires Java 7)
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;:&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/2016-jvm-versions/2016-jvm-stats-only-2.x.png&quot; alt=&quot;2016 jvm stats only 2.x&quot; /&gt;&lt;/span&gt;
&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;Java 8 adoption numbers are getting bigger, while every other JREs are going down.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are still using a JRE 7 to run Jenkins, it is seriously time to think
about upgrading to 8.  Knowing that it’s definitely not a bleeding-edge path
might help you go that way, especially if you generally do not like upgrades.
Also, as a reminder, the most used JDK,
&lt;a href=&quot;https://java.com/en/download/faq/java_7.xml&quot;&gt;Oracle JDK 7 now got end-of-lifed more than 18 months ago&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contrary to the past attempts the previous years, the discussion on the Jenkins
development mailing list did not trigger strong rebutals by many people.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Perhaps it’s finally time for Mr. Jenkins to upgrade to Java 8!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
All numbers shown below are derived from the new &lt;a href=&quot;https://stats.jenkins.io/plugin-installation-trend/jvms.json&quot;&gt;&lt;code&gt;jvms.json&lt;/code&gt;&lt;/a&gt; file now generated automatically every month, after the two related pull-requests  &lt;a href=&quot;https://github.com/jenkins-infra/infra-statistics/pull/21&quot;&gt;1&lt;/a&gt; and &lt;a href=&quot;https://github.com/jenkins-infra/infra-statistics/pull/22&quot;&gt;2&lt;/a&gt; got merged.
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_2&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_2&quot; title=&quot;View footnote.&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. 69% for October, 67% in September
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_2&quot;&gt;
&lt;a href=&quot;#_footnoteref_2&quot;&gt;2&lt;/a&gt;. You are more than welcome to review those Pull-Requests and shout if you see something wrong in the calculations.
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/11/21/gc-tuning/</id>
<title>Tuning Jenkins GC For Responsiveness and Stability with Large Instances</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-11-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/11/21/gc-tuning/" />
<author>
<name>svanoort</name>
</author>
<category term='performance'></category>
<category term='scalability'></category>
<category term='administration'></category>
<summary>
This is a
cross
post by Sam Van Oort, Software Engineer at
CloudBees and contributor to the Jenkins project.






Today I&#8217;m going to show you how easy it is to tune Jenkins Java settings to
make your controllers more responsive and stable, especially with large heap sizes.


The Magic Settings:



Basics: -server -XX:+AlwaysPreTouch


GC Logging: -Xloggc:$JENKINS_HOME/gc-%t.log -XX:NumberOfGCLogFiles=5 -XX:+UseGCLogFileRotation -XX:GCLogFileSize=20m -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCCause -XX:+PrintTenuringDistribution -XX:+PrintReferenceGC -XX:+PrintAdaptiveSizePolicy


G1 GC settings: -XX:+UseG1GC -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=20 -XX:+UnlockDiagnosticVMOptions -XX:G1SummarizeRSetStatsPeriod=1


Heap settings: set your minimum heap size (-Xms) to at least 1/2 of your maximum size (-Xmx).




Now, let&#8217;s look at where those came from!  We&#8217;re going to focus on garbage
collection (GC)...
</summary>
<content type='html'>
&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;This is a
&lt;a href=&quot;https://www.cloudbees.com/blog/joining-big-leagues-tuning-jenkins-gc-responsiveness-and-stability&quot;&gt;cross
post&lt;/a&gt; by &lt;a href=&quot;https://github.com/svanoort&quot;&gt;Sam Van Oort&lt;/a&gt;, Software Engineer at
&lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; and contributor to the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today I’m going to show you how easy it is to tune Jenkins Java settings to
make your controllers more responsive and stable, especially with large heap sizes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-magic-settings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-magic-settings&quot; /&gt;The Magic Settings:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Basics:&lt;/strong&gt; &lt;code&gt;-server -XX:+AlwaysPreTouch&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GC Logging:&lt;/strong&gt; &lt;code&gt;-Xloggc:$JENKINS_HOME/gc-%t.log -XX:NumberOfGCLogFiles=5 -XX:+UseGCLogFileRotation -XX:GCLogFileSize=20m -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCCause -XX:+PrintTenuringDistribution -XX:+PrintReferenceGC -XX:+PrintAdaptiveSizePolicy&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;G1 GC settings:&lt;/strong&gt; &lt;code&gt;-XX:+UseG1GC -XX:+ExplicitGCInvokesConcurrent -XX:+ParallelRefProcEnabled -XX:+UseStringDeduplication -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=20 -XX:+UnlockDiagnosticVMOptions -XX:G1SummarizeRSetStatsPeriod=1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Heap settings:&lt;/strong&gt; set your minimum heap size (&lt;code&gt;-Xms&lt;/code&gt;) to at least 1/2 of your maximum size (&lt;code&gt;-Xmx&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;Now, let’s look at where those came from!  We’re going to focus on garbage
collection (GC) here and dig fast and deep to strike for gold; if you’re not
familiar with GC fundamentals
&lt;a href=&quot;https://blog.takipi.com/garbage-collectors-serial-vs-parallel-vs-cms-vs-the-g1-and-whats-new-in-java-8/&quot;&gt;take a look at this source&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because performance tuning is data driven, I’m going to use real-world data
selected three very large Jenkins instances that I help support.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;What we’re not going to do:&lt;/strong&gt; Jenkins basics, or play with max heap.  See the
section &quot;what should I do before tuning.&quot;  This is for cases where we really
&lt;strong&gt;do&lt;/strong&gt; need a big heap and can’t easily split our Jenkins controllers into smaller
ones.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-problem-hangups&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-problem-hangups&quot; /&gt;The Problem: Hangups&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Symptom: Users report that the Jenkins instance periodically hangs, taking
several seconds to handle normally fast requests.  We may even see lockups or
timeouts from systems communicating with the Jenkins controller (build agents,
etc).  In long periods of heavy load, users may report Jenkins running slowly.
Application monitoring shows that during lockups all or most of the CPU cores
are fully loaded, but there’s not enough activity to justify it.  Process and
JStack dumps will reveal that the most active Java threads are doing garbage
collection.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Instance A, they had this problem.  Their Jenkins Java arguments are very
close to the default, aside from sizing the heap:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;24 GB max heap, 4 GB initial, default GC settings (ParallelGC)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A few flags set (some coming in as defaults): &lt;code&gt;-XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:+ReduceSignalUsage -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation&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;After enabling garbage collection (GC) logging we see the following rough stats:&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/gc-tuning/s-bulkstats-company-a-red-parallelgc.png&quot; alt=&quot;HeapStats Instance A System Red CPU use-parallelGC&quot; /&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Diving deeper, we get this chart of GC pause durations:&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/gc-tuning/s-duration-company-a-red-parallelgc.png&quot; alt=&quot;Instance A Jenkins Red GC duration use-parallelGC&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Key stats:&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;Throughput: 99.64%  (percent of time spent executing application code, not doing garbage collection)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Average GC time: 348 ms (ugh!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GC cycles over 2 seconds: 36 (2.7%)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Minor/Full GC average time: 263 ms / 2.803 sec&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Object creation &amp;amp; promotion rate: 42.4 MB/s &amp;amp; 1.99 MB/s&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;Explanations:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, young GC cycles very quickly clear away freshly-created
garbage, but the deeper old-gen GC cycles run very slowly: 2-4 seconds. This is
where our problems happen.  The default Java garbage collection algorithm
(ParallelGC) pauses everything when it has to collect garbage (often called a
&quot;stop the world pause&quot;). During that period, Jenkins is fully halted: normally
(with small heaps) these pauses are too brief to be an issue.  With heaps of 4
GB or larger, the time required becomes long enough to be a problem: several
seconds over short windows, and over a longer interval you occasionally see
much longer pauses (tens of seconds, or minutes.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is where the user-visible hangs and lock-ups happen.  It also adds
significant latency to those build/deploy tasks.  In periods of heavy load, the
system was even experiencing hangs of 30+ seconds for a single full GC cycle.
This was long enough to trigger network timeouts (or internal Jenkins thread
timeouts) and cause even larger problems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Fortunately there’s a solution: the concurrent low-pause garbage collection
algorithms, Concurrent Mark Sweep (CMS) and Garbage First (G1). These attempt
to do much of the garbage collection concurrently with application threads,
resulting in much shorter pauses (at a slight cost in extra CPU use).  We’re
going to focus on G1, because it is slated to become the default in Java 9 and
is the official recommendation for large heap sizes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Let’s see what happens when someone uses G1 on a similarly-sized Jenkins
controller with Instance B (17 GB heap):&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Their settings:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;16 GB max heap, 0.5 GB initial size&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Java flags (mostly defaults, except for G1): &lt;code&gt;-XX:+UseG1GC -XX:+UseCompressedClassPointers -XX:+UseCompressedOops&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;And the GC log analysis:&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/gc-tuning/s-duration-company-b-g1.png&quot; alt=&quot;Instance B Jenkins G1 duration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Key stats:&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;Throughput: 98.76%  (not great, but still only slowing things down a bit)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Average GC time: 128 ms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GC cycles over 2 seconds: 11, 0.27%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Minor/Full GC average time: 122 ms / 1 sec 232 ms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Object creation &amp;amp; promotion rate: 132.53 MB/s &amp;amp; 522 KB/s&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Okay, &lt;strong&gt;much better&lt;/strong&gt;: some improvement may be expected from a 30% smaller
heap, but not as much as we’ve seen.  Most of the GC pauses are well
under 2 seconds, but we have 11 outliers - long Full GC pauses of 2-12 seconds.
Those are troubling; we’ll take a deeper dive into their causes in a second.
First, let’s look at the big picture and at how Jenkins behaves with G1 GC for
a second instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;G1 Garbage Collection with Instance C (24 GB heap):&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Their settings:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;24 GB max heap, 24 GB initial heap, 2 GB max metaspace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some custom flags: `-XX:+UseG1GC -XX:+AlwaysPreTouch -XX:+UseStringDeduplication  -XX:+UseCompressedClassPointers -XX:+UseCompressedOops `&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Clearly they’ve done some garbage collection tuning and optimization.  The
AlwaysPreTouch pre-zeros allocated heap pages, rather than waiting until
they’re first used. This is suggested especially for large heap sizes, because
it trades slightly slower startup times for improved runtime performance.  Note
also that they pre-allocated the whole heap.  This is a common optimization.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;They also enabled StringDeduplication, a G1 option introduced in Java 8 Update
20 that transparently replaces identical character arrays with pointers to the
original, reducing memory use (and improving cache performance).  Think of it
like &lt;code&gt;String.intern()&lt;/code&gt; but it silently happens during garbage collection.  This
is a concurrent operation added on to normal GC cycles, so it doesn’t pause the
application.  We’ll look at its impacts later.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking at the basics:&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/gc-tuning/s-duration-company-c-g1.png&quot; alt=&quot;Instance C G1 duration&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Similar picture to Instance B, but it’s hidden by the sheer number of points
(this is a longer period here, 1 month).  Those same occasional Full GC
outliers are present!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Key stats:&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;Throughput: 99.93%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Average GC time: 127 ms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GC cycles over 2 seconds: 235 (1.56%)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Minor/Full GC average time: 56 ms / 3.97 sec&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Object creation &amp;amp; promotion rate: 34.06 MB/s &amp;amp; 286 kb/s&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overall fairly similar to Instance B: ~100 ms GC cycles, all the minor GC
cycles are very fast.  Object promotion rates sound similar.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Remember those random long pauses?&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s find out what caused them and how to get rid of them.  Instance B had 11
super-long pause outliers.  Let’s get some more detail, by opening GC Logs in
&lt;a href=&quot;https://github.com/chewiebug/GCViewer&quot;&gt;GCViewer&lt;/a&gt;.
This tool gives a tremendous amount of information.  Too much, in fact —  I
prefer to use
&lt;a href=&quot;https://gceasy.io/&quot;&gt;GCEasy.io&lt;/a&gt;
except where needed.  Since GC logs do not contain compromising information
(unlike heap dumps or some stack traces), web apps are a great tool for
analysis.&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/gc-tuning/s-gccauses-company-b-g1-highlighted.png&quot; alt=&quot;Instance B Jenkins G1 causes&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What we care about are at the Full GC times in the middle (highlighted).  See
how much longer they are vs. the young and concurrent GC cycles up top (2
seconds or less)?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, I lied a bit earlier - sorry!  For concurrent garbage collectors, there
are actually 3 modes: young GC, concurrent GC, and full GC.  Concurrent GC
replaces the Full GC mode in Parallel GC with a faster concurrent operation
that runs in parallel with the application.  But in a few cases, we are
forced to fall back to a non-concurrent Full GC operation, which will use the
serial  (single-threaded) garbage collector.  That means that even if we have
30+ CPU cores, only one is working. This is what is happening here, and on a
large-heap, multicore system it is S  L  O  W.  How slow?  280 MB/s vs. 12487
MB/s for Instance B (for instance C, the difference is also about 50:1).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What triggers a full GC instead of concurrent:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Explicit calls to &lt;code&gt;System.gc()&lt;/code&gt;  (most common culprit, often tricky to trace down)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Metadata GC Threshold: Metaspace (used for Class data mostly) has hit the
defined size to force garbage collection or increase it.  Documentation is
terrible for this,
&lt;a href=&quot;https://stackoverflow.com/questions/25251388/what-is-the-metadata-gc-threshold-and-how-do-i-tune-it&quot;&gt;Stack Overflow&lt;/a&gt;
will be your friend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Concurrent mode failure: concurrent GC can’t complete fast enough to keep up
with objects the application is creating (there are JVM arguments to trigger
concurrent GC earlier)&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;How do we fix this?&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For explicit GC:&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;-XX:+DisableExplicitGC&lt;/code&gt; will turn off Full GC triggered by &lt;code&gt;System.gc()&lt;/code&gt;.  Often set in production, but the below option is safer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We can trigger a concurrent GC in place of a full one with &lt;code&gt;-XX:+ExplicitGCInvokesConcurrent&lt;/code&gt; - this will take the explicit call as a hint to do deeper cleanup, but with less performance cost.&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;Gotcha for people who’ve used CMS:&lt;/strong&gt; if you have used CMS in the past, you
may have used the option &lt;code&gt;-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses&lt;/code&gt; — which does what it says.  This option will silently fail in G1, meaning you
still see the very long pauses from Full GC cycles as if it wasn’t set (no
warning is generated).  I have logged a JVM bug for this issue.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the Metadata GC threshold:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Increase your initial metaspace to the final amount to avoid resizing. For example: &lt;code&gt;-XX:MetaspaceSize=500M&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;Instance C also suffered the same problem with explicit GC calls, with almost
all our outliers accounted for (230 out of 235) by slow, nonconcurrent Full GC
cycles (all from explicit &lt;code&gt;System.gc()&lt;/code&gt; calls, since they tuned metaspace):&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/gc-tuning/s-gccauses-company-c-g1-highlighted.png&quot; alt=&quot;Instance C Jenkins G1 GC causes&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s what GC pause durations look like if we remove the log entries for the
explicit &lt;code&gt;System.gc()&lt;/code&gt; calls, assuming that they’ll blend in with the other
concurrent GC pauses (not 100% accurate, but a good approximation):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Instance B:&lt;/strong&gt;&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/gc-tuning/s-duration-company-b-g1-explicitremoved.png&quot; alt=&quot;Instance B Jenkins GC duration - G1 - no explicit pauses&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The few long Full GC cycles at the start are from metaspace expansion — they
can be removed by increasing initial Metaspace size, as noted above. The
spikes?  That’s when we’re about to resize the Java heap, and memory pressure
is high.  &lt;strong&gt;You can avoid this by setting the minimum/initial heap to at least
half of the maximum, to limit resizing.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Stats:&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;Throughput: 98.93%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Average GC time: 111 ms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GC cycles over 2 seconds: 3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Minor &amp;amp; Full or concurrent GC average time: 122 ms / 25 ms (yes, faster than minor!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Object creation &amp;amp; promotion rate: 132.07 MB/s &amp;amp; 522 kB/s&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;Instance C:&lt;/strong&gt;&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/gc-tuning/s-duration-company-c-g1-explicitremoved.png&quot; alt=&quot;Instance C Jenkins G1 - no explicit pauses&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Stats:&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;Throughput: 99.97%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Average GC time: 56 ms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GC cycles over 2 seconds: 0 (!!!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Minor &amp;amp; Full or concurrent GC average time: 56 ms &amp;amp; 10 ms (yes, faster than minor!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Object creation &amp;amp; promotion rate: 33.31 MB/s &amp;amp; 286 kB/s&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Side point: GCViewer is claiming GC performance of 128 GB/s (not unreasonable, we clear ~10 GB of young generation in under 100 ms usually)&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;Okay, so we’ve tamed the long worst-case pauses!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;but-what-about-those-long-minor-gc-pauses-we-saw&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#but-what-about-those-long-minor-gc-pauses-we-saw&quot; /&gt;But What About Those Long Minor GC Pauses We Saw?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Okay, now we’re in the home stretch!  We’ve tamed the old-generation GC pauses
with concurrent collection, but what about those longer young-generation
pauses?  Lets look at stats for the different phases and causes again in
GCViewer.&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/gc-tuning/s-gccauses-company-b-g1-noexplicit-highlighted.png&quot; alt=&quot;Instance C Jenkins G1 causes -no explicit pauses&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Highlighted in yellow we see the culprit: the remark phase of G1 garbage
collection. This stop-the-world phase ensures we’ve identified all live
objects, and process references (
&lt;a href=&quot;https://www.infoq.com/articles/G1-One-Garbage-Collector-To-Rule-Them-All&quot;&gt;more info&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s look at a sample execution to get more info:&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;2016-09-07T15:28:33.104+0000: 26230.652: [GC remark 26230.652: [GC ref-proc, 1.7204585 secs], 1.7440552 secs]

 [Times: user=1.78 sys=0.03, real=1.75 secs]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This turns out to be typical for the GC log: the longest pauses are spent in
reference processing. This is not surprising because Jenkins internally uses
references heavily for caching, especially weak references, and the default
reference processing algorithm is single-threaded.  Note that user (CPU) time
matches real time, and it would be higher if we were using multiple cores.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, we add the GC flag &lt;code&gt;-XX:+ParallelRefProcEnabled&lt;/code&gt; which enables us to use the multiple cores more effectively.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Tuning young-generation GC further based on Instance C:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back to GCViewer we go, to see what’s time consuming with the GC for Instance C.&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/gc-tuning/s-gccauses-company-c-g1-noexplicit-highlighted.png&quot; alt=&quot;Instance C Jenkins G1 causes -no explicit pauses&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s good, because most of the time is just sweeping out the trash
(evacuation pause).  But the 1.8 second pause looks odd.  Let’s look at the raw
GC log for the longest pause:&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;2016-09-24T16:31:27.738-0700: 106414.347: [GC pause (G1 Evacuation Pause) (young), 1.8203527 secs]
[Parallel Time: 1796.4 ms, GC Workers: 8]
 [GC Worker Start (ms): Min: 106414348.2, Avg: 106414348.3, Max: 106414348.6, Diff: 0.4]
[Ext Root Scanning (ms): Min: 0.3, Avg: 1.7, Max: 5.7, Diff: 5.4, Sum: 14.0]
  [Update RS (ms): Min: 0.0, Avg: 7.0, Max: 19.6, Diff: 19.6, Sum: 55.9]
    [Processed Buffers: Min: 0, Avg: 45.1, Max: 146, Diff: 146, Sum: 361]
 [Scan RS (ms): Min: 0.2, Avg: 0.4, Max: 0.7, Diff: 0.6, Sum: 3.5]
 [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.2]
 [Object Copy (ms): Min: 1767.1, Avg: 1784.4, Max: 1792.6, Diff: 25.5, Sum: 14275.2]
 [Termination (ms): Min: 0.3, Avg: 2.4, Max: 3.5, Diff: 3.2, Sum: 19.3]
    [Termination Attempts: Min: 11, Avg: 142.5, Max: 294, Diff: 283, Sum: 1140]
 [GC Worker Other (ms): Min: 0.0, Avg: 0.1, Max: 0.4, Diff: 0.3, Sum: 0.8]
 [GC Worker Total (ms): Min: 1795.9, Avg: 1796.1, Max: 1796.2, Diff: 0.3, Sum: 14368.9]
 [GC Worker End (ms): Min: 106416144.4, Avg: 106416144.5, Max: 106416144.5, Diff: 0.1]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;…​oh, well dang. Almost the entire time (1.792 s out of 1.820) is walking
through the live objects and copying them.  And wait, what about this line,
showing the summary statistics:&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;Eden: 13.0G(13.0G)-&amp;gt;0.0B(288.0M) Survivors: 1000.0M-&amp;gt;936.0M Heap: 20.6G(24.0G)-&amp;gt;7965.2M(24.0G)]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Good grief, we flushed out 13 GB (!!!) of freshly-allocated garbage in one
swoop and compacted the leftovers!  No wonder it was so slow.  I wonder how we
accumulated so much…​&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/gc-tuning/s-younggen-company-c-g1-explicitremoved.png&quot; alt=&quot;Instance C Jenkins G1-ExplicitGC removed&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Oh, right…​ we set up for 24 GB of heap initially, and each minor GC clears
most of the young generation.  Okay, so we’ve set aside tons of space for trash
to collect, which means longer but less frequent GC periods.  This also gets
the best performance from Jenkins memory caches which are using WeakReferences
(survives until collected by GC) and SoftReferences (more long-lived). Those
caches boost performance a lot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We could take actions to prevent those rare longer pauses. The best ways are to
limit total heap size or reduce the value of &lt;code&gt;-XX:MaxGCPauseMillis=200&lt;/code&gt; from
its default (200).  A more advanced way (if those don’t help enough) is to
explicitly set the maximum size of the young generation smaller (say
&lt;code&gt;-XX:G1MaxNewSizePercent=45&lt;/code&gt; instead of the default of 60).  We could also
throw more CPUs at the problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But if we look up, most pauses are around 100 ms (200 ms is the default value
for MaxGCPauseMillis).  For Jenkins on this hardware, this appears to work
&lt;strong&gt;just fine&lt;/strong&gt; and a rare longer pause is OK as long as they don’t get too
big.  Also remember, if this happens often, G1 GC will try to autotune for
lower pauses and more predictable performance.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;a-few-final-settings&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-few-final-settings&quot; /&gt;A Few Final Settings&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We mentioned StringDeduplication was on with Instance C, what is the impact?
This only triggers on Strings that have survived a few generations (most of our
garbage does not), has limits on the CPU time it can use, and replaces
duplicate references to their immutable backing character arrays.
&lt;a href=&quot;https://java-performance.info/java-string-deduplication/&quot;&gt;For more info, look here&lt;/a&gt;.
So, we should be trading a little CPU time for improved memory efficiently
(similarly to string interning).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the beginning, this has a huge impact:&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;[GC concurrent-string-deduplication, 375.3K-&amp;gt;222.5K(152.8K), avg 63.0%, 0.0     024966 secs]
[GC concurrent-string-deduplication, 4178.8K-&amp;gt;965.5K(3213.2K), avg 65.3%, 0     .0272168 secs]
[GC concurrent-string-deduplication, 36.1M-&amp;gt;9702.6K(26.6M), avg 70.3%, 0.09     65196 secs]
[GC concurrent-string-deduplication, 4895.2K-&amp;gt;394.9K(4500.3K), avg 71.9%, 0     .0114704 secs]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This peaks at an average of about ~90%:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After running for a month, less of an impact - many of the strings that can be
deduplicated already are:&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;[GC concurrent-string-deduplication, 138.7K-&amp;gt;39.3K(99.4K), avg 68.2%, 0.0007080 secs]
[GC concurrent-string-deduplication, 27.3M-&amp;gt;21.5M(5945.1K), avg 68.1%, 0.0554714 secs]
[GC concurrent-string-deduplication, 304.0K-&amp;gt;48.5K(255.5K), avg 68.1%, 0.0021169 secs]
[GC concurrent-string-deduplication, 748.9K-&amp;gt;407.3K(341.7K), avg 68.1%, 0.0026401 secs]
[GC concurrent-string-deduplication, 3756.7K-&amp;gt;663.1K(3093.6K), avg 68.1%, 0.0270676 secs]
[GC concurrent-string-deduplication, 974.3K-&amp;gt;17.0K(957.3K), avg 68.1%, 0.0121952 secs]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However it’s cheap to use: in average, each dedup cycle takes 8.8 ms and
removes 2.4 kB of duplicates.  The median takes 1.33 ms and removes 17.66 kB
from the old generation.  A small change per cycle, but in aggregate it adds up
quickly — in periods of heavy load, this can save hundreds of megabytes of
data. But that’s still small, relative to multi-GB heaps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Conclusion: turn string deduplication on&lt;/strong&gt; string deduplication is fairly
cheap to use, and reduces the steady-state memory needed for Jenkins.  That
frees up more room for the young generation, and should overall reduce GC time
by removing duplicate objects.  I think it’s worth turning on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Soft reference flushing:&lt;/strong&gt; Jenkins uses soft references for caching build
records and in pipeline FlowNodes.  The only guarantee for these is that they
will be removed instead of causing an OutOfMemoryError…​ however Java
applications can slow to a crawl from memory pressure long before that happens.
There’s an option that provides a hint to the JVM based on time &amp;amp; free memory,
controlled by &lt;code&gt;-XX:SoftRefLRUPolicyMSPerMB&lt;/code&gt; (default 1000).  The SoftReferences
become eligible for garbage collection after this many milliseconds have
elapsed since last touch…​ per MB of unused heap (vs the maximum).  The
referenced objects don’t count towards that target.  So, with 10 GB of heap
free and the default 1000 ms setting, soft references stick around for ~2.8
hours (!).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the system is continuously allocating more soft references, it may trigger
heavy GC activity, rather than clearing out soft references. See the open bug
&lt;a href=&quot;https://bugs.openjdk.java.net/browse/JDK-6912889&quot;&gt;JDK-6912889&lt;/a&gt;
for more details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If Jenkins consumes excessive old generation memory, it &lt;strong&gt;may&lt;/strong&gt; help to make soft
references easier to flush  by reducing -XX:SoftRefLRUPolicyMSPerMB from its
default (1000) to something smaller (say 10-200).  The catch is that
SoftReferences are often used for objects that are relatively expensive to
load, such lazy-loaded build records and pipeline FlowNode data.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;caveats&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#caveats&quot; /&gt;Caveats&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;G1 vs. CMS:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;G1 was available on later releases of JRE 7, but unstable and slow.&lt;/strong&gt;  If you
use it you absolutely must be using JRE 8, and the later the release the better
(it’s gotten a lot of patches).  Googling around will show horrible G1 vs CMS
benchmarks from around 2014: these are probably best ignored, since the G1
implementation was still immature then. There’s probably a niche for CMS use
still, especially on midsized heaps (1-3 GB) or where settings are already
tuned.  With appropriate tuning it &lt;strong&gt;can&lt;/strong&gt; still perform generally well for
Jenkins (which mostly generates short-lived garbage), but CMS eventually suffer
from heap fragmentation and need a slow, non-concurrent Full GC to clear this.
It also needs considerably more tuning than G1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;General GC tuning caveats&lt;/strong&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No single setting is perfect for everybody.  We avoid tweaking settings that we
don’t have strong evidence for here, but there are of course many additional
settings to tweak.  One shouldn’t change them without evidence though, because
it can cause unexpected side effects.  The GC logs we enabled earlier will
collect this evidence.  The only setting that jumps out as a likely candidate
for further tuning is G1 region size (too small and there are many humungous
object allocations, which hurt performance).  Running on smaller systems,
I’ve seen evidence that regions shouldn’t be smaller than 4 MB because
there are 1-2 MB objects allocated somewhat regularly — but it’s not
enough to make solid guidance without more data.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-should-i-do-before-tuning-jenkins-gc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-should-i-do-before-tuning-jenkins-gc&quot; /&gt;What Should I Do Before Tuning Jenkins GC:&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve seen
&lt;a href=&quot;https://www.cloudbees.com/so-you-want-build-worlds-biggest-jenkins-cluster&quot;&gt;Stephen Connolly’s excellent Jenkins World talk&lt;/a&gt;,
you know that most Jenkins instances can and should get by with 4 GB or less of
allocated heap, even up to very large sizes.  You will want to turn on GC
logging (suggested above) and look at stats over a few weeks (remember
&lt;a href=&quot;https://gceasy.io/&quot;&gt;GCeasy.io&lt;/a&gt;).
If you’re not seeing periodic longer pause times, you’re probably okay.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this post we assume we’ve already done the basic performance work for Jenkins:&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;Jenkins is running on fast, SSD-backed storage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We’ve set up build rotation for your Jobs, to delete old builds so they don’t pile up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The weather column is already disabled for folders.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All builds/deploys are running on build agents not on the controller. If the controller has executors allocated, they are exclusively used for backup tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We’ve verified that Jenkins really does need the large heap size and can’t easily be split into separate controllers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If not, we need to do that FIRST before looking at GC tuning, because those will have larger impacts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusions&quot; /&gt;Conclusions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve gone from:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Average 350 ms pauses (bad user experience) including less frequent 2+ second generation pauses&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To an average pause of ~50 ms, with almost all under 250 ms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reduced total memory footprint from String deduplication&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How:&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;Use Garbage First (G1) garbage collection, which performs generally very well for Jenkins.  Usually there’s enough spare CPU time to enable concurrent running.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure explicit &lt;code&gt;System.gc()&lt;/code&gt; and metaspace resizing do not trigger a Full GC because this can trigger a very long pause&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turn on parallel reference processing for Jenkins to use all CPU cores fully.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use String deduplication, which generates a tidy win for Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable GC logging, which can then be used for the next level of tuning and diagnostics, if needed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s still a little unpredictability, but using appropriate settings gives a
&lt;strong&gt;much&lt;/strong&gt; more stable, responsive CI/CD server…​ even up to 20 GB heap sizes!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;further-reading&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#further-reading&quot; /&gt;Further Reading:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://product.hubspot.com/blog/g1gc-fundamentals-lessons-from-taming-garbage-collection&quot;&gt;G1GC fundamentals&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://mechanical-sympathy.blogspot.com/2013/07/java-garbage-collection-distilled.html&quot;&gt;MechanicalSympathy: Garbage Collection Distilled&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.oracle.com/technetwork/articles/java/g1gc-1984535.html&quot;&gt;Oracle Garbage First Garbage Collector Tuning&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;one-additional-thing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#one-additional-thing&quot; /&gt;One additional thing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve added &lt;code&gt;-XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=20&lt;/code&gt; to our
options above.  This is covering a complex and usually infrequent case where G1
self-tuning can trigger bad performance for Jenkins — but that’s material for
another post…​&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/11/16/security-updates-addressing-zero-day/</id>
<title>Security updates addressing zero day vulnerability</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-11-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/11/16/security-updates-addressing-zero-day/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
A zero-day vulnerability in Jenkins was published on Friday, November 11.  Last
week
we provided an immediate mitigation
and today we are releasing updates to Jenkins which fix the vulnerability. We
strongly recommend you update Jenkins to 2.32 (main line) or 2.19.3 (LTS) as
soon as possible.


Today&#8217;s
security advisory
contains more information on the exploit, affected versions, and fixed
versions, but in short:




An unauthenticated remote code execution vulnerability allowed attackers to
transfer a serialized Java object to the Jenkins CLI, making Jenkins connect to
an attacker-controlled LDAP server, which in turn can send a serialized payload
leading to code execution, bypassing existing protection mechanisms.




Moving forward, the Jenkins security team is...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A zero-day vulnerability in Jenkins was published on Friday, November 11.  Last
week
&lt;a href=&quot;https://www.jenkins.io/blog/2016/11/12/addressing-remote-vulnerabilities-in-cli&quot;&gt;we provided an immediate mitigation&lt;/a&gt;
and today we are releasing updates to Jenkins which fix the vulnerability. We
strongly recommend you update Jenkins to 2.32 (main line) or 2.19.3 (LTS) as
soon as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today’s
&lt;a href=&quot;https://www.jenkins.io/security/advisory/2016-11-16/&quot;&gt;security advisory&lt;/a&gt;
contains more information on the exploit, affected versions, and fixed
versions, but in short:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An unauthenticated remote code execution vulnerability allowed attackers to
transfer a serialized Java object to the Jenkins CLI, making Jenkins connect to
an attacker-controlled LDAP server, which in turn can send a serialized payload
leading to code execution, bypassing existing protection mechanisms.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Moving forward, the Jenkins security team is revisiting the design of the
Jenkins CLI over the coming weeks to prevent this class of vulnerability in the
future. If you are interested in participating in that discussion, please join
in on the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;jenkinsci-dev@&lt;/a&gt;
mailing list.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project encourages administrators to subscribe to the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-advisories&quot;&gt;jenkinsci-advisories@&lt;/a&gt;
mailing list to receive future Jenkins security notifications.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/11/13/november-jenkins-events/</id>
<title>Upcoming November Jenkins Events</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-11-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/11/13/november-jenkins-events/" />
<author>
<name>alyssat</name>
</author>
<category term='events'></category>
<category term='jam'></category>
<summary>
November is packed full of meetups and events. If you are in any of the areas
below please stop by to say "Hi" and talk Jenkins over beer.


North America



November 15 | SF JAM: Let’s Talk CI/CD and DevOps with ClusterHQ and Jenkins


November 15 | DC JAM: Jenkins and Fannie Mae


November 30 | Albuquerque JAM: Learn About Blue Ocean


November 30 | Guadalajara JAM: Jenkins Install and Setup





Europe



November 10 | Amsterdam JAM: Jenkins and Docker - Multiple Uses for Containers and Jenkins


November 10 | Milano JAM: Meet and Greet





Australia



November 15 | Melbourne JAM: Blue Ocean - A New User Experience





Asia



November 17 | Singapore...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/jams/guadalahara.jpg&quot; alt=&quot;Guadalahara JAM&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;November is packed full of meetups and events. If you are in any of the areas
below please stop by to say &quot;Hi&quot; and talk Jenkins over beer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;north-america&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#north-america&quot; /&gt;North America&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;November 15 | SF JAM: &lt;a href=&quot;https://www.meetup.com/San-Francisco-Jenkins-Area-Meetup/events/235423503/&quot;&gt;Let’s Talk CI/CD and DevOps with ClusterHQ and Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;November 15 | DC JAM: &lt;a href=&quot;https://www.meetup.com/Washington-DC-Jenkins-Area-Meetup/events/235329896/&quot;&gt;Jenkins and Fannie Mae&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;November 30 | Albuquerque JAM: &lt;a href=&quot;https://www.meetup.com/Albuquerque-Jenkins-Area-Meetup/events/234807265/&quot;&gt;Learn About Blue Ocean&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;November 30 | Guadalajara JAM: &lt;a href=&quot;https://www.meetup.com/Guadalajara-Jenkins-Area-Meetup/events/234929834/&quot;&gt;Jenkins Install and Setup&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;europe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#europe&quot; /&gt;Europe&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;November 10 | Amsterdam JAM: &lt;a href=&quot;https://www.meetup.com/Amsterdam-Jenkins-Area-Meetup/events/234471476/&quot;&gt;Jenkins and Docker - Multiple Uses for Containers and Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;November 10 | Milano JAM: &lt;a href=&quot;https://www.meetup.com/Milano-Jenkins-Area-Meetup/events/235320492/&quot;&gt;Meet and Greet&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;australia&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#australia&quot; /&gt;Australia&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;November 15 | Melbourne JAM: &lt;a href=&quot;https://www.meetup.com/Melbourne-Jenkins-Area-Meetup/events/235070768/&quot;&gt;Blue Ocean - A New User Experience&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;asia&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#asia&quot; /&gt;Asia&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;November 17 | Singapore JAM: &lt;a href=&quot;https://www.meetup.com/Jenkins-User-Group-Singapore/events/235128133/&quot;&gt;CI Using Source Code on GitHub&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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/projects/jam&quot;&gt;Start a JAM&lt;/a&gt; in your city if there isn’t one already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://www.meetup.com/pro/jenkins/&quot;&gt;JAM member&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become an &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;online JAM member&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speak or sponsor at a JAM. Contact us at &lt;a href=&quot;mailto:jenkinsci-jam@googlegroups.com&quot;&gt;jenkinsci-jam@googlegroups.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beginners+Guide+to+Contributing&quot;&gt;Jenkins project contributor&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/11/12/addressing-remote-vulnerabilities-in-cli/</id>
<title>Addressing recently disclosed vulnerabilities in the Jenkins CLI</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-11-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/11/12/addressing-remote-vulnerabilities-in-cli/" />
<author>
<name>rtyler</name>
</author>
<category term='security'></category>
<category term='lts'></category>
<summary>
The Jenkins
security team
has been made aware of a new attack vector for a remote code execution
vulnerability in the
Jenkins CLI,
according to
this
advisory
by Daniel Beck:




We have received a report of a possible unauthenticated remote code execution
vulnerability in Jenkins (all versions).


We strongly advise anyone running a Jenkins instance on a public network
disable the CLI for now.


As this uses the same attack vector as SECURITY-218, you can reuse the script
and instructions published in this repository: https://github.com/jenkinsci-cert/SECURITY-218




We have since been able to confirm the vulnerability and strongly recommend
that everyone follow the instructions in the linked repository.


As Daniel mentions in the security advisory, the advised mitigation strategy...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins
&lt;a href=&quot;https://www.jenkins.io/security&quot;&gt;security team&lt;/a&gt;
has been made aware of a new attack vector for a remote code execution
vulnerability in the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+CLI&quot;&gt;Jenkins CLI&lt;/a&gt;,
according to
&lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-advisories/-fc-w9tNEJE/GRvEzWoJBgAJ&quot;&gt;this
advisory&lt;/a&gt;
by Daniel Beck:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have received a report of a possible unauthenticated remote code execution
vulnerability in Jenkins (all versions).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We strongly advise anyone running a Jenkins instance on a public network
disable the CLI for now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As this uses the same attack vector as SECURITY-218, you can reuse the script
and instructions published in this repository: &lt;a href=&quot;https://github.com/jenkinsci-cert/SECURITY-218&quot; class=&quot;bare&quot;&gt;https://github.com/jenkinsci-cert/SECURITY-218&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have since been able to confirm the vulnerability and strongly recommend
that everyone follow the instructions in the linked repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Daniel mentions in the security advisory, the advised mitigation strategy is
to disable the CLI subsystem via
&lt;a href=&quot;https://github.com/jenkinsci-cert/SECURITY-218/blob/master/cli-shutdown.groovy&quot;&gt;this
Groovy script&lt;/a&gt;.
If you are a Jenkins administrator, navigate to the &#39;Manage Jenkins&#39; page and
click on the &#39;Script Console&#39;, which will allow you to run the Groovy script to
immediately disable the CLI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to persist this change across restarts of your Jenkins controller, place
&lt;a href=&quot;https://github.com/jenkinsci-cert/SECURITY-218/blob/master/cli-shutdown.groovy&quot;&gt;the
Groovy script&lt;/a&gt;
in &lt;code&gt;$JENKINS_HOME/init.groovy.d/cli-shutdown.groovy&lt;/code&gt; so that Jenkins executes
the script on each boot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are expecting to have a fix implemented, tested and included in an updated
weekly and LTS release this upcoming &lt;strong&gt;Wednesday, November 16th&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For users who are operating Jenkins on public, or otherwise hostile, networks,
we suggest hosting Jenkins behind reverse proxies such as Apache or Nginx.
These can help provide an additional layer of security, when used appropriately,
to cordon off certain URLs such as &lt;code&gt;/cli&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, we strongly recommend that &lt;strong&gt;all&lt;/strong&gt; Jenkins administrators subscribe
to the
&lt;a href=&quot;mailto:jenkinsci-advisories+subscribe@googlegroups.com&quot;&gt;jenkinsci-advisories@googlegroups.com&lt;/a&gt;
mailing list to receive future advisories.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins project has a responsible disclosure policy, which we strongly
encourage anybody who believes they have discovered a potential vulnerability
to follow. You can learn more about this policy and our processes on our
&lt;a href=&quot;https://www.jenkins.io/security&quot;&gt;security page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/11/11/monthly-jam-recap-october/</id>
<title>Monthly JAM Recap - October 2016</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-11-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/11/11/monthly-jam-recap-october/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='JAM'></category>
<category term='meetup'></category>
<summary>
October has proven to be a busy month within the Jenkins Area Meetup groups.
Below is a recap of topics discussed at various JAMS in the month of October.


Dallas Forth Worth, Texas (DFW) JAM

James Dumay
took time out of his vacation to present Blue Ocean, a project that rethinks
the user experience of Jenkins, modeling and presenting the process of software
delivery by surfacing information that is important to development teams with
as few clicks as possible, while still staying true to the extensibility that
Jenkins always has had as a core value.


See recording HERE.



San Francisco, CA JAM

Andrey Falko from Salesforce shared how he and his...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;October has proven to be a busy month within the Jenkins Area Meetup groups.
Below is a recap of topics discussed at various JAMS in the month of October.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;dallas-forth-worth-texas-dfw-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dallas-forth-worth-texas-dfw-jam&quot; /&gt;Dallas Forth Worth, Texas (DFW) JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/i386&quot;&gt;James Dumay&lt;/a&gt;
took time out of his vacation to present Blue Ocean, a project that rethinks
the user experience of Jenkins, modeling and presenting the process of software
delivery by surfacing information that is important to development teams with
as few clicks as possible, while still staying true to the extensibility that
Jenkins always has had as a core value.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See recording &lt;a href=&quot;https://www.youtube.com/watch?v=ZdRYnuwouI4&quot;&gt;HERE&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;san-francisco-ca-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#san-francisco-ca-jam&quot; /&gt;San Francisco, CA JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Andrey Falko from Salesforce shared how he and his Diagnostics team used
Jenkins to deliver software securely and reliably to production within
Salesforce.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See videos &lt;a href=&quot;https://www.youtube.com/watch?v=kSnR-B-3EuY&quot;&gt;HERE&lt;/a&gt; and
&lt;a href=&quot;https://www.youtube.com/watch?v=_e71fw7eeQU&quot;&gt;HERE&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/post-images/Screen%20Shot%202016-11-08%20at%204.37.08%20PM.png&quot; alt=&quot;Salesforce&quot; width=&quot;350&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;boulder-co-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#boulder-co-jam&quot; /&gt;Boulder, CO JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was a meetup with CA Technologies and included
&lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt;, maintainer of the Jenkins git plugin
and a director at CA Technologies in Fort Collins.
&lt;a href=&quot;https://github.com/rtyler&quot;&gt;Tyler&lt;/a&gt; did a great presentation about Jenkins
Pipeline and Blue Ocean and showed off how the community is using Blue Ocean to
build Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;barcelona-spain-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#barcelona-spain-jam&quot; /&gt;Barcelona, Spain JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this meetup, there were plenty of engaging discussions surrounding the
Jenkins Certification and DevOps 2.1 Toolkit: Continuous Deployment with
Jenkins and Docker Swarm.  Guillem Sola shared his Jenkins certification
experience &lt;a href=&quot;https://www.youtube.com/watch?v=fJgG-ZC_vwE&quot;&gt;HERE&lt;/a&gt; while Viktor
Farcic presented his thoughts on the aspects of building, testing, deploying,
and monitoring services inside Docker Swarm clusters and Jenkins
&lt;a href=&quot;https://www.youtube.com/watch?v=fs1ED_y5mUc&quot; class=&quot;bare&quot;&gt;https://www.youtube.com/watch?v=fs1ED_y5mUc&lt;/a&gt;.&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/Screen%20Shot%202016-11-08%20at%204.24.35%20PM.png&quot; alt=&quot;Viktor Farcic&quot; width=&quot;350&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/Screen%20Shot%202016-11-08%20at%204.24.51%20PM.png&quot; alt=&quot;Guillem Sola&quot; width=&quot;350&quot; /&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/Screen%20Shot%202016-11-08%20at%204.42.44%20PM.png&quot; alt=&quot;Barcelona JAM&quot; width=&quot;350&quot; /&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;lima-peru-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lima-peru-jam&quot; /&gt;Lima, Peru JAM&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/Screen%20Shot%202016-11-08%20at%204.27.57%20PM.png&quot; alt=&quot;Lima JAM&quot; width=&quot;350&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;October’s meetup was a joint effort with collaboration from Perú JUG, and
Docker Lima. The first talk was an Introduction to
&lt;a href=&quot;https://github.com/mario21ic/DockerJava&quot;&gt;Docker Ecosystem&lt;/a&gt;, second was
&lt;a href=&quot;https://github.com/eddumelendez/javaee7-docker-gradle&quot;&gt;Building and Testing Apps with Docker&lt;/a&gt; and
&lt;a href=&quot;https://github.com/eddumelendez/arquillian-cube-maven-demos&quot;&gt;Arquillian Cube&lt;/a&gt;
and the last one was
&lt;a href=&quot;https://github.com/jenkinsperu/javaee8-mvc#using-jenkins&quot;&gt;CI/CD using Docker and Jenkins Pipelines&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had a full house at the meetup. Now, everyone in the room has a Mr. Jenkins
branded on their laptop :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https://twitter.com/mario21ic&quot;&gt;Mario Inga&lt;/a&gt; and
&lt;a href=&quot;https://twitter.com/hdanniel&quot;&gt;Héctor Paz&lt;/a&gt; for their collaborations during the
last meetups.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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/projects/jam&quot;&gt;Start a JAM&lt;/a&gt; in your city if there isn’t one already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;JAM member&lt;/a&gt; .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become an &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;online JAM member&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be a JAM speaker or sponsor. Let us know &lt;a href=&quot;mailto:jenkinsci-jam@googlegroups.com&quot;&gt;jenkinsci-jam@googlegroups.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beginners+Guide+to+Contributing&quot;&gt;Jenkins project contributor&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/10/31/xunit-reporting/</id>
<title>xUnit and Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-10-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/10/31/xunit-reporting/" />
<author>
<name>lnewman</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='xunit'></category>
<category term='nightwatch'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





The
JUnit plugin
is the go-to test result reporter for many Jenkins projects,
but the it is not the only one available.  The
xUnit plugin
is a viable alternative that supports JUnit and many other test result file formats.


Introduction

No matter the project, you need to gather and report test results.
JUnit is one of the most widely supported formats for recording test results.
For a scenarios where your tests are stable and your framework can produce JUnit output,
this makes the JUnit plugin ideal for reporting results in Jenkins.
It will consume results from a specified file or...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/JUnit+Plugin&quot;&gt;JUnit plugin&lt;/a&gt;
is the go-to test result reporter for many Jenkins projects,
but the it is not the only one available.  The
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/xUnit+Plugin&quot;&gt;xUnit plugin&lt;/a&gt;
is a viable alternative that supports JUnit and many other test result file formats.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;introduction&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introduction&quot; /&gt;Introduction&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No matter the project, you need to gather and report test results.
JUnit is one of the most widely supported formats for recording test results.
For a scenarios where your tests are stable and your framework can produce JUnit output,
this makes the JUnit plugin ideal for reporting results in Jenkins.
It will consume results from a specified file or path, create a report,
and if it finds test failures it will set the job state to &quot;unstable&quot; or &quot;failed&quot;.&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/2016-10-27/job-7-report.png&quot; alt=&quot;Test reporting with JUnit&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are also plenty of scenarios where the JUnit plugin is not enough.
If your project has some failing tests that will take some time to fix,
or if there are some flaky tests,
the JUnit plugin’s simplistic view of test failures may be difficult to work with.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No problem, the Jenkins plugin model lets us replace the JUnit
plugin functionality with similar
functionality from another plugin and Jenkins Pipeline lets us do this in safe
stepwise fashion where we can test and debug each of our changes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this article, I will show you how to replace the JUnit plugin with the
xUnit plugin in Pipeline code to address a few common test reporting scenarios.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;initial-setup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#initial-setup&quot; /&gt;Initial Setup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m going to use the &quot;JS-Nightwatch.js&quot; sample project from my
&lt;a href=&quot;https://www.jenkins.io/blog/2016/08/29/sauce-pipeline/&quot;&gt;previous post&lt;/a&gt; to demonstrate a couple
common scenarios that the xUnit handles better.
I already have the latest
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/JUnit+Plugin&quot;&gt;JUnit plugin&lt;/a&gt;
and
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/xUnit+Plugin&quot;&gt;xUnit plugin&lt;/a&gt;
installed on my Jenkins server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll be keeping my changes in
&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js&quot;&gt;my fork&lt;/a&gt;
of the &quot;JS-Nightwatch.js&quot; sample project on GitHub, under the
&quot;&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js/tree/blog/xunit&quot;&gt;blog/xunit&lt;/a&gt;&quot; branch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s what the Jenkinsfile looked like at the end of that previous post and what
the report page looks like after a few runs:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;node&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;s2&quot;&gt;&quot;Build&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Install dependencies&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;npm install&#39;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Test&quot;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Add sauce credentials&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sauce&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;f0a6b8ad-ce30-4cba-bf9a-95afbc470a8a&#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;c1&quot;&gt;// Start sauce connect&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sauceconnect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;options:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;useGeneratedTunnelIdentifier:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;verboseLogging:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;c1&quot;&gt;// List of browser configs we&#39;ll be testing against.&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;platform_configs&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;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;ie&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// Nightwatch.js supports color output, so wrap this step for ansi color&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;wrap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;AnsiColorBuildWrapper&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;colorMapName&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;XTerm&#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;c1&quot;&gt;// Run selenium tests using Nightwatch.js&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// Ignore error codes. The junit publisher will cover setting build status.&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./node_modules/.bin/nightwatch -e ${platform_configs} || true&quot;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;reports/**&#39;&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SauceOnDemandTestPublisher&#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 class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-10-27/job-7-console.png&quot; alt=&quot;JUnit plugin console output&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;switching-from-junit-to-xunit&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#switching-from-junit-to-xunit&quot; /&gt;Switching from JUnit to xUnit&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll start by replacing JUnit with xUnit in my pipeline.
I use the Snippet Generator to create the step with the right parameters.
The main downside of using the xUnit plugin is that while it is Pipeline compatible,
it still uses the more verbose &lt;code&gt;step()&lt;/code&gt; syntax and has some very rough edges around that, too.
I’ve filed
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/37611&quot;&gt;JENKINS-37611&lt;/a&gt;
but in the meanwhile, we’ll work with what we have.&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;c1&quot;&gt;// Original JUnit step&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;reports/**&#39;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Equivalent xUnit step - generated (reformatted)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;XUnitBuilder&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;testTimeMargin:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;3000&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;thresholdMode:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;thresholds:&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;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;FailedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureNewThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unstableNewThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unstableThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;1&#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;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SkippedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureNewThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unstableNewThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unstableThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&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;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;JUnitType&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;deleteOutputFiles:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failIfNotNew:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;reports/**&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;skipNoTestFiles:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;stopProcessingIfError:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;c1&quot;&gt;// Equivalent xUnit step - cleaned&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;XUnitBuilder&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;thresholds:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;FailedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unstableThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;1&#39;&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;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;JUnitType&#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;reports/**&#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;If I replace the &lt;code&gt;junit&lt;/code&gt; step in my Jenkinsfile with that last step above,
it produces a report and job result identical to the JUnit plugin but using the xUnit plugin.  Easy!&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;node&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;s2&quot;&gt;&quot;Build&quot;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ... snip ...&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Test&quot;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Add sauce credentials&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sauce&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;f0a6b8ad-ce30-4cba-bf9a-95afbc470a8a&#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;c1&quot;&gt;// Start sauce connect&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sauceconnect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;options:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;useGeneratedTunnelIdentifier:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;verboseLogging:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;c1&quot;&gt;// ... snip ...&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// junit &#39;reports/**&#39;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;XUnitBuilder&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;thresholds:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;FailedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unstableThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;1&#39;&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;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;JUnitType&#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;reports/**&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]]])&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// ... snip ...&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;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-10-27/job-8-summary.png&quot; alt=&quot;Test reporting with xUnit&quot; width=&quot;800&quot;&gt;
&lt;/img&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/2016-10-27/job-8-console.png&quot; alt=&quot;xUnit plugin console output&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;accept-a-baseline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#accept-a-baseline&quot; /&gt;Accept a Baseline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most projects don’t start off with automated tests passing or even running.
They start with a people hacking and prototyping, and eventually they start to write tests.
As new tests are written, having tests checked-in, running, and failing can be valuable information.
With the xUnit plugin we can accept a baseline of failed cases and drive that number down over time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll start by changing the Jenkinsfile to fail jobs only if the number of failures is greater than an expected baseline,
in this case four failures. When I run the job with this change, the reported numbers remain the same, but the job passes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;c1&quot;&gt;// The rest of the Jenkinsfile is unchanged.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Only the xUnit step() call is modified.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;XUnitBuilder&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;thresholds:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;FailedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;4&#39;&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;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;JUnitType&#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;reports/**&#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;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-10-27/job-9-summary.png&quot; alt=&quot;Accept a baseline of failing tests.&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, I can also check that the plugin reports the job as failed if more failures occur.
Since this is sample code, I’ll do this by adding another failing test and checking the job
reports as failed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;tests/guineaPig.js&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// ... snip ...&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Assert Title 0 - D&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ... */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Assert Title 0 - E&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;https://saucelabs.com/test/guinea-pig&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;waitForElementVisible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;//.assert.title(&#39;I am a page title - Sauce Labs&#39;);&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;assert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;I am a page title - Sauce Labs - Cause a Failure&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;afterEach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ... */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ... snip ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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/2016-10-27/job-10-summary.png&quot; alt=&quot;All tests pass!&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a real project, we’d make fixes over a number of commits bringing the number of failures down and adjusting our baseline.
Since this is a sample, I’ll just make all tests pass and set the job failure threshold for failed and skipped cases to zero.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;c1&quot;&gt;// The rest of the Jenkinsfile is unchanged.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Only the xUnit step() call is modified.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;XUnitBuilder&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;thresholds:&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;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SkippedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;0&#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;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;FailedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;0&#39;&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;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;JUnitType&#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;reports/**&#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;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;tests/guineaPig.js&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// ... snip ...&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Assert Title 0 - D&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ... */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Assert Title 0 - E&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;https://saucelabs.com/test/guinea-pig&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;waitForElementVisible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;assert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;I am a page title - Sauce Labs&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;afterEach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ... */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ... snip ...&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;title&quot;&gt;tests/guineaPig_1.js&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// ... snip ...&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Assert Title 1 - A&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;https://saucelabs.com/test/guinea-pig&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;waitForElementVisible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;assert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;I am a page title - Sauce Labs&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ... snip ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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/2016-10-27/job-12-summary.png&quot; alt=&quot;All tests pass!&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;allow-for-flakiness&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#allow-for-flakiness&quot; /&gt;Allow for Flakiness&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve all known the frustration of having one flaky test that fails once every ten jobs.
You want to keep it active so you can working isolating the source of the problem,
but you also don’t want to destablize your CI pipeline or reject commits that are actually okay.
You could move the test to a separate job that runs the &quot;flaky&quot; tests,
but in my experience that just leads to a job that is always in a failed state
and a pile of flaky tests no one looks at.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the xUnit plugin, we can keep the this flaky test in main test suite but allow
the our job to still pass.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll start by adding a sample flaky test.  After a few runs, we can see the test
fails intermittently and causes the job to fail too.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;tests/guineaPigFlaky.js&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// New test file: tests/guineaPigFlaky.js&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;https&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;https&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;SauceLabs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;saucelabs&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@tags&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;guineaPig&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Flaky Assert Title 0&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;expectedTitle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;I am a page title - Sauce Labs&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Fail every fifth minute&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;expectedTitle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; - Cause failure&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;https://saucelabs.com/test/guinea-pig&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;waitForElementVisible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;assert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;expectedTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nl&quot;&gt;afterEach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;customSauceEnd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;nf&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&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/2016-10-27/job-17-summary.png&quot; alt=&quot;The pain of flaky tests failing the build&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I can almost hear my teammates screaming in frustration just looking at this report.
To allow specific tests to be unstable but not others,
I’m going to add a guard &quot;suite completed&quot; test to the suites that should be stable,
and keep flaky test on it’s own.
Then I’ll tell xUnit to allow for a number of failed tests, but no skipped ones.
If any test fails other than the ones I allow to be flaky,
it will also result in one or more skipped tests and will fail the build.&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;c1&quot;&gt;// The rest of the Jenkinsfile is unchanged.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Only the xUnit step() call is modified.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;XUnitBuilder&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;thresholds:&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;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SkippedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureThreshold:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;0&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Allow for a significant number of failures&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Keeping this threshold so that overwhelming failures are guaranteed&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;//     to still fail the build&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;FailedThreshold&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;failureThreshold:&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;nl&quot;&gt;tools:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;JUnitType&#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;reports/**&#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;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;tests/guineaPig.js&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// ... snip ...&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Assert Title 0 - E&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ... */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Assert Title 0 - Suite Completed&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// No assertion needed&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;afterEach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ... */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ... snip ...&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;title&quot;&gt;tests/guineaPig_1.js&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// ... snip ...&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Assert Title 1 - E&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ... */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

    &lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Guinea Pig Assert Title 1 - Suite Completed&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// No assertion needed&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;afterEach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ... */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ... snip ...&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 a few more runs, you can see the flaky test is still being flaky,
but it is no longer failing the build.  Meanwhile, if another test fails,
it will cause the &quot;suite completed&quot; test to be skipped, failing the job.
If this were a real project, the test owner could instrument and eventually fix
the test.  When they were confident they had stabilized the test the could add
a &quot;suite completed&quot; test after it to enforce it passing without changes to other
tests or framework.&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/2016-10-27/job-19-summary.png&quot; alt=&quot;Flaky tests don’t have to fail the build&quot; width=&quot;800&quot;&gt;
&lt;/img&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/2016-10-27/job-18-report.png&quot; alt=&quot;Results from flaky test&quot; width=&quot;800&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;Conclusion&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post has shown how to migrate from the JUnit plugin to the
xUnit plugin on an existing project in Jenkins pipeline.  It also covered how to
use the features of xUnit plugin to get more meaningful and effective Jenkins
reporting behavior.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What I didn’t show was how many other formats xUnit supports - from CCPUnit to MSTest.  You can
also write your own XSL for result formats not on the known/supported list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/xUnit+Plugin&quot;&gt;xUnit plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js&quot;&gt;bitwiseman/JS-Nightwatch.js&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saucelabs-sample-test-frameworks&quot;&gt;saucelabs-sample-test-frameworks&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/10/18/jenkins-world-2016-videos/</id>
<title>Jenkins World 2016 Session Videos</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-10-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/10/18/jenkins-world-2016-videos/" />
<author>
<name>lnewman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





The videos of the sessions from
Jenkins World 2016 are up!


I&#8217;ve updated the wrap-up posts with links to each of the sessions mentioned:




Jenkins Pipeline


Scaling Jenkins


Ask the Experts &amp; Demos




You can also find video from all the sessions
here.  Enjoy!...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The videos of the sessions from
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2016&lt;/a&gt; are up!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve updated the wrap-up posts with links to each of the sessions mentioned:&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/2016/09/24/jenkins-world-2016-wrap-up-pipeline&quot;&gt;Jenkins Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/09/27/jenkins-world-2016-wrap-up-scaling/&quot;&gt;Scaling Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/09/29/jenkins-world-2016-wrap-up-experts-demos/&quot;&gt;Ask the Experts &amp;amp; Demos&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;You can also find video from all the sessions
&lt;a href=&quot;https://www.cloudbees.com/juc/agenda&quot;&gt;here&lt;/a&gt;.  Enjoy!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/10/16/stage-lock-milestone/</id>
<title>Controlling the Flow with Stage, Lock, and Milestone</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-10-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/10/16/stage-lock-milestone/" />
<author>
<name>hrmpw</name>
</author>
<category term='pipeline'></category>
<category term='newfeatures'></category>
<summary>
This is a guest post by Patrick Wolf,
Director of Product Management at CloudBees.





Recently the Pipeline team began making several changes to improve the stage step and increase control of concurrent builds in Pipeline. Until now the stage step has been the catch-all for functionality related to the flow of builds through the Pipeline: grouping build steps into visualized stages, limiting concurrent builds, and discarding stale builds.


In order to improve upon each of these areas independently we decided to break this functionality into discrete steps rather than push more and more features into an already packed stage step.




stage - the stage...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/hrmpw&quot;&gt;Patrick Wolf&lt;/a&gt;,
Director of Product Management at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently the Pipeline team began making several changes to improve the &lt;code&gt;stage&lt;/code&gt; step and increase control of concurrent builds in Pipeline. Until now the &lt;code&gt;stage&lt;/code&gt; step has been the catch-all for functionality related to the flow of builds through the Pipeline: grouping build steps into visualized stages, limiting concurrent builds, and discarding stale builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to improve upon each of these areas independently we decided to break this functionality into discrete steps rather than push more and more features into an already packed &lt;code&gt;stage&lt;/code&gt; step.&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://wiki.jenkins.io/display/JENKINS/Pipeline+Stage+Step+Plugin&quot;&gt;stage&lt;/a&gt; - the &lt;code&gt;stage&lt;/code&gt; step remains but is now focused on grouping steps and providing boundaries for Pipeline segments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Lockable+Resources+Plugin&quot;&gt;lock&lt;/a&gt; - the &lt;code&gt;lock&lt;/code&gt; step throttles the number of concurrent builds in a defined section of the Pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Milestone+Step+Plugin&quot;&gt;milestone&lt;/a&gt; - the &lt;code&gt;milestone&lt;/code&gt; step automatically discards builds that will finish out of order and become stale.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Separating these concerns into explicit, independent steps allows for much greater control of Pipelines and broadens the set of possible use cases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;stage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage&quot; /&gt;Stage&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;stage&lt;/code&gt; step is a primary building block in Pipeline, dividing the steps of a Pipeline into explicit units and helping to visualize the progress using the &quot;Stage View&quot; plugin or &lt;a href=&quot;https://www.jenkins.io/projects/blueocean/&quot;&gt;&quot;Blue Ocean&quot;&lt;/a&gt;. Beginning with version 2.2 of &quot;Pipeline Stage Step&quot; plugin, the &lt;code&gt;stage&lt;/code&gt; step now requires a block argument, wrapping all steps within the defined stage. This makes the boundaries of where each &lt;code&gt;stage&lt;/code&gt; begins and ends obvious and predictable. In addition, the concurrency argument of &lt;code&gt;stage&lt;/code&gt; has now been removed to make this step more concise; responsibility for concurrency control has been delegated to the &lt;code&gt;lock&lt;/code&gt; step.&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;Build&#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;doSomething&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;echo $PATH&quot;&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;Omitting the block from &lt;code&gt;stage&lt;/code&gt; and using the concurrency argument are now deprecated in Pipeline. Pipelines using this syntax will continue to function but will produce a warning in the console log:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;Using the &#39;stage&#39; step without a block argument is deprecated&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This message is only a reminder to update your Pipeline scripts; none of your Pipelines will stop working. If we reach a point where the old syntax is to be removed we will make an announcement prior to the change. We do, however, recommend that you update your existing Pipelines to utilize the new syntax.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;note:&lt;/strong&gt; Stage View and Blue Ocean will both work with either the old &lt;code&gt;stage&lt;/code&gt; syntax or the new.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;lock&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lock&quot; /&gt;Lock&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Rather than attempt to limit the number of concurrent builds of a job using the &lt;code&gt;stage&lt;/code&gt;, we now rely on the &quot;Lockable Resources&quot; plugin and the &lt;code&gt;lock&lt;/code&gt; step to control this. The &lt;code&gt;lock&lt;/code&gt; step limits concurrency to a single build and it provides much greater flexibility in designating where the concurrency is limited.&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;lock&lt;/code&gt; can be used to constrain an entire &lt;code&gt;stage&lt;/code&gt; or just a segment:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;Build&#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;doSomething&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;lock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;myResource&#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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;locked build&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;lock&lt;/code&gt; can be also used to wrap multiple stages into a single concurrency unit:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;lock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;myResource&#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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Build&#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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Building&quot;&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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Testing&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;/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;milestone&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#milestone&quot; /&gt;Milestone&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;milestone&lt;/code&gt; step is the last piece of the puzzle to replace functionality originally intended for &lt;code&gt;stage&lt;/code&gt; and adds even more control for handling concurrent builds of a job. The &lt;code&gt;lock&lt;/code&gt; step limits the number of builds running concurrently in a section of your Pipeline while the &lt;code&gt;milestone&lt;/code&gt; step ensures that older builds of a job will not overwrite a newer build.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Concurrent builds of the same job do not always run at the same rate. Depending on the network, the node used, compilation times, test times, etc. it is always possible for a newer build to complete faster than an older build. For example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Build 1 is triggered&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build 2 is triggered&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build 2 builds faster than Build 1 and enters the Test stage sooner.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Rather than allowing Build 1 to continue and possibly overwrite the newer artifact produced in Build 2, you can use the &lt;code&gt;milestone&lt;/code&gt; step to abort Build 1:&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;Build&#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;milestone&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;s2&quot;&gt;&quot;Building&quot;&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;milestone&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;s2&quot;&gt;&quot;Testing&quot;&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 using the &lt;code&gt;input&lt;/code&gt; step or the &lt;code&gt;lock&lt;/code&gt; step a backlog of concurrent builds can easily stack up, either waiting for user input or waiting for a resource to become free. The &lt;code&gt;milestone&lt;/code&gt; step will automatically prune all older jobs that are waiting at these junctions.&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;milestone&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Proceed?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;milestone&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;Bookending an &lt;code&gt;input&lt;/code&gt; step like this allows you to select a specific build to proceed and automatically abort all antecedent builds.&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;milestone&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;resource:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;myResource&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;inversePrecedence:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;locked step&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;milestone&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;Similarly a pair of &lt;code&gt;milestone&lt;/code&gt; steps used with a &lt;code&gt;lock&lt;/code&gt; will discard all old builds waiting for a shared resource. In this example, &lt;code&gt;inversePrecedence: true&lt;/code&gt; instructs the &lt;code&gt;lock&lt;/code&gt; to begin most recent waiting build first, ensuring that the most recent code takes precedence.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;putting-it-all-together&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#putting-it-all-together&quot; /&gt;Putting it all together&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Each of these steps can be used independently of the others to control one aspect of a Pipeline or they can be combined to provide powerful, fine-grained control of every aspect of multiple concurrent builds flowing through a Pipeline. Here is a very simple example utilizing all three:&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;Build&#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;c1&quot;&gt;// The first milestone step starts tracking concurrent build order&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;milestone&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;node&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;s2&quot;&gt;&quot;Building&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;c1&quot;&gt;// This locked resource contains both Test stages as a single concurrency Unit.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Only 1 concurrent build is allowed to utilize the test resources at a time.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Newer builds are pulled off the queue first. When a build reaches the&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// milestone at the end of the lock, all jobs started prior to the current&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// build that are still waiting for the lock will be aborted&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lock&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;resource:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;myResource&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;inversePrecedence:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;node&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Unit Tests&#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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Unit Tests&quot;&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;System Tests&#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;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;System Tests&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;n&quot;&gt;milestone&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;c1&quot;&gt;// The Deploy stage does not limit concurrency but requires manual input&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// from a user. Several builds might reach this step waiting for input.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// When a user promotes a specific build all preceding builds are aborted,&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// ensuring that the latest code is always deployed.&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;Deploy&#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;input&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Deploy?&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;milestone&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;node&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;s2&quot;&gt;&quot;Deploying&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a more complete and complex example utilizing all these steps in a Pipeline check out the  &lt;a href=&quot;https://github.com/jenkinsci/workflow-aggregator-plugin/blob/8a69bb4506d270c4a1fc58580519a0bcac1b8bce/demo/repo/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt; provided with the &lt;a href=&quot;https://github.com/jenkinsci/workflow-aggregator-plugin/tree/8a69bb4506d270c4a1fc58580519a0bcac1b8bce/demo&quot;&gt;Docker image for demonstrating Pipeline&lt;/a&gt;. This is a working demo that can be quickly set up and run.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/09/30/jenkins-world-2016-wrap-up-complete/</id>
<title>Jenkins World 2016, That&#39;s a Wrap!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/30/jenkins-world-2016-wrap-up-complete/" />
<author>
<name>lnewman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.








This year&#8217;s Jenkins World conference
was a huge milestone for the Jenkins project - the first global event for the Jenkins community.
It brought users and contributors together to exchange ideas on the current state
of the project, celebrate accomplishments of the past year, and look ahead at all the exiting enhancements
coming down the pipe(line).


Contributor Summit

To kick off Jenkins World, we had a full day "Contributor Summit".
Jenkins is a distributed project with contributors from all over the globe.
Conferences like this are perfect time to get contributors together face-to-face,
to talk through current issues and...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-jenkins-world-wrap/jenkins-world-banner-pic.jpg&quot; alt=&quot;Jenkins World 2016&quot; height=&quot;200&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year’s &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; conference
was a huge milestone for the Jenkins project - the first global event for the Jenkins community.
It brought users and contributors together to exchange ideas on the current state
of the project, celebrate accomplishments of the past year, and look ahead at all the exiting enhancements
coming down the pipe(line).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributor-summit&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributor-summit&quot; /&gt;Contributor Summit&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To kick off Jenkins World, we had a full day &quot;Contributor Summit&quot;.
Jenkins is a distributed project with contributors from all over the globe.
Conferences like this are perfect time to get contributors together face-to-face,
to talk through current issues and upcoming plans for the project.
Some key topics discussed during this summit were:&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;Infrastructure&lt;/strong&gt; - In the past year, the Jenkins project has moved new domain name,
a statically generated website, and has entered a
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/18/announcing-azure-partnership&quot;&gt;partnership with Microsoft&lt;/a&gt;
to host to host infrastructure on Azure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt; - A year ago, there were five
&lt;a href=&quot;https://www.jenkins.io/projects/jam/&quot;&gt;Jenkins Area Meetups&lt;/a&gt;, today there are 37 around the
world, with ~7000 members.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt; - Daniel Beck has done a great job a &quot;Security Officer&quot; for the project over the last year.
Jenkins 2 includes tighter security out of the box, 9 security alerts have been addressed, and the
&lt;a href=&quot;https://www.jenkins.io/security/&quot;&gt;Security Team&lt;/a&gt; is continuing to evaluate threats as they are reported.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pipeline&lt;/strong&gt; - Pipeline has been a success and there many improvements on the way, including better
Pipeline Library support, a UI-based Pipeline Editor, and Declarative Pipeline syntax.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blue Ocean&lt;/strong&gt; - Blue Ocean announced their &quot;1.0 Beta&quot; release and discussed their roadmap.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage Pluggability&lt;/strong&gt; - One of the big upcoming goals is reducing Jenkins&#39;
dependence on local file system storage on the server system
(job configuration, build logs, etc.).  There was extensive
discussion of how to accomplish this goal.&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/2016-jenkins-world-wrap/contributors.jpg&quot; alt=&quot;Contributors Summit&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;keynote-the-state-of-jenkins-2016&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#keynote-the-state-of-jenkins-2016&quot; /&gt;Keynote: The State of Jenkins 2016&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next day,
&lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke&lt;/a&gt; gave a great
&lt;a href=&quot;https://www.cloudbees.com/jenkins-community-keynote&quot;&gt;keynote&lt;/a&gt;,
showing how far the project as come this year and where it is headed.
You can get the slides
&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-jenkins_world_keynote.pdf&quot;&gt;here&lt;/a&gt;
or see the full video below.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/NXjeHeIYRRI&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s Next?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overall, Jenkins World was a very enjoyable event. I’m sure everyone came away having
learned a lot and made many new connections.  I know I’m excited to see
what the coming year brings for Jenkins and the Jenkins community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t forget that there are many ways to continue
to build connections to the rest of the Jenkins community throughout the year, such as the
&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;Jenkins Online Meetup&lt;/a&gt; which
hosts online events year-round.  Or, see if there is a
&lt;a href=&quot;https://www.meetup.com/pro/jenkins/&quot;&gt;Jenkins Area Meetup (JAM)&lt;/a&gt; near you.  If
there isn’t, take a look at the
&lt;a href=&quot;https://www.jenkins.io/projects/jam/&quot;&gt;Jenkins Area Meetup page&lt;/a&gt; to see about starting one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks, and I hope to see you all and Jenkins World 2017!&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/2016-jenkins-world-wrap/mural-end.jpg&quot; alt=&quot;CommitStrip Mural&quot; /&gt;&lt;/span&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/2016/09/29/jenkins-world-2016-wrap-up-experts-demos/</id>
<title>Jenkins World 2016 Wrap-up - Ask the Experts &amp; Demos</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/29/jenkins-world-2016-wrap-up-experts-demos/" />
<author>
<name>lnewman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.








As I mentioned in my
previous post,
Jenkins World brought together
Jenkins users from organizations of all sizes.  It also brought together Jenkins
users of all skill levels; from beginners to experts (including to JAM
organizers, board members, and long time contributors).  A number
of those experts also volunteered to staff the Open Source Hub&#8217;s
"Ask the Experts" desk throughout the conference to answer Jenkins questions.
This included, but was not limited to:
Paul Allen,
R Tyler Croy,
James Dumay,
Jesse Glick,
Eddú Meléndez Gonzales,
Jon Hermansen,
Owen Mehegan,
Oleg Nenashev,
Liam Newman,
Christopher Orr,
Casey Vega,
Mark Waite,
Dean Yu,
and
Keith Zantow.





I actually chose to spend the majority of...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at CloudBees.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 2016&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I mentioned in my
&lt;a href=&quot;https://www.jenkins.io/blog/2016/09/27/jenkins-world-2016-wrap-up-scaling/&quot;&gt;previous post&lt;/a&gt;,
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; brought together
Jenkins users from organizations of all sizes.  It also brought together Jenkins
users of all skill levels; from beginners to experts (including to &lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;JAM&lt;/a&gt;
organizers, board members, and long time contributors).  A number
of those experts also volunteered to staff the Open Source Hub’s
&quot;Ask the Experts&quot; desk throughout the conference to answer Jenkins questions.
This included, but was not limited to:
&lt;a href=&quot;https://github.com/p4paul&quot;&gt;Paul Allen&lt;/a&gt;,
&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R Tyler Croy&lt;/a&gt;,
&lt;a href=&quot;https://github.com/i386&quot;&gt;James Dumay&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;,
&lt;a href=&quot;https://github.com/eddumelendez&quot;&gt;Eddú Meléndez Gonzales&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jonahermansen&quot;&gt;Jon Hermansen&lt;/a&gt;,
&lt;a href=&quot;https://github.com/omehegan&quot;&gt;Owen Mehegan&lt;/a&gt;,
&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;,
&lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
&lt;a href=&quot;https://github.com/orrc&quot;&gt;Christopher Orr&lt;/a&gt;,
&lt;a href=&quot;https://github.com/cvega&quot;&gt;Casey Vega&lt;/a&gt;,
&lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt;,
&lt;a href=&quot;https://github.com/dty&quot;&gt;Dean Yu&lt;/a&gt;,
and
&lt;a href=&quot;https://github.com/kzantow&quot;&gt;Keith Zantow&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/post-images/2016-jenkins-world-wrap/experts-0.jpg&quot; alt=&quot;Ask the Experts&quot; width=&quot;480&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I actually chose to spend the majority of my time at the booth. It was
fantastic to hear all the different ways people are using
Jenkins and wanting use Jenkins to do even more. I answered dozens of questions
on both days of the conference, often learning new things in the process of answering them.
And for questions that were beyond any one person’s knowledge, there was such a
breadth of expertise, very few questions were beyond our combined abilities.&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/2016-jenkins-world-wrap/experts-2.jpg&quot; alt=&quot;Ask the Experts&quot; width=&quot;480&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While &quot;Ask the Experts&quot; saw a lot traffic, the Open Source Hub’s lunch-time demos drew
really big crowds. They covered wide range of subjects in a quick succession and offered people
a chance to be introduced to new areas of in Jenkins without spending a whole session on them.
Some demos were only presented at lunch while others were abbreviated versions of
longer talks presented at other times during the conference.  Here’s the full list with related links:&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/2016-jenkins-world-wrap/demo-crowd.jpg&quot; alt=&quot;Demo Crowd&quot; width=&quot;480&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;a href=&quot;https://github.com/kzantow&quot;&gt;Keith Zantow&lt;/a&gt; gave a live demo of
&lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; in Action&lt;/strong&gt; on their
&lt;a href=&quot;https://ci.blueocean.io/blue&quot;&gt;live Jenkins instance&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/orrc&quot;&gt;Christopher Orr&lt;/a&gt; presented a lightning version of his talk
&lt;a href=&quot;https://www.cloudbees.com/continuous-build-and-delivery-pipelines-android&quot;&gt;&lt;strong&gt;Pipelines for building and deploying Android apps&lt;/strong&gt;&lt;/a&gt;
(&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-continuous_build_delivery_pip.pdf&quot;&gt;Slides&lt;/a&gt;)
(&lt;a href=&quot;https://youtu.be/Gn3ygjUMKUY&quot;&gt;video&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; showed a different way to
manage security with the
&lt;strong&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Ownership+Plugin&quot;&gt;Ownership plugin&lt;/a&gt; for Jenkins&lt;/strong&gt;
(&lt;a href=&quot;https://speakerdeck.com/onenashev/jw2016-ownership-plugin-demo&quot;&gt;Slides&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/alexsomai&quot;&gt;Alex Somai&lt;/a&gt; presented his
&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code (GSoC) 2016&lt;/a&gt; project, the
&lt;strong&gt;External Workspace Manager plugin for Jenkins Pipeline&lt;/strong&gt; (&lt;a href=&quot;https://youtu.be/lo8sZJt2WhM?t=6m58s&quot;&gt;GSOC Video&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt; discussed
&lt;strong&gt;Git plugin - large repos, submodule authentication and more&lt;/strong&gt;
(&lt;a href=&quot;https://www.jenkins.io/files/2016/jenkins-world/large-git-repos.pdf&quot;&gt;Slides&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt; gave a live demo of
&lt;strong&gt;Notifications with Jenkins Pipeline&lt;/strong&gt;
(based on &lt;a href=&quot;https://www.jenkins.io/blog/2016/07/18/pipeline-notifications/&quot;&gt;this blog post&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; talked about
&lt;strong&gt;Extending Pipeline with Libraries&lt;/strong&gt; using the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Shared+Groovy+Libraries+Plugin&quot;&gt;Pipeline Shared Groovy Libraries Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jonahermansen&quot;&gt;Jon Hermansen&lt;/a&gt; demonstrated some cool ways to use
&lt;strong&gt;Multibranch Pipelines + Git symbolic-ref&lt;/strong&gt; to optimize build times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R Tyler Croy&lt;/a&gt; showed the power of
&lt;strong&gt;Docker and Pipeline&lt;/strong&gt;
(&lt;a href=&quot;https://www.jenkins.io/files/2016/jenkins-world/jenkins-and-docker.pdf&quot;&gt;Slides&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R Tyler Croy&lt;/a&gt; also showed how easy it can be to migrate from
&lt;strong&gt;Freestyle to Pipeline&lt;/strong&gt;
(&lt;a href=&quot;https://www.jenkins.io/files/2016/jenkins-world/freestyle-to-pipelines.pdf&quot;&gt;Slides&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cvega&quot;&gt;Casey Vega&lt;/a&gt; gave a live demo,
&lt;strong&gt;&lt;code&gt;package.json&lt;/code&gt; and Jenkins&lt;/strong&gt;, on using &lt;code&gt;package.json&lt;/code&gt; to control all aspects of Jenkins builds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt; presented at lightning version of his talk,
&lt;a href=&quot;https://www.cloudbees.com/introducing-new-way-define-jenkins-pipelines&quot;&gt;&lt;strong&gt;A simpler way to define Jenkins Pipelines&lt;/strong&gt;&lt;/a&gt;
(&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-introducing_a_new_way_to_define_jenkins_pipelines_1.pdf&quot;&gt;Slides&lt;/a&gt;)
(&lt;a href=&quot;https://www.youtube.com/watch?v=ALvg4KK25JU&quot;&gt;Video&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;&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-jenkins-world-wrap/experts-3.jpg&quot; alt=&quot;Ask the Experts&quot; width=&quot;480&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to everyone who staffed the booth and gave demos.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, thanks to everyone who attended the demos and came by to ask questions.
If you have more questions, you don’t have to wait until next year’s Jenkins World.
Join the
&lt;a href=&quot;https://www.jenkins.io/content/mailing-lists/&quot;&gt;jenkinsci-users&lt;/a&gt; mailing list or the
&lt;a href=&quot;https://www.jenkins.io/chat/&quot;&gt;#jenkins IRC channel&lt;/a&gt; to
get help from experts around the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And finally, a special thanks to the Jenkins Events officer, &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;,
for getting the entire booth designed, prepared, and keeping everything
on track before, during, and after the conference.&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/2016-jenkins-world-wrap/experts-4.jpg&quot; alt=&quot;Ask the Experts&quot; width=&quot;480&quot; /&gt;&lt;/span&gt;
&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/2016/09/27/jenkins-world-2016-wrap-up-scaling/</id>
<title>Jenkins World 2016 Wrap-up - Scaling</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/27/jenkins-world-2016-wrap-up-scaling/" />
<author>
<name>lnewman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.








One of the great features of Jenkins is how far it
can scale, not only from a software perspective, but also from an
organizational one.  From a single Jenkins controller with one or two agents to a
multiple controller with thousands of agents, from a team of only a few people
to a whole company with multiple disparate departments and organizations,
you&#8217;ll find space where Jenkins is used.


Like any software or organization,
there are common challenges for increasing scale with Jenkins and some common best practices, but
there are also some unique solutions.  A big...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at CloudBees.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 2016&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the great features of Jenkins is how far it
can scale, not only from a software perspective, but also from an
organizational one.  From a single Jenkins controller with one or two agents to a
multiple controller with thousands of agents, from a team of only a few people
to a whole company with multiple disparate departments and organizations,
you’ll find space where Jenkins is used.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Like any software or organization,
there are common challenges for increasing scale with Jenkins and some common best practices, but
there are also some unique solutions.  A big conference like
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; brings users
from all scales together to see how people in other organizations at similar or
greater scale are solving similar problems.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a recap of the some of the sessions on scaling Jenkins,
with links to slides and videos shared by &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/159px-National_Public_Radio_logo.svg.png&quot; alt=&quot;159px National Public Radio logo.svg&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/milespj&quot;&gt;Paul Miles&lt;/a&gt; and
&lt;a href=&quot;https://twitter.com/jgrantd&quot;&gt;Grant Dickie&lt;/a&gt; of
&lt;a href=&quot;https://www.npr.org/&quot;&gt;NPR&lt;/a&gt; talked about
&lt;a href=&quot;https://www.cloudbees.com/jenkinsops-initiative-streamline-and-automate-jenkins&quot;&gt;&lt;strong&gt;JenkinsOps: An Initiative to Streamline and Automate Jenkins&lt;/strong&gt;&lt;/a&gt;.
They shared ways their team has used Jenkins to automate many of the
administrative tasks related to managing feature code branches,
handling deployments, running tests, and properly configuring their environments.
They also showed code samples and talked about future challenges in their quest
to achieve
&lt;a href=&quot;https://puppet.com/blog/continuous-delivery-vs-continuous-deployment-what-s-diff&quot;&gt;continuous deployment&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-jenkinsops_at_npr_-_final.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/qrAf5fjDTXI&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/Riot_Games_logo.png&quot; alt=&quot;Riot Games logo&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/maxfields&quot;&gt;Maxfield F Stewart&lt;/a&gt; of
&lt;a href=&quot;https://www.riotgames.com&quot;&gt;Riot Games&lt;/a&gt; showed how they built an
integrated Docker solution using Jenkins in
&lt;a href=&quot;https://www.cloudbees.com/thinking-inside-container-continuous-delivery-story&quot;&gt;&lt;strong&gt;Thinking Inside the Container: A Continuous Delivery Story&lt;/strong&gt;&lt;/a&gt;
He showed how their system allows engineers around the company to
submit Docker images as build environments.
This has let their containerized farm now create over 10,000 containers per week
and handles nearly 1,000 jobs at a rate of about 100 jobs per hour.
And they have done this using readily available, open
source Jenkins plugins. He also talked about how they settled on this design,
lessons learned, best practices, and how to build and scale other similar system.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-thinking_inside_the_container-_a_continuous_delivery_story.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/mMvFaEP5mP0&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/redhat.png&quot; alt=&quot;Red Hat&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/how-do-continuous-delivery-jenkins-pipeline-docker-and-kubernetes&quot;&gt;&lt;strong&gt;How to Do Continuous Delivery with Jenkins Pipeline, Docker and Kubernetes&lt;/strong&gt;&lt;/a&gt;,
presented by
&lt;a href=&quot;https://github.com/jstrachan&quot;&gt;James Strachan&lt;/a&gt; of
&lt;a href=&quot;https://www.redhat.com&quot;&gt;Red Hat&lt;/a&gt;, showed how to use Jenkins Pipeline with
Docker and Kubernetes to implement a complete end-to-end continuous delivery and
continuous improvement system using open source software for both microservices
and monolithic applications. He demonstrated how to
create or import projects, and have them automatically build, run
system and integration tests, stage, and finally deploy. He also showed to
manage and update those deployed applications using continuous
delivery practices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-jenkins-at-redhat-final-final.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://vimeo.com/173353537&quot;&gt;&lt;strong&gt;Watch the Video Demo from the Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/carlossg&quot;&gt;Carlos Sanchez&lt;/a&gt; of
&lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; discussed
&lt;a href=&quot;https://www.cloudbees.com/scaling-jenkins-docker-swarm-kubernetes-or-mesos&quot;&gt;&lt;strong&gt;Scaling Jenkins with Docker: Swarm, Kubernetes or Mesos?&lt;/strong&gt;&lt;/a&gt;
He compared various Docker Swarm, Apache Mesos, and Kubernetes in terms of their
ability to dynamically scale in Jenkins by running jobs inside containers.
He also discussed the pros and cons, best practices, level of Jenkins support for each
of these technologies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-scaling_jenkins_with_docker_swarm_kubernetes_or_mesos_.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/24X18e4GVbk&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/stephenc&quot;&gt;Stephen Connolly&lt;/a&gt; of
&lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; asked
&quot;&lt;a href=&quot;https://www.cloudbees.com/so-you-want-build-worlds-biggest-jenkins-cluster&quot;&gt;&lt;strong&gt;So, You Want to Build the World’s Biggest Jenkins Cluster?&lt;/strong&gt;&lt;/a&gt;&quot;
and explained how to do so.  He started with
real world results realized by Jenkins users who have built large clusters.
Next, he showed experiments around scaling some individual sub-components of Jenkins in
isolation to see what challenges have been faced when integrated. Finally,
he arrived at recipes for building Jenkins clusters with different scaling capabilities and
making existing Jenkins clusters more efficient.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-soyouwanttobuildtheworldslargestjenkinscluster_final.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/eGA8UuijgA4&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/splunk-logo-300x100.gif&quot; alt=&quot;splunk logo 300x100&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/bill-houston-4909412&quot;&gt;Bill Houston&lt;/a&gt; and
&lt;a href=&quot;https://www.linkedin.com/in/aliraza82&quot;&gt;Ali Raza&lt;/a&gt; of
&lt;a href=&quot;https://www.splunk.com/&quot;&gt;Splunk&lt;/a&gt;
gave a talk in two parts,
&lt;a href=&quot;https://www.cloudbees.com/jenkins-splunk-and-splunking-jenkins&quot;&gt;&lt;strong&gt;Jenkins at Splunk and Splunking Jenkins&lt;/strong&gt;&lt;/a&gt;
In the first part, Bill showed how Splunk uses Jenkins to implement their end-to-end CI system.
They discussed features and design goals, challenges they encountered, and how they addressed
these challenges.
In the second part, Ali showed how to use the Jenkins Splunk plugin.  Using plugin, he gathered
test results and Jenkins environment data, and delivered it to a Splunk indexer for analysis and presentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-jenkins_at_splunk.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/dlsEprySOrg&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/272px-Google_2015_logo.svg.png&quot; alt=&quot;272px Google 2015 logo.svg&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/david-hoover-4265245&quot;&gt;David Hoover&lt;/a&gt; of
&lt;a href=&quot;https://www.google.com/about/&quot;&gt;Google&lt;/a&gt; talked about
&lt;a href=&quot;https://www.cloudbees.com/jenkins-inside-google&quot;&gt;&lt;strong&gt;Jenkins inside Google&lt;/strong&gt;&lt;/a&gt;.
Last year, they
&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/02-01-1600&quot;&gt;presented&lt;/a&gt;
their initial investigations and stress testing as they
prepared to deploy a large-scale Jenkins installation at Google. Now, with a
year of real-world use under their belts, they returned to present on how their
expectations held up, what new issues they encountered, how they have addressed those issues, and
the challenges and opportunities they see ahead.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-jenkins_inside_google.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/7ERV9C20GSE&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&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/2016/09/24/jenkins-world-2016-wrap-up-pipeline/</id>
<title>Jenkins World 2016 Wrap-up - Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/24/jenkins-world-2016-wrap-up-pipeline/" />
<author>
<name>lnewman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.








As someone who has managed Jenkins for years and manually managed jobs, I think
pipeline is fantastic. I spent much of the conference manning the
Ask the Experts desk of the
"Open Source Hub" and was glad to find I was not alone in that sentiment.
The questions were not "Why should I use Pipeline?", but "How do I do this in Pipeline?"


Everyone was interested in showing what they have been able to accomplish,
learning about best practices, and seeing what new features were on the horizon.
The sessions and demos on Pipeline that
I saw were...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at CloudBees.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 2016&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As someone who has managed Jenkins for years and manually managed jobs, I think
pipeline is fantastic. I spent much of the conference manning the
&lt;a href=&quot;https://www.jenkins.io/blog/2016/08/26/ask-the-experts-jenkins-world/&quot;&gt;Ask the Experts&lt;/a&gt; desk of the
&quot;Open Source Hub&quot; and was glad to find I was not alone in that sentiment.
The questions were not &quot;Why should I use Pipeline?&quot;, but &quot;How do I do this in Pipeline?&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Everyone was interested in showing what they have been able to accomplish,
learning about best practices, and seeing what new features were on the horizon.
The sessions and &lt;a href=&quot;https://www.jenkins.io/blog/2016/08/30/ask-experts-demos/&quot;&gt;demos&lt;/a&gt; on Pipeline that
I saw were all well attended, but no one could have seen all of them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a recap of the some of the sessions on Jenkins Pipeline,
with links to slides and videos shared by &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; discussed the past, present, and future of Jenkins Pipeline in
&lt;a href=&quot;https://www.cloudbees.com/directions-pipeline&quot;&gt;&lt;strong&gt;Directions for Pipeline&lt;/strong&gt;&lt;/a&gt;.
He reviewed a broad range of improvements made to Pipeline over the last year, including
syntax, documentation, plugin support, and stability.  He reviewed the changes
currently underway.  He also pointed out that many of the improvements have been
driven by user feedback and invited everyone to continue to participate in making
pipeline even better.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-directions_for_pipeline.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/51fndpAWpYQ&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/nextsource_logo.jpg&quot; alt=&quot;Nextsource&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In
&lt;a href=&quot;https://www.cloudbees.com/pipelining-devops-jenkins-and-aws&quot;&gt;&lt;strong&gt;Pipelining DevOps with Jenkins and AWS&lt;/strong&gt;&lt;/a&gt;,
&lt;a href=&quot;https://www.linkedin.com/in/iamjimmyray&quot;&gt;Jimmy Ray&lt;/a&gt;
of
&lt;a href=&quot;https://www.nextsource.com/&quot;&gt;nextSource&lt;/a&gt; showed how Pipeline can be used to automate CI/CD build processes,
and how to integrate Jenkins and Pipeline with AWS.
He also discussed some admin-level considerations,
such as how to install Jenkins on EC2
and the merits of &quot;LTS&quot; and &quot;latest build&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-pipelining_devops_with_jenkins_and_aws.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/vP8sNGGIEGY&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-jenkins-world-wrap/android-pipeline.png&quot; alt=&quot;Continuous Build and Delivery Pipelines for Android&quot; width=&quot;240&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/orrc&quot;&gt;Christopher Orr&lt;/a&gt; examined how to create
&quot;&lt;a href=&quot;https://www.cloudbees.com/continuous-build-and-delivery-pipelines-android&quot;&gt;&lt;strong&gt;Continuous Build and Delivery Pipelines for Android&lt;/strong&gt;&lt;/a&gt;&quot;
applications.
He showed how to set up Android-capable build agents, ensure traceable application releases,
reporting warnings, run various types of tests, and deploy and app to Google Play.
This included live demonstrations and discussion of best practices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-continuous_build_delivery_pip.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/Gn3ygjUMKUY&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-jenkins-world-wrap/declarative-pipeline.png&quot; alt=&quot;A New Way to Define Jenkins Pipelines&quot; width=&quot;240&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt; presented
&lt;a href=&quot;https://www.cloudbees.com/introducing-new-way-define-jenkins-pipelines&quot;&gt;&lt;strong&gt;A New Way to Define Jenkins Pipelines&lt;/strong&gt;&lt;/a&gt;.
He showed the next evolution for Pipeline, based on a simpler declarative model.
This declarative syntax for Pipeline still supports the creation of complex pipelines,
including complete build environments, post-build actions, and notifications, while
also being easier to understand. This declarative syntax also makes in it easier to
implement other interesting scenarios such as early validation of pipelines and
a visual pipeline editor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-introducing_a_new_way_to_define_jenkins_pipelines_1.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/ALvg4KK25JU&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/perforce.png&quot; alt=&quot;Perforce&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In
&lt;a href=&quot;https://www.cloudbees.com/birds-feather-session-perfecting-your-development-tools-updates-helix-plugin-jenkins&quot;&gt;&lt;strong&gt;Perfecting Your Development Tools: Updates to the Helix Plugin for Jenkins&lt;/strong&gt;&lt;/a&gt;,
&lt;a href=&quot;https://github.com/p4paul&quot;&gt;Paul Allen&lt;/a&gt; of
&lt;a href=&quot;https://www.perforce.com/&quot;&gt;Perforce&lt;/a&gt; walked through using Perforce’s &quot;Monorepo&quot; model with Jenkins Pipeline.
He explained in detail how to work with the Perforce
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/P4+Plugin&quot;&gt;&quot;P4&quot; plugin&lt;/a&gt; in Jenkins,
including credential passing and workspace management.
Of particular interest was his side-by-side comparison the various actions done with the Jenkins UI vs Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-an_introduction_to_the_p4_plugin_and_update_on_the_latest_features.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-jenkins-world-wrap/faster-pipelines-code.png&quot; alt=&quot;Building Pipelines To Be Faster&quot; width=&quot;240&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/svanoort&quot;&gt;Sam Van Oort&lt;/a&gt;
demonstrated strategies for faster pipelines in
&lt;a href=&quot;https://www.cloudbees.com/need-speed-building-pipelines-be-faster&quot;&gt;&lt;strong&gt;The Need For Speed: Building Pipelines To Be Faster&lt;/strong&gt;&lt;/a&gt;.
He discussed various elements that contribute to making pipelines faster or slower,
such a number of resources and latency.  He then showed several best practices
for constructing pipelines that have lower turnaround times and reduced resource use.
He also reviewed plugins and tools that can help analyze and visualize pipeline
performance, including the Pipeline Stage View plugin and Blue Ocean.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-the_need_for_speed-_building_pipelines_to_be_faster.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/7w2uFA5JPLI&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rsandell&quot;&gt;Bobby Sandell&lt;/a&gt; and
&lt;a href=&quot;https://github.com/jtnord&quot;&gt;James T. Nord&lt;/a&gt; talked about what not to do with Pipeline in
&lt;a href=&quot;https://www.cloudbees.com/no-you-shouldnt-do-lessons-using-pipeline&quot;&gt;&lt;strong&gt;No, You Shouldn’t Do That! Lessons from Using Pipeline&lt;/strong&gt;&lt;/a&gt;.
They told the story of their own experiences as early adopters of
Jenkins Pipeline at CloudBees. They described a number of key scenarios they attempted
to address, detailed various mistakes and false starts, and finally share what
they learned in each case.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-no_you_shouldnt_do_that_lessons_from_using_pipeline.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/lLZwTMFf9GI&quot;&gt;&lt;strong&gt;Stream Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-jenkins-world-wrap/google-summer-of-code.png&quot; alt=&quot;Google Summer of Code&quot; width=&quot;240&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/alexsomai&quot;&gt;Alexandru Somai&lt;/a&gt; gave a
&lt;a href=&quot;https://www.cloudbees.com/lightning-talks&quot;&gt;lightning talk&lt;/a&gt; on his
&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code (GSoC) 2016&lt;/a&gt; project,
&quot;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/External+Workspace+Manager+Plugin&quot;&gt;External Workspace Manager Plugin&lt;/a&gt; for Jenkins Pipeline&quot;.
The build workspace for Jenkins projects may become very large.
Alex showed how the External Workspace Manager plugin addresses this issue,
adding support for managing and reusing the same workspace between multiple pipeline builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A recording of his presentation for GSOC is available
&lt;a href=&quot;https://youtu.be/lo8sZJt2WhM?t=6m58s&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/redhat.png&quot; alt=&quot;Red Hat&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/how-do-continuous-delivery-jenkins-pipeline-docker-and-kubernetes&quot;&gt;&lt;strong&gt;How to Do Continuous Delivery with Jenkins Pipeline, Docker and Kubernetes&lt;/strong&gt;&lt;/a&gt;,
presented by
&lt;a href=&quot;https://github.com/jstrachan&quot;&gt;James Strachan&lt;/a&gt; of
&lt;a href=&quot;https://www.redhat.com&quot;&gt;Red Hat&lt;/a&gt;, showed how to use Jenkins Pipeline with
Docker and Kubernetes to implement a complete end-to-end continuous delivery and
continuous improvement system using open source software for both microservices
and monolithic applications. He demonstrated how to
create or import projects, and have them automatically build, run
system and integration tests, stage, and finally deploy. He also showed to
manage and update those deployed applications using continuous
delivery practices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/2016-jenkins-world-jenkins-at-redhat-final-final.pdf&quot;&gt;&lt;strong&gt;Download Presentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://vimeo.com/173353537&quot;&gt;&lt;strong&gt;Stream Demo Video&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&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/2016/09/21/jenkins-world-2016-wrap-up/</id>
<title>Jenkins World 2016 Wrap-up - Introduction</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/21/jenkins-world-2016-wrap-up/" />
<author>
<name>lnewman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.








That&#8217;s a Wrap!

Any way you look at it, last week&#8217;s Jenkins World Conference 2016 was a huge success.


In 2011, a few hundred users gathered in San Francisco for the first "Jenkins User Conference".
Over successive years, this grew into several yearly regional Jenkins user conferences.
This year, over 1,300 people came from around the world to "Jenkins World 2016",
the first global event for the Jenkins community.





This year&#8217;s Jenkins World conference included:







Keynote presentation by Jenkins creator, Kohsuke Kawaguchi, announcing a number of great new Jenkins project features, such as "Blue Ocean".


More than 50...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 2016&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;thats-a-wrap&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thats-a-wrap&quot; /&gt;That’s a Wrap!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Any way you look at it, last week’s Jenkins World Conference 2016 was a huge success.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2011, a few hundred users gathered in San Francisco for the first &quot;Jenkins User Conference&quot;.
Over successive years, this grew into several yearly regional Jenkins user conferences.
This year, over 1,300 people came from around the world to &quot;Jenkins World 2016&quot;,
the first global event for the Jenkins community.&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/2016-jenkins-world-wrap/kohsuke-keynote.jpg&quot; alt=&quot;Kohsuke Kawaguchi Keynote&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year’s Jenkins World conference included:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2016-jenkins-world-wrap/blue-ocean-sticker.jpg&quot; alt=&quot;Stickers!&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Keynote presentation by Jenkins creator, Kohsuke Kawaguchi, announcing a number of great new Jenkins project features, such as &quot;Blue Ocean&quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More than 50 sessions on everything from the new &quot;Blue Ocean&quot; UI, to &quot;Continuous Security&quot; to &quot;Dockerizing Jenkins&quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins Open-source Hub, with &quot;Ask the Experts&quot; and demos by 20+ Jenkins contributors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Booths from 30+ sponsors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stickers!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the next week, I’ll be posting highlights from the event,
including slides, videos, and links to other useful resources.  Stay tuned!&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/2016/09/20/jom-plugin-development/</id>
<title>Jenkins Online Meetup report. Plugin Development - WebUI</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/20/jom-plugin-development/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='meetup'></category>
<category term='event'></category>
<summary>
On September 6th we had a Jenkins Online Meetup.
This meetup was the second event in the series of Plugin Development meet ups.
At this meetup we were talking about Jenkins Web UI development.







Talks

1) Classic Jenkins UI framework -
Daniel Beck


In the first part of his talk, Daniel presented how Stapler, the web framework used in Jenkins, works, and how you can add to the set of URLs handled by Jenkins.
In the second part he was talking about creating new views using Jelly and Groovy, and how to add new content to existing views.


Keywords:
Stapler,
Jelly,
Groovy-defined UIs


2) Developing modern Jenkins UIs with Javascript -
Tom Fennelly


Feel...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On September 6th we had a Jenkins Online Meetup.
This meetup was the &lt;strong&gt;second&lt;/strong&gt; event in the series of Plugin Development meet ups.
At this meetup we were talking about Jenkins Web UI development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/jams/OnlineMeetup/logo.png&quot; alt=&quot;logo&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;talks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#talks&quot; /&gt;Talks&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;1) Classic Jenkins UI framework -
&lt;a href=&quot;https://github.com/daniel-beck/&quot;&gt;Daniel Beck&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the first part of his talk, Daniel presented how Stapler, the web framework used in Jenkins, works, and how you can add to the set of URLs handled by Jenkins.
In the second part he was talking about creating new views using Jelly and Groovy, and how to add new content to existing views.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Keywords:&lt;/strong&gt;
&lt;a href=&quot;https://github.com/stapler/&quot;&gt;Stapler&lt;/a&gt;,
Jelly,
Groovy-defined UIs&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2) Developing modern Jenkins UIs with Javascript -
&lt;a href=&quot;https://github.com/tfennelly&quot;&gt;Tom Fennelly&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel that Jenkins UI is a bit old? You are not alone.
In addition to the old stack Jenkins offers a framework for writing UI components in Javascript with help of Node.js.
Tom presented this new engine, which is being used in new Jenkins Web UI components like Jenkins installation wizard.
He also provided several examples from the BlueOcean project he is working on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Keywords:&lt;/strong&gt;
Node.js,
ReactJS,
&lt;a href=&quot;https://www.npmjs.com/package/jenkins-js-builder&quot;&gt;Jenkins JS Builder&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkinsci/jenkins-design-language&quot;&gt;Jenkins Design Language&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean/&quot;&gt;Blue Ocean&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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.meetup.com/Jenkins-online-meetup/&quot;&gt;Meetup page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/233378840/&quot;&gt;Event page: Plugin Development. Web UI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/events/c8vnv4esvvmg1u83fhugc86meuo&quot;&gt;Webinar recording&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;want-to-conduct-a-meetup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#want-to-conduct-a-meetup&quot; /&gt;Want to conduct a meetup?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are looking for speakers, who would be interested to share their experience about Jenkins best-practices, war stories and plugin development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested to conduct a presentation,
please contact meetup organizers using meetup.com “contact organizers” feature
or via the &lt;a href=&quot;mailto:events@lists.jenkins-ci.org&quot;&gt;events@lists.jenkins-ci.org&lt;/a&gt; mailing list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/09/19/blueocean-beta-declarative-pipeline-pipeline-editor/</id>
<title>Announcing the Blue Ocean beta, Declarative Pipeline and Pipeline Editor</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/19/blueocean-beta-declarative-pipeline-pipeline-editor/" />
<author>
<name>i386</name>
</author>
<category term='blueocean'></category>
<category term='ux'></category>
<category term='pipeline'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
At Jenkins World on Wednesday 14th of September, the Jenkins project was happy to
introduce the beta release of Blue Ocean. Blue Ocean is the new user experience
for Jenkins, built from the ground up to take advantage of Jenkins Pipeline.
It is an entire rethink of the way that modern developers will use Jenkins.


Blue Ocean is available today via the Jenkins Update Center for Jenkins users
running 2.7.1 and above.


Get the beta

Just search for BlueOcean beta in the Update Center, install it,
browse to the dashboard, and then click the Try BlueOcean UI button on the dashboard.



Whats included?

Back in April we open sourced Blue...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At Jenkins World on Wednesday 14th of September, the Jenkins project was happy to
introduce the beta release of Blue Ocean. Blue Ocean is the new user experience
for Jenkins, built from the ground up to take advantage of Jenkins Pipeline.
It is an entire rethink of the way that modern developers will use Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is available today via the Jenkins Update Center for Jenkins users
running 2.7.1 and above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;get-the-beta&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-the-beta&quot; /&gt;Get the beta&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just search for &lt;em&gt;BlueOcean beta&lt;/em&gt; in the Update Center, install it,
browse to the dashboard, and then click the &lt;em&gt;Try BlueOcean UI&lt;/em&gt; button on the dashboard.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-included&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-included&quot; /&gt;Whats included?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/26/introducing-blue-ocean/&quot;&gt;Back in April we open sourced Blue Ocean&lt;/a&gt;
and shared our vision with the community. We’re very happy that all the things we showed you then have
shipped in the beta (software projects run &lt;strong&gt;on time&lt;/strong&gt;?!).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a refresher on Blue Ocean, watch this short video:&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;https://www.youtube-nocookie.com/embed/3dITffteCD4?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;declarative-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#declarative-pipeline&quot; /&gt;Declarative Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have heard from the community about the usability of &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Jenkins
Pipeline&lt;/a&gt;. Much of the feedback we received was to a desire to
&lt;strong&gt;configure&lt;/strong&gt; Pipelines rather than &lt;strong&gt;script&lt;/strong&gt; them, and to make it easy for beginners
to get started with their first Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is how &lt;strong&gt;Declarative Pipeline&lt;/strong&gt; was born. We’ve introduced a new method whereby
you declare how you want your Pipeline to look rather than using Pipeline Script
 - it’s configuration rather than code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a small example of a Declarative Pipeline for nodejs that runs the whole
Pipeline inside a Docker container:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;pipeline {
  agent &lt;span style=&quot;color:#606&quot;&gt;docker&lt;/span&gt;:&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;node:6.3&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  stages {
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;npm --version&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;npm install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }
    stage (&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;npm test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;node(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
  docker.image(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;node:6.3&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;).inside {
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;npm --version&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
      sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;npm install&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }

    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;npm test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Docker support in Declarative Pipeline allows you to version your application code,
Jenkins Pipeline configuration, and the environment where your pipeline will run,
all in a single repository. It’s a crazy powerful combination.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Declarative Pipeline introduces the &lt;code&gt;postBuild&lt;/code&gt; section that makes it
easy to run things conditionally at the end of your Pipeline without the
complexity of the &lt;code&gt;try…​ catch&lt;/code&gt; of Pipeline script.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;pipeline-block&quot;&gt;  &lt;div class=&quot;listingblock pipeline-declarative&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Declarative Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;postBuild {
  always {
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;This will always run&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  }
  success {
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;This will run only if successful&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  }
  failure {
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;This will run only if failed&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  }
  unstable {
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;This will run only if the run was marked as unstable&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  }
  changed {
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;This will run only if the state of the Pipeline has changed&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;For example, the Pipeline was previously failing but is now successful&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;... or the other way around :)&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;  &lt;div class=&quot;pipeline-script-expand&quot;&gt;
    &lt;a href=&quot;#&quot; onclick=&quot;javascript:$(this).parent().siblings(&amp;apos;.pipeline-script&amp;apos;).toggle(); return false;&quot;&gt;Toggle Scripted Pipeline&lt;/a&gt;
    &lt;em&gt;(Advanced)&lt;/em&gt;
  &lt;/div&gt;
  &lt;div class=&quot;listingblock pipeline-script&quot; style=&quot;display: none&quot;&gt;
    &lt;div class=&quot;title&quot;&gt;Jenkinsfile (Scripted Pipeline)&lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
  &lt;pre class=&quot;CodeRay highlight nowrap&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;node(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
  &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;try&lt;/span&gt; {
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;build&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      &lt;span style=&quot;color:#777&quot;&gt;/* .. snip .. */&lt;/span&gt;
    }
    stage(&lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      &lt;span style=&quot;color:#777&quot;&gt;/* .. snip .. */&lt;/span&gt;
    }

    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;This will run only if successful&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  }
  &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;catch&lt;/span&gt; (exc) {
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; (currentBuild.result == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;UNSTABLE&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;This will run only if the run was marked as unstable&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }
    &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;if&lt;/span&gt; (currentBuild.result == &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;FAILURE&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;) {
      sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;This will run only if failed&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
    }
  }
  &lt;span style=&quot;color:#080;font-weight:bold&quot;&gt;finally&lt;/span&gt; {
    sh &lt;span style=&quot;background-color:hsla(0,100%,50%,0.05)&quot;&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;span style=&quot;color:#D20&quot;&gt;echo &quot;This will always run&quot;&lt;/span&gt;&lt;span style=&quot;color:#710&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And there is so much more!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have the Blue Ocean beta installed you already have Declarative Pipeline.
While Declarative Pipeline is still alpha at the moment, we do encourage you to
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/getting%20started&quot;&gt;follow our getting started guide&lt;/a&gt;,
 give us feedback on the &lt;a href=&quot;https://www.jenkins.io/content/mailing-lists/&quot;&gt;Jenkins Users mailing list&lt;/a&gt;
 or file bugs &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;against the &#39;pipeline-model-definition&#39; component in JIRA&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;introducing-the-pipeline-editor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-the-pipeline-editor&quot; /&gt;Introducing the Pipeline Editor&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline Editor is a graphical user interface that gives Jenkins users the
simplest way yet to get started with creating Pipelines in Jenkins. It will also
save a lot of time for intermediate and advanced Jenkins users as a way to author
Pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you build your Pipeline in the Editor and click the save button, the editor
will commit a new &lt;strong&gt;Jenkinsfile&lt;/strong&gt; back to your repository in the form of the new
Declarative Pipeline. When you want to edit again, Jenkins will read it from
your repository exactly how you saw it previously.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline Editor is a work in progress and should arrive in a beta release soon.&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/blueocean/pipeline-editor.png&quot; alt=&quot;Personalized dashboard&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;thank-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thank-you&quot; /&gt;Thank you&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks for reading our news from Jenkins World and be sure to check the blog
for regular updates!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d also like to thank our amazing community for their feedback and support
as we change the way software teams around the world use Jenkins. We couldn’t
do this without you.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/09/09/take-the-2016-jenkins-survey-blog/</id>
<title>Take the 2016 Jenkins Survey!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/09/take-the-2016-jenkins-survey-blog/" />
<author>
<name>bvdawson</name>
</author>
<category term='jenkins'></category>
<summary>
This is a guest post by Brian
Dawson on behalf of CloudBees, where he works as a DevOps Evangelist
responsible for developing and sharing continuous delivery and DevOps best
practices. He also serves as the CloudBees Product Marketing Manager for
Jenkins.





Once again it’s that time of year when CloudBees sponsors the
Jenkins Community Survey to
assist the community with gathering objective insights into how jenkins is
being used and what users would like to see in the Jenkins project.


Your personal information (name, email address and company) will NOT be used by CloudBees for
sales or marketing.


As an added incentive to take the survey, CloudBees will enter participants
into a...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://twitter.com/brianvdawson&quot;&gt;Brian
Dawson&lt;/a&gt; on behalf of CloudBees, where he works as a DevOps Evangelist
responsible for developing and sharing continuous delivery and DevOps best
practices. He also serves as the CloudBees Product Marketing Manager for
Jenkins.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once again it’s that time of year when CloudBees sponsors the
&lt;a href=&quot;https://www.surveymonkey.com/r/jenkins2016&quot;&gt;Jenkins Community Survey&lt;/a&gt; to
assist the community with gathering objective insights into how jenkins is
being used and what users would like to see in the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Your personal information (name, email address and company) will NOT be used by CloudBees for
sales or marketing.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As an added incentive to take the survey, &lt;strong&gt;CloudBees will enter participants
into a drawing for a free pass to Jenkins World 2017 (1st prize) and a $100
Amazon Gift Card (2nd prize).&lt;/strong&gt; The survey will close at the end of September, so
click the link at the end of the blog post to get started!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All participants will be able to access reports summarizing survey results. If
you’re curious about what insights your input will provide, see the results of
last year’s 2015 survey:&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/files/2015-Jenkins-Community-Survey-Results.pdf&quot;&gt;2015 Community Survey Results (PDF)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/files/State-of-Jenkins-Infographic-2015.pdf&quot;&gt;State of Jenkins Infographic (PDF)&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;Your feedback helps capture a bigger picture of
community trends and needs. There are laws that govern prize giveaways and
eligibility; CloudBees has compiled all those fancy
&lt;a href=&quot;https://www.cloudbees.com/blog/2016-jenkins-community-survey&quot;&gt;terms and conditions here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please take the survey and let your voice be heard - it will take less than 10
minutes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.surveymonkey.com/r/jenkins2016&quot;&gt;&lt;strong&gt;Take me to the survey&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/09/08/continuous-delivery-of-infra/</id>
<title>Continuous Delivery of Infrastructure with Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/08/continuous-delivery-of-infra/" />
<author>
<name>rtyler</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Jenkins World speaker
R Tyler Croy, infrastructure maintainer for the
Jenkins project.








I don&#8217;t think I have ever met a tools, infrastructure, or operations team that
did not have a ton of work to do. The Jenkins project&#8217;s
infrastructure
"team" is no different; too much work, not enough time. In lieu of hiring more
people, which isn&#8217;t always an option, I have found heavy automation and
continuous delivery pipelines to be two solutions within reach of the
over-worked infrastructure team.


As a big believer in the concept of "Infrastructure as Code", I have been,
slowly but surely, moving the project&#8217;s infrastructure from manual tasks to
code,...
</summary>
<content type='html'>
&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;
This is a guest post by Jenkins World speaker
&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R Tyler Croy&lt;/a&gt;, infrastructure maintainer for the
Jenkins project.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I don’t think I have ever met a tools, infrastructure, or operations team that
did not have a ton of work to do. The Jenkins project’s
&lt;a href=&quot;https://github.com/jenkins-infra&quot;&gt;infrastructure&lt;/a&gt;
&quot;team&quot; is no different; too much work, not enough time. In lieu of hiring more
people, which isn’t always an option, I have found heavy automation and
continuous delivery pipelines to be two solutions within reach of the
over-worked infrastructure team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a big believer in the concept of &quot;Infrastructure as Code&quot;, I have been,
slowly but surely, moving the project’s infrastructure from manual tasks to
code, whether implemented in our
&lt;a href=&quot;https://github.com/jenkins-infra/jenkins-infra&quot;&gt;Puppet code-base&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jenkins-infra/ircbot&quot;&gt;Docker containers&lt;/a&gt;,
or even as
&lt;a href=&quot;https://github.com/jenkins-infra/azure/tree/master/machines&quot;&gt;machine specifications&lt;/a&gt;
with
&lt;a href=&quot;https://packer.io&quot;&gt;Packer&lt;/a&gt;.
The more of our infrastructure that is &lt;em&gt;code&lt;/em&gt;, the more we can apply continuous
delivery practices to consistently and reliably build, test and deliver our
infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This approach integrates nicely with
&lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Jenkins Pipeline&lt;/a&gt;,
allowing us to also define our continuous delivery pipelines themselves as
code. For example, by sanity-checking our BIND zone files:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dockerImage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;rtyler/jenkins-infra-builder&#39;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dockerImage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;inside&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;/usr/sbin/named-checkzone jenkins-ci.org dist/profile/files/bind/jenkins-ci.org.zone&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/usr/sbin/named-checkzone jenkins.io dist/profile/files/bind/jenkins.io.zone&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or delivering our Docker containers automatically to
&lt;a href=&quot;https://hub.docker.com&quot;&gt;Docker Hub&lt;/a&gt;
, with a &lt;code&gt;Jenkinsfile&lt;/code&gt; such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Jenkinsfile&lt;/div&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/* Get our abbreviated SHA-1 to uniquely identify this build */&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shortCommit&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;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;script:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;git rev-parse HEAD&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;returnStdout:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;take&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&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;s1&quot;&gt;&#39;Build ircbot&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;JAVA_HOME=${tool &#39;jdk8&#39;}&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;PATH+MVN=${tool &#39;mvn&#39;}/bin&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;make bot&#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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;whale&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Build container&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;whale&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;jenkinsciinfra/ircbot:build${shortCommit}&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;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Deploy container&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;cm&quot;&gt;/* Push to Docker Hub */&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;whale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;push&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;In
&lt;a href=&quot;https://www.cloudbees.com/continuous-delivery-infrastructure-jenkins&quot;&gt;my talk at Jenkins World&lt;/a&gt;
(September 14th, 3:00 - 3:45pm in Exhibit Hall A-1) I will discuss these
Jenkinsfiles along with some of the strategies, patterns and code used with the
Jenkins project’s
&lt;a href=&quot;https://github.com/jenkins-infra&quot;&gt;open source&lt;/a&gt;
infrastructure to get the most out of the team’s limited time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;R Tyler will be
&lt;a href=&quot;https://www.cloudbees.com/continuous-delivery-infrastructure-jenkins&quot;&gt;presenting&lt;/a&gt;
more about continuous delivery of infrastructure at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt;
in September.  Register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for 20% off your full conference
pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/09/07/pipeline-at-jenkins-world/</id>
<title>Pipeline at Jenkins World 2016</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/07/pipeline-at-jenkins-world/" />
<author>
<name>rtyler</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by R. Tyler Croy, who is a
long-time contributor to Jenkins and the primary contact for Jenkins project
infrastructure. He is also a Jenkins Evangelist at
CloudBees, Inc.









I have been heavily using Jenkins Pipeline for just about
every Jenkins-related project I have contributed to over the past year. Whether I am
building and publishing Docker
containers, testing
infrastructure code or
publishing this very web
site, I have been adding a Jenkinsfile to nearly every Git repository I
touch.


Implementing Pipeline has been rewarding, but has not been without its own
challenges. That&#8217;s why I&#8217;m excited to see lots of different Jenkins Pipeline
related content in the agenda at
Jenkins...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt;, who is a
long-time contributor to Jenkins and the primary contact for Jenkins project
infrastructure. He is also a Jenkins Evangelist at
&lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have been heavily using &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Jenkins Pipeline&lt;/a&gt; for just about
every Jenkins-related project I have contributed to over the past year. Whether I am
building and publishing &lt;a href=&quot;https://github.com/jenkins-infra/ircbot&quot;&gt;Docker
containers&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkins-infra/jenkins-infra&quot;&gt;testing
infrastructure code&lt;/a&gt; or
&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io&quot;&gt;publishing this very web
site&lt;/a&gt;, I have been adding a &lt;code&gt;Jenkinsfile&lt;/code&gt; to nearly every Git repository I
touch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Implementing Pipeline has been rewarding, but has not been without its own
challenges. That’s why I’m excited to see &lt;em&gt;lots&lt;/em&gt; of different Jenkins Pipeline
related content in the &lt;a href=&quot;https://www.cloudbees.com/juc/agenda&quot;&gt;agenda&lt;/a&gt; at
Jenkins World.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I don’t think it’s possible for a single person to attend all of the Pipeline
talks, or the Pipeline-related &lt;a href=&quot;https://www.jenkins.io/blog/2016/08/30/ask-experts-demos/&quot;&gt;demos&lt;/a&gt;
in the &quot;Open Source Hub&quot;, but fortunately &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;
will be recording the sessions. If you have Pipeline-related questions unanswered by
all these presentations, feel free to join us at the &quot;Open Source Hub&quot; in the
expo hall and &lt;a href=&quot;https://www.jenkins.io/blog/2016/08/26/ask-the-experts-jenkins-world/&quot;&gt;Ask the
Experts&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the first day of Jenkins World (September 13th), Isaac Cohen is hosting a
workshop titled
&lt;a href=&quot;https://www.cloudbees.com/let%E2%80%99s-build-jenkins-pipeline&quot;&gt;&lt;strong&gt;Let’s
Build a Jenkins Pipeline&lt;/strong&gt;&lt;/a&gt; which may be interesting to you if you haven’t yet
worked with Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/pipelining-devops-jenkins-and-aws&quot;&gt;&lt;strong&gt;Pipelining
DevOps with Jenkins and AWS&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 14th 2:00 PM - 2:45 PM, Exhibit Hall A-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/nextsource_logo.jpg&quot; alt=&quot;nextsource logo&quot; /&gt;
Automated workflow is a proven method for removing process variability. DevOps
pipelines are the next step in the evolution of CI/CD/DevOps. This talk covers
Jenkins pipelines, both with and without AWS integration, and explains how
Jenkins can be used to create, execute and manage pipelines.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Jimmy Ray of nextSource
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/birds-feather-session-perfecting-your-development-tools-updates-helix-plugin-jenkins&quot;&gt;&lt;strong&gt;Perfecting
Your Development Tools: Updates to the Helix Plugin for Jenkins&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 14th 5:00 PM - 6:00 PM, Exhibit Hall C&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Considering a mono repo that can manage all your source code, binary and other
assets? Join us at the Perforce Birds of a Feather Session for updates and
discussions around the Helix Plugin for Jenkins (or ‘P4 plugin’).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/perforce.png&quot; alt=&quot;perforce&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This session will look at the latest DSL PipeLine support in the ‘P4 plugin’
for Jenkins and will include a live demo. We will show you how to map your
Branches and Streams into a Jenkins Workspace, publish assets back into
Helix, and more. You may even get a sneak preview at the latest ‘P4 plugin’
for Jenkins that allows you the freedom to query and run commands from
within Jenkins directly against your Helix connection.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Paul Allen of Perforce
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/continuously-deploying-containers-jenkins-pipeline-docker-swarm-cluster&quot;&gt;&lt;strong&gt;Continuously
Deploying Containers with Jenkins Pipeline to Docker Swarm Cluster&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 14th 3:00 PM - 3:45 PM, Exhibit Hall A-3&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;
Many of us have already experimented with Docker - for example, by running one
of the pre-built images from Docker Hub. It is possible that your team might
have recognized the benefits that Docker provides in building microservices and
the advantages the technology could bring to development, testing, integration
and, ultimately, production. However, you must create a comprehensive build
pipeline before deploying any containers into a live environment. Integrating
containers into a CD pipeline is far from easy. Along with the benefits Docker
brings, there are challenges both technically and process-related. This
presentation attempts to outline the steps you need to take for a
fully-automated Jenkins pipeline that continuously builds, tests and deploys
microservices into a Docker Swarm cluster.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Viktor Farcic
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/no-you-shouldnt-do-lessons-using-pipeline&quot;&gt;&lt;strong&gt;No,
You Shouldn’t Do That! Lessons from Using Pipeline&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 15th 10:30 AM - 11:15 AM, Exhibit Hall A-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;
Pipeline is as powerful as a loaded gun, but with skill can be as delicate as a
surgeon’s knife. This talk will give an overview of health and safety so that
you can avoid shooting yourself in the head and walk the path to medical
school. It will cover not only what not to do, but also why, and share some
solutions so you are not left high and dry. Both James and Bobby have bullet
wounds from “Champagning” pipeline to automate the test and release of several
of the CloudBees products and can occasionally still be seen walking with a
limp from shooting for the moon and hitting their feet.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Bobby Sandell and James T. Nord of CloudBees
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/docker-image-lifecycle-implemented-jenkins-pipeline&quot;&gt;&lt;strong&gt;Docker
Image Lifecycle Implemented with Jenkins Pipeline&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 15th 11:30 AM - 12:15 PM, Exhibit Hall A-2&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/jfrog.png&quot; alt=&quot;jfrog&quot; /&gt;
While Docker has enabled an unprecedented velocity of software production, it
is all too easy to spin out of control. A promotion-based model is required to
control and track the flow of Docker images as much as it is required for a
traditional software development lifecycle. We will demonstrate how to go from
development to containerization to distribution utilizing binary management
promotion in a framework implemented on Jenkins, using the Pipeline
functionality.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Mark Galpin
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/directions-pipeline&quot;&gt;&lt;strong&gt;Directions for Pipeline&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 15th 11:30 AM - 12:15 PM, Exhibit Hall A-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;
The Pipeline feature has matured and is now included in Jenkins 2.0. During the
time since its release, copious user feedback has been received about missing
features and pain points. Come hear about some things we know should be worked
on - or are already in progress - and bring your suggestions.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Jesse Glick of CloudBees
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/how-do-continuous-delivery-jenkins-pipeline-docker-and-kubernetes&quot;&gt;&lt;strong&gt;How
to Do Continuous Delivery with Jenkins Pipeline, Docker and Kubernetes&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 15th 2:30 PM - 3:15 PM, Great America J&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/redhat.png&quot; alt=&quot;redhat&quot; /&gt;
In this talk, we’ll show how to use Jenkins Pipeline together with Docker and
Kubernetes to implement a complete end-to-end continuous delivery and
continuous improvement system for microservices and monolithic applications
using open source software. We’ll demonstrate how to easily create new
microservices projects or import existing projects, have them automatically
built, system and integration tested, staged and then deployed. Once deployed,
we will also see how to manage and update applications using continuous
delivery practices along with integrated ChatOps - all completely automated!&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— James Strachan of Red Hat
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/introducing-new-way-define-jenkins-pipelines&quot;&gt;&lt;strong&gt;Introducing
a New Way to Define Jenkins Pipelines&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 15th 3:45 PM - 4:30 PM, Great America J&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;
Pipeline is quickly establishing itself as the direction that Jenkins jobs are
going, enabling the definition of a complete CD pipeline in a single job;
Pipeline as Code via the “Jenkinsfile”; job durability across controller restarts;
and more. I’ll be talking here about the next evolution for Pipeline: a simple,
declarative model to define your Pipelines with no need to write scripts. This
configuration syntax for Pipeline allows you to automatically configure all
stages of your pipeline, the complete build environment, post-build actions,
notifications and more. All while providing syntactic and semantic validation
before the build actually gets going.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Andrew Bayer of CloudBees
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/need-speed-building-pipelines-be-faster&quot;&gt;&lt;strong&gt;The
Need For Speed: Building Pipelines To Be Faster&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 15th 4:45 PM - 5:30 PM, Exhibit Hall A-1&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;
Response time is paramount for a CI/CD system. In this session, you will see
how a few best practices in constructing pipelines can yield faster turnaround
times and reduced resource use. We’ll also run through plugins and tools to
analyze and visualize performance, including the Pipeline Stage View plugin. If
time permits, we may briefly discuss some of the computer science theory behind
different aspects of performance.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Sam Van Oort of CloudBees
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/lightning-talks-0&quot;&gt;&lt;strong&gt;Continuously Delivering
Continuous Delivery Pipelines&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 15th 4:45 PM - 5:30 PM, Exhibit Hall J&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/aquilent.png&quot; alt=&quot;aquilent&quot; /&gt;
Our 600-person IT organization has committed to implementing continuous
delivery practices enterprise-wide. This isn’t a single momentous event put in
place overnight. Rather, it’s a strategic journey towards a common goal, and
through which each application will take its own unique path. A seminal
component of our CD journey is the Pipeline plugin and it has become our
standard for CD pipeline orchestration. We will discuss a few of the diverse
paths taken by the application teams at our company and show how the use of the
Pipeline plugin has uniquely enabled continuous delivery for us in a way that
no competing tool can.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Neil Hunt of Aquilent
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/lightning-talks-0&quot;&gt;&lt;strong&gt;CD Pipelines as Code with
Github and Bitbucket&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;September 15th 4:45 PM - 5:30 PM, Exhibit Hall J&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;
Pipeline Multibranch projects come as a natural evolution of pipeline as code:
define your CD pipeline in your source code repository and Jenkins will create
isolated branch and pull requests jobs for it. This talk is about the
integration of the Pipeline Multibranch plugin with Github and Bitbucket as
branch sources.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Antonio Muñiz of CloudBees
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in
September with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/09/06/jenkins-world-speaker-blog-pipeline-model-definition/</id>
<title>Introducing a New Way to Define Jenkins Pipelines</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/06/jenkins-world-speaker-blog-pipeline-model-definition/" />
<author>
<name>abayer</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Jenkins World speaker Andrew Bayer, Jenkins
developer at CloudBees.








Over the last couple years, Pipeline as code has very much become the future of
Jenkins - in fact, at this point, I&#8217;d say it&#8217;s pretty well established as the
present of Jenkins. But that doesn&#8217;t mean it&#8217;s done, let alone that it&#8217;s
perfect. While many developers enjoy the power and control that they get from
writing Pipelines using scripting, not everyone feels the same way. A lot of
developers want to specify their build as configuration and get on with building
software.


Pipeline scripts haven&#8217;t been a good way to do that&#8230;&#8203;until now.


With...
</summary>
<content type='html'>
&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;
This is a guest post by Jenkins World speaker Andrew Bayer, Jenkins
developer at &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the last couple years, Pipeline as code has very much become the future of
Jenkins - in fact, at this point, I’d say it’s pretty well established as the
&lt;strong&gt;present&lt;/strong&gt; of Jenkins. But that doesn’t mean it’s done, let alone that it’s
perfect. While many developers enjoy the power and control that they get from
writing Pipelines using scripting, not everyone feels the same way. A lot of
developers want to specify their build as configuration and get on with building
software.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline scripts haven’t been a good way to do that…​until now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With new changes to Jenkins Pipeline, you are now able to define your Pipeline
from configuration in your &lt;code&gt;Jenkinsfile&lt;/code&gt; by installing the new
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Model+Definition+Plugin&quot;&gt;Pipeline Model Definition&lt;/a&gt;
plugin. It’s available today for you to try via the update center.
Be sure to check the &lt;a href=&quot;https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki&quot;&gt;documentation&lt;/a&gt; for examples on how to get started for a
variety of languages and platforms.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a quick example based on &lt;a href=&quot;https://github.com/jenkinsci/pipeline-model-definition-plugin/blob/master/Jenkinsfile&quot;&gt;the plugin’s own Jenkinsfile&lt;/a&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;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;c1&quot;&gt;// Make sure that the tools we need are installed and on the path.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;tools&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;maven&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Maven 3.3.9&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;jdk&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Oracle JDK 8u40&quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Run on any executor.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;agent&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;label:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// The order that sections are specified doesn&#39;t matter - this will still be run&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// after the stages, even though it&#39;s specified before the stages.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;postBuild&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// No matter what the build status is, run these steps. There are other conditions&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// available as well, such as &quot;success&quot;, &quot;failed&quot;, &quot;unstable&quot;, and &quot;changed&quot;.&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;n&quot;&gt;archive&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;target/**/*&quot;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;target/surefire-reports/*.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;n&quot;&gt;stages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// While there&#39;s only one stage here, you can specify as many stages as you like!&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;s2&quot;&gt;&quot;build&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;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn clean install -Dmaven.test.failure.ignore=true&#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;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s still early days for this feature, with a lot of further functionality
planned to make it easier and more intuitive to define your Pipelines. All of
that functionality lives on top of Pipeline scripting, so we’ll also keep
improving Pipeline steps and syntax outside of the model! And perhaps most
exciting, the Pipeline model will be used by an in-the-works visual editor
that will be part of the Blue Ocean project - while the editor isn’t ready yet,
the Pipeline Model Definition plugin will be bundled with the Blue Ocean beta
for you to try out.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll be going into all of this and more at my talk on Thursday, September 15th, at
3:45pm at Jenkins World, and showing off the same day at the lunchtime demo
theater. I can’t wait to see you all there and hear what you think of all this!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Andrew will be
&lt;a href=&quot;https://www.cloudbees.com/introducing-new-way-define-jenkins-pipelines&quot;&gt;presenting&lt;/a&gt;
more of this concept at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in September.
Register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for 20% off your full conference pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/09/01/jenkins-world-contributor-summit/</id>
<title>Jenkins World Contributor Summit</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-09-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/09/01/jenkins-world-contributor-summit/" />
<author>
<name>rtyler</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
At previous Jenkins User Conferences we have hosted "Contributor Summits" to
gather developers and power-users in one room to discuss specific areas of
Jenkins, such as Scalability, Pipeline, etc. As part of this year&#8217;s
Jenkins World we&#8217;re hosting
another Contributor
Summit, to discuss: Blue Ocean,
Pipeline and Storage Pluggability.


Contributors to these three areas of the Jenkins ecosystem will be in
attendance to present details of their design, requirements, and tentative
roadmaps. After the presentations, the afternoon will be "unconference style" which
is much more fluid to allow discussions, feedback, and brain-storming around
the three focus areas.


The program for the
Jenkins World
Contributor Summit includes:




Updates from the various project
officers.


A discussion of the Blue...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At previous Jenkins User Conferences we have hosted &quot;Contributor Summits&quot; to
gather developers and power-users in one room to discuss specific areas of
Jenkins, such as Scalability, Pipeline, etc. As part of this year’s
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; we’re hosting
another &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/232811529/&quot;&gt;Contributor
Summit&lt;/a&gt;, to discuss: &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;&lt;strong&gt;Blue Ocean&lt;/strong&gt;&lt;/a&gt;,
&lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;&lt;strong&gt;Pipeline&lt;/strong&gt;&lt;/a&gt; and &lt;strong&gt;Storage Pluggability&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Contributors to these three areas of the Jenkins ecosystem will be in
attendance to present details of their design, requirements, and tentative
roadmaps. After the presentations, the afternoon will be &quot;unconference style&quot; which
is much more fluid to allow discussions, feedback, and brain-storming around
the three focus areas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The program for the
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/232811529/&quot;&gt;&lt;strong&gt;Jenkins World
Contributor Summit&lt;/strong&gt;&lt;/a&gt; includes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Updates from the various project
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Team+Leads&quot;&gt;officers&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A discussion of the &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; technology stack,
overall architecture, and how to develop plugins that integrate with Blue
Ocean. Led by &lt;a href=&quot;https://github.com/kzantow&quot;&gt;Keith Zantow&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Presentation on the current status of &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Pipeline&lt;/a&gt;, lessons
learned, new changes and the future. Led by
&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Overview of &quot;Storage Pluggability&quot;, a new scalability-oriented project to
revamp the underlying storage mechanisms in Jenkins. Led by
&lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&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;I cannot recommend participating in the Contributor Summit enough. I have found
previous Summits to be immensely useful for sharing my own thoughts, as well as
for hearing new perspectives from the others in attendance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our space is limited however! I encourage you to join us, so please
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/232811529/&quot;&gt;RSVP soon&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in
September with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/08/31/scaling-jenkins-at-jenkins-world/</id>
<title>Scaling Jenkins at Jenkins World 2016</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/31/scaling-jenkins-at-jenkins-world/" />
<author>
<name>rtyler</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by R. Tyler Croy, who is a
long-time contributor to Jenkins and the primary contact for Jenkins project
infrastructure. He is also a Jenkins Evangelist at
CloudBees, Inc.









I find the topic of "scaling Jenkins" to be incredibly interesting because,
more often than not, scaling Jenkins isn&#8217;t just about scaling a single instance
but rather scaling an organization and its continuous delivery processes. In
many cases when people talk about "scaling Jenkins" they&#8217;re talking about
"Jenkins as a Service" or "Continuous Delivery as a Service" which introduces a
much broader scope, and also more organization-specific requirements, to the
problem.


One of my favorite parts of a...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt;, who is a
long-time contributor to Jenkins and the primary contact for Jenkins project
infrastructure. He is also a Jenkins Evangelist at
&lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I find the topic of &quot;scaling Jenkins&quot; to be incredibly interesting because,
more often than not, scaling Jenkins isn’t just about scaling a single instance
but rather scaling an &lt;em&gt;organization&lt;/em&gt; and its continuous delivery processes. In
many cases when people talk about &quot;scaling Jenkins&quot; they’re talking about
&quot;Jenkins as a Service&quot; or &quot;Continuous Delivery as a Service&quot; which introduces a
much broader scope, and also more organization-specific requirements, to the
problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of my favorite parts of a big conference like
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; is getting to
see how other people are solving similar problems at different organizations,
in essence:
&quot;&lt;a href=&quot;https://english.stackexchange.com/questions/120739/a-peek-into-the-sausage-factory&quot;&gt;how
the sausage is made&lt;/a&gt;.&quot; This year’s Jenkins World will be no different, with a number
of sessions by developers and engineers from the companies leading the way,
scaling continuous delivery and Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in
September with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the realm of &quot;scaling Jenkins&quot; the following sessions stand-out to me as
&quot;must-attend&quot; for those interested in the space:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkinsops-initiative-streamline-and-automate-jenkins&quot;&gt;&lt;strong&gt;JenkinsOps:
An Initiative to Streamline and Automate Jenkins&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;September 14th 4:15 PM - 5:00 PM, Exhibit Hall A-1&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/159px-National_Public_Radio_logo.svg.png&quot; alt=&quot;159px National Public Radio logo.svg&quot; /&gt;
NPR’s Digital Media team uses Jenkins to build, test and deploy code to various
staging and production environments. As the complexity of the software
components, environments and tests have grown - both generally and due to our
quest to achieve continuous deployment - management of Jenkins has become a
challenge. In this talk, we share information about our “JenkinsOps” effort
which has allowed us to automate many of the administrative tasks necessary to
manage feature code branches, handle deployments, run tests and configure our
environments properly.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Paul Miles and Grant Dickie of NPR
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/thinking-inside-container-continuous-delivery-story&quot;&gt;&lt;strong&gt;Thinking
Inside the Container: A Continuous Delivery Story&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;September 15th 1:30 PM - 2:15 PM, Exhibit Hall C&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/Riot_Games_logo.png&quot; alt=&quot;Riot Games logo&quot; /&gt;
At Riot Games, we build a lot of software. Come learn how we built an
integrated Docker solution using Jenkins that accepts Docker images submitted
as build environments by engineers around the company. Our containerized farm
now creates over 10,000 containers per week and handles nearly 1,000 jobs at a
rate of about 100 jobs per hour. All this is done with readily available, open
source Jenkins plugins. We’ll explore lessons learned, best practices and how
to scale and build your own system, as well as why we chose to solve the
problem this way…and whether or not we succeeded!&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Maxfield F Stewart of Riot Games
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/how-do-continuous-delivery-jenkins-pipeline-docker-and-kubernetes&quot;&gt;&lt;strong&gt;How
to Do Continuous Delivery with Jenkins Pipeline, Docker and Kubernetes&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;September 15th 2:30 PM - 3:15 PM, Great America J&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-at-jenkinsworld/redhat.png&quot; alt=&quot;redhat&quot; /&gt;
In this talk, we’ll show how to use Jenkins Pipeline together with Docker and
Kubernetes to implement a complete end-to-end continuous delivery and
continuous improvement system for microservices and monolithic applications
using open source software. We’ll demonstrate how to easily create new
microservices projects or import existing projects, have them automatically
built, system and integration tested, staged and then deployed. Once deployed,
we will also see how to manage and update applications using continuous
delivery practices along with integrated ChatOps - all completely automated!&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— James Strachan of Red Hat
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/scaling-jenkins-docker-swarm-kubernetes-or-mesos&quot;&gt;&lt;strong&gt;Scaling
Jenkins with Docker: Swarm, Kubernetes or Mesos?&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;September 15th 2:30 PM - 3:15 PM, Exhibit Hall C&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/320px-CloudBees_official_logo.png&quot; alt=&quot;320px CloudBees official logo&quot; /&gt;
The Jenkins platform can be dynamically scaled by using several Docker cluster
and orchestration platforms, using containers to run agents and jobs and also
isolating job execution. But which cluster technology should be used? Docker
Swarm? Apache Mesos? Kubernetes? How do they compare? All of them can be used
to dynamically run jobs inside containers. This talk will cover these main
container clusters, outlining the pros and cons of each, the current state of
the art of the technologies and Jenkins support. I believe people will be very
interested in learning about the multiple options available.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Carlos Sanchez of CloudBees
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/so-you-want-build-worlds-biggest-jenkins-cluster&quot;&gt;&lt;strong&gt;So,
You Want to Build the World’s Biggest Jenkins Cluster?&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;September 15th 3:45 PM - 4:30 PM, Exhibit Hall C&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How can we do it? We start with some real world results realized by Jenkins
users who have built large clusters and review how they got there. Next, we
will do experiments scaling some individual sub-components of Jenkins in
isolation and see what challenges we will face when integrated. The famous
large, distributed systems undoubtedly faced problems scaling - and we can
learn from them, too. The result will be recipes for building Jenkins
clusters with different scaling capabilities. After all of this, you can
build the biggest Jenkins cluster in the world…or maybe just make your own
Jenkins cluster more efficient.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Stephen Connolly of CloudBees
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-splunk-and-splunking-jenkins&quot;&gt;&lt;strong&gt;Jenkins at
Splunk and Splunking Jenkins&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;September 15th 3:45 PM - 4:30 PM, Exhibit Hall A-1&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/splunk-logo-300x100.gif&quot; alt=&quot;splunk logo 300x100&quot; /&gt;
This session will highlight how Splunk uses Jenkins to provide an end-to-end
solution in the development CI system. Attendees will see how test results are
delivered to a Splunk indexer, where they can be analyzed and presented in a
variety of ways. This session will also include a live demonstration.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Bill Houston of Splunk
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-inside-google&quot;&gt;&lt;strong&gt;Jenkins inside Google&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;September 15th 4:45 PM - 5:30 PM, Exhibit Hall C&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/scaling-jenkins-at-jenkinsworld/272px-Google_2015_logo.svg.png&quot; alt=&quot;272px Google 2015 logo.svg&quot; /&gt;
Last year, we presented our initial investigations and stress testing as we
prepared to deploy a large-scale Jenkins installation at Google. Now, with a
year of real-world use under our belts, we’ll discuss how our expectations held
up, what new issues we encountered and how we have addressed them.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;attribution&quot;&gt;
— David Hoover of Google
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to these, we will also be hosting a
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/232811529/&quot;&gt;Jenkins World
Contributor Summit&lt;/a&gt; where &quot;scaling&quot; relevant topics such as &quot;Storage
Pluggability&quot; will be discussed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins World &lt;a href=&quot;https://www.cloudbees.com/juc/agenda&quot;&gt;agenda&lt;/a&gt; is packed
with even more sessions, so it should be a very informational event for
everybody; hope to see you there!&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/2016/08/30/ask-experts-demos/</id>
<title>Demos at Jenkins World 2016</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/30/ask-experts-demos/" />
<author>
<name>rtyler</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
At this year&#8217;s Jenkins World,
our events officer Alyssa has been working to
organize various activities in the "Open Source Hub" on the expo floor.  Both
days of the conference (Sept. 14th and 15th), during the break for lunch, there
will be 15 minute demos by many of the
experts helping to staff
the Open Source Hub.


Demo Schedule


Wednesday, September 14th









Time
Session
Details
Presenter




12:15 - 12:30
Blue Ocean in Action
Showcase of Blue Ocean and how it will make Jenkins a pleasure to use.
Keith Zantow


12:30 - 12:45
Notifications with Jenkins Pipeline
Sending information to Slack, HipChat, email and more from your Pipeline
Liam Newman


12:45 - 13:00
Docker and Pipeline
Learn how to use Docker inside of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 125x125&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this year’s &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt;,
our events officer &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa&lt;/a&gt; has been working to
organize various activities in the &quot;Open Source Hub&quot; on the expo floor.  Both
days of the conference (Sept. 14th and 15th), during the break for lunch, there
will be 15 minute demos by many of the
&lt;a href=&quot;https://www.jenkins.io/blog/2016/08/26/ask-the-experts-jenkins-world/&quot;&gt;experts&lt;/a&gt; helping to staff
the Open Source Hub.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;demo-schedule&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#demo-schedule&quot; /&gt;Demo Schedule&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;wednesday-september-14th&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#wednesday-september-14th&quot; /&gt;Wednesday, September 14th&lt;/h3&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time&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;Details&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Presenter&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;12:15 - 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;&lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; in Action&lt;/strong&gt;&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;em&gt;Showcase of &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; and how it will make Jenkins a pleasure to use.&lt;/em&gt;&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;a href=&quot;https://github.com/kzantow&quot;&gt;Keith Zantow&lt;/a&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;12:30 - 12: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;&lt;strong&gt;Notifications with Jenkins Pipeline&lt;/strong&gt;&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;em&gt;Sending information to Slack, HipChat, email and more from your Pipeline&lt;/em&gt;&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;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&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;12:45 - 13: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;&lt;strong&gt;Docker and Pipeline&lt;/strong&gt;&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;em&gt;Learn how to use Docker inside of Pipeline for clean, repeatable testing environments&lt;/em&gt;&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;a href=&quot;https://github.com/rtyler&quot;&gt;R Tyler Croy&lt;/a&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;13:00 - 13: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;&lt;strong&gt;Git plugin - large repos, submodule authentication and more&lt;/strong&gt;&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;em&gt;Techniques for managing large Git repositories, Submodule authentication, Pipelines and Git&lt;/em&gt;&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;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&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;13:15 - 13: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;&lt;strong&gt;Freestyle to Pipeline&lt;/strong&gt;&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;em&gt;Overview of how easy it is to migrate from a confusing series of Freestyle Jobs to Jenkins Pipeline&lt;/em&gt;&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;a href=&quot;https://github.com/rtyler&quot;&gt;R Tyler Croy&lt;/a&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;13:30 - 13: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;&lt;strong&gt;&lt;code&gt;package.json&lt;/code&gt; and Jenkins&lt;/strong&gt;&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;em&gt;Using &lt;code&gt;package.json&lt;/code&gt; to control your build; running tests, coverage and generating documentation in Jenkins&lt;/em&gt;&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;a href=&quot;https://github.com/cvega&quot;&gt;Casey Vega&lt;/a&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;13:45 - 14: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;&lt;strong&gt;Extending Pipeline with Libraries&lt;/strong&gt;&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;em&gt;When you have many jobs using similar configuration, it is natural to factor out the common parts into libraries. See some ways Pipeline lets you do this.&lt;/em&gt;&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;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;&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;thursday-september-15th&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#thursday-september-15th&quot; /&gt;Thursday, September 15th&lt;/h3&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;col style=&quot;width: 25%;&quot;&gt;
&lt;/col&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Time&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;Details&lt;/th&gt;
&lt;th class=&quot;tableblock halign-left valign-top&quot;&gt;Presenter&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;12:15 - 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;&lt;strong&gt;A simpler way to define Jenkins Pipelines&lt;/strong&gt;&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;em&gt;Get to know a new way to define your Pipelines in a more configuration-like way!&lt;/em&gt;&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;a href=&quot;https://github.com/abayer&quot;&gt;Andrew Bayer&lt;/a&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;12:30 - 12: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;&lt;strong&gt;Multibranch Pipelines + Git symbolic-ref&lt;/strong&gt;&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;em&gt;Pipeline Multibranch Plugin is amazing, but is even better when used with
Git symbolic references. The combination of the two gives users a way to create
individual Jenkins jobs for each of their build/test configurations, instead of
using a single parameterized job. I’ll show how to use these tools together to
home in on problematic tests, systems under test, or both.&lt;/em&gt;&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;a href=&quot;https://github.com/jonahermansen&quot;&gt;Jon Hermansen&lt;/a&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;12:45 - 13: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;&lt;strong&gt;External Workspace Manager plugin for Jenkins Pipeline&lt;/strong&gt;&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;em&gt;Meet the External Workspace Manager plugin, which supports managing workspaces across multiple Jenkins jobs running on different nodes and more!&lt;/em&gt;&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;a href=&quot;https://github.com/alexsomai&quot;&gt;Alex Somai&lt;/a&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;13:00 - 13: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;&lt;strong&gt;Ownership plugin for Jenkins&lt;/strong&gt;&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;em&gt;The presentation will introduce the Ownership engine for Jenkins jobs, folders and nodes. The presentation will cover plugin WebUI features, Ownership-based security and integration with Jenkins Pipeline&lt;/em&gt;&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;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&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;13:15 - 13: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;&lt;strong&gt;Pipelines for building and deploying Android apps&lt;/strong&gt;&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;em&gt;Using the various Android-related plugins for Jenkins, we will demonstrate pipelines to automatically build, test, and securely deploy Android apps.&lt;/em&gt;&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;a href=&quot;https://github.com/orrc&quot;&gt;Christopher Orr&lt;/a&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;As you can see there is a lot to see in the Open Source Hub at Jenkins World.
To my knowledge these demos are not going to be recorded, so your only
opportunities to see them might be at Jenkins World or your local
&lt;a href=&quot;https://www.meetup.com/pro/jenkins&quot;&gt;Jenkins Area Meetup&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in
September with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/col&gt;
&lt;/col&gt;
&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/08/29/sauce-pipeline/</id>
<title>Browser-testing with Sauce OnDemand and Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/29/sauce-pipeline/" />
<author>
<name>lnewman</name>
</author>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='saucelabs'></category>
<category term='selenium'></category>
<category term='nightwatch'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Testing web applications across multiple browsers on different platforms can be challenging even for smaller applications.
With Jenkins and the
Sauce OnDemand Plugin,
you can wrangle that complexity by defining your Pipeline as Code.


Pipeline &#9829; UI Testing, Too

I recently started looking for a way to do browser UI testing for an open-source JavaScript project to which I contribute.
The project is targeted primarily at
Node.js
but we&#8217;re committed to maintaining browser-client compatibility as well.
That means we should run tests on a matrix of browsers.
Sauce Labs
has an "open-sauce" program that provides free test instances to open-source projects.
I...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Testing web applications across multiple browsers on different platforms can be challenging even for smaller applications.
With Jenkins and the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Sauce+OnDemand+Plugin&quot;&gt;Sauce OnDemand Plugin&lt;/a&gt;,
you can wrangle that complexity by defining your Pipeline as Code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;pipeline-ui-testing-too&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-ui-testing-too&quot; /&gt;Pipeline ♥ UI Testing, Too&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I recently started looking for a way to do browser UI testing for an open-source JavaScript project to which I contribute.
The project is targeted primarily at
&lt;a href=&quot;https://nodejs.org&quot;&gt;Node.js&lt;/a&gt;
but we’re committed to maintaining browser-client compatibility as well.
That means we should run tests on a matrix of browsers.
&lt;a href=&quot;https://saucelabs.com/&quot;&gt;Sauce Labs&lt;/a&gt;
has an &quot;open-sauce&quot; program that provides free test instances to open-source projects.
I decided to try using the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Sauce+OnDemand+Plugin&quot;&gt;Sauce OnDemand Plugin&lt;/a&gt;
and
&lt;a href=&quot;https://nightwatchjs.org/&quot;&gt;Nightwatch.js&lt;/a&gt;
to run Selenium tests on a sample project first, before trying a full-blown suite of tests.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;starting-from-framework&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#starting-from-framework&quot; /&gt;Starting from Framework&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started off by following Sauce Labs&#39; instructions on
&quot;&lt;a href=&quot;https://wiki.saucelabs.com/display/DOCS/Setting+Up+Sauce+Labs+with+Jenkins&quot;&gt;Setting up Sauce Labs with Jenkins&lt;/a&gt;&quot;
as far as I could.
I installed the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/JUnit+Plugin&quot;&gt;JUnit&lt;/a&gt; and
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Sauce+OnDemand+Plugin&quot;&gt;Sauce OnDemand&lt;/a&gt;
plugins, created an account with Sauce Labs, and
&lt;a href=&quot;https://wiki.saucelabs.com/display/DOCS/Installing+and+Configuring+the+Sauce+OnDemand+Plugin+for+Jenkins&quot;&gt;added my Sauce Labs credentials to Jenkins&lt;/a&gt;.
From there I started to get a little lost.
I’m new to Selenium and I had trouble understanding how to translate the instructions to my situation.
I needed a working example that I could play with.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Happily, there’s a whole range of sample projects in
&quot;&lt;a href=&quot;https://github.com/saucelabs-sample-test-frameworks&quot;&gt;saucelabs-sample-test-frameworks&lt;/a&gt;&quot;
on GitHub, which show how to integrate Sauce Labs with various test frameworks, including Nightwatch.js.
I forked the Nightwatch.js sample to
&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js&quot;&gt;bitwiseman/JS-Nightwatch.js&lt;/a&gt;
and set to writing my &lt;code&gt;Jenkinsfile&lt;/code&gt;.
Between the sample and the Sauce Labs instructions,
I was able to write a pipeline that ran five tests on one browser via
&lt;a href=&quot;https://wiki.saucelabs.com/display/DOCS/Sauce+Connect+Proxy&quot;&gt;Sauce Connect&lt;/a&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;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;node&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;s2&quot;&gt;&quot;Build&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;npm install&#39;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;

    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Test&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sauce&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;f0a6b8ad-ce30-4cba-bf9a-95afbc470a8a&#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;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
        &lt;span class=&quot;n&quot;&gt;sauceconnect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;options:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;useGeneratedTunnelIdentifier:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;verboseLogging:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&gt;
            &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./node_modules/.bin/nightwatch -e chrome --test tests/guineaPig.js || true&#39;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;(4)&lt;/b&gt;
            &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;reports/**&#39;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;(5)&lt;/b&gt;
            &lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SauceOnDemandTestPublisher&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;6&quot; /&gt;&lt;b&gt;(6)&lt;/b&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;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Install dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Use my
&lt;a href=&quot;https://wiki.saucelabs.com/display/DOCS/Installing+and+Configuring+the+Sauce+OnDemand+Plugin+for+Jenkins&quot;&gt;previously added sauce credentials&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Start up the
&lt;a href=&quot;https://wiki.saucelabs.com/display/DOCS/Sauce+Connect+Proxy&quot;&gt;Sauce Connect&lt;/a&gt;
tunnel to Sauce Labs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot; /&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Run Nightwatch.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;5&quot; /&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Use JUnit to track results and show a trend graph&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;6&quot; /&gt;&lt;b&gt;6&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Link result details from Sauce Labs&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;This pipeline expects to be run from a &lt;code&gt;Jenkinsfile&lt;/code&gt; in SCM.
To copy and paste it directly into a Jenkins Pipeline job, replace the &lt;code&gt;checkout scm&lt;/code&gt; step with
&lt;code&gt;git url:&#39;https://github.com/bitwiseman/JS-Nightwatch.js&#39;, branch: &#39;sauce-pipeline&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I ran this job a few times to get the JUnit report to show a trend graph.&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/2016-08-29/pipeline-report.png&quot; alt=&quot;Pipeline Report for &amp;quot;sauce-pipeline&amp;quot; Branch&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This sample app generates the &lt;code&gt;SauceOnDemandSessionID&lt;/code&gt; for each test, enabling the Jenkins Sauce OnDemand Plugin’s result publisher to link results to details Sauce Labs captured during the run.&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/2016-08-29/pipeline-results.png&quot; alt=&quot;Sauce Test Results&quot;&gt;
&lt;/img&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/2016-08-29/sauce-details.png&quot; alt=&quot;Sauce Test Result Details&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;adding-platforms&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adding-platforms&quot; /&gt;Adding Platforms&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next I wanted to add a few more platforms to my matrix.
This would require changing both the test framework configuration and the pipeline.
I’d need to add new named combinations of platform, browser, and browser version (called &quot;environments&quot;) to the Nightwatch.js configuration file,
and modify the pipeline to run tests in those new environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a perfect example of the power of pipeline as code.
If I were working with a separately configured pipeline,
I’d have to make the change to the test framework, then change the pipeline manually.
With my pipeline checked in as code,
I could change both in one commit,
preventing errors resulting from pipeline configurations going out of sync from the rest of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I added three new environments to &lt;code&gt;nightwatch.json&lt;/code&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;js&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;test_settings&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/*----8&amp;lt;----8&amp;lt;----8&amp;lt;----*/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;chrome&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/*----8&amp;lt;----8&amp;lt;----8&amp;lt;----*/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;firefox&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;desiredCapabilities&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;linux&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;browserName&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;firefox&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;latest&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;ie&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;desiredCapabilities&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Windows 10&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;browserName&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;internet explorer&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;latest&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;edge&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;desiredCapabilities&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Windows 10&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;browserName&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;MicrosoftEdge&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;latest&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&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;And I modified my &lt;code&gt;Jenkinsfile&lt;/code&gt; to call them:&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;c1&quot;&gt;//----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sauceconnect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;options:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;useGeneratedTunnelIdentifier:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;verboseLogging:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;configs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
        &lt;span class=&quot;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&#39;ie&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Run selenium tests using Nightwatch.js&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./node_modules/.bin/nightwatch -e ${configs} --test tests/guineaPig.js&quot;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Using an array to improve readability and make it easy to add more platforms later.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Changed from single-quoted string to double-quoted to support variable substitution.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Test frameworks have bugs too. Nightwatch.js (v0.9.8) generates incomplete JUnit files,
reporting results without enough information in them to distinguish between platforms.
I implemented a fix for it and
&lt;a href=&quot;https://github.com/nightwatchjs/nightwatch/pull/1160&quot;&gt;submitted a PR&lt;/a&gt; to Nightwatch.js.
This blog shows output with that fix applied locally.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As expected, Jenkins picked up the new pipeline and ran Nightwatch.js on four platforms.
Sauce Labs of course recorded the results and correctly linked them into this build.
Nightwatch.js was already configured to use multiple worker threads to run tests against those platforms in parallel, and
my Sauce Labs account supported running them all at the same time,
letting me cover four configurations in less that twice the time,
and that added time was most due to individual new environments taking longer to complete.
When I move to the actual project, this will let me run broad acceptance passes quickly.&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/2016-08-29/platforms-results.png&quot; alt=&quot;Sauce Labs Results List&quot;&gt;
&lt;/img&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/2016-08-29/platforms-report.png&quot; alt=&quot;JUnit Report Showing Added Platforms&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion-to-awesome-and-beyond&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion-to-awesome-and-beyond&quot; /&gt;Conclusion: To Awesome and Beyond&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Considering the complexity of the system, I was impressed with how easy it was to integrate Jenkins with Sauce OnDemand to start testing on multiple browsers.
The plugin worked flawlessly with Jenkins Pipeline.
I went ahead and ran some additional tests to show that failure reporting also behaved as expected.&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;c1&quot;&gt;//----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./node_modules/.bin/nightwatch -e ${configs}&quot;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;c1&quot;&gt;//----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----8&amp;lt;----&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Removed &lt;code&gt;--test&lt;/code&gt; filter to run all tests&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/2016-08-29/tests-report.png&quot; alt=&quot;Tests&quot; width=&quot;Platforms&quot; height=&quot;Results&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;epilogue-pipeline-vs-freestyle&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#epilogue-pipeline-vs-freestyle&quot; /&gt;Epilogue: Pipeline vs. Freestyle&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just for comparison here’s the final state of this job in Freestyle UI versus fully-commented pipeline code:&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;This includes the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/AnsiColor+Plugin&quot;&gt;AnsiColor Plugin&lt;/a&gt;
to support Nightwatch.js&#39; default ANSI color output.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;freestyle&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#freestyle&quot; /&gt;Freestyle&lt;/h4&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/2016-08-29/freestyle-1.png&quot; alt=&quot;Freestyle Job Configuration - SCM&quot;&gt;
&lt;/img&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/2016-08-29/freestyle-2.png&quot; alt=&quot;Freestyle Job Configuration - Wrappers and Sauce&quot;&gt;
&lt;/img&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/2016-08-29/freestyle-3.png&quot; alt=&quot;Freestyle Job Configuration - Build and Publish&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline&quot; /&gt;Pipeline&lt;/h4&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;node&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;s2&quot;&gt;&quot;Build&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Install dependencies&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;npm install&#39;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Test&quot;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Add sauce credentials&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sauce&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;f0a6b8ad-ce30-4cba-bf9a-95afbc470a8a&#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;c1&quot;&gt;// Start sauce connect&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sauceconnect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;options:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;useGeneratedTunnelIdentifier:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;verboseLogging:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;c1&quot;&gt;// List of browser configs we&#39;ll be testing against.&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;platform_configs&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;s1&quot;&gt;&#39;chrome&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;firefox&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;ie&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s1&quot;&gt;&#39;edge&#39;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// Nightwatch.js supports color output, so wrap this step for ansi color&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;wrap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;AnsiColorBuildWrapper&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;colorMapName&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;XTerm&#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;c1&quot;&gt;// Run selenium tests using Nightwatch.js&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;// Ignore error codes. The junit publisher will cover setting build status.&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./node_modules/.bin/nightwatch -e ${platform_configs} || true&quot;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;reports/**&#39;&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SauceOnDemandTestPublisher&#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 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;This pipeline expects to be run from a &lt;code&gt;Jenkinsfile&lt;/code&gt; in SCM.
To copy and paste it directly into a Jenkins Pipeline job, replace the &lt;code&gt;checkout scm&lt;/code&gt; step with
&lt;code&gt;git url:&#39;https://github.com/bitwiseman/JS-Nightwatch.js&#39;, branch: &#39;sauce-pipeline&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not only is the pipeline as code more compact,
it also allows for comments to further clarify what is being done.
And as I noted earlier,
changes to this pipeline code are committed the same as changes to the rest of the project,
keeping everything synchronized, reviewable, and testable at any commit.
In fact, you can view the full set of commits for this blog post in the
&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js/tree/blog/sauce-pipeline&quot;&gt;blog/sauce-pipeline&lt;/a&gt;
branch of the
&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js&quot;&gt;bitwiseman/JS-Nightwatch.js&lt;/a&gt;
repository.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Sauce+OnDemand+Plugin&quot;&gt;Sauce OnDemand Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bitwiseman/JS-Nightwatch.js&quot;&gt;bitwiseman/JS-Nightwatch.js&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saucelabs-sample-test-frameworks&quot;&gt;saucelabs-sample-test-frameworks&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/08/29/jenkins-world-speaker-blog-goodgame/</id>
<title>Enforcing Jenkins Best Practices</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/29/jenkins-world-speaker-blog-goodgame/" />
<author>
<name>hinman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Jenkins World speaker David Hinske, Release
Engineer at Goodgame Studios.








Hey there, my name is David Hinske and I work at Goodgame Studios (GGS), a game
development company in Hamburg, Germany. As Release Engineer in a company with
several development teams, it comes in handy using several Jenkins instances.
While this approach works fine in our company and gives the developers a lot of
freedom, we came across some long-term problems concerning maintenance and
standards. These problems were mostly caused by misconfiguration or non-use of
plugins. With “configuration as code” in mind, I took the approach to apply
static code analysis with the...
</summary>
<content type='html'>
&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;
This is a guest post by Jenkins World speaker David Hinske, Release
Engineer at &lt;a href=&quot;https://www.goodgamestudios.com/&quot;&gt;Goodgame Studios&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hey there, my name is David Hinske and I work at Goodgame Studios (GGS), a game
development company in Hamburg, Germany. As Release Engineer in a company with
several development teams, it comes in handy using several Jenkins instances.
While this approach works fine in our company and gives the developers a lot of
freedom, we came across some long-term problems concerning maintenance and
standards. These problems were mostly caused by misconfiguration or non-use of
plugins. With “configuration as code” in mind, I took the approach to apply
static code analysis with the help of SonarQube, a platform to manage code
quality, for all of our Jenkins job configurations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a small centralized team, we were looking for an easy way to control the
health of our growing Jenkins infrastructure. With considering “configuration
as code“, I developed a simple extension of SonarQube, to manage the quality
and usage of all spawned Jenkins instances. The given SonarQube features (like
customized rules/metrics, quality profiles and dashboards) allow us and the
development teams to analyze and measure the quality of all created jobs in our
company. Even though Jenkins configuration analysis cannot cover all
SonarQube’s axes of code quality, I think there is still potential for
conventions/standards, duplications, complexity, potential bugs
(misconfiguration) and design and architecture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The results of this analysis can be used by all people working with Jenkins. To
achieve this, I developed a simple extension of SonarQube, containing
everything which is needed to hook up our SonarQube with our Jenkins
environment. The implementation contains a new basic-language “Jenkins“ and an
initial set of rules.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course the needs depend strongly on the way Jenkins is being used, so not
every rule implemented might be useful for every team, but this applies to all
types of code analysis. The main inspirations for the rules were developer
feedback and some articles found in the web. The different ways Jenkins can be
configured provides the potential for many more rules. With this new approach
of quality analysis, we can enforce best practices like:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Polling must die (Better to triggerb uilds from pushes than poll the
repository every x minutes).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use Log Rotator (Not using log-rotator can result in disk space problems on
the controller).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use agents/labels (Jobs should be defined where to run).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t build on the controller (In larger systems, don’t build on the controller).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enforce plugin usage (For example: Timestamp, Mask-Passwords).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Naming sanity (Limit project names to a sane (e.g. alphanumeric) character
set).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Analyze Groovy Scripts (For example: Prevent System.exit(0) in System Groovy
Scripts).&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/jw-speaker-blog-goodgame/jenkins1.png&quot; alt=&quot;jenkins1&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Besides taking control of all configuration of any Jenkins instance we want,
there is also room for additional metrics, like measuring the amount and
different types of jobs (Freestyle/Maven etc…​) to get an overview about the
general load of the Jenkins instance. A more sophisticated idea is to measure
complexity of jobs and even pipelines. As code, jobs configuration gets harder
to understand the more steps are involved. On the one hand scripts, conditions
and many parameters can negatively influence the readability, especially if you
have external dependencies (like scripts) in different locations. On the other
hand, pipelines can also grow very complex when many jobs are involved and
chained for execution. It will be very interesting for us to see where and why
too complex pipelines are being created.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On visualization we rely on the data and its interpretation of SonarQube, which
offers a big bandwidth of widgets. Everybody can use and customize the
dashboards. Our centralized team for example has a separate dashboard where we
can get a quick overview over all instances.&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/jw-speaker-blog-goodgame/jenkins2.png&quot; alt=&quot;jenkins2&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The problem of &quot;growing&quot; Jenkins with maintenance problems is not new.
Especially when you have many developers involved, including with the access to
create jobs and pipelines themselves, an analysis like this SonarQube plugin
provides can be useful for anyone who wants to keep their Jenkins in shape.
Customization and standards are playing a big role in this scenario. This blog
post surely is not an advertisement for my developed plugin, it is more about
the crazy idea of using static code analysis for Jenkins job configuration. I
haven’t seen anything like it so far and I feel that there might be some
potential behind this idea.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join me at my Enforcing Jenkins Best Practices session at the 2016 Jenkins
World to hear more!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;David will be
&lt;a href=&quot;https://www.cloudbees.com/enforcing-jenkins-best-practices&quot;&gt;presenting&lt;/a&gt;
more of this concept at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in September.
Register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for 20% off your full conference pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/08/26/ask-the-experts-jenkins-world/</id>
<title>Ask the Experts at Jenkins World 2016</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/26/ask-the-experts-jenkins-world/" />
<author>
<name>rtyler</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
Our events officer Alyssa has been working for
the past several weeks to organize the "Open Source Hub" at
Jenkins World 2016. The Hub
is a location on the expo floor where contributors to the Jenkins project can hang
out, share demos and help Jenkins users via the "Ask the Experts" program. Thus
far we have a great list of experts who have volunteered to help staff the
booth, which includes many frequent contributors, JAM
organizers and board members.


A few of the friendly folks you will see at Jenkins World are:




Paul Allen -
P4 Plugin
maintainer and Pipeline contributor.


R Tyler Croy -
Jenkins infrastructure maintainer and
board member.


Jesse Glick - Pipeline
maintainer...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 125x125&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our events officer &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa&lt;/a&gt; has been working for
the past several weeks to organize the &quot;Open Source Hub&quot; at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2016&lt;/a&gt;. The Hub
is a location on the expo floor where contributors to the Jenkins project can hang
out, share demos and help Jenkins users via the &quot;Ask the Experts&quot; program. Thus
far we have a great list of experts who have volunteered to help staff the
booth, which includes many frequent contributors, &lt;a href=&quot;https://www.jenkins.io/projects/jam&quot;&gt;JAM&lt;/a&gt;
organizers and board members.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few of the friendly folks you will see at Jenkins World 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;&lt;a href=&quot;https://github.com/p4paul&quot;&gt;Paul Allen&lt;/a&gt;&lt;/strong&gt; -
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/P4+Plugin&quot;&gt;P4 Plugin&lt;/a&gt;
maintainer and &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Pipeline&lt;/a&gt; contributor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R Tyler Croy&lt;/a&gt;&lt;/strong&gt; -
&lt;a href=&quot;https://github.com/jenkins-infra&quot;&gt;Jenkins infrastructure&lt;/a&gt; maintainer and
board member.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;&lt;/strong&gt; - &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Pipeline&lt;/a&gt;
maintainer and long-time contributor to Jenkins
&lt;a href=&quot;https://github.com/jenkinsci/jenkins&quot;&gt;core&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/eddumelendez&quot;&gt;Eddú Meléndez Gonzales&lt;/a&gt;&lt;/strong&gt; - Organizer for
the &lt;a href=&quot;https://www.meetup.com/es/Lima-Jenkins-Area-Meetup/&quot;&gt;Lima (Perú)
Jenkins Area Meetup&lt;/a&gt; and contributor to &lt;a href=&quot;https://spring.io&quot;&gt;Spring&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/jh86&quot;&gt;Jon Hermansen&lt;/a&gt;&lt;/strong&gt; - Organizer for the
&lt;a href=&quot;https://www.meetup.com/Los-Angeles-Jenkins-Area-Meetup/&quot;&gt;Los Angeles
Jenkins Area Meetup&lt;/a&gt;, developer and Pipeline user.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/omehegan&quot;&gt;Owen Mehegan&lt;/a&gt;&lt;/strong&gt; -
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/GitLab+Plugin&quot;&gt;GitLab plugin&lt;/a&gt;
contributor, release engineer and copy editor for jenkins.io.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;&lt;/strong&gt; -
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc&quot;&gt;Google Summer of Code&lt;/a&gt; organizer, maintainer of multiple
plugins and &lt;a href=&quot;https://www.meetup.com/St-Petersburg-Jenkins-Meetup/&quot;&gt;St.
Petersburg Jenkins Area Meetup&lt;/a&gt; organizer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/orrc&quot;&gt;Christopher Orr&lt;/a&gt;&lt;/strong&gt; - Maintainer of multiple
Android-related plugins, including the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Android+Emulator+Plugin&quot;&gt;Android
Emulator plugin&lt;/a&gt; and contributor to numerous projects behind the scenes of
Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/cvega&quot;&gt;Casey Vega&lt;/a&gt;&lt;/strong&gt; - Organizer for the
&lt;a href=&quot;https://www.meetup.com/Los-Angeles-Jenkins-Area-Meetup/&quot;&gt;Los Angeles
Jenkins Area Meetup&lt;/a&gt; and release engineer at Verizon Digital Media.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/markewaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/strong&gt; - Maintainer of the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Git%20Plugin&quot;&gt;Git plugin&lt;/a&gt; and
contributor to a number of other Git-related plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/dty&quot;&gt;Dean Yu&lt;/a&gt;&lt;/strong&gt; - Long-time contributor, board member
and release engineer at Shutterfly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope that this list isn’t exhaustive! If you are an active member of the
Jenkins community and/or a contributor, consider taking part in the &quot;Ask the
Experts&quot; program. It’s a great opportunity to bond with other contributors and
talk with fellow users at Jenkins World.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will be able to find us in the expo hall under the &quot;Open Source Hub&quot; sign;
please stop by at Jenkins World to say hello, pick up stickers and to ask
questions!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in
September with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/08/24/jenkins-world-2016-festivities/</id>
<title>Jenkins World 2016 Festivities</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/24/jenkins-world-2016-festivities/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
At Jenkins World 2016 on
September 14-15, stop by the "Open Source Hub", located in the Partner Expo
hall at the Santa Clara Convention Center in Santa Clara, CA. The Open Source
Hub will have many Jenkins contributors, committers, JAM leaders, and
officers from
the governance board under one roof, so there will be plenty of knowledge and
talents on hand to share. We hope you’ll join in on the festivities.


Ask the Experts


The setup that is waiting for you: white boards, monitors and lots of brain
power to help answer those Jenkins questions that have been keeping you up at
night.  Jenkins experts can help with beginner...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 125x125&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2016&lt;/a&gt; on
September 14-15, stop by the &quot;Open Source Hub&quot;, located in the Partner Expo
hall at the Santa Clara Convention Center in Santa Clara, CA. The Open Source
Hub will have many Jenkins contributors, committers, JAM leaders, and
&lt;a href=&quot;https://www.jenkins.io/project/board&quot;&gt;officers from
the governance board&lt;/a&gt; under one roof, so there will be plenty of knowledge and
talents on hand to share. We hope you’ll join in on the festivities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ask-the-experts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ask-the-experts&quot; /&gt;Ask the Experts&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The setup that is waiting for you: white boards, monitors and lots of brain
power to help answer those Jenkins questions that have been keeping you up at
night.  Jenkins experts can help with beginner questions to the more advanced
ones. All you need to do is bring your laptop and your questions; the experts
will help answer them!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in
September with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;live-demos&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#live-demos&quot; /&gt;Live Demos&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes seeing is believing, there will be plenty of demos in the &quot;Open
Source Hub&quot; during the lunch hours on Wednesday September 14th, and Thursday
September 15th in the expo hall. Jenkins experts will be show-casing their
favorite Jenkins features, plugins and projects. Grab your lunch, take a seat
in the open source theater to learn about:&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;Pipelines for Building and Deploying Android Apps&lt;/strong&gt; by Android Emulator
plugin maintainer &lt;a href=&quot;https://github.com/orrc&quot;&gt;Chris Orr&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Git Plugin - Large Repos, Submodule Authentication, and more&lt;/strong&gt; by Git plugin
maintainer &lt;a href=&quot;https://github.com/MarkEWaite&quot;&gt;Mark Waite&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker and Pipeline&lt;/strong&gt; by Jenkins infrastructure contributor
&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R Tyler Croy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extending Pipeline with Libraries&lt;/strong&gt; by Pipeline plugin maintainer
&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Blue Ocean in Action&lt;/strong&gt; by &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; contributor
&lt;a href=&quot;https://github.com/kzantow&quot;&gt;Keith Zantow&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;External Workspace Manager plugin for Pipeline&lt;/strong&gt; by
&lt;a href=&quot;https://www.jenkins.io/projects/gsoc&quot;&gt;Google Summer of Code&lt;/a&gt; student
&lt;a href=&quot;https://github.com/alexsomai&quot;&gt;Alexandru Somai&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And many more&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;jenkins-mural&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-mural&quot; /&gt;Jenkins Mural&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins World participants will take part in the realization of a giant
collaborative mural painting with the
&lt;a href=&quot;https://www.commitstrip.com/&quot;&gt;CommitStrip&lt;/a&gt; team.  Thomas, the writer and
Etienne, the cartoonist, teamed up with a few Jenkins contributors to design a
5m x 2m mmural which will be drawn live! Brushes and colors will be
available for all attendees who wish to help paint this one of a kind piece of
Jenkins art.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;sticker-swap&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#sticker-swap&quot; /&gt;Sticker Swap&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins World attendees will have a chance to swap stickers. There will be a
table where attendees are welcome to place/take stickers. Bring your cool
stickers to share with others and take stickers that interest you.&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/logo_128.png&quot; alt=&quot;logo 128&quot; /&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/angry-jenkins_128.png&quot; alt=&quot;angry jenkins 128&quot; /&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/ninja_128.png&quot; alt=&quot;ninja 128&quot; /&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/jenkins-master.png&quot; alt=&quot;jenkins master&quot; /&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/blue-ocean-girl.png&quot; alt=&quot;blue ocean girl&quot; /&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;after-dark-reception-sponsored-by-cloudbees&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#after-dark-reception-sponsored-by-cloudbees&quot; /&gt;After Dark Reception Sponsored by CloudBees&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 right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/patrons/cloudbees.png&quot; alt=&quot;cloudbees&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After Dark reception will be from 6-8pm on Wed Sept 14 in the Partner Expo.
Enjoy cocktails, appetizers, mingle, and dance to a live band. A big &lt;strong&gt;THANK
YOU&lt;/strong&gt;
goes out to CloudBees for their generous contributions! See you at After Dark!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;contributor-summit-tuesday-september-13&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributor-summit-tuesday-september-13&quot; /&gt;Contributor Summit - Tuesday, September 13&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If Blue Ocean, Pipeline and Storage Pluggability sounds interesting to you,
join the interactive discussions surrounding these topics. The Jenkins project
is also looking to hear use-cases, war stories, and pain points. The objective
of the summit is to work towards improving the Jeknins project.
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/232811529/&quot;&gt;Seats are limited&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t forget to &lt;a href=&quot;https://www.cvent.com/d/mfq3kd&quot;&gt;register&lt;/a&gt;; I look forward to
seeing you at the conference!&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2016&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;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;Special thanks to &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; as the premier
sponsor and &lt;a href=&quot;https://www.cloudbees.com/juc/sponsors&quot;&gt;BlazeMeter, Microsoft, Red
Hat and all the other sponsors&lt;/a&gt; who have made this event possible.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&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/2016/08/22/ewm-stable-release/</id>
<title>GSoC: External Workspace Manager for Pipeline is released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/22/ewm-stable-release/" />
<author>
<name>alexsomai</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='external-workspace-manager'></category>
<category term='gsoc'></category>
<summary>
This blog post is the last one from the series of
Google Summer of Code 2016, External Workspace Manager Plugin project.
The previous posts are:




Introductory blog post


Alpha release announcement


Beta release announcement




In this post I would like to announce the 1.0.0 release of the External Workspace Manager Plugin version to the main
update center.


Here&#8217;s a highlight of the available features:




Workspace share and reuse across multiple jobs, running on different nodes


Automatic workspace cleanup


Provide custom workspace path on the disk


Disk Pool restrictions


Flexible Disk allocation strategies




All the above are detailed, with usage examples, on the plugin&#8217;s
documentation page.


Future work

Currently, there is work in progress for the workspace browsing...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post is the last one from the series of
&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code&lt;/a&gt; 2016, External Workspace Manager Plugin project.
The previous posts 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/blog/2016/05/23/external-workspace-manager-plugin/&quot;&gt;Introductory blog post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/06/30/ewm-alpha-version/&quot;&gt;Alpha release announcement&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/08/09/ewm-beta-version/&quot;&gt;Beta release announcement&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;In this post I would like to announce the 1.0.0 release of the External Workspace Manager Plugin version to the main
update center.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a highlight of the available features:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Workspace share and reuse across multiple jobs, running on different nodes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic workspace cleanup&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provide custom workspace path on the disk&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disk Pool restrictions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flexible Disk allocation strategies&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All the above are detailed, with usage examples, on the plugin’s
&lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin/blob/master/README.md&quot;&gt;documentation page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;future-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#future-work&quot; /&gt;Future work&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently, there is work in progress for the &lt;em&gt;workspace browsing&lt;/em&gt; feature (see pull request
&lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin/pull/37&quot;&gt;#37&lt;/a&gt;).
Afterwards, I’m planning to integrate fingerprints, so that the user can view a specific workspace in which
other jobs was used.
A particular feature that would be nice to have is to integrate the plugin with at least one disk provider
(e.g. Amazon EBS, Google Cloud Storage).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many other features and improvements are still to come, they are grouped in the phase 3 EPIC:
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/37543&quot;&gt;JENKINS-37543&lt;/a&gt;.
The plugin’s repository is on &lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin&quot;&gt;GitHub&lt;/a&gt;.
If you’d like to come up with new features or ideas, contributions are very welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;closing&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#closing&quot; /&gt;Closing&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was a Google Summer of Code 2016 project.
A summary of the contributions that I’ve made to the Jenkins project during this time may be found
&lt;a href=&quot;https://alexsomai.github.io/gsoc-2016/&quot;&gt;here&lt;/a&gt;.
It was a great experience, from which I learned a lot, and I’d wish I could repeat it every year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d like to thank to my mentors, &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; and
&lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt; for all their support, good advice and help they gave me.
Also, thanks to the Jenkins contributors with which I have interacted and helped me during this period.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any issues in setting up or using the plugin, please feel free to ask me on the plugin’s Gitter
link:https://app.gitter.im/#/room/#jenkinsci_external-workspace-manager-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;chat&lt;/a&gt;.
Any feedback is welcome, and you may provide it either on the Gitter chat, or on
&lt;a href=&quot;https://issues.jenkins.io&quot;&gt;Jira&lt;/a&gt; by using the &lt;em&gt;external-workspace-manager-plugin&lt;/em&gt; component.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;link:https://app.gitter.im/#/room/#jenkinsci_external-workspace-manager-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/external-workspace-manager-plugin.svg&quot; alt=&quot;title: &amp;quot;Gitter&amp;quot;&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/span&gt;
&lt;/a&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/external-workspace-manager-plugin&quot;&gt;Project repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://alexsomai.github.io/gsoc-2016/&quot;&gt;Work product page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;GSoC page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;Jenkins GSoC Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/08/17/jenkins-world-speaker-blog-aquilent/</id>
<title>Continuously Delivering Continuous Delivery Pipelines</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/17/jenkins-world-speaker-blog-aquilent/" />
<author>
<name>hinman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Jenkins World speaker Neil Hunt, Senior DevOps Architect at Aquilent.





In smaller companies with a handful of apps and fewer silos, implementing CD
pipelines to support these apps is fairly straightforward using one of the many
delivery orchestration tools available today. There is likely a constrained
tool set to support - not an abundance of flavors of applications and security
practices - and generally fewer cooks in the kitchen. But in a larger
organization, I have found that in the past, there were seemingly endless
unique requirements and mountains to climb to reach this level of automation on
each new project.









Neil will...
</summary>
<content type='html'>
&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;
This is a guest post by Jenkins World speaker Neil Hunt, Senior DevOps Architect at &lt;a href=&quot;https://www.aquilent.com/&quot;&gt;Aquilent&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In smaller companies with a handful of apps and fewer silos, implementing CD
pipelines to support these apps is fairly straightforward using one of the many
delivery orchestration tools available today. There is likely a constrained
tool set to support - not an abundance of flavors of applications and security
practices - and generally fewer cooks in the kitchen. But in a larger
organization, I have found that in the past, there were seemingly endless
unique requirements and mountains to climb to reach this level of automation on
each new project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Neil will be &lt;a href=&quot;https://www.cloudbees.com/lightning-talks&quot;&gt;presenting&lt;/a&gt; more
of this concept at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in
September, register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enter the Jenkins Pipeline plugin. My recently departed former company, a large
financial services organization with a 600+ person IT organization and 150+
application portfolio, set out to implement continuous delivery
enterprise-wide. After considering several pipeline orchestration tools, we
determined the Pipeline plugin (at the time called Workflow) to be the superior
solution for our company. Pipeline has continued Jenkins&#39; legacy of presenting
an extensible platform with just the right set of features to allow
organizations to scale its capabilities as they see fit, and do so rapidly. As
early adopters of Pipeline with a protracted set of requirements, we used it
both to accelerate the pace of onboarding new projects and to reduce the
ongoing feature delivery time of our applications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my presentation at Jenkins World, I will demonstrate the methods we used to
enable this. A few examples:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We leveraged the Pipeline Remote File Loader plugin to write shared common
code and sought and received community enhancements to these functions.&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/jw-speaker-blog-aquient/jw-speaker-blog-aquilent-1-1.png&quot; alt=&quot;jw speaker blog aquilent 1 1&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Jenkinsfile, loading a shared AWS utilities function library&lt;/em&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/jw-speaker-blog-aquient/jw-speaker-blog-aquilent-2.png&quot; alt=&quot;jw speaker blog aquilent 2&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;awsUtils.groovy, snippets of some AWS functions&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We migrated from EC2 agents to Docker-based agents running on Amazon’s
Elastic Container Service, allowing us to spin up new executors in seconds
and for teams to own their own executor definitions.&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/jw-speaker-blog-aquient/jw-speaker-blog-aquilent-3.png&quot; alt=&quot;jw speaker blog aquilent 3&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline run #1 using standard EC2 executors, spinning up EC2 instance for each
node; Pipeline run #2 using shared ECS cluster with near-instant instantiation
of a Docker agent in the cluster for each node.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We also created a Pipeline Library of common pipelines, enabling projects
that fit certain models to use ready-made end-to-end pipelines. Some
examples:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Maven JAR Pipeline: Pipeline that clones git repository, builds JAR file
from pom.xml, deploys to Artifactory, and runs maven release plugin to
increment next version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Angular.JS Pipeline: Pipeline that executes a grunt and bower build, then
runs S3 sync to Amazon S3 bucket in Dev, then Stage, then Prod buckets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pentaho Reports Pipeline: Pipeline that clones git repository, constructs
zip file, and executes Pentaho Business Intelligence Platform CLI to import new
set of reports in Dev, Stage, then Prod servers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Perhaps most critically, a shout-out to the saving grace of this quest for our
security and ops teams: the manual &#39;input&#39; step! While the ambition of
continuous delivery is to have as few of these as possible, this was the
single-most pivotal feature in convincing others of Pipeline’s viability, since
now any step of the delivery process could be gate-checked by an LDAP-enabled
permission group. Were it not for the availability of this step, we may still
be living in the world of: &quot;This seems like a great tool for development, but
we will have a segregated process for production deployments.&quot; Instead, we had
a pipeline full of many &#39;input&#39; steps at first, and then used the data we
collected around the longest delays to bring management focus to them and unite
everyone around the goal of strategically removing them, one by one.&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/jw-speaker-blog-aquient/jw-speaker-blog-aquilent-4.png&quot; alt=&quot;jw speaker blog aquilent 4&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 125x125&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Going forward, having recently joined Aquilent’s Cloud Solutions Architecture
team, I’ll be working with our project teams here to further mature the use of
these Pipeline plugin features as we move towards continuous delivery. Already,
we have migrated several components of our healthcare.gov project to Pipeline.
The team has been able to consolidate several Jenkins jobs into a single,
visible delivery pipeline, to maintain the lifecycle of the pipeline with our
application code base in our SCM, and to more easily integrate with our
external tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Due to functional shortcomings in the early adoption stages of the Pipeline
plugin and the ever-present political challenges of shifting organizational
policy, this has been and continues to be far from a bruise-free journey. But
we plodded through many of these issues to bring this to fruition and
ultimately reduced the number of manual steps in some pipelines from 12 down to
1 and brought our 20+ Jenkins-minute pipelines to only six minutes after months
of iteration. I hope you’ll join this session at Jenkins World and learn about
our challenges and successes in achieving the promise of continuous delivery at
enterprise scale.&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/2016/08/11/speaker-blog-edx-jenkins-world/</id>
<title>Using Jenkins for Disparate Feedback on GitHub</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/11/speaker-blog-edx-jenkins-world/" />
<author>
<name>hinman</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Ben Patterson, Engineering Manager at
edX.





Picking a pear from a basket is straightforward when you can hold it in your hand, feel its weight, perhaps give a gentle squeeze, observe its color and look more closely at any bruises. If the only information we had was a photograph from one angle, we’d have to do some educated guessing. 


As developers, we don’t get a photograph; we get a green checkmark or a red x. We use that to decide whether or not we need to switch gears and go back to a pull request we...
</summary>
<content type='html'>
&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;
This is a guest post by Ben Patterson, Engineering Manager at
&lt;a href=&quot;https://www.edx.org/&quot;&gt;edX&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Picking a pear from a basket is straightforward when you can hold it in your hand, feel its weight, perhaps give a gentle squeeze, observe its color and look more closely at any bruises. If the only information we had was a photograph from one angle, we’d have to do some educated guessing. &lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/1pear.png&quot; alt=&quot;1pear&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As developers, we don’t get a photograph; we get a green checkmark or a red x. We use that to decide whether or not we need to switch gears and go back to a pull request we submitted recently. At edX, we take advantage of some Jenkins features that could give us more granularity on GitHub pull requests, and make that decision less of a guessing game.&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/5pears.png&quot; alt=&quot;5pears&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;multiple-contexts-reporting-back-when-theyre-available&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#multiple-contexts-reporting-back-when-theyre-available&quot; /&gt;Multiple contexts reporting back when they’re available&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pull requests on our platform are evaluated from several angles: static code analysis including linting and security audits, javascript unit tests, python unit tests, acceptance tests and accessibility tests. Using an elixir of plugins, including the GitHub Pull Request Builder Plugin, we put more direct feedback into the hands of the contributor so s/he can quickly decide how much digging is going to be needed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, if I made adjustments to my branch and know more requirements are coming, then I may not be as worried about passing the linter; however, if my unit tests have failed, I likely have a problem I need to address regardless of when the new requirements arrive. Timing is important as well. Splitting out the contexts means we can run tests in parallel and report results faster.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;developers-can-re-run-specific-contexts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#developers-can-re-run-specific-contexts&quot; /&gt;Developers can re-run specific contexts&lt;/h3&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/jenkins-run-python.png&quot; alt=&quot;jenkins run python&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Occasionally the feedback mechanism fails. It is oftentimes a flaky condition in a test or in test setup. (Solving flakiness is a different discussion I’m sidestepping. Accept the fact that the system fails for purposes of this blog entry.) Engineers are armed with the power of re-running specific contexts, also available through the PR plugin. A developer can say “jenkins run bokchoy” to re-run the acceptance tests, for example. A developer can also re-run everything with “jenkins run all”. These phrases are set through the GitHub Pull Request Builder configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;more-granular-data-is-easier-to-find-for-our-tools-team&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-granular-data-is-easier-to-find-for-our-tools-team&quot; /&gt;More granular data is easier to find for our Tools team&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Splitting the contexts has also given us important data points for our Tools team to help in highlighting things like flaky tests, time to feedback and other metrics that help the org prioritize what’s important. We use this with a log aggregator (in our case, Splunk) to produce valuable reports such as this one.&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/95th-percentile.png&quot; alt=&quot;95th percentile&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I could go on! The short answer here is we have an intuitive way of divvying up our tests, not only for optimizing the overall amount of time it takes to get build results, but also to make the experience more user-friendly to developers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ben will be &lt;a href=&quot;https://www.cloudbees.com/using-jenkins-diverse-feedback-github&quot;&gt;presenting&lt;/a&gt; more on this topic at
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in September,
register with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/2016/08/10/rails-cd-with-pipeline/</id>
<title>Continuous Security for Rails apps with Pipeline and Brakeman</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/10/rails-cd-with-pipeline/" />
<author>
<name>rtyler</name>
</author>
<category term='tutorial'></category>
<category term='ruby'></category>
<category term='pipeline'></category>
<category term='rails'></category>
<category term='brakeman'></category>
<category term='continuousdelivery'></category>
<summary>
This is a guest post by R. Tyler Croy, who is a
long-time contributor to Jenkins and the primary contact for Jenkins project
infrastructure. He is also a Jenkins Evangelist at
CloudBees, Inc.






When the Ruby on Rails framework debuted it
changed the industry in two noteworthy ways: it created a trend of opinionated web
application frameworks (Django,
Play, Grails) and it
also strongly encouraged thousands of developers to embrace test-driven
development along with many other modern best practices (source control, dependency
management, etc). Because Ruby, the language underneath Rails, is interpreted
instead of compiled there isn&#8217;t a "build" per se but rather tens, if not
hundreds, of tests, linters and scans...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt;, who is a
long-time contributor to Jenkins and the primary contact for Jenkins project
infrastructure. He is also a Jenkins Evangelist at
&lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the &lt;a href=&quot;https://rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt; framework debuted it
changed the industry in two noteworthy ways: it created a trend of opinionated web
application frameworks (&lt;a href=&quot;https://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt;,
&lt;a href=&quot;https://playframework.com/&quot;&gt;Play&lt;/a&gt;, &lt;a href=&quot;https://grails.org/&quot;&gt;Grails&lt;/a&gt;) and it
also &lt;em&gt;strongly&lt;/em&gt; encouraged thousands of developers to embrace test-driven
development along with many other modern best practices (source control, dependency
management, etc). Because Ruby, the language underneath Rails, is interpreted
instead of compiled there isn’t a &quot;build&quot; per se but rather tens, if not
hundreds, of tests, linters and scans which are run to ensure the application’s
quality. With the rise in popularity of Rails, the popularity of application
hosting services with easy-to-use deployment tools like &lt;a href=&quot;https://heroku.com&quot;&gt;Heroku&lt;/a&gt; or
&lt;a href=&quot;https://engineyard.com&quot;&gt;Engine Yard&lt;/a&gt; rose too.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This combination of good &lt;strong&gt;test coverage&lt;/strong&gt; and easily &lt;strong&gt;automated deployments&lt;/strong&gt;
makes Rails easy to continuously deliver with Jenkins. In this post we’ll cover
testing non-trivial Rails applications with &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Jenkins
Pipeline&lt;/a&gt; and, as an added bonus, we will add security scanning via
&lt;a href=&quot;https://brakemanscanner.org&quot;&gt;Brakeman&lt;/a&gt; and the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Brakeman+Plugin&quot;&gt;Brakeman
plugin&lt;/a&gt;.&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/ruby-pipeline-2016/cfpapp-stage-view.png&quot; alt=&quot;cfpapp stage view&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Topics&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;#preparing-the-app&quot;&gt;Preparing the app&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#preparing-jenkins&quot;&gt;Preparing Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#writing-the-pipeline&quot;&gt;Writing the Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#security-scanning&quot;&gt;Security scanning&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#deploying-the-good-stuff&quot;&gt;Deploying the good stuff&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;#wrap-up&quot;&gt;Wrap up&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;For this demonstration, I used &lt;a href=&quot;https://rubycentral.org/&quot;&gt;Ruby Central&lt;/a&gt;&#39;s
&lt;a href=&quot;https://github.com/rubycentral/cfp-app&quot;&gt;cfp-app&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A Ruby on Rails application that lets you manage your conference’s call for
proposal (CFP), program and schedule. It was written by Ruby Central to run the
CFPs for RailsConf and RubyConf.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I chose this Rails app, not only because it’s a sizable application with lots
of tests, but it’s actually the application we used to collect talk proposals
for the &quot;Community Tracks&quot; at this
year’s &lt;a href=&quot;https://jenkinsworld.com&quot;&gt;Jenkins World&lt;/a&gt;. For the most part,
cfp-app is a standard Rails application. It uses
&lt;a href=&quot;https://www.postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt; for its database,
&lt;a href=&quot;https://rspec.info&quot;&gt;RSpec&lt;/a&gt; for its tests and
&lt;a href=&quot;https://ruby-lang.org&quot;&gt;Ruby 2.3.x&lt;/a&gt; as its runtime.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you prefer to just to look at the code, skip straight to the
&lt;a href=&quot;https://github.com/rtyler/cfp-app/blob/aff11d97b460ca4b630b1fa4f669c226aeadd8ae/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;preparing-the-app&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#preparing-the-app&quot; /&gt;Preparing the app&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For &lt;em&gt;most&lt;/em&gt; Rails applications there are few, if any, changes needed to enable
continuous delivery with Jenkins. In the case of
&lt;a href=&quot;https://github.com/rubycentral/cfp-app&quot;&gt;cfp-app&lt;/a&gt;, I added two gems to get
the most optimal integration into Jenkins:&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;&lt;a href=&quot;https://github.com/ci-reporter/ci_reporter&quot;&gt;ci_reporter&lt;/a&gt;, for test report
integration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/presidentbeef/brakeman&quot;&gt;brakeman&lt;/a&gt;, for security scanning.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Adding these was simple, I just needed to update the &lt;code&gt;Gemfile&lt;/code&gt; and the
&lt;code&gt;Rakefile&lt;/code&gt; in the root of the repository to contain:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Gemfile&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# .. snip ..&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;group&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:test&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# RSpec, etc&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ci_reporter&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ci_reporter_rspec&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;brakeman&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:require&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&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;title&quot;&gt;Rakefile&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight nowrap&quot;&gt;&lt;code data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# .. snip ..&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ci/reporter/rake/rspec&#39;&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Make sure we setup ci_reporter before executing our RSpec examples&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:spec&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ci:setup:rspec&#39;&lt;/span&gt;&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;preparing-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#preparing-jenkins&quot; /&gt;Preparing Jenkins&lt;/h3&gt;
&lt;div id=&quot;plugins&quot; class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the cfp-app project set up, next on the list is to ensure that Jenkins itself
is ready. Generally I suggest running the &lt;a href=&quot;https://www.jenkins.io/changelog-stable&quot;&gt;latest LTS&lt;/a&gt; of
Jenkins; for this demonstration I used Jenkins 2.7.1 with the following
plugins:&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://wiki.jenkins.io/display/JENKINS/Pipeline+Plugin&quot;&gt;Pipeline plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Brakeman+Plugin&quot;&gt;Brakeman plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/CloudBees+Docker+Pipeline+Plugin&quot;&gt;CloudBees
Docker Pipeline 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;I also used the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/GitHub+Organization+Folder+Plugin&quot;&gt;GitHub
Organization Folder plugin&lt;/a&gt; to automatically create pipeline items in my
Jenkins instance; that isn’t required for the demo, but it’s pretty cool to see
repositories and branches with a &lt;code&gt;Jenkinsfile&lt;/code&gt; automatically show up in
Jenkins, so I recommend it!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the &lt;a href=&quot;#plugins&quot;&gt;plugins&lt;/a&gt; listed above, I also needed at least &lt;em&gt;one&lt;/em&gt;
Jenkins agent with the &lt;a href=&quot;https://docker.io&quot;&gt;Docker&lt;/a&gt; daemon installed and
running on it. I label these agents with &quot;docker&quot; to make it easier to assign
Docker-based workloads to them in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Any Linux-based machine with Docker installed will work, in my case I was
provisioning on-demand agents with the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Azure+Slave+plugin&quot;&gt;Azure
plugin&lt;/a&gt; which, like the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Amazon+EC2+Plugin&quot;&gt;EC2 plugin&lt;/a&gt;,
helps keep my test costs down.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re using Amazon Web Services, you might also be interested in
&lt;a href=&quot;https://www.jenkins.io/blog/2016/06/10/save-costs-with-ec2-spot-fleet&quot;&gt;this blog post&lt;/a&gt; from
earlier this year unveiling the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Amazon+EC2+Fleet+Plugin&quot;&gt;EC2
Fleet plugin&lt;/a&gt; for working with EC2 Spot Fleets.&lt;/p&gt;
&lt;/div&gt;
&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;writing-the-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#writing-the-pipeline&quot; /&gt;Writing the Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To make sense of the various things that the &lt;code&gt;Jenkinsfile&lt;/code&gt; needs to do, I find
it easier to start by simply defining the stages of my pipeline. This helps me
think of, in broad terms, what order of operations my pipeline should have.
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;cm&quot;&gt;/* Assign our work to an agent labelled &#39;docker&#39; */&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Prepare Container&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Install Gems&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Prepare Database&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Invoke Rake&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Security scan&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Deploy&#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 mentioned previously, this &lt;code&gt;Jenkinsfile&lt;/code&gt; is going to rely heavily on the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/CloudBees+Docker+Pipeline+Plugin&quot;&gt;CloudBees
Docker Pipeline plugin&lt;/a&gt;. The plugin provides two very important features:&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;Ability to execute steps &lt;em&gt;inside&lt;/em&gt; of a running Docker container&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ability to run a container in the &quot;background.&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Like most Rails applications, one can effectively test the application with two
commands: &lt;code&gt;bundle install&lt;/code&gt; followed by &lt;code&gt;bundle exec rake&lt;/code&gt;. I already had some
Docker images prepared with &lt;a href=&quot;https://rvm.io&quot;&gt;RVM&lt;/a&gt; and Ruby 2.3.0 installed,
which ensures a common and consistent starting point:&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;c1&quot;&gt;// .. &#39;stage&#39; steps removed&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;rtyler/rvm:2.3.0&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;inside&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
        &lt;span class=&quot;n&quot;&gt;rvm&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bundle install&#39;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
        &lt;span class=&quot;n&quot;&gt;rvm&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bundle exec rake&#39;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&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;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Run the named container. The &lt;code&gt;inside&lt;/code&gt; method can take optional additional flags for the &lt;code&gt;docker run&lt;/code&gt; command.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Execute our shell commands using our tiny &lt;code&gt;sh&lt;/code&gt; step wrapper
&lt;a href=&quot;https://github.com/rtyler/cfp-app/blob/aff11d97b460ca4b630b1fa4f669c226aeadd8ae/Jenkinsfile#L86-L91&quot;&gt;&lt;code&gt;rvm&lt;/code&gt;&lt;/a&gt;. This ensures that the shell code is executed in the correct RVM environment.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;When the closure completes, the container will be destroyed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, with this application, the &lt;code&gt;bundle exec rake&lt;/code&gt; command will fail
if PostgreSQL isn’t available when the process starts. This is where the
&lt;em&gt;second&lt;/em&gt; important feature of the CloudBees Docker Pipeline plugin comes
into effect: the ability to run a container in the &quot;background.&quot;&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;c1&quot;&gt;// .. &#39;stage&#39; steps removed&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* Pull the latest `postgres` container and run it in the background */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;postgres&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withRun&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;container&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
        &lt;span class=&quot;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;PostgreSQL running in container ${container.id}&quot;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&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;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Run the container, effectively &lt;code&gt;docker run postgres&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Any number of steps can go inside the closure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;When the closure completes, the container will be destroyed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;running-the-tests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-the-tests&quot; /&gt;Running the tests&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Combining these two snippets of Jenkins Pipeline is, in my opinion, where the
power of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Domain-specific_language&quot;&gt;DSL&lt;/a&gt;
shines:&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;postgres&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withRun&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;container&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;rtyler/rvm:2.3.0&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;inside&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--link=${container.id}:postgres&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;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
            &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Install Gems&#39;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;rvm&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bundle install&quot;&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Invoke Rake&#39;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;DATABASE_URL=postgres://postgres@postgres:5432/&#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;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
                &lt;span class=&quot;n&quot;&gt;rvm&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;bundle exec rake&quot;&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;spec/reports/*.xml&#39;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;(3)&lt;/b&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;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;By passing the &lt;code&gt;--link&lt;/code&gt; argument, the Docker daemon will allow the RVM container to talk to the PostgreSQL container under the host name &#39;postgres&#39;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Use the &lt;code&gt;withEnv&lt;/code&gt; step to set environment variables for everything that is in the closure. In this case, the cfp-app DB scaffolding will look for the &lt;code&gt;DATABASE_URL&lt;/code&gt; variable to override the DB host/user/dbname defaults.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot; /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Archive the test reports generated by &lt;a href=&quot;https://github.com/ci-reporter/ci_reporter&quot;&gt;ci_reporter&lt;/a&gt; so that Jenkins can display test reports and trend analysis.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/ruby-pipeline-2016/cfpapp-tests.png&quot; alt=&quot;cfpapp tests&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this done, the basics are in place to consistently run the tests for
cfp-app in fresh Docker containers for each execution of the pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;security-scanning&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#security-scanning&quot; /&gt;Security scanning&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using &lt;a href=&quot;https://brakemanscanner.org&quot;&gt;Brakeman&lt;/a&gt;, the security scanner for Ruby
on Rails, is almost trivially easy inside of Jenkins Pipeline, thanks to the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Brakeman+Plugin&quot;&gt;Brakeman
plugin&lt;/a&gt; which implements the &lt;code&gt;publishBrakeman&lt;/code&gt; step.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building off our example above, we can implement the &quot;Security scan&quot; stage:&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;cm&quot;&gt;/* --8&amp;lt;--8&amp;lt;-- snipsnip --8&amp;lt;--8&amp;lt;-- */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Security scan&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rvm&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;brakeman -o brakeman-output.tabs --no-progress --separate-models&#39;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
    &lt;span class=&quot;n&quot;&gt;publishBrakeman&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;brakeman-output.tabs&#39;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
    &lt;span class=&quot;cm&quot;&gt;/* --8&amp;lt;--8&amp;lt;-- snipsnip --8&amp;lt;--8&amp;lt;-- */&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;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Run the &lt;a href=&quot;https://brakemanscanner.org&quot;&gt;Brakeman&lt;/a&gt; security scanner for Rails and store the output for later in &lt;code&gt;brakeman-output.tabs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Archive the reports generated by Brakeman so that Jenkins can display detailed reports with trend analysis.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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/ruby-pipeline-2016/cfpapp-brakeman.png&quot; alt=&quot;cfpapp brakeman&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of this writing, there is work in progress
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31202&quot;&gt;JENKINS-31202&lt;/a&gt;) to
render trend graphs from plugins like Brakeman on a pipeline project’s main
page.&lt;/p&gt;
&lt;/div&gt;
&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;deploying-the-good-stuff&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deploying-the-good-stuff&quot; /&gt;Deploying the good stuff&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the tests and security scanning are all working properly, we can start to
set up the deployment stage. Jenkins Pipeline provides the variable
&lt;code&gt;currentBuild&lt;/code&gt; which we can use to determine whether our pipeline has been
successful thus far or not. This allows us to add the logic to only deploy when
everything is passing, as we would expect:&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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;docker&#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;cm&quot;&gt;/* --8&amp;lt;--8&amp;lt;-- snipsnip --8&amp;lt;--8&amp;lt;-- */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Deploy&#39;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;currentBuild&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SUCCESS&#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;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;(1)&lt;/b&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;./deploy.sh&#39;&lt;/span&gt; &lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;(2)&lt;/b&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Something is wrong with ${env.JOB_NAME} ${env.BUILD_ID}&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                  &lt;span class=&quot;nl&quot;&gt;to:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;nobody@example.com&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;You should fix it&#39;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* --8&amp;lt;--8&amp;lt;-- snipsnip --8&amp;lt;--8&amp;lt;-- */&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;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot; /&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;currentBuild&lt;/code&gt; has the &lt;code&gt;result&lt;/code&gt; property which would be &lt;code&gt;&#39;SUCCESS&#39;&lt;/code&gt;, &lt;code&gt;&#39;FAILED&#39;&lt;/code&gt;, &lt;code&gt;&#39;UNSTABLE&#39;&lt;/code&gt;, &lt;code&gt;&#39;ABORTED&#39;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot; /&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Only if &lt;code&gt;currentBuild.result&lt;/code&gt; is successful should we bother invoking our deployment script (e.g. &lt;code&gt;git push heroku master&lt;/code&gt;)&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;wrap-up&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#wrap-up&quot; /&gt;Wrap up&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have gratuitously commented the full
&lt;a href=&quot;https://github.com/rtyler/cfp-app/blob/0e85db6d054deefd637de235766468631f551c7f/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt;
which I hope is a useful summation of the work outlined above. Having worked
on a number of Rails applications in the past, the consistency provided by
Docker and Jenkins Pipeline above would have definitely improved those
projects&#39; delivery times. There is still room for improvement however, which
is left as an exercise for the reader. Such as: preparing new containers with
all their
&lt;a href=&quot;https://github.com/rtyler/cfp-app/blob/0e85db6d054deefd637de235766468631f551c7f/Jenkinsfile#L36-L46&quot;&gt;dependencies
built-in&lt;/a&gt; instead of installing them at run-time. Or utilizing the &lt;code&gt;parallel&lt;/code&gt;
step for executing RSpec across multiple Jenkins agents simultaneously.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The beautiful thing about defining your continuous delivery, and continuous
security, pipeline in code is that you can continue to iterate on it!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://github.com/rtyler/cfp-app/blob/0e85db6d054deefd637de235766468631f551c7f/Jenkinsfile&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/ruby-pipeline-2016/cfpapp-stage-view.png&quot; alt=&quot;cfpapp stage view&quot; /&gt;
&lt;/a&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/2016/08/09/ewm-beta-version/</id>
<title>GSoC: External Workspace Manager for Pipeline. Beta release is available</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/09/ewm-beta-version/" />
<author>
<name>alexsomai</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='external-workspace-manager'></category>
<category term='gsoc'></category>
<summary>
This blog post is a continuation of the External Workspace Manager Plugin related posts, starting with
the introductory blog post, and followed by
the alpha version release announcement.


As the title suggests, the beta version of the External Workspace Manager Plugin was launched!
This means that it&#8217;s available only in the
Experimental Plugins Update Center.








Take care when installing plugins from the Experimental Update Center, since they may change in
backward-incompatible ways.
It&#8217;s advisable not to use it for Jenkins production environments.





The plugin&#8217;s repository is on GitHub.
The complete plugin&#8217;s documentation can be accessed
here.


What&#8217;s new

Bellow is a summary of the features added so far, since the alpha version.


Multiple upstream...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This blog post is a continuation of the External Workspace Manager Plugin related posts, starting with
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/23/external-workspace-manager-plugin/&quot;&gt;the introductory blog post&lt;/a&gt;, and followed by
&lt;a href=&quot;https://www.jenkins.io/blog/2016/06/30/ewm-alpha-version/&quot;&gt;the alpha version release announcement&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the title suggests, the beta version of the External Workspace Manager Plugin was launched!
This means that it’s available only in the
&lt;a href=&quot;https://www.jenkins.io/blog/2013/09/23/experimental-plugins-update-center/&quot;&gt;Experimental Plugins Update Center&lt;/a&gt;.&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;
Take care when installing plugins from the Experimental Update Center, since they may change in
backward-incompatible ways.
It’s advisable not to use it for Jenkins production environments.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin’s repository is on &lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin&quot;&gt;GitHub&lt;/a&gt;.
The complete plugin’s documentation can be accessed
&lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin/blob/master/README.md&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-new&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-new&quot; /&gt;What’s new&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Bellow is a summary of the features added so far, since the alpha version.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;multiple-upstream-run-selection-strategies&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#multiple-upstream-run-selection-strategies&quot; /&gt;Multiple upstream run selection strategies&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It has support for the
&lt;a href=&quot;https://github.com/jenkinsci/run-selector-plugin&quot;&gt;Run Selector Plugin&lt;/a&gt; (which is still in beta),
so you can provide different run selection strategies when allocating a disk from the upstream job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s suppose that we have an upstream job that clones the repository and builds the project:&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extWorkspace&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exwsAllocate&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;diskpool1&#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#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;exws&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extWorkspace&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;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn clean install -DskipTests&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the downstream job, we run the tests on a different node, but we reuse the same workspace as the previous job:&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;selectRun&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;upstream&#39;&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extWorkspace&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exwsAllocate&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;selectedRun:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&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;exws&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extWorkspace&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 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;/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;selectRun&lt;/code&gt; in this example selects the last stable build from the upstream job.
But, we can be more explicit, and select a specific build number from the upstream job.&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;selectRun&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;upstream&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;nl&quot;&gt;selector:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SpecificRunSelector&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;buildNumber:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UPSTREAM_BUILD_NUMBER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extWorkspace&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exwsAllocate&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;selectedRun:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;
&lt;span class=&quot;c1&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 &lt;code&gt;selectedRun&lt;/code&gt; parameter is given to the &lt;code&gt;exwsAllocate&lt;/code&gt; step, it will allocate the same workspace that was
used by that run.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Run Selector Plugin has several run selection strategies that are briefly explained
&lt;a href=&quot;https://github.com/jenkinsci/run-selector-plugin/blob/master/README.md&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;automatic-workspace-cleanup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automatic-workspace-cleanup&quot; /&gt;Automatic workspace cleanup&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Provides an automatic workspace cleanup by integrating the
&lt;a href=&quot;https://github.com/jenkinsci/ws-cleanup-plugin&quot;&gt;Workspace Cleanup Plugin&lt;/a&gt;.
For example, if we need to delete the workspace only if the build has failed, we can do the following:&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extWorkspace&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exwsAllocate&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;diskPoolId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;diskpool1&#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#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;exws&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extWorkspace&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;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn clean install&#39;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&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;currentBuild&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;FAILURE&#39;&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;step&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;WsCleanup&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;cleanWhenFailure:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&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;More workspace cleanup examples can be found at this
&lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin/blob/master/doc/WORKSPACE_CLEANUP.md&quot;&gt;link&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;custom-workspace-path&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#custom-workspace-path&quot; /&gt;Custom workspace path&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Allows the user to specify a custom workspace path to be used when allocating workspace on the disk.
The plugin offers two alternatives for doing this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;by defining a global workspace template for each Disk Pool&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This can be defined in the Jenkins global config, &lt;em&gt;External Workspace Definitions&lt;/em&gt; section.&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/ewm/global-custom-workspace-path.png&quot; alt=&quot;global custom workspace path&quot; title=&quot;Global Custom Workspace Path&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;by defining a custom workspace path in the Pipeline script&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can use the Pipeline DSL to compute the workspace path.
Then we pass this path as input parameter to the &lt;code&gt;exwsAllocate&lt;/code&gt; step.&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;customPath&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${env.JOB_NAME}/${PULL_REQUEST_NUMBER}/${env.BUILD_NUMBER}&quot;&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extWorkspace&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exwsAllocate&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;diskPoolId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;diskpool1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;path:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;customPath&lt;/span&gt;
&lt;span class=&quot;c1&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;For more details see the afferent
&lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin/blob/master/doc/CUSTOM_WORKSPACE_PATH.md&quot;&gt;documentation page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;disk-pool-restrictions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#disk-pool-restrictions&quot; /&gt;Disk Pool restrictions&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin comes with Disk Pool restriction strategies.
It does this by using the restriction capabilities provided by the
&lt;a href=&quot;https://github.com/jenkinsci/job-restrictions-plugin&quot;&gt;Job Restrictions Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, we can restrict a Disk Pool to be allocated only if the Jenkins job in which it’s allocated was triggered
by a specific user:&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/ewm/restriction-by-user.png&quot; alt=&quot;restriction by user&quot; title=&quot;Disk Pool Restriction By User&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or, we can restrict the Disk Pool to be allocated only for those jobs whose name matches a well defined pattern:&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/ewm/restriction-by-job-name.png&quot; alt=&quot;restriction by job name&quot; title=&quot;Disk Pool Restriction By Job Name&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-next&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-next&quot; /&gt;What’s next&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently there is ongoing work for providing flexible disk allocation strategies.
The user will be able to define a default disk allocation strategy in the Jenkins global config.
So for example, we want to select the disk with the most usable space as default allocation strategy:&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/ewm/global-disk-allocation-strategy.png&quot; alt=&quot;global disk allocation strategy&quot; title=&quot;Global Disk Allocation Strategy&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If needed, this allocation strategy may be overridden in the Pipeline code.
Let’s suppose that for a specific job, we want to allocate the disk with the highest read speed.&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extWorkspace&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exwsAllocate&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;diskPoolId:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;diskpool1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;strategy:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fastestRead&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;c1&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 this feature is completed, the plugin will enter a final testing phase.
If all goes to plan, a stable version should be released in about two weeks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any issues in setting up or using the plugin, please feel free to ask me on the plugin’s Gitter
link:https://app.gitter.im/#/room/#jenkinsci_external-workspace-manager-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;chat&lt;/a&gt;.
Any feedback is welcome, and you may provide it either on the Gitter chat, or on
&lt;a href=&quot;https://issues.jenkins.io&quot;&gt;Jira&lt;/a&gt; by using the &lt;em&gt;external-workspace-manager-plugin&lt;/em&gt; component.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;link:https://app.gitter.im/#/room/#jenkinsci_external-workspace-manager-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/external-workspace-manager-plugin.svg&quot; alt=&quot;title: &amp;quot;Gitter&amp;quot;&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/span&gt;
&lt;/a&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/external-workspace-manager-plugin&quot;&gt;Project repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/23/external-workspace-manager-plugin/&quot;&gt;Project intro blog post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/06/30/ewm-alpha-version/&quot;&gt;Alpha version announcement&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;GSoC page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;Jenkins GSoC Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&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/2016/08/08/docker-pipeline-environments/</id>
<title>Don&#39;t install software, define your environment with Docker and Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/08/docker-pipeline-environments/" />
<author>
<name>michaelneale</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='blueocean'></category>
<category term='ux'></category>
<category term='javascript'></category>
<category term='nodejs'></category>
<summary>
This is a guest post by Michael Neale, long time open
source developer and contributor to the Blue Ocean
project.






If you are running parts of your pipeline on Linux, possibly the easiest way to
get a clean reusable environment is to use:
CloudBees
Docker Pipeline plugin.


In this short post I wanted to show how you can avoid installing stuff on the agents, and have per project, or even per branch, customized build environments.
Your environment, as well as your pipeline is defined and versioned alongside your code.


I wanted to use the Blue Ocean project as an
example of a
project that uses the CloudBees Docker Pipeline plugin.


Environment and...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/michaelneale&quot;&gt;Michael Neale&lt;/a&gt;, long time open
source developer and contributor to the &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;
project.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are running parts of your pipeline on Linux, possibly the easiest way to
get a clean reusable environment is to use:
&lt;a href=&quot;https://go.cloudbees.com/docs/cloudbees-documentation/cje-user-guide/chapter-docker-workflow.html&quot;&gt;CloudBees
Docker Pipeline plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this short post I wanted to show how you can avoid installing stuff on the agents, and have per project, or even per branch, customized build environments.
Your environment, as well as your pipeline is defined and versioned alongside your code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I wanted to use the &lt;a href=&quot;https://www.jenkins.io/doc/book/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; project as an
&lt;a href=&quot;https://github.com/jenkinsci/jenkins-design-language/&quot;&gt;example&lt;/a&gt; of a
project that uses the CloudBees Docker Pipeline plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;environment-and-pipeline-for-javascript-components&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#environment-and-pipeline-for-javascript-components&quot; /&gt;Environment and Pipeline for JavaScript components&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt; project has a few moving parts, one of
which is called the &quot;Jenkins Design Language&quot;.  This is a grab bag of re-usable
CSS, HTML, style rules, icons and JavaScript components (using React.js) that
provide the look and feel for Blue Ocean.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JavaScript and Web Development being what it is in 2016, many utilities are
need to assemble a web app.  This includes npm and all that it needs, less.js
to convert Less to CSS, Babel to &quot;transpile&quot; versions of JavaScript to other
types of JavaScript (don’t ask) and more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We could spend time installing nodejs/npm on the agents, but why not just use
the &lt;a href=&quot;https://hub.docker.com/_/node/&quot;&gt;official off the shelf&lt;/a&gt; docker image
from &lt;a href=&quot;https://hub.docker.com&quot;&gt;Docker Hub&lt;/a&gt;?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The only thing that has to be installed and run on the build agents is the Jenkins agent, and a docker daemon.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A simple pipeline using this approach would be:&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;node&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;s2&quot;&gt;&quot;Prepare environment&quot;&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;node&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;inside&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;s2&quot;&gt;&quot;Checkout and build deps&quot;&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;npm install&quot;&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Test and validate&quot;&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;npm install gulp-cli &amp;amp;&amp;amp; ./node_modules/.bin/gulp&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This uses the stock &quot;official&quot; Node.js image from the Docker Hub, but doesn’t let us customize much about the environment.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;customising-the-environment-without-installing-bits-on-the-agent&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#customising-the-environment-without-installing-bits-on-the-agent&quot; /&gt;Customising the environment, without installing bits on the agent&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Being the forward looking and lazy person that I am, I didn’t want to have to
go and fish around for a Docker image every time a developer wanted something
special installed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead, I put a &lt;code&gt;Dockerfile&lt;/code&gt; in the root of the repo, alongside the &lt;code&gt;Jenkinsfile&lt;/code&gt;:&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/2016-08-03/environment_jenkinsfile.png&quot; alt=&quot;Environment&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The contents of the &lt;code&gt;Dockerfile&lt;/code&gt; can then define the exact environment needed
to build the project.  Sure enough, shortly after this, someone came along
saying they wanted to use &lt;a href=&quot;https://flowtype.org/&quot;&gt;Flow&lt;/a&gt; from Facebook (A
typechecker for JavaScript).  This required an additional native component to
work (via &lt;code&gt;apt-get install&lt;/code&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was achieved via a
&lt;a href=&quot;https://github.com/jenkinsci/jenkins-design-language/pull/72/files&quot;&gt;pull
request&lt;/a&gt; to both the &lt;code&gt;Jenkinsfile&lt;/code&gt; and the &lt;code&gt;Dockerfile&lt;/code&gt; at the same time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So now our environment is defined by a &lt;code&gt;Dockerfile&lt;/code&gt; with the following contents:&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;c&quot;&gt;# Lets not just use any old version but pick one&lt;/span&gt;
FROM node:5.11.1

&lt;span class=&quot;c&quot;&gt;# This is needed for flow, and the weirdos that built it in ocaml:&lt;/span&gt;
RUN apt-get update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; libelf1

RUN useradd jenkins &lt;span class=&quot;nt&quot;&gt;--shell&lt;/span&gt; /bin/bash &lt;span class=&quot;nt&quot;&gt;--create-home&lt;/span&gt;
USER jenkins&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;Jenkinsfile&lt;/code&gt; pipeline now has the following contents:&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;node&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;s2&quot;&gt;&quot;Prepare environment&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;def&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;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;cloudbees-node&#39;&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;na&quot;&gt;inside&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;s2&quot;&gt;&quot;Checkout and build deps&quot;&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;npm install&quot;&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Validate types&quot;&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./node_modules/.bin/flow&quot;&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Test and validate&quot;&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;npm install gulp-cli &amp;amp;&amp;amp; ./node_modules/.bin/gulp&quot;&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;reports/**/*.xml&#39;&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;s2&quot;&gt;&quot;Cleanup&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;deleteDir&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;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Even hip JavaScript tools can emit that weird XML format that test
reporters can use, e.g. the junit result archiver.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main change is that we have &lt;code&gt;docker.build&lt;/code&gt; being called to produce the
&lt;code&gt;environment&lt;/code&gt; which is then used.  Running &lt;code&gt;docker build&lt;/code&gt; is essentially a
&quot;no-op&quot; if the image has already been built on the agent before.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;whats-it-like-to-drive&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-it-like-to-drive&quot; /&gt;What’s it like to drive?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well, using Blue Ocean, to build Blue Ocean, yields a pipeline that visually
looks like this (a recent run I screen capped):&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/2016-08-03/JDL_pipeline.png&quot; alt=&quot;Pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This creates a pipeline that developers can tweak on a pull-request basis,
along with any changes to the environment needed to support it, without having
to install any packages on the agent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;why-not-use-docker-commands-directly&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#why-not-use-docker-commands-directly&quot; /&gt;Why not use docker commands directly?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You could of course just use shell commands to do things with Docker directly,
however, Jenkins Pipeline keeps track of Docker images used in a &lt;code&gt;Dockerfile&lt;/code&gt;
via the &quot;Docker Fingerprints&quot; link (which is good, should that image need to
change due to a security patch).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The project used as as an example is &lt;a href=&quot;https://github.com/jenkinsci/jenkins-design-language/&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The pipeline is defined by the &lt;a href=&quot;https://github.com/jenkinsci/jenkins-design-language/blob/master/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The environment is defined by the &lt;a href=&quot;https://github.com/jenkinsci/jenkins-design-language/blob/master/Dockerfile&quot;&gt;Dockerfile&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Read more on &lt;a href=&quot;https://go.cloudbees.com/docs/cloudbees-documentation/cje-user-guide/chapter-docker-workflow.html&quot;&gt;Docker Pipeline&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/2016/08/03/st-petersburg-jam-3-4-report/</id>
<title>St. Petersburg Jenkins Meetup #3 and #4 Reports</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-08-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/08/03/st-petersburg-jam-3-4-report/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='jam'></category>
<category term='jenkins_ru'></category>
<summary>
I would like to write about two last Jenkins Meetups in Saint Petersburg, Russia.







Meetup #3. Jenkins Administration (May 20, 2016)


In May we had a meetup about Jenkins administration techniques.
At this meetup we were talking about common Jenkins ecosystem components
like custom update centers, tool repositories and generic jobs.


Talks:




Kirill Merkushev, Yandex, "Juseppe. A custom Update Center for Jenkins"



Presentation (rus)


Keywords: Juseppe





Anna Muravieva, EMC, "Generic jobs in Jenkins. How to build anything?"



Presentation (rus)


Keywords: Generic Builds, Scripted Build Wrappers





Oleg Nenashev, CloudBees, "Building Jenkins Tool infrastructures with help of Custom Tools Plugin and Docker"



Presentation (rus)


Keywords: Custom Tools Plugin, Extra Tool Installers Plugin, Docker









Meetup #4. IT Global...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to write about two last Jenkins Meetups in Saint Petersburg, Russia.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/sites/default/files/images/stpetersburg-butler_0.jpeg&quot; alt=&quot;stpetersburg butler 0&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;meetup-3-jenkins-administration-may-20-2016&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#meetup-3-jenkins-administration-may-20-2016&quot; /&gt;Meetup #3. Jenkins Administration (May 20, 2016)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In May we had a meetup about Jenkins administration techniques.
At this meetup we were talking about common Jenkins ecosystem components
like custom update centers, tool repositories and generic jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Talks:&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;Kirill Merkushev&lt;/strong&gt;, Yandex, &quot;Juseppe. A custom Update Center for Jenkins&quot;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/lanwen/juseppe&quot;&gt;Presentation&lt;/a&gt; (rus)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keywords: &lt;a href=&quot;https://github.com/yandex-qatools/juseppe&quot;&gt;Juseppe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Anna Muravieva&lt;/strong&gt;, EMC, &quot;Generic jobs in Jenkins. How to build anything?&quot;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/anamura/generic-jobs-v-jenkins-ili-kak-sobrat-vsie-chto-ughodno&quot;&gt;Presentation&lt;/a&gt; (rus)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keywords: Generic Builds, Scripted Build Wrappers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Oleg Nenashev&lt;/strong&gt;, CloudBees, &quot;Building Jenkins Tool infrastructures with help of Custom Tools Plugin and Docker&quot;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/onenashev/spb-jenkins-meetup-number-3-razviertyvaniie-tulovoi-infrastruktury-v-jenkins&quot;&gt;Presentation&lt;/a&gt; (rus)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keywords: &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Custom+Tools+Plugin&quot;&gt;Custom Tools Plugin&lt;/a&gt;, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Extra+Tool+Installers+Plugin&quot;&gt;Extra Tool Installers Plugin&lt;/a&gt;, Docker&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;meetup-4-it-global-meetup-july-23-2016&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#meetup-4-it-global-meetup-july-23-2016&quot; /&gt;Meetup #4. IT Global Meetup (July 23, 2016)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Saint Petersburg there is a regular gathering of local IT communities.
This &lt;a href=&quot;https://piter-united.ru/itgm8/itgm.html&quot;&gt;IT Global Meetup&lt;/a&gt; is a full-day event, which provides an opportunity to dozens of communities and hundreds of visitors to meet at a single place.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On July 23rd our local Jenkins community participated in the eight’s global meetup.
We conduced 2 talks in main tracks and also had a round table in the evening.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Talks:&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;Oleg Nenashev&lt;/strong&gt;, CloudBees, &quot;About Jenkins 2 and future plans&quot;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Oleg provided a top-level overview about changes in Jenkins,
shared insights about upgrading to the new Jenkins 2.7.1 LTS and talked about Jenkins plans&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/onenashev/itgm8-o-jenkins-2-i-planakh-na-budushchieie&quot;&gt;Presentation&lt;/a&gt; (rus)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aleksandr Tarasov&lt;/strong&gt;, Alfa-Laboratory, &quot;Continuous Delivery with Jenkins: Lessons learned&quot;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Aleksandr summarized AlfaLab’s experience of Jenkins usage for Continuous Delivery in their environment.
He talked about the flow based on &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/&quot;&gt;Jenkins Pipeline&lt;/a&gt;, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Job+DSL+Plugin&quot;&gt;JobDSL&lt;/a&gt; and &lt;a href=&quot;https://www.jenkins.io/projects/blueocean/&quot;&gt;BlueOcean&lt;/a&gt; prototype.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.slideshare.net/aatarasoff/continuous-delivery-with-jenkins-lessons-learned&quot;&gt;Presentation&lt;/a&gt; (rus)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the talks we had a roundtable about Jenkins (~10 Jenkins experts).
Oleg provided an overview of Docker and Configuration-as-Code features available in Jenkins,
and then we talked about common use-cases in Jenkins installations.
We hope to finally organize a &quot;Jenkins &amp;amp; Docker&quot; meetup at some point.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;qa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#qa&quot; /&gt;Q&amp;amp;A&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any questions, all speakers can be contacted via
&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci-ru_public:gitter.im&quot;&gt;Jenkins RU Gitter Chat&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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.meetup.com/St-Petersburg-Jenkins-Meetup/&quot;&gt;St. Petersburg Meetup page&lt;/a&gt; (follow the events here)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/jenkins_spb&quot;&gt;St. Petersburg Meetup Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/jenkins_ru&quot;&gt;Jenkins RU Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci-ru_public:gitter.im&quot;&gt;Jenkins RU Gitter Chat&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://piter-united.ru/itgm8/itgm.html&quot;&gt;IT Global Meetup&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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The events have been organized with help from
&lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;, &lt;a href=&quot;https://www.emc.com/en-us/index.htm&quot;&gt;EMC&lt;/a&gt; and
organizers of the &lt;a href=&quot;https://piter-united.ru/itgm8/itgm.html&quot;&gt;St. Petersburg IT Global Meetup&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/2016/07/26/join-me-at-jenkinsworld/</id>
<title>Join me for Jenkins World 2016</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-07-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/07/26/join-me-at-jenkinsworld/" />
<author>
<name>kohsuke</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
Jenkins World, September
13-15 at the Santa Clara Convention Center (SCCC), takes our 6th annual
community user conference to a whole new level. It will be one big party for
everything Jenkins, from users to developers, from the community to vendors.
There will be more of what people always loved in past user conferences, such
as technical sessions from users and developers, the Ask the Experts booth and
plugin development workshop, and even more has been added, such as Jenkins
training pre-conference, workshops and the opportunity to get certified for
free. Jenkins World is a not-to-be-missed.


For me, the best part of Jenkins World is the opportunity to meet...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 125x125&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkinsworld.com/&quot;&gt;Jenkins World&lt;/a&gt;, September
13-15 at the Santa Clara Convention Center (SCCC), takes our 6th annual
community user conference to a whole new level. It will be one big party for
everything Jenkins, from users to developers, from the community to vendors.
There will be more of what people always loved in past user conferences, such
as technical sessions from users and developers, the Ask the Experts booth and
plugin development workshop, and even more has been added, such as Jenkins
training pre-conference, workshops and the opportunity to get certified for
free. Jenkins World is a not-to-be-missed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me, the best part of Jenkins World is the opportunity to meet other Jenkins
users and developers face-to-face. We all interact on IRC, Google Groups or
GitHub, but when you have a chance to meet in person, the person behind the
GitHub ID or IRC name, whose plugin you use every day, becomes a real person.
Your motivation might be a little different from mine, but we have the breath
in the agenda to cover everyone from new users to senior plugin developers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, you’ll have more opportunities than ever before to learn about
Jenkins and continuous delivery/DevOps practices, and explore what Jenkins has
to offer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you are travelling from somewhere, you might as well get a two-day Jenkins training course to be held onsite, starting Monday.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On Tuesday, you can attend your choice of workshops, which gives you more hands-on time to go deeper, including:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The DevOps Toolkit 2.0 Workshop&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let’s Build a Jenkins Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Preparing for Jenkins Certification&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intro to Plugin Development&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CD and DevOps Maturity for Managers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On Wednesday, the formal conference kicks off. Throughout Wednesday and
Thursday, you can choose from sessions spread across five tracks and covering
a diverse range of topics like infrastructure as code, security, containers,
pipeline automation, best practices, scaling Jenkins and new community
development initiatives.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At Jenkins World, you’ll be exposed to projects going on in the community such
as &lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;Blue Ocean&lt;/a&gt;, a new Jenkins UX project. You can
learn more about &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;Jenkins 2&lt;/a&gt; - a major release for the project, and based on the
huge number of downloads we saw in the weeks following its introduction at the
end of April, it was a big +1. At Jenkins World, you will be immersed in
Jenkins and community, and leave knowing that you are part of a meaningful open
source project that, with your involvement, can do anything!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year there will only be one Jenkins World conference, so that everyone
involved in Jenkins can get together in one place at one time and actually see
each other. I understand that it might be a bit more difficult for Jenkins
users outside of the US to make it to Jenkins World, but hopefully we made the
event worth your visit. As the final push on the back, CloudBees has created a
special &lt;a href=&quot;https://www.cloudbees.com/juc/international-program&quot;&gt;international program&lt;/a&gt;
for those who are coming from outside the United States.  You’ll have
time to talk with all of the other Jenkins users who have made the journey from
across the globe, you’ll be able to attend exclusive networking events and
more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope to see you September 13th through 15th in Santa Clara at
&lt;a href=&quot;https://jenkinsworld.com&quot;&gt;Jenkins World&lt;/a&gt; in Santa Clara!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Register for &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World&lt;/a&gt; in
September with the code &lt;code&gt;JWFOSS&lt;/code&gt; for a 20% discount off your pass.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/07/19/blue-ocean-update/</id>
<title>Blue Ocean July development update </title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-07-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/07/19/blue-ocean-update/" />
<author>
<name>i386</name>
</author>
<category term='blueocean'></category>
<category term='ux'></category>
<category term='pipeline'></category>
<summary>
The team have been hard at work moving the needle forward on the Blue
Ocean 1.0 features. Many of the features we have been working on have
come a long way in the past few months but here&#8217;s a few highlights:


Goodbye page refreshes, Hello Real Time updates!

Building upon
Tom's great work on
Server Sent Events (SSE) both
Cliff and
Tom worked
on making the all the screens in Blue Ocean update without manual
refreshes.


SSE is a great technology
choice for new web apps as it only pushes out
events to the client when things have changed on the server. That means
there’s a lot less traffic going between your browser and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The team have been hard at work moving the needle forward on the Blue
Ocean 1.0 features. Many of the features we have been working on have
come a long way in the past few months but here’s a few highlights:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;goodbye-page-refreshes-hello-real-time-updates&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#goodbye-page-refreshes-hello-real-time-updates&quot; /&gt;Goodbye page refreshes, Hello Real Time updates!&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building upon
&lt;a href=&quot;https://twitter.com/tomfennelly&quot;&gt;Tom&lt;/a&gt;&#39;s great work on
&lt;a href=&quot;https://github.com/jenkinsci/sse-gateway-plugin&quot;&gt;Server Sent Events&lt;/a&gt; (SSE) both
&lt;a href=&quot;https://twitter.com/cliffmeyers&quot;&gt;Cliff&lt;/a&gt; and
&lt;a href=&quot;https://twitter.com/tomfennelly&quot;&gt;Tom&lt;/a&gt; worked
on making the all the screens in Blue Ocean update without manual
refreshes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events&quot;&gt;SSE is a great technology&lt;/a&gt;
choice for new web apps as it only pushes out
events to the client when things have changed on the server. That means
there’s a lot less traffic going between your browser and the Jenkins
server when compared to the continuous AJAX polling method that has been
typical of Jenkins in the past.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;640&quot; height=&quot;505&quot; src=&quot;https://www.youtube-nocookie.com/embed/AEnByFwPYaE?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;new-test-reporting-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-test-reporting-ui&quot; /&gt;New Test Reporting UI&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kzantow&quot;&gt;Keith&lt;/a&gt; has
been working with &lt;a href=&quot;https://twitter.com/vivekpandey&quot;&gt;Vivek&lt;/a&gt; to
drive out a new set of extension points that allow us to build a new
rest reporting UI in Blue Ocean. Today this works for JUnit test reports
but can be easily extended to work with other kinds of reports.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;640&quot; height=&quot;505&quot; src=&quot;https://www.youtube-nocookie.com/embed/QEeSOBCYY4o?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;pipeline-logs-are-split-into-steps-and-update-live&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-logs-are-split-into-steps-and-update-live&quot; /&gt;Pipeline logs are split into steps and update live&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ThorScherler&quot;&gt;Thorsten&lt;/a&gt; and
&lt;a href=&quot;https://twitter.com/sophistifunk&quot;&gt;Josh&lt;/a&gt; have
been hard at work breaking down the log into steps and making the live
log tailing follow the pipeline execution - which we’ve lovingly
nicknamed the “karaoke mode”&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;640&quot; height=&quot;505&quot; src=&quot;https://www.youtube-nocookie.com/embed/Ew13TjclNME?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;pipelines-can-be-triggered-from-the-ui&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipelines-can-be-triggered-from-the-ui&quot; /&gt;Pipelines can be triggered from the UI&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/tomfennelly&quot;&gt;Tom&lt;/a&gt; has
been on allowing users to trigger jobs from Blue Ocean, which is one
less reason to go back to the Classic UI :)&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;640&quot; height=&quot;505&quot; src=&quot;https://www.youtube-nocookie.com/embed/kdT02vPTxQI?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;blue-ocean-has-been-released-to-the-experimental-update-center&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#blue-ocean-has-been-released-to-the-experimental-update-center&quot; /&gt;Blue Ocean has been released to the experimental update center&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many of you have asked us questions about how you can try Blue Ocean
today and have resorted to building the plugin yourself or running our
Docker image.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We wanted to make the process of trying Blue Ocean in its unfinished
state by publishing the plugin to the experimental update center - it’s
available today!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So what is the Experimental Update Center? It is a mechanism for the
Jenkins developer community to share early previews of new plugins with
the broader user community. Plugins in this update center are
experimental and we strongly advise not running them on production or
Jenkins systems that you rely on for your work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That means any plugin in this update center could eat your Jenkins data,
cause slowdowns, degrade security or have their behavior change at no
notice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can learn how to
&lt;a href=&quot;https://www.jenkins.io/blog/2013/09/23/experimental-plugins-update-center/&quot;&gt;activate
the experimental update center on this post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for more updates!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/07/18/pipeline-notifications/</id>
<title>Sending Notifications in Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-07-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/07/18/pipeline-notifications/" />
<author>
<name>lnewman</name>
</author>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='notifications'></category>
<category term='slack'></category>
<category term='hipchat'></category>
<category term='emailext'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Rather than sitting and watching Jenkins for job status, I want Jenkins to send
notifications when events occur.  There are Jenkins plugins for
Slack,
HipChat,
or even email
among others.


Note: Something is happening!

I think we can all agree getting notified when events occur is preferable to
having to constantly monitor them just in case.  I&#8217;m going to continue from
where I left off in my
previous post with the
hermann project.  I added a Jenkins
Pipeline with an HTML publisher for code coverage. This week, I&#8217;d like to make
Jenkins to notify me when builds start and when...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Rather than sitting and watching Jenkins for job status, I want Jenkins to send
notifications when events occur.  There are Jenkins plugins for
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Slack+Plugin&quot;&gt;Slack&lt;/a&gt;,
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/HipChat+Plugin&quot;&gt;HipChat&lt;/a&gt;,
or even &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Email-ext+plugin&quot;&gt;email&lt;/a&gt;
among others.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;note-something-is-happening&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#note-something-is-happening&quot; /&gt;Note: Something is happening!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I think we can all agree getting notified when events occur is preferable to
having to constantly monitor them just in case.  I’m going to continue from
where I left off in my
&lt;a href=&quot;https://www.jenkins.io/blog/2016/07/01/html-publisher-plugin/&quot;&gt;previous post&lt;/a&gt; with the
&lt;a href=&quot;https://github.com/reiseburo/hermann&quot;&gt;hermann&lt;/a&gt; project.  I added a Jenkins
Pipeline with an HTML publisher for code coverage. This week, I’d like to make
Jenkins to notify me when builds start and when they succeed or fail.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;setup-and-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#setup-and-configuration&quot; /&gt;Setup and Configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, I select targets for my notifications. For this blog post, I’ll use sample
targets that I control.  I’ve created Slack and HipChat organizations called
&quot;bitwiseman&quot;, each with one member - me.  And for email I’m running a Ruby SMTP server called
&lt;a href=&quot;https://mailcatcher.me/&quot;&gt;mailcatcher&lt;/a&gt;, that is perfect for local testing
such as this.  Aside for these concessions, configuration would be much the
same in a non-demo situation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, I install and add server-wide configuration for the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Slack+Plugin&quot;&gt;Slack&lt;/a&gt;,
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/HipChat+Plugin&quot;&gt;HipChat&lt;/a&gt;,
and &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Email-ext+plugin&quot;&gt;Email-ext&lt;/a&gt;
plugins.  Slack and HipChat use API tokens - both products have integration
points on their side that generate tokens which I copy into my Jenkins
configuration. Mailcatcher SMTP runs locally. I just point Jenkins
at it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s what the Jenkins configuration section for each of these looks like:&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/2016-07-15/slack-config.png&quot; alt=&quot;Slack Configuration&quot;&gt;
&lt;/img&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/2016-07-15/hipchat-config.png&quot; alt=&quot;HipChat Configuration&quot;&gt;
&lt;/img&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/2016-07-15/email-config.png&quot; alt=&quot;Email Configuration&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;original-pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#original-pipeline&quot; /&gt;Original Pipeline&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now I can start adding notification steps. The same as
&lt;a href=&quot;https://www.jenkins.io/blog/2016/07/01/html-publisher-plugin/&quot;&gt;last week&lt;/a&gt;, I’ll use the
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/31/pipeline-snippetizer/&quot;&gt;Jenkins Pipeline Snippet Generator&lt;/a&gt;
to explore the step syntax for the notification plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s the base pipeline before I start making changes:&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;s1&quot;&gt;&#39;Build&#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Checkout&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// install required bundles&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bundle install&#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// build and run tests with coverage&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bundle exec rake build spec&#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Archive the built artifacts&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;archive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;includes:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;pkg/*.gem&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// publish html&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// snippet generator doesn&#39;t include &quot;target:&quot;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// https://issue-redirect.jenkins.io/issue/29711.&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;publishHTML&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;target:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;allowMissing:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;alwaysLinkToLastBuild:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;keepAll:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;reportDir:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;coverage&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;reportFiles:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;index.html&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;reportName:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;RCov Report&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;/code&gt;&lt;/pre&gt;
&lt;/div&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;This pipeline expects to be run from a &lt;code&gt;Jenkinsfile&lt;/code&gt; in SCM.
To copy and paste it directly into a Jenkins Pipeline job, replace the &lt;code&gt;checkout scm&lt;/code&gt; step with
&lt;code&gt;git &#39;https://github.com/reiseburo/hermann.git&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&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;job-started-notification&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#job-started-notification&quot; /&gt;Job Started Notification&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the first change, I decide to add a &quot;Job Started&quot; notification.  The
snippet generator and then reformatting makes this straightforward:&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;notifyStarted&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;

  &lt;span class=&quot;cm&quot;&gt;/* ... existing build steps ... */&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;notifyStarted&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;c1&quot;&gt;// send to Slack&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;slackSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FFFF00&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;STARTED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// send to HipChat&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;hipchatSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;YELLOW&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;notify:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;STARTED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// send to email&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;emailext&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;STARTED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&amp;lt;p&amp;gt;STARTED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;:&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;Check console output at &amp;amp;QUOT;&amp;lt;a href=&#39;${env.BUILD_URL}&#39;&amp;gt;${env.JOB_NAME} [${env.BUILD_NUMBER}]&amp;lt;/a&amp;gt;&amp;amp;QUOT;&amp;lt;/p&amp;gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;recipientProviders:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DevelopersRecipientProvider&#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;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since Pipeline is a Groovy-based DSL, I can use
&lt;a href=&quot;https://docs.groovy-lang.org/latest/html/documentation/index.html#_string_interpolation&quot;&gt;string interpolation&lt;/a&gt;
and variables to add exactly the details I want in my notification messages. When
I run this I get the following notifications:&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/2016-07-15/notify-started.png&quot; alt=&quot;Started Notifications&quot;&gt;
&lt;/img&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/2016-07-15/notify-started-email.png&quot; alt=&quot;Started Email Notification&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;job-successful-notification&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#job-successful-notification&quot; /&gt;Job Successful Notification&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next logical choice is to get notifications when a job succeeds.  I’ll
copy and paste based on the &lt;code&gt;notifyStarted&lt;/code&gt; method for now and do some refactoring
later.&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;notifyStarted&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;

  &lt;span class=&quot;cm&quot;&gt;/* ... existing build steps ... */&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;notifySuccessful&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;notifyStarted&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;cm&quot;&gt;/* .. */&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;notifySuccessful&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;slackSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#00FF00&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SUCCESSFUL: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;hipchatSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;GREEN&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;notify:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SUCCESSFUL: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;emailext&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SUCCESSFUL: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&amp;lt;p&amp;gt;SUCCESSFUL: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;:&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;Check console output at &amp;amp;QUOT;&amp;lt;a href=&#39;${env.BUILD_URL}&#39;&amp;gt;${env.JOB_NAME} [${env.BUILD_NUMBER}]&amp;lt;/a&amp;gt;&amp;amp;QUOT;&amp;lt;/p&amp;gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;recipientProviders:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DevelopersRecipientProvider&#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;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Again, I get notifications, as expected.  This build is fast enough,
some of them are even on the screen at the same 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/2016-07-15/notify-successful.png&quot; alt=&quot;Multiple Notifications&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;job-failed-notification&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#job-failed-notification&quot; /&gt;Job Failed Notification&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next I want to add failure notification.  Here’s where we really start to see the power
and expressiveness of Jenkins pipeline.  A Pipeline is a Groovy script, so as we’d
expect in any Groovy script, we can handle errors using &lt;code&gt;try-catch&lt;/code&gt; blocks.&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;notifyStarted&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/* ... existing build steps ... */&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;notifySuccessful&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;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&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;currentBuild&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;FAILED&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;notifyFailed&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;notifyStarted&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;cm&quot;&gt;/* .. */&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;notifySuccessful&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;cm&quot;&gt;/* .. */&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;notifyFailed&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;slackSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FF0000&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;FAILED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;hipchatSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;RED&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;notify:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;FAILED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39; (${env.BUILD_URL})&quot;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;emailext&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;FAILED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&amp;lt;p&amp;gt;FAILED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;:&amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;Check console output at &amp;amp;QUOT;&amp;lt;a href=&#39;${env.BUILD_URL}&#39;&amp;gt;${env.JOB_NAME} [${env.BUILD_NUMBER}]&amp;lt;/a&amp;gt;&amp;amp;QUOT;&amp;lt;/p&amp;gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;recipientProviders:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DevelopersRecipientProvider&#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;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/2016-07-15/notify-failed.png&quot; alt=&quot;Failed Notifications&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;code-cleanup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#code-cleanup&quot; /&gt;Code Cleanup&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, now that I have it all working, I’ll do some refactoring. I’ll unify
all the notifications in one method and move the final success/failure notification
into a &lt;code&gt;finally&lt;/code&gt; block.&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;s1&quot;&gt;&#39;Build&#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;notifyBuild&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;STARTED&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/* ... existing build steps ... */&lt;/span&gt;

  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&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;c1&quot;&gt;// If there was an exception thrown, the build failed&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;currentBuild&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;FAILED&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;finally&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Success or failure, always send notifications&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;notifyBuild&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;currentBuild&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;result&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;notifyBuild&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;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;STARTED&#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;c1&quot;&gt;// build status of null means successful&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SUCCESS&#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Default values&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colorName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;RED&#39;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FF0000&#39;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${buildStatus}: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;&quot;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${subject} (${env.BUILD_URL})&quot;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;details&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&amp;lt;p&amp;gt;STARTED: Job &#39;${env.JOB_NAME} [${env.BUILD_NUMBER}]&#39;:&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Check console output at &amp;amp;QUOT;&amp;lt;a href=&#39;${env.BUILD_URL}&#39;&amp;gt;${env.JOB_NAME} [${env.BUILD_NUMBER}]&amp;lt;/a&amp;gt;&amp;amp;QUOT;&amp;lt;/p&amp;gt;&quot;&quot;&quot;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Override default values based on build status&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;STARTED&#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;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;YELLOW&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FFFF00&#39;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buildStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;SUCCESS&#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;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;GREEN&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#00FF00&#39;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;RED&#39;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;#FF0000&#39;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Send notifications&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;slackSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;colorCode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;hipchatSend&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;color:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;notify:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;message:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;emailext&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;recipientProviders:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;DevelopersRecipientProvider&#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;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;you-have-been-notified&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#you-have-been-notified&quot; /&gt;You have been notified!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I now get notified twice per build on three different channels.  I’m not sure I
need to get notified this much for such a short build.  However, for a longer
or complex CD pipeline, I might want exactly that.  If needed, I could even
improve this to handle other status strings and call it as needed throughout
my pipeline.&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/2016-07-15/final.png&quot; alt=&quot;Final View of Notifications&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Slack+Plugin&quot;&gt;Slack Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/HipChat+Plugin&quot;&gt;HipChat Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Email-ext+plugin&quot;&gt;Email-ext Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/31/pipeline-snippetizer/&quot;&gt;Jenkins Pipeline Snippet Generator&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/07/14/2-7-1-re-release/</id>
<title>New packages for Jenkins 2.7.1</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-07-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/07/14/2-7-1-re-release/" />
<author>
<name>daniel-beck</name>
</author>
<category term='jenkins2'></category>
<category term='lts'></category>
<summary>
We created new native packages for Jenkins 2.7.1 today. These replace the existing packages. Due to a release process issue, the packaging (RPM, etc.) was created the same way as Jenkins 1.x LTS, resulting in problems starting Jenkins on some platforms: While we dropped support for AJP in Jenkins 2.0, some 1.x packages had it enabled by default, resulting in an exception during startup.


These new packages for Jenkins 2.7.1, dated July 14, have the same scripts and parameters as Jenkins 2.x and should allow starting up Jenkins without problems. If you notice any further problems with the packaging, please report...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We created new native packages for Jenkins 2.7.1 today. These replace the existing packages. Due to a release process issue, the packaging (RPM, etc.) was created the same way as Jenkins 1.x LTS, resulting in problems starting Jenkins on some platforms: While we dropped support for AJP in Jenkins 2.0, some 1.x packages had it enabled by default, resulting in an exception during startup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These new packages for Jenkins 2.7.1, dated July 14, have the same scripts and parameters as Jenkins 2.x and should allow starting up Jenkins without problems. If you notice any further problems with the packaging, please &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/How+to+report+an+issue&quot;&gt;report&lt;/a&gt; them in the &lt;code&gt;packaging&lt;/code&gt; component.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/07/07/jenkins-2/</id>
<title>Jenkins 2 hits LTS</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-07-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/07/07/jenkins-2/" />
<author>
<name>kohsuke</name>
</author>
<category term='lts'></category>
<category term='jenkins2'></category>
<summary>
It’s been almost three months since we’ve released Jenkins 2.0, the first ever major version upgrade for this 10 year old project. The 2.x versions since then has been adopted by more than 20% of the users, but one segment of users who haven’t seen the benefits of Jenkins 2 is those who has been running LTS releases.


But that is no more! The new version of Jenkins LTS release we just released is 2.7.1, and now LTS users get to finally enjoy Jenkins 2.


This release also officially marks the end-of-life for Jenkins 1.x. There won’t be any future release of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been almost three months since we’ve released &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;Jenkins 2.0&lt;/a&gt;, the first ever major version upgrade for this 10 year old project. The 2.x versions since then has been adopted by more than 20% of the users, but one segment of users who haven’t seen the benefits of Jenkins 2 is those who has been running LTS releases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But that is no more! The new version of Jenkins LTS release we just released is 2.7.1, and now LTS users get to finally enjoy Jenkins 2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release also officially marks the end-of-life for Jenkins 1.x. There won’t be any future release of Jenkins 1.x beyond this point. If you are worried about the upgrade, don’t be! The core of Jenkins is still the same, and all the plugins &amp;amp; existing configuration will just work.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/07/01/html-publisher-plugin/</id>
<title>Publishing HTML Reports in Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-07-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/07/01/html-publisher-plugin/" />
<author>
<name>lnewman</name>
</author>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='ruby'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





Most projects need more that just JUnit result reporting.  Rather than writing a
custom plugin for each type of report, we can use the
HTML Publisher Plugin.


Let&#8217;s Make This Quick

I&#8217;ve found a Ruby project,
hermann, I&#8217;d like to build using Jenkins Pipeline. I&#8217;d
also like to have the code coverage results published with each build job.  I could
write a plugin to publish this data, but I&#8217;m in a bit of hurry and
the build already creates an HTML report file using SimpleCov
when the unit tests run.



Simple Build

I&#8217;m going to use the
HTML Publisher Plugin
to...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most projects need more that just JUnit result reporting.  Rather than writing a
custom plugin for each type of report, we can use the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/HTML+Publisher+Plugin&quot;&gt;HTML Publisher Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;lets-make-this-quick&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lets-make-this-quick&quot; /&gt;Let’s Make This Quick&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve found a Ruby project,
&lt;a href=&quot;https://github.com/reiseburo/hermann&quot;&gt;hermann&lt;/a&gt;, I’d like to build using Jenkins Pipeline. I’d
also like to have the code coverage results published with each build job.  I could
write a plugin to publish this data, but I’m in a bit of hurry and
the build already creates an HTML report file using &lt;a href=&quot;https://github.com/colszowka/simplecov&quot;&gt;SimpleCov&lt;/a&gt;
when the unit tests run.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;simple-build&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#simple-build&quot; /&gt;Simple Build&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m going to use the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/HTML+Publisher+Plugin&quot;&gt;HTML Publisher Plugin&lt;/a&gt;
to add the HTML-formatted code coverage report to my builds.  Here’s a simple
pipeline for building the &lt;a href=&quot;https://github.com/reiseburo/hermann&quot;&gt;hermann&lt;/a&gt;
project.&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;s1&quot;&gt;&#39;Build&#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Checkout&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// install required bundles&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bundle install&#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// build and run tests with coverage&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bundle exec rake build spec&#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Archive the built artifacts&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;archive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;includes:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;pkg/*.gem&#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;/code&gt;&lt;/pre&gt;
&lt;/div&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;This pipeline expects to be run from a &lt;code&gt;Jenkinsfile&lt;/code&gt; in SCM.
To copy and paste it directly into a Jenkins Pipeline job, replace the &lt;code&gt;checkout scm&lt;/code&gt; step with
&lt;code&gt;git &#39;https://github.com/reiseburo/hermann.git&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Simple enough, it builds, runs tests, and archives the package.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&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/2016-06-30/run-1.png&quot; alt=&quot;Job Run Without Report Link&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now I just need to add the step to publish the code coverage report.
I know that &lt;code&gt;rake spec&lt;/code&gt; creates an &lt;code&gt;index.html&lt;/code&gt; file in the &lt;code&gt;coverage&lt;/code&gt; directory.
I’ve already installed the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/HTML+Publisher+Plugin&quot;&gt;HTML Publisher Plugin&lt;/a&gt;.
How do I add the HTML publishing step to the pipeline?  The plugin page doesn’t
say anything about it.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;snippet-generator-to-the-rescue&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#snippet-generator-to-the-rescue&quot; /&gt;Snippet Generator to the Rescue&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Documentation is hard to maintain and easy to miss, even more so in a system
like Jenkins with hundreds of plugins the each potential have one or more
groovy fixtures to add to the Pipeline.  The Pipeline Syntax
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/31/pipeline-snippetizer/&quot;&gt;&quot;Snippet Generator&quot;&lt;/a&gt; helps users
navigate this jungle by providing a way to generate a code snippet for any step using
provided inputs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It offers a dynamically generated list of steps, based on the installed plugins.
From that list I select the &lt;code&gt;publishHTML&lt;/code&gt; step:&lt;/p&gt;
&lt;/div&gt;
&lt;hr&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/2016-06-30/snippet-generator-1.png&quot; alt=&quot;Snippet Generator Menu&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then it shows me a UI similar to the one used in job configuration.  I fill in
the fields, click &quot;generate&quot;, and it shows me snippet of groovy generated from
that input.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&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/2016-06-30/snippet-generator-2.png&quot; alt=&quot;Snippet Generator Output&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;html-published&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#html-published&quot; /&gt;HTML Published&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I can use that snippet directly or as a template for further customization.
In this case, I’ll just reformat and copy it in at the end of my
pipeline.  (I ran into a &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/29711&quot;&gt;minor bug&lt;/a&gt;
in the snippet generated for this plugin step. Typing
error string in my search bar immediately found the bug and a workaround.)&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;cm&quot;&gt;/* ...unchanged... */&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Archive the built artifacts&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;archive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;includes:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;pkg/*.gem&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// publish html&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// snippet generator doesn&#39;t include &quot;target:&quot;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// https://issue-redirect.jenkins.io/issue/29711.&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;publishHTML&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;target:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;allowMissing:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;alwaysLinkToLastBuild:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;keepAll:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;reportDir:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;coverage&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;reportFiles:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;index.html&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;reportName:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;RCov Report&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I run this new pipeline I am rewarded with an &lt;code&gt;RCov Report&lt;/code&gt; link on left side,
which I can follow to show the HTML report.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&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/2016-06-30/run-2.png&quot; alt=&quot;Job Run With Report Link&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;hr&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/2016-06-30/rcov.png&quot; alt=&quot;RCov Report&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I even added the &lt;code&gt;keepAll&lt;/code&gt; setting to let I can also go back an look at reports on old jobs as
more come in.  As I said to to begin with, this is not as slick as what I
could do with a custom plugin, but it is much easier and works with any static
HTML.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/HTML+Publisher+Plugin&quot;&gt;HTML Publisher Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/31/pipeline-snippetizer/&quot;&gt;Jenkins Pipeline Snippet Generator&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/06/30/ewm-alpha-version/</id>
<title>GSoC: External Workspace Manager Plugin alpha version</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/30/ewm-alpha-version/" />
<author>
<name>alexsomai</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='external-workspace-manager'></category>
<category term='gsoc'></category>
<summary>
Currently it&#8217;s quite difficult to share and reuse the same workspace between multiple jobs and across nodes.
There are some possible workarounds for achieving this, but each of them has its own drawback,
e.g. stash/unstash pre-made artifacts, Copy Artifacts plugin or advanced job settings.
A viable solution for this problem is the External Workspace Manager plugin, which facilitates workspace share and
reuse across multiple Jenkins jobs and nodes.
It also eliminates the need to copy, archive or move files.
You can learn more about the design and goals of the External Workspace Manager project in
this introductory blog post.


I&#8217;d like to announce that an alpha version of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently it’s quite difficult to share and reuse the same workspace between multiple jobs and across nodes.
There are some possible workarounds for achieving this, but each of them has its own drawback,
e.g. stash/unstash pre-made artifacts, Copy Artifacts plugin or advanced job settings.
A viable solution for this problem is the External Workspace Manager plugin, which facilitates workspace share and
reuse across multiple Jenkins jobs and nodes.
It also eliminates the need to copy, archive or move files.
You can learn more about the design and goals of the External Workspace Manager project in
&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/23/external-workspace-manager-plugin/&quot;&gt;this introductory blog post&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d like to announce that an alpha version of the External Manager Plugin has been released!
It’s now public available for testing.
To be able to install this plugin, you must follow the steps from the Experimental Plugins Update Center
&lt;a href=&quot;https://www.jenkins.io/blog/2013/09/23/experimental-plugins-update-center/&quot;&gt;blog post&lt;/a&gt;.&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;
Please be aware that it’s not recommended to use the Experimental Update Center in production installations of
Jenkins, since it may break it.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin’s wiki page may be accessed
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/External+Workspace+Manager+Plugin&quot;&gt;here&lt;/a&gt;.
The documentation that helps you get started with this plugin may be found on the
&lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin/blob/master/README.md&quot;&gt;README&lt;/a&gt; page.
To get an idea of what this plugin does, which are the features implemented so far and to see a working demo of it,
you can watch my mid-term presentation that is available &lt;a href=&quot;https://youtu.be/u4zhxfUT8P4?t=22m7s&quot;&gt;here&lt;/a&gt;.
The slides for the presentation are shared on
&lt;a href=&quot;https://docs.google.com/presentation/d/1ZCYSIR2Tg466Ij1ghH5LSc8DLBCxWjIaD9IJcOyMZwU/edit?usp=sharing&quot;&gt;Google Slides&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My mentors, &lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin&lt;/a&gt; and &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg&lt;/a&gt;,
and I have set up public meetings related to this plugin.
You are invited to join our discussions if you’d like to get more insight about the project.
The meetings are taking place twice a week on the Jenkins hangout,
every Monday at
&lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=External+Workspace+Manager+Plugin+(Mondays+weekly+recurring)&amp;amp;iso=20160606T12&amp;amp;p1=1440&amp;amp;ah=1&quot;&gt;12 PM UTC&lt;/a&gt;
and every Thursday at
&lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=External+Workspace+Manager+Plugin+(Thursdays+weekly+recurring)&amp;amp;iso=20160609T05&amp;amp;p1=1440&amp;amp;ah=1&quot;&gt;5 PM UTC&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have any issues in setting up or using the plugin, please feel free to ask me on the plugin’s Gitter
link:https://app.gitter.im/#/room/#jenkinsci_external-workspace-manager-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;chat&lt;/a&gt;.
The plugin is open-source, having the repository on
&lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin&quot;&gt;GitHub&lt;/a&gt;, and you may contribute to it.
Any feedback is welcome, and you may provide it either on the Gitter chat, or on
&lt;a href=&quot;https://issues.jenkins.io&quot;&gt;Jira&lt;/a&gt; by using the &lt;em&gt;external-workspace-manager-plugin&lt;/em&gt; component.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;link:https://app.gitter.im/#/room/#jenkinsci_external-workspace-manager-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/external-workspace-manager-plugin.svg&quot; alt=&quot;title: &amp;quot;Gitter&amp;quot;&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/span&gt;
&lt;/a&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/external-workspace-manager-plugin&quot;&gt;Project repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/External+Workspace+Manager+Plugin&quot;&gt;Plugin wiki page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/u4zhxfUT8P4?t=22m7s&quot;&gt;Mid-term presentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/2016/05/23/external-workspace-manager-plugin/&quot;&gt;Project intro blog post&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;GSoC page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;Jenkins GSoC Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/06/29/from-freestyle-to-pipeline/</id>
<title>Migrating from chained Freestyle jobs to Pipelines</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/29/from-freestyle-to-pipeline/" />
<author>
<name>rtyler</name>
</author>
<category term='pipeline'></category>
<category term='infra'></category>
<summary>
This is a guest post by R. Tyler Croy, who is a
long-time contributor to Jenkins and the primary contact for Jenkins project
infrastructure. He is also a Jenkins Evangelist at
CloudBees, Inc.






For ages I have used the "Build After" feature in Jenkins to cobble together
what one might refer to as a "pipeline" of sorts. The Jenkins project itself, a
major consumer of Jenkins, has used these daisy-chained Freestyle jobs to drive
a myriad of delivery pipelines in our infrastructure.


One such "pipeline" helped drive the complex process of generating the pretty
blue charts on
stats.jenkins.io.
This statistics generation process primarily performs two major tasks, on rather
large sets of...
</summary>
<content type='html'>
&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;This is a guest post by &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt;, who is a
long-time contributor to Jenkins and the primary contact for Jenkins project
infrastructure. He is also a Jenkins Evangelist at
&lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees, Inc.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For ages I have used the &quot;Build After&quot; feature in Jenkins to cobble together
what one might refer to as a &quot;pipeline&quot; of sorts. The Jenkins project itself, a
major consumer of Jenkins, has used these daisy-chained Freestyle jobs to drive
a myriad of delivery pipelines in our infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One such &quot;pipeline&quot; helped drive the complex process of generating the pretty
blue charts on
&lt;a href=&quot;https://stats.jenkins.io/jenkins-stats/svg/svgs.html&quot;&gt;stats.jenkins.io&lt;/a&gt;.
This statistics generation process primarily performs two major tasks, on rather
large sets of data:&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;Generate aggregate monthly &quot;census data.&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Process the census data and create trend charts&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The chained jobs allowed us to resume the independent stages of the pipeline,
and allowed us to run different stages on different hardware (different
capabilities) as needed. Below is a diagram of what this looked like:&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/freestyle-to-pipeline-2016/freestyle-pipeline.png&quot; alt=&quot;freestyle pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;infra_generate_monthly_json&lt;/code&gt; would run periodically creating the
aggregated census data, which would then be picked up by &lt;code&gt;infra_census_push&lt;/code&gt;
whose sole responsibility was to take census data and publish it to the
necessary hosts inside the project’s infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second, semi-independent, &quot;pipeline&quot; would also run periodically. The
&lt;code&gt;infra_statistics&lt;/code&gt; job’s responsibility was to use the census data, pushed
earlier by &lt;code&gt;infra_census_push&lt;/code&gt;, to generate the myriad of pretty blue charts
before triggering the
&lt;code&gt;infra_checkout_stats&lt;/code&gt; job which would make sure &lt;code&gt;stats.jenkins.io&lt;/code&gt; was
properly updated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Suffice it to say, this &quot;pipeline&quot; had grown organically over a period time when
&lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;more advanced tools&lt;/a&gt; weren’t quite available.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When we migrated to newer infrastructure for
&lt;a href=&quot;https://ci.jenkins.io&quot;&gt;ci.jenkins.io&lt;/a&gt; earlier this year I took the
opportunity to do some cleaning up. Instead of migrating jobs verbatim, I pruned
stale jobs and refactored a number of others into proper
&lt;a href=&quot;https://www.jenkins.io/solutions/pipeline&quot;&gt;Pipelines&lt;/a&gt;, statistics generation being an obvious
target!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our requirements for statistics generation, in their most basic form, are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Enable a sequence of dependent tasks to be executed as a logical group (a
pipeline)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable executing those dependent tasks on various pieces of infrastructure
which support different requirements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Actually generate those pretty blue charts&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;If you wish to skip ahead, you can jump straight to the
&lt;a href=&quot;https://github.com/jenkins-infra/infra-statistics/blob/a6dcaa29fca9a4f61143954fb9e1300c2f995a89/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt;
which implements our new Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first iteration of the &lt;code&gt;Jenkinsfile&lt;/code&gt; simply defined the conceptual stages we
would need:&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;node&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;s1&quot;&gt;&#39;Sync raw data and census files&#39;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Process raw logs&#39;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Generate census data&#39;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Generate stats&#39;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Publish census&#39;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Publish stats&#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;How exciting! Although not terrifically useful. When I began actually
implementing the first couple stages, I noticed that the Pipeline might sync
&lt;em&gt;dozens&lt;/em&gt; of gigabytes of data every time it ran on a new agent in the cluster.
While this problem will soon be solved by the
&lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin&quot;&gt;External
Workspace Manager plugin&lt;/a&gt;, which is currently being developed. Until it’s ready,
I chose to mitigate the issue by pinning the execution to a consistent agent.&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;cm&quot;&gt;/* `census` is a node label for a single machine, ideally, which will be
 * consistently used for processing usage statistics and generating census data
 */&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;census &amp;amp;&amp;amp; docker&#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;cm&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;Restricting a workload which previously used multiple agents to a single one
introduced the next challenge. As an infrastructure administrator, technically
speaking, I &lt;em&gt;could&lt;/em&gt; just install all the system dependencies that I want on this
one special Jenkins agent. But what kind of example would that be setting!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The statistics generation process requires:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;JDK8&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.groovy-lang.org&quot;&gt;Groovy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A running &lt;a href=&quot;https://www.mongodb.org/&quot;&gt;MongoDB&lt;/a&gt; instance&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Fortunately, with Pipeline we have a couple of useful features at our disposal:
tool auto-installers and the
&lt;a href=&quot;https://go.cloudbees.com/docs/cloudbees-documentation/cje-user-guide/chapter-docker-workflow.html&quot;&gt;CloudBees
Docker Pipeline plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tool-auto-installers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tool-auto-installers&quot; /&gt;Tool Auto-Installers&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tool Auto-Installers are exposed in Pipeline through the &lt;code&gt;tool&lt;/code&gt; step and on
&lt;a href=&quot;https://ci.jenkins.io&quot;&gt;ci.jenkins.io&lt;/a&gt; we already had JDK8 and Groovy
available. This meant that the &lt;code&gt;Jenkinsfile&lt;/code&gt; would invoke &lt;code&gt;tool&lt;/code&gt; and Pipeline
would automatically install the desired tool on the agent executing the current
Pipeline steps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;tool&lt;/code&gt; step does not modify the &lt;code&gt;PATH&lt;/code&gt; environment variable, so it’s usually
used in conjunction with the &lt;code&gt;withEnv&lt;/code&gt; step, 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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;census &amp;amp;&amp;amp; docker&#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;cm&quot;&gt;/* .. */&lt;/span&gt;

    &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;javaHome&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;jdk8&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;groovyHome&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;groovy&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/* Set up environment variables for re-using our auto-installed tools */&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;customEnv&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;s2&quot;&gt;&quot;PATH+JDK=${javaHome}/bin&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s2&quot;&gt;&quot;PATH+GROOVY=${groovyHome}/bin&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s2&quot;&gt;&quot;JAVA_HOME=${javaHome}&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;cm&quot;&gt;/* use our auto-installed tools */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;customEnv&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;java --version&#39;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;cm&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 class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cloudbees-docker-pipeline-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cloudbees-docker-pipeline-plugin&quot; /&gt;CloudBees Docker Pipeline plugin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Satisfying the MongoDB dependency would still be tricky. If I caved in and installed
MongoDB on a single unicorn agent in the cluster, what could I say the next time
somebody asked for a special, one-off, piece of software installed on our
Jenkins build agents?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After doing my usual complaining and whining, I discovered that the CloudBees
Docker Pipeline plugin provides the ability to &lt;strong&gt;run containers&lt;/strong&gt; inside of a
&lt;code&gt;Jenkinsfile&lt;/code&gt;. To make things even better, there are
&lt;a href=&quot;https://hub.docker.com/_/mongo/&quot;&gt;official MongoDB docker images&lt;/a&gt; readily
available on DockerHub!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This feature requires that the machine has a running Docker daemon which is
accessible to the user running the Jenkins agent. After that, running a
container in the background is easy, 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;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;census &amp;amp;&amp;amp; docker&#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;cm&quot;&gt;/* .. */&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/* Run MongoDB in the background, mapping its port 27017 to our host&#39;s port
     * 27017 so our script can talk to it, then execute our Groovy script with
     * tools from our `customEnv`
     */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;docker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;mongo:2&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withRun&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;-p 27017:27017&#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;container&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;withEnv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;customEnv&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;s2&quot;&gt;&quot;groovy parseUsage.groovy --logs ${usagestats_dir} --output ${census_dir} --incremental&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;cm&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 beauty, to me, of this example is that you can pass a
&lt;a href=&quot;https://www.groovy-lang.org/Closures&quot;&gt;closure&lt;/a&gt; to &lt;code&gt;withRun&lt;/code&gt; which will
execute &lt;em&gt;while&lt;/em&gt; the container is running. When the closure is finished executing,
just the &lt;code&gt;sh&lt;/code&gt; step in this case, the container is destroyed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With that system requirement satisfied, the rest of the stages of the Pipeline
fell into place. We now have a single source of truth, the
&lt;a href=&quot;https://github.com/jenkins-infra/infra-statistics/blob/master/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt;,
for the sequence of dependent tasks which need to be executed, accounting for
variations in systems requirements, and it actually generates
&lt;a href=&quot;https://stats.jenkins.io/jenkins-stats/svg/svgs.html&quot;&gt;those pretty
blue charts&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, a nice added bonus is the beautiful visualization of our
&lt;a href=&quot;https://ci.jenkins.io/job/Infra/job/infra-statistics/&quot;&gt;new Pipeline&lt;/a&gt;!&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/freestyle-to-pipeline-2016/stats-pipeline.png&quot; alt=&quot;The New and Improved Statistics Pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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/doc/pipeline&quot;&gt;Pipeline documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://go.cloudbees.com/docs/cloudbees-documentation/cje-user-guide/chapter-docker-workflow.html&quot;&gt;CloudBees Docker Pipeline plugin documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Live &lt;a href=&quot;https://ci.jenkins.io/job/Infra/job/infra-statistics/&quot;&gt;statistics Pipeline&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/2016/06/21/gsoc-midterm-presentations-ann/</id>
<title>GSoC: Mid-term presentations by students on June 23 and 24</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/21/gsoc-midterm-presentations-ann/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='core'></category>
<category term='gsoc'></category>
<category term='plugin'></category>
<category term='general'></category>
<summary>
As you probably know, on this year Jenkins projects participates in
Google Summer of Code 2016.
You can find more information about the accepted projects on the GSoC subproject page and in the
Jenkins Developer mailing list.


On this week GSoC students are going to present their projects as a part of mid-term evaluation,
which covers one month of community bonding and one month of coding.


We would like to invite Jenkins developers to attend these meetings.
There are two additional months of coding ahead for successful students, so any feedback from Jenkins contributors and users will be appreciated.


Meeting #1 - June 23, 7:00 PM UTC -...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you probably know, on this year Jenkins projects participates in
&lt;a href=&quot;https://developers.google.com/open-source/gsoc/&quot;&gt;Google Summer of Code 2016&lt;/a&gt;.
You can find more information about the accepted projects &lt;a href=&quot;https://www.jenkins.io/projects/gsoc/&quot;&gt;on the GSoC subproject page&lt;/a&gt; and in the
&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev&quot;&gt;Jenkins Developer&lt;/a&gt; mailing list.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On &lt;strong&gt;this week&lt;/strong&gt; GSoC students are going to present their projects as a part of mid-term evaluation,
which covers one month of community bonding and one month of coding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would like to invite Jenkins developers to attend these meetings.
There are two additional months of coding ahead for successful students, so any feedback from Jenkins contributors and users will be appreciated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;meeting-1-june-23-700-pm-utc-900-pm-utc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#meeting-1-june-23-700-pm-utc-900-pm-utc&quot; /&gt;Meeting #1 - June 23, &lt;a href=&quot;https://www.google.com/url?q=http%3A%2F%2Fwww.timeanddate.com%2Fworldclock%2Ffixedtime.html%3Fmsg%3DGoogle%2BSummer%2Bof%2BCode.%2BMid-term%2BEvaluation%2BPresentations%2B%25231%26iso%3D20160623T19%26p1%3D%253A%26ah%3D2&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNGUZwPgrFTUtIJdw9tyD5gi6Ljn0g&quot;&gt;7:00 PM UTC - 9:00 PM UTC&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Support Core plugin improvements by &lt;a href=&quot;https://github.com/minudika&quot;&gt;Minudika Malshan&lt;/a&gt;&lt;/p&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/2016/06/14/gsoc-jenkins-support-core-plugin-improvements&quot;&gt;Intro blogpost&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;External Workspace Manager by &lt;a href=&quot;https://github.com/alexsomai&quot;&gt;Alex Somai&lt;/a&gt;&lt;/p&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/2016/05/23/external-workspace-manager-plugin&quot;&gt;Intro blogpost&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin documentation publishing to jenkins.io by &lt;a href=&quot;https://github.com/anyangocynthia&quot;&gt;Cynthia Anyango&lt;/a&gt;&lt;/p&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/2016/06/01/gsoc-automatic-plugin-documentation&quot;&gt;Intro blogpost&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Q&amp;amp;A session&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/events/cic4c57cd4of7bauc5blmcr59p4&quot;&gt;Meeting link&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;meeting-2-june-24-8am-utc-9-am-utc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#meeting-2-june-24-8am-utc-9-am-utc&quot; /&gt;Meeting #2 - June 24, &lt;a href=&quot;https://www.google.com/url?q=http%3A%2F%2Fwww.timeanddate.com%2Fworldclock%2Ffixedtime.html%3Fmsg%3DGoogle%2BSummer%2Bof%2BCode.%2BMid-term%2BEvaluation%2BPresentations%2B%25232%26iso%3D20160624T08%26p1%3D%253A%26ah%3D1&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNHC36YI3bwpO_W5FIkjaRTeye918w&quot;&gt;8AM UTC - 9 AM UTC&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins WebUI: Improving Job Creation/Configuration by &lt;a href=&quot;https://github.com/samatdav&quot;&gt;Samat Davletshin&lt;/a&gt;&lt;/p&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/2016/05/26/gsoc-jenkins-web-ui-project&quot;&gt;Intro blogpost&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Q&amp;amp;A session&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/events/cj09ur9ikphda1r5dmqu1cse9q8&quot;&gt;Meeting link&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;Both meetings will be conducted and recorded via &lt;strong&gt;Hangouts on Air&lt;/strong&gt;.
The recorded sessions will be made public after the meetup.
The agenda may change a bit.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/OX1ZdRVqS24&quot;&gt;Mid-term presentations announcement on Jenkins Developer mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016&quot;&gt;Jenkins GSoC 2016 Wiki Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://summerofcode.withgoogle.com/organizations/5668199471251456/&quot;&gt;Jenkins project page on the GSoC2016 website&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/06/16/parallel-test-executor-plugin/</id>
<title>Faster Pipelines with the Parallel Test Executor Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/16/parallel-test-executor-plugin/" />
<author>
<name>lnewman</name>
</author>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='plugins'></category>
<summary>
This is a guest post by Liam Newman,
Technical Evangelist at CloudBees.





In this blog post, I’ll show you how to speed up your pipeline by using the
Parallel Test Executor Plugin.


So much to do, so little time&#8230;&#8203;

In my career, I&#8217;ve helped many teams move to continuous integration and delivery. One problem
we always encounter is how to run all the tests needed to ensure high-quality
changes while still keeping pipeline times reasonable and changes flowing
smoothly. More tests mean greater confidence, but also longer wait times.
Build systems may or may not support running tests in parallel, but they still only use one
machine even while other...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/bitwiseman&quot;&gt;Liam Newman&lt;/a&gt;,
Technical Evangelist at &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post, I’ll show you how to speed up your pipeline by using the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Parallel+Test+Executor+Plugin&quot;&gt;Parallel Test Executor Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;so-much-to-do-so-little-time&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#so-much-to-do-so-little-time&quot; /&gt;So much to do, so little time…​&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my career, I’ve helped many teams move to continuous integration and delivery. One problem
we always encounter is how to run all the tests needed to ensure high-quality
changes while still keeping pipeline times reasonable and changes flowing
smoothly. More tests mean greater confidence, but also longer wait times.
Build systems may or may not support running tests in parallel, but they still only use one
machine even while other lab machines sit idle. In these cases, parallelizing
test execution across multiple machines is a great way to speed up pipelines.
The Parallel Test Executor plugin lets us leverage Jenkins do just that with no
disruption to the rest of the build system.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;serial-test-execution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#serial-test-execution&quot; /&gt;Serial Test Execution&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this post, I’ll be running a pipeline based on the
&lt;a href=&quot;https://github.com/jenkinsci/git-plugin&quot;&gt;Jenkins Git Plugin&lt;/a&gt;. I’ve modified
the Jenkinsfile from that project to allow us to compare execution times to our
later changes, and I’ve truncated the &quot;mvn&quot; utility method since it remains
unchanged.  You can find the original file
&lt;a href=&quot;https://github.com/jenkinsci/git-plugin/blob/7a31858e61d2ca2e752b0e4f1285bddcb7a75c4d/Jenkinsfile&quot;&gt;here&lt;/a&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;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;node&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;s1&quot;&gt;&#39;Checkout&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Build&#39;&lt;/span&gt;

  &lt;span class=&quot;cm&quot;&gt;/* Call the Maven build without tests. */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;mvn&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;clean install -DskipTests&quot;&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Test&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;runTests&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;

  &lt;span class=&quot;cm&quot;&gt;/* Save Results. */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Results&#39;&lt;/span&gt;

  &lt;span class=&quot;cm&quot;&gt;/* Archive the build artifacts */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;archive&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;includes:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;target/*.hpi,target/*.jpi&#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;runTests&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&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;cm&quot;&gt;/* Call the Maven build with tests. */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;mvn&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;install -Dmaven.test.failure.ignore=true&quot;&lt;/span&gt;

  &lt;span class=&quot;cm&quot;&gt;/* Archive the test results */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/target/surefire-reports/TEST-*.xml&#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* Run Maven */&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;mvn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&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;cm&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;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;This pipeline expects to be run from a &lt;code&gt;Jenkinsfile&lt;/code&gt; in SCM.
To copy and paste it directly into a Jenkins Pipeline job, replace the &lt;code&gt;checkout scm&lt;/code&gt; step with
&lt;code&gt;git &#39;https://github.com/jenkinsci/git-plugin.git&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a Maven project, so the Jenkinsfile is pretty simple.
I’ve split the Maven build into separate “Build” and “Test”
stages. Maven doesn’t support this split very well, it wants to run all
the steps of the lifecycle in order every time. So, I have to call Maven twice:
first using the “skipTests” property to do only build steps in the first call,
and then a second time with out that property to run tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On my quad-core machine, executing this pipeline takes about 13 minutes and 30
seconds.  Of that time, it takes 13 minutes to run about 2.7 thousand tests in
serial.&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/2016-06-16/serial.png&quot; alt=&quot;Serial Test Pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;parallel-test-execution&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#parallel-test-execution&quot; /&gt;Parallel Test Execution&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This looks like an ideal project for parallel test execution: a short build
followed by a large number of serially executed tests that consume the most of
the pipeline time. There are a number of things I could try to speed this up.
For example, I could modify test harness to look for ways to parallelize
the test execution on this single machine. Or I could try speed up the tests
themselves. Both of those can be time-consuming and both risk destabilizing the
tests. I’d need to know more about the project to do it well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll avoid that risk by using Jenkins and the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Parallel+Test+Executor+Plugin&quot;&gt;Parallel Test Executor Plugin&lt;/a&gt; to
parallelize the tests across multiple nodes instead. This will isolate the tests
from each other, while still giving us speed gains from parallel execution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin reads the list of tests from the results archived in the previous execution of this
job and splits that list into a specified number of sublists. I can then use
those sublists to execute the tests in parallel, passing a different sublist to
each node.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s look at how this changes the pipeline:&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;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* ...unchanged... */&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;runTests&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&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;cm&quot;&gt;/* Request the test groupings.  Based on previous test results. */&lt;/span&gt;
  &lt;span class=&quot;cm&quot;&gt;/* see https://wiki.jenkins.io/display/JENKINS/Parallel+Test+Executor+Plugin and demo on github
  /* Using arbitrary parallelism of 4 and &quot;generateInclusions&quot; feature added in v1.8. */&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;splits&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;splitTests&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;parallelism:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;CountDrivenParallelism&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;size:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;generateInclusions:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;

  &lt;span class=&quot;cm&quot;&gt;/* Create dictionary to hold set of parallel test executions. */&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testGroups&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;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;splits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;split&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;splits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/* Loop over each record in splits to prepare the testGroups that we&#39;ll run in parallel. */&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* Split records returned from splitTests contain { includes: boolean, list: List&amp;lt;String&amp;gt; }. */&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/*     includes = whether list specifies tests to include (true) or tests to exclude (false). */&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/*     list = list of tests for inclusion or exclusion. */&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* The list of inclusions is constructed based on results gathered from */&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* the previous successfully completed job. One additional record will exclude */&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* all known tests to run any tests not seen during the previous run.  */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;testGroups&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;split-${i}&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;c1&quot;&gt;// example, &quot;split3&quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;checkout&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scm&lt;/span&gt;

        &lt;span class=&quot;cm&quot;&gt;/* Clean each test node to start. */&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;mvn&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;clean&#39;&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mavenInstall&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;install -DMaven.test.failure.ignore=true&#39;&lt;/span&gt;

        &lt;span class=&quot;cm&quot;&gt;/* Write includesFile or excludesFile for tests.  Split record provided by splitTests. */&lt;/span&gt;
        &lt;span class=&quot;cm&quot;&gt;/* Tell Maven to read the appropriate file. */&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;includes&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;writeFile&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;file:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;target/parallel-test-includes-${i}.txt&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;text:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;\n&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;mavenInstall&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot; -Dsurefire.includesFile=target/parallel-test-includes-${i}.txt&quot;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;writeFile&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;file:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;target/parallel-test-excludes-${i}.txt&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;text:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;\n&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;mavenInstall&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot; -Dsurefire.excludesFile=target/parallel-test-excludes-${i}.txt&quot;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;cm&quot;&gt;/* Call the Maven build with tests. */&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;mvn&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mavenInstall&lt;/span&gt;

        &lt;span class=&quot;cm&quot;&gt;/* Archive the test results */&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;**/target/surefire-reports/TEST-*.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;n&quot;&gt;parallel&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;testGroups&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* Run Maven */&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;mvn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&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;cm&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;That’s it!  The change is significant but it is all encapsulated in this one
method in the &lt;code&gt;Jenkinsfile&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;great-ish-success&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#great-ish-success&quot; /&gt;Great (ish) Success!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s the results for the new pipeline with parallel test execution:&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/2016-06-16/serial-vs-parallel.png&quot; alt=&quot;Pipeline Duration Comparison&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The tests ran almost twice as fast, without changes outside pipeline.  Great!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, I used 4 test executors, so why am I not seeing a 4x? improvement.
A quick review of the logs shows the problem: A small number of tests are taking up
to 5 minutes each to complete! This is actually good news. It means that I
should be able to see further improvement in pipeline throughput just by refactoring
those few long running tests into smaller parts.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusion&quot; /&gt;Conclusion&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While I would like to have seen closer to a 4x improvement to match to number
of executors, 2x is still perfectly respectable. If I were working on a group of projects
with similar pipelines, I’d be completely comfortable reusing these same changes
on my other project and I’d expect to similar improvement without any disruption to
other tools or processes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Parallel+Test+Executor+Plugin&quot; class=&quot;bare&quot;&gt;https://wiki.jenkins.io/display/JENKINS/Parallel+Test+Executor+Plugin&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/2016/06/15/jenkins-pipeline-scalability/</id>
<title>Jenkins Pipeline Scalability in the Enterprise</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/15/jenkins-pipeline-scalability/" />
<author>
<name>dcoraboeuf</name>
</author>
<category term='jenkins'></category>
<category term='scalability'></category>
<category term='dsl'></category>
<summary>
This is a guest post by Damien
Coraboeuf, Jenkins project contributor and Continuous Delivery consultant.





Implementing a CI/CD solution based on Jenkins has become very easy. Dealing
with hundreds of jobs? Not so much. Having to scale to thousands of jobs?
Now this is a real challenge.


This is the story of a journey to get out of the jungle of jobs&#8230;&#8203;







Start of the journey

At the beginning of the journey there were several projects using roughly the same
technologies. Those projects had several
branches, for maintenance of releases, for new features.


In turn, each of those branches had to be carefully built, deployed on different
platforms and versions, promoted...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/dcoraboeuf&quot;&gt;Damien
Coraboeuf&lt;/a&gt;, Jenkins project contributor and &lt;a href=&quot;https://nemerosa.com/&quot;&gt;Continuous Delivery consultant&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Implementing a CI/CD solution based on Jenkins has become very easy. Dealing
with hundreds of jobs? Not so much. Having to scale to thousands of jobs?
Now this is a real challenge.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the story of a journey to get out of the jungle of jobs…​&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/jenkins-pipeline-scalability/journey.png&quot; alt=&quot;Journey out of the jungle of jobs&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;start-of-the-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#start-of-the-journey&quot; /&gt;Start of the journey&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the beginning of the journey there were several projects using roughly the same
technologies. Those projects had several
branches, for maintenance of releases, for new features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In turn, each of those branches had to be carefully built, deployed on different
platforms and versions, promoted so they could be tested for functionalities,
performances and security, and then promoted again for actual delivery.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, we had to offer the test teams the means to deploy any version of
their choice on any supported platform in order to carry out some manual tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This represented, for each branch, around 20 jobs. Multiply this by the number of
branches and projects, and there you are: more than two years after the start
of the story, we had more than 3500 jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3500 jobs. Half a dozen people to manage them all…​&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/jenkins-pipeline-scalability/thousands.png&quot; alt=&quot;Thousands of jobs for a small team&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;preparing-the-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#preparing-the-journey&quot; /&gt;Preparing the journey&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How did we deal with this load?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We were lucky enough to have several assets:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;time - we had time to design a solution before the scaling went really out of
control&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;forecast - we &lt;em&gt;knew&lt;/em&gt; that the scaling would occur and we were not taken by
surprise&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tooling - the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Job+DSL+Plugin&quot;&gt;Jenkins Job DSL&lt;/a&gt;
was available, efficient and well documented&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also knew that, in order to scale, we’d have to provide a solution with the
following characteristics:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;self-service - we could not have a team of 6 people become a bottleneck for
enabling CI/CD in projects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;security - the solution had to be secure enough in order for it to be used by
remote developers we never met and didn’t know&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;simplicity - enabling CI/CD had to be simple so that people having
never heard of it could still use it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;extensibility - no solution is a one-size-fits-all and must be flexible
enough to allow for corner cases&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;
All the mechanisms described in this article are available through the
&lt;a href=&quot;https://github.com/jenkinsci/seed-plugin&quot;&gt;Jenkins Seed plugin&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Creating pipelines using the Job DSL and embedding the scripts in the code was
simple enough. But what about branching? We needed a mechanism to allow the
creation of pipelines per branch, by downloading the associated DSL and to
run it in a dedicated folder.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But then, all those projects, all those branches, they were mostly using the
same pipelines, give or take a few configurable items. Going this way would
have lead to a terrible duplication of code, transforming a job maintenance
nightmare into a code maintenance nightmare.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;pipeline-as-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-as-configuration&quot; /&gt;Pipeline as configuration&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our trick was to transform this vision of &quot;pipeline as code&quot; into a &quot;pipeline
as configuration&quot;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;by maintaining well documented and tested &quot;pipeline libraries&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;by asking projects to describe their pipeline not as code, but as property
files which would:&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;define the name and version of the DSL pipeline library to use&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;use the rest of the property file to configure the pipeline library, using
as many sensible default values as possible&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&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/jenkins-pipeline-scalability/properties.png&quot; alt=&quot;Property file&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;piloting-the-pipeline-from-the-scm&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#piloting-the-pipeline-from-the-scm&quot; /&gt;Piloting the pipeline from the SCM&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once this was done, the only remaining trick was to automate the creation,
update, start and deletion of the pipelines using SCM events. By enabling SCM
hooks (in GitHub, BitBucket or even in Subversion), we could:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;automatically create a pipeline for a new branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;regenerate a pipeline when the branch’s pipeline description was modified&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;start the pipeline on any other commit on the branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;remove the pipeline when the branch was deleted&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/jenkins-pipeline-scalability/hooks.png&quot; alt=&quot;Hooks&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once a project wants to go in our ecosystem, the Jenkins team &quot;seeds&quot; the
project into Jenkins, by running a job and giving a few parameters.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It will create a folder for the project and grant proper authorisations, using
Active Directory group names based on the project name.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The hook for the project must be registered into the SCM and you’re up and
running.&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/jenkins-pipeline-scalability/jobs.png&quot; alt=&quot;Jobs&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;configuration-and-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-and-code&quot; /&gt;Configuration &lt;em&gt;and&lt;/em&gt; code&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mixing the use of strong pipeline libraries configured by properties and the
direct use of the Jenkins Job DSL is still possible. The Seed plugin
supports all kinds of combinations:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;use of pipeline libraries only - this can even be enforced&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;use a DSL script which can in turn use some classes and methods defined in
a pipeline library&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;use of a Job DSL script only&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Usually, we tried to have a maximum reuse, through only pipeline libraries, for
most of our projects, but in other circumstances, we were less strict and
allowed some teams to develop their own pipeline script.&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/jenkins-pipeline-scalability/modes.png&quot; alt=&quot;Mixed modes&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;end-of-the-journey&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#end-of-the-journey&quot; /&gt;End of the journey&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the end, what did we achieve?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Self service&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;Pipeline automation from SCM - no intervention from the Jenkins team but for
the initial bootstrapping&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Getting a project on board of this system can be done in a few minutes only&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;Security&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;Project level authorisations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No code execution on the controller&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;Simplicity&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;Property files&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;Extensibility&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;Pipeline libraries&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct job DSL still possible&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/jenkins-pipeline-scalability/responsibilities.png&quot; alt=&quot;Responsibilities&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;seed-and-pipeline-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#seed-and-pipeline-plugin&quot; /&gt;Seed and Pipeline plugin&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, what about the &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/&quot;&gt;Pipeline plugin&lt;/a&gt;? Both
this plugin and the Seed plugin have common functionalities:&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/jenkins-pipeline-scalability/seed-now.png&quot; alt=&quot;Seed now&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What we have found in our journey is that having a &quot;pipeline as configuration&quot;
was the easiest and most secure way to get a lot of projects on board, with
developers not knowing Jenkins and even less the DSL.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The outcome of the two plugins is different:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;one pipeline job for the Pipeline plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a list of orchestrated jobs for the Seed plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If time allows, it would be probably a good idea to find a way to integrate the
functionalities of the Seed plugin into the pipeline framework, and to keep
what makes the strength of the Seed plugin:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pipeline as configuration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;reusable pipeline libraries, versioned and tested&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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/jenkins-pipeline-scalability/seed-pipeline.png&quot; alt=&quot;Seed and Pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find additional information about the Seed plugin and its usage at the
following links:&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/seed-plugin&quot;&gt;the Seed plugin itself&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/02-03-1515-coraboeuf&quot;&gt;JUC London, June 2015&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.slideshare.net/DamienCoraboeuf/brujug-jenkins-pipeline-scalability&quot;&gt;BruJUG Brussels, March 2016&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/06/14/jenkins-world-agenda/</id>
<title>Jenkins World Agenda is Live!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/14/jenkins-world-agenda/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<summary>
Join us in Santa Clara, California on September 13-15, 2016!


We are excited to announce the Jenkins
World agenda is now live. There will be 50+ sessions, keynotes, training,
certifications and workshops. Here are a few highlights of what you can expect:


High level topics



Continuous delivery


DevOps


Microservices architectures


Testing


Automation tools


Plugin development


Pipeline


Best practices


And much more




Additionally, Jenkins World offers great opportunities for hands-on learning,
exploring and networking:



Plugin Development Workshop

Due to its popularity in previous years, we are bringing back the plugin
development workshop. This workshop will introduce developers to the Jenkins
plugin ecosystem and terminology. The goal is to provide a cursory overview of
the resources available to Jenkins plugin developers. Armed...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join us in Santa Clara, California on &lt;strong&gt;September 13-15, 2016&lt;/strong&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to announce the &lt;a href=&quot;https://www.cloudbees.com/juc/agenda&quot;&gt;Jenkins
World agenda&lt;/a&gt; is now live. There will be 50+ sessions, keynotes, training,
certifications and workshops. Here are a few highlights of what you can expect:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;high-level-topics&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#high-level-topics&quot; /&gt;High level topics&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Continuous delivery&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DevOps&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Microservices architectures&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Testing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automation tools&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugin development&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Best practices&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And much more&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, Jenkins World offers great opportunities for hands-on learning,
exploring and networking:&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;plugin-development-workshop&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-development-workshop&quot; /&gt;Plugin Development Workshop&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Due to its popularity in previous years, we are bringing back the plugin
development workshop. This workshop will introduce developers to the Jenkins
plugin ecosystem and terminology. The goal is to provide a cursory overview of
the resources available to Jenkins plugin developers. Armed with this
information, Jenkins developers can learn how to navigate the project and
codebase to find answers to their questions.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;birds-of-a-feather-sessions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#birds-of-a-feather-sessions&quot; /&gt;Birds of a Feather Sessions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;BoFs, as they are usually known, will be a new addition to Jenkins World this
year. Sessions will be curated on various technical topics from DevOps to how
enterprises are integrating Jenkins in their environment. Discussions will be
lead by the industry’s brightest minds who have an influence in shaping the
future of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;ask-the-experts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ask-the-experts&quot; /&gt;Ask the Experts&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Got a Jenkins question that’s been keeping you up at night? Need to bounce ideas
off somebody? Or you just need someone to fix your Jenkins issue? This is your chance
to get connected with the Jenkins Experts. Experts will be on hand to help with
all your Jenkins needs on Sept 14th &amp;amp; 15th.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;prepare-for-jenkins-certification&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#prepare-for-jenkins-certification&quot; /&gt;Prepare for Jenkins Certification&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The objective of this session is to help you assess your level of readiness for
the certification exam - either the Certified Jenkins Engineer (CJE/open source)
certification or the Certified CloudBees Jenkins Platform Engineer
(CCJPE/CloudBees-specific) certification. After an overview about the
certification program, a Jenkins expert from CloudBees will walk you through the
various sections of the exam, highlighting the important things to controller ahead
of time, not only from a pure knowledge perspective but also in terms of
practical experience. This will be an interactive session.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hope-to-see-you-at-jenkins-world-2016&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hope-to-see-you-at-jenkins-world-2016&quot; /&gt;Hope to see you at &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2016&lt;/a&gt;!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t miss out on
&lt;a href=&quot;https://www.cvent.com/events/jenkins-world/event-summary-9d5c7937a3c34f048fb9b4045a449f38.aspx&quot;&gt;Super
Early Bird Rate $399&lt;/a&gt;. Price goes up after July 1.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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/projects/jam&quot;&gt;Start a JAM&lt;/a&gt; in your city if there isn’t one already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;JAM member&lt;/a&gt; .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become an &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;online JAM member&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be a JAM speaker or sponsor. Let us know &lt;a href=&quot;mailto:jenkinsci-jam@googlegroups.com&quot;&gt;jenkinsci-jam@googlegroups.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beginners+Guide+to+Contributing&quot;&gt;Jenkins project contributor&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/06/14/gsoc-jenkins-support-core-plugin-improvements/</id>
<title>GSoC Project Intro: Support Core Plugin Improvements</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/14/gsoc-jenkins-support-core-plugin-improvements/" />
<author>
<name>minudika</name>
</author>
<category term='core'></category>
<category term='gsoc'></category>
<category term='plugin'></category>
<category term='support-core'></category>
<summary>
About me

I am Minudika Malshan, an undergraduate student in Computer Science and Engineering from University of Moratuwa, Sri Lanka.


As a person who is passionate in open source software development and seeking for new knowledge and experience, I am willing to give my contribution for this project.


LinkedIn | Twitter



Abstract

The Support-Core Plugin provides the basic infrastructure for generating "bundles" of support information with Jenkins.
There are two kinds of bundles.




Automatic bundles: Bundles which are generated and get saved in $JENKINS_HOME/support once per hour starting 15 seconds after Jenkins starts the plugin.
The automatic bundles are retained using an exponential aging strategy. Therefore it&#8217;s possible...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-me&quot; /&gt;About me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am Minudika Malshan, an undergraduate student in Computer Science and Engineering from University of Moratuwa, Sri Lanka.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a person who is passionate in open source software development and seeking for new knowledge and experience, I am willing to give my contribution for this project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/minudika&quot;&gt;LinkedIn&lt;/a&gt; | &lt;a href=&quot;https://twitter.com/minudika&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;abstract&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#abstract&quot; /&gt;Abstract&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Support-Core Plugin provides the basic infrastructure for generating &quot;bundles&quot; of support information with Jenkins.
There are two kinds of bundles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Automatic bundles: Bundles which are generated and get saved in $JENKINS_HOME/support once per hour starting 15 seconds after Jenkins starts the plugin.
The automatic bundles are retained using an exponential aging strategy. Therefore it’s possible to have a bunch of them over the entire lifetime after the plugin installing the plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On demand bundles: These bundles are generated from the root &quot;Support&quot; action.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However current support-core plugin is not much user friendly. The object of this project is to make it more user friendly by adding some features which make a sophisticated environment for the user who use support plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this project scope, there are three features and improvements we are going to consider.&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;Ease the bundles management by the administrator (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/33090&quot;&gt;JENKINS-33090&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding an option to anonymize customer labels (strings created by the user such as name of a job, folder, view, agent, and template etc). (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/33091&quot;&gt;JENKINS-33091&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allowing user to create an issue and submit a bundle into the OSS tracker using the support-core plugin. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/21670&quot;&gt;JENKINS-21670&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/aheritier&quot;&gt;Arnaud Héritier&lt;/a&gt; and &lt;a href=&quot;https://github.com/christ66&quot;&gt;Steven Christou&lt;/a&gt; are guiding me through the project as my mentors.&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/gsoc-support-core-plugin/generate-bundle.png&quot; alt=&quot;Popup window&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;tasks-and-deliverables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tasks-and-deliverables&quot; /&gt;Tasks and Deliverables&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;ease-the-bundles-management-by-the-administrator&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ease-the-bundles-management-by-the-administrator&quot; /&gt;Ease the bundles management by the administrator.&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Under this task, the following functions are going to be implemented.&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;Listing bundles stored on the jenkins instance with their details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allowing user to download each bundle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allowing user to delete each bundle or all bundles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allowing user to browse the content of each bundle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatically purging old bundles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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/gsoc-support-core-plugin/downloadBundles.png&quot; alt=&quot;Popup window&quot; /&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/gsoc-support-core-plugin/config.png&quot; alt=&quot;Popup window&quot; /&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;enabling-user-to-create-an-issue-and-submit-a-bundle-into-the-oss-tracker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enabling-user-to-create-an-issue-and-submit-a-bundle-into-the-oss-tracker&quot; /&gt;Enabling user to create an issue and submit a bundle into the OSS tracker&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When a Jenkins user sees an issue, he/she commonly contacts his support contacts (Jenkins instance admins) and then Jenkins admins troubleshoot the issue.
The objective of this task is to implement a feature which enables the user to report an issue to a admin through support core plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When creating bundles to attach with the ticket, it is important to protect the privacy of the user who creates the ticket. When considering doing that, anonymizing user created labels (texts) comes to the front.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;adding-an-option-to-anonymize-customer-labels&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#adding-an-option-to-anonymize-customer-labels&quot; /&gt;Adding  an option to anonymize customer labels&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following functions will be implemented under this task.&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;Creating randomized tokens for labels created by users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Producing a mapping for those labels.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Substituting encoded labels into all the files included in the support bundle.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When creating randomized tokens, it would be much useful and effective if we can create those tokens in a way they make sense to humans. (i.e. readable to humans). For that, I am hoping to use a suitable java library to create human friendly random tokens. One of such libraries is &lt;a href=&quot;https://github.com/kohsuke/wordnet-random-name&quot;&gt;wordnet-random-name&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However in order to substitute randomized tokens, all files included in the bundle should be read. This can become inefficient when bundle consists of large number of files.  Therefore it’s important to follow an optimized method for this task.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1052sUGFxcDfUHNZFNeQ1FAR61ZB4tJb-GxdW1L3FSC8/edit?usp=sharing&quot;&gt;Initial proposal of the project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/minudika/support-core-plugin&quot;&gt;Project repository&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/2016/06/13/june-jenkins-events/</id>
<title>Upcoming June Jenkins Events</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/13/june-jenkins-events/" />
<author>
<name>alyssat</name>
</author>
<category term='events'></category>
<category term='jam'></category>
<summary>
It is hard to believe that the first half of 2016 is almost over and summer is
just around the corner.  As usual, there are plenty of educational Jenkins
events planned for this month. Below lists what’s happening in your neck of the
woods:


Online JAM



June 14: Plugin Development - Basics





North America JAMs



June 14: Pipeline in a Windows Environment - Boston, Massachusetts


June 15: Open Source Jenkins 2.0, What’s New? - Washington, DC


June 22: Continuously Deploying Containers with Jenkins Pipeline to a Docker Swarm Cluster - Seattle, Washington





Europe JAM



June 14: Jenkins 2.0 - London, United Kingdom


June 22: Pipeline As Code - Toulouse, France





Links



Start a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/jams/jenkins_revolution.png&quot; alt=&quot;Jenkins revolution&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is hard to believe that the first half of 2016 is almost over and summer is
just around the corner.  As usual, there are plenty of educational Jenkins
events planned for this month. Below lists what’s happening in your neck of the
woods:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;online-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#online-jam&quot; /&gt;Online JAM&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;June 14: &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/231401509/&quot;&gt;Plugin Development - Basics&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;north-america-jams&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#north-america-jams&quot; /&gt;North America JAMs&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;June 14: &lt;a href=&quot;https://www.meetup.com/Boston-Jenkins-Area-Meetup/events/229488470/&quot;&gt;Pipeline in a Windows Environment&lt;/a&gt; - Boston, Massachusetts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;June 15: &lt;a href=&quot;https://www.meetup.com/Washington-DC-Jenkins-Area-Meetup/events/231270867/&quot;&gt;Open Source Jenkins 2.0, What’s New?&lt;/a&gt; - Washington, DC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;June 22: &lt;a href=&quot;https://www.meetup.com/Seattle-Jenkins-Area-Meetup/events/231271904/&quot;&gt;Continuously Deploying Containers with Jenkins Pipeline to a Docker Swarm Cluster&lt;/a&gt; - Seattle, Washington&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;europe-jam&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#europe-jam&quot; /&gt;Europe JAM&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;June 14: &lt;a href=&quot;https://www.meetup.com/London-Jenkins-Area-Meetup/events/229929937/&quot;&gt;Jenkins 2.0&lt;/a&gt; - London, United Kingdom&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;June 22: &lt;a href=&quot;https://www.meetup.com/Toulouse-Jenkins-Area-Meetup/events/231843462/&quot;&gt;Pipeline As Code&lt;/a&gt; - Toulouse, France&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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/projects/jam&quot;&gt;Start a JAM&lt;/a&gt; in your city if there isn’t one already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://www.meetup.com/pro/jenkins/&quot;&gt;JAM member&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become an &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;online JAM member&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speak or sponsor at a JAM. Contact us at &lt;a href=&quot;mailto:jenkinsci-jam@googlegroups.com&quot;&gt;jenkinsci-jam@googlegroups.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Take advantage of the super-early-bird price to &lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Jenkins World 2016&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Become a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beginners+Guide+to+Contributing&quot;&gt;Jenkins project contributor&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/06/13/gsoc-usage-stats-analysis/</id>
<title>GSoC Project Intro: Usage Statistics Analysis</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/13/gsoc-usage-stats-analysis/" />
<author>
<name>payal94</name>
</author>
<category term='usage-statistics'></category>
<category term='gsoc'></category>
<summary>
About myself

Hello, my name is Payal Priyadarshini.  I am pursing my major in Computer
Science &amp; Engineering at the Indian Institute of Technology Kharagpur, India.  I
am very proficient in writing code in Python, C++, Java and currently getting
familiar and hopefully good in Groovy too.


I have internship experiences in renowned institutions like Google and VMware
where I worked with some exciting technologies for example Knowledge Graphs,
BigTable, SPARQL, RDF in Google. I am a passionate computer science student who
is always interested in learning and looking for new challenges and
technologies.That’s how I came across to Google Summer of Code where I am
working on...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-myself&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-myself&quot; /&gt;About myself&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello, my name is Payal Priyadarshini.  I am pursing my major in Computer
Science &amp;amp; Engineering at the Indian Institute of Technology Kharagpur, India.  I
am very proficient in writing code in Python, C++, Java and currently getting
familiar and hopefully good in Groovy too.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have internship experiences in renowned institutions like Google and VMware
where I worked with some exciting technologies for example Knowledge Graphs,
BigTable, SPARQL, RDF in Google. I am a passionate computer science student who
is always interested in learning and looking for new challenges and
technologies.That’s how I came across to Google Summer of Code where I am
working on some exciting data mining problems which you are going to encounter
below in this blog.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-overview&quot; /&gt;Project Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has collected anonymous usage information of more than 100,000
installations which includes set of plugins and their versions etc and also
release history information of the upgrades. This data collection can be used
for various data mining experiments. The main goal of this project is to perform
various analysis and studies over the available dataset to discover trends
in data usage. This project will help us to learn more about the Jenkins
usage by solving various problems, such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Plugin versions installation trends&lt;/em&gt;, will let us know about the versions installation behaviour of a given plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Spotting downgrades&lt;/em&gt;, which will warn us that something is wrong with the version from which downgrading was performed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Correlating&lt;/em&gt; what users are saying (community rating) with what users are doing (upgrades/downgrades).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Distribution of cluster size&lt;/em&gt;, where clusters represents jobs, nodes count which approximates the size of installation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Finding set of plugins which are likely to be used together&lt;/em&gt;, will setup pillar for plugin recommendation system.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a part of the &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code&lt;/a&gt; 2016, I will be working on the above
mentioned problems. My mentors for the project are Kohsuke Kawaguchi and Daniel Beck. Some &lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/svg/svgs.html&quot;&gt;analyses&lt;/a&gt; has already been done over this
data but those are outdated as charts can be more clearer and interactive. This project aims to improvise existing
statistics and generating new ones discussed above.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;use-cases&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-cases&quot; /&gt;Use Cases&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project covers wide-range of the use-cases that has been derived from the
problems mentioned above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;use-case-1-upgradedowngrade-analysis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-case-1-upgradedowngrade-analysis&quot; /&gt;Use Case 1: Upgrade/Downgrade Analysis&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Understanding the trend in upgrades and downgrades have lots of utilities, some
of them have already been explained earlier which includes measuring the
popularity, spotting downgrades, giving warning about the wrong versions quickly
etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;use-case-1-1-plugin-versions-installation-trends&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-case-1-1-plugin-versions-installation-trends&quot; /&gt;Use Case 1.1: Plugin versions installation trends&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here we are analysing the trend in the different version installations for a
given plugin. This use-case will help us to know about:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Trend in the upgrade to the latest version released for a given plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trend in the popularity decrement of the previous versions after new version release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find the most popular plugin version at any given point of time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;use-case-1-2-spotting-downgrades&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-case-1-2-spotting-downgrades&quot; /&gt;Use Case 1.2: Spotting downgrades&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here we are interested to know, how many installations are downgraded from any
given version to previously used version. Far fetched goal of this analysis is
to give warning when something goes wrong with the new version release, which
can be sensed using downgrades performed by users. This analysis can be
accomplished by studying the monotonic property of the version number vs.
timestamp graph for a given plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;use-case-1-3-correlation-with-the-perceived-quality-of-jenkins-release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-case-1-3-correlation-with-the-perceived-quality-of-jenkins-release&quot; /&gt;Use Case 1.3: Correlation with the perceived quality of Jenkins release&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To correlate what users are saying to what users are doing, we have community
ratings which tells us about the ratings and reviews of the releases and has
following parameters:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Used the release on production site w/o major issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t recommend to other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tried but rolled it back to the previous version.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First parameters can be calculated from the Jenkins usage data and third
parameter is basically spotting downgrades(use case 1.2). But the second
parameter is basically an expression which is not possible to calculate. This
analysis is just to get a subjective idea about the correlation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;use-case-2-plugin-recommendation-system&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#use-case-2-plugin-recommendation-system&quot; /&gt;Use Case 2: Plugin Recommendation System&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This section involves setting up ground work for the plugin recommendation
system. The idea is to find out the set of plugins which are most likely to be
used together. Here we will be following both content based filtering as well as
collaborative filtering approach.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;collaborative-filtering&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#collaborative-filtering&quot; /&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Recommender_system#Collaborative_filtering&quot;&gt;Collaborative Filtering&lt;/a&gt;&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This approach is based upon analysing large amount of information on
installation’s behaviours and activities. We have implicit form of the data
about the plugins, that is for every install ids, we know the set of plugins
installed. We can use this information to construct plugin usage graph where
nodes are the plugins and the edges between them is the number of installations
in which both plugins are installed together.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;content-based-filtering&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#content-based-filtering&quot; /&gt;&lt;a href=&quot;https://recommender-systems.org/content-based-filtering/&quot;&gt;Content-based Filtering&lt;/a&gt;&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This method is based on a properties or the content of the item for example
recommending items that are similar to the those that a user liked in the past
or examining in the present based upon some properties. Here, we are utilizing
&lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/jenkinsgraph.html?filter=kohsuke&quot;&gt;Jenkins
plugin dependency graph&lt;/a&gt; to learn about the properties of a plugin. This graph
tells us about dependent plugins on a given plugin as well as its dependencies
on others. Here is an example to show, how this graph is use for content based
filetring, suppose if a user is using “CloudBees Cloud Connector”, then we can
recommend them for “CloudBees Registration Plugin” as both plugins are dependent
on “CloudBees Credentials Plugin”.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;additional-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#additional-details&quot; /&gt;Additional Details&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You may find the complete project proposal along with the detailed design of the
use-cases with their implementation details here in the
&lt;a href=&quot;https://docs.google.com/document/d/1ZSVDzYChadUcmsLpI274t36kHJAIE03IDkxBLiVVylM/edit?usp=sharing&quot;&gt;design
document&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A complete version of the &lt;strong&gt;use-case 1: Upgrade &amp;amp; Downgrade Analysis&lt;/strong&gt; should be
available in late June and basic version of plugin recommendation system will be
available in late July.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I do appreciate any kind of feedback and suggestions.  You may add comments in
the
&lt;a href=&quot;https://docs.google.com/document/d/1ZSVDzYChadUcmsLpI274t36kHJAIE03IDkxBLiVVylM/edit?usp=sharing&quot;&gt;design
doc&lt;/a&gt;.  I will be posting updates about the statistics generation status on the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;jenkins-dev&lt;/a&gt; mailing
list and &lt;a href=&quot;https://lists.jenkins-ci.org/mailman/listinfo/jenkins-infra&quot;&gt;jenkins-infra&lt;/a&gt; mailing list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links:&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/1ZSVDzYChadUcmsLpI274t36kHJAIE03IDkxBLiVVylM/edit?usp=sharing&quot;&gt;Design Doc&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/infra-statistics&quot;&gt;Github infra-stats&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/svg/svgs.html&quot;&gt;Jenkins statistics&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/jenkinsgraph.html?filter=kohsuke&quot;&gt;Jenkins Plugin Dependency Graph&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Payal94/GSoC-Jenkins-Usage-Statistics-Analysis&quot;&gt;Github GSoC Jenkins Usage Statistics Analysis&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/06/10/save-costs-with-ec2-spot-fleet/</id>
<title>Save up to 90% of CI cost on AWS with Jenkins and EC2 Spot Fleet</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/10/save-costs-with-ec2-spot-fleet/" />
<author>
<name>cyberax</name>
</author>
<category term='aws'></category>
<category term='plugins'></category>
<category term='ec2'></category>
<summary>
This is a guest post by Aleksei Besogonov, Senior Software Developer at
Amazon Web Services.





Earlier this year, we published a case study on how
Lyft has used Amazon EC2 Spot instances to save 75% on their continuous delivery
infrastructure costs by simply changing four lines of code. Several other EC2 customers like Mozilla have
also reduced costs of their
continuous integration, deployment and testing pipelines by up to 90% on Spot instances. You can view
the current savings on Spot instances over EC2 On-demand instances using the
Spot Bid Advisor:





AWS Spot instances are spare EC2 instances that you can bid on. While your Spot instances may be
terminated...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;mailto:cyberax@amazon.com&quot;&gt;Aleksei Besogonov&lt;/a&gt;, Senior Software Developer at
&lt;a href=&quot;https://aws.amazon.com&quot;&gt;Amazon Web Services&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Earlier this year, we published a &lt;a href=&quot;https://aws.amazon.com/solutions/case-studies/lyft/&quot;&gt;case study&lt;/a&gt; on how
&lt;a href=&quot;https://www.lyft.com/&quot;&gt;Lyft&lt;/a&gt; has used Amazon EC2 Spot instances to save 75% on their continuous delivery
infrastructure costs by simply changing four lines of code. Several other EC2 customers like Mozilla have
also &lt;a href=&quot;https://web.archive.org/web/20160511040514/https://taras.glek.net/blog/2014/05/09/how-amazon-ec2-got-15x-cheaper-in-6-months/&quot;&gt;reduced costs&lt;/a&gt; of their
continuous integration, deployment and testing pipelines by up to 90% on Spot instances. You can view
the current savings on Spot instances over EC2 On-demand instances using the
&lt;a href=&quot;https://aws.amazon.com/ec2/spot/bid-advisor/&quot;&gt;Spot Bid Advisor&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/post-images/aws/bidadvisor.png&quot; alt=&quot;bidadvisor&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;AWS Spot instances are spare EC2 instances that you can bid on. While your Spot instances may be
terminated when EC2’s spare capacity declines, you can automatically replenish these instances and
maintain your target capacity using
&lt;a href=&quot;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet.html&quot;&gt;EC2 Spot fleets&lt;/a&gt;. As each
instance type and Availability Zone provides an alternative capacity pool, you can select multiple
such pools to launch the lowest priced instances currently available by launching a Spot
fleet on the &lt;a href=&quot;https://console.aws.amazon.com/ec2sp/v1/spot/&quot;&gt;Amazon EC2 Spot Requests&lt;/a&gt; console
or using the AWS CLI/SDK tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this walkthrough, we’ll show you how to configure Jenkins to automatically scale a fleet of Spot
instances up or down depending on the number jobs to be completed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;request-an-amazon-ec2-spot-fleet&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#request-an-amazon-ec2-spot-fleet&quot; /&gt;Request an Amazon EC2 Spot fleet&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To get started, login to &lt;a href=&quot;https://console.aws.amazon.com/ec2/&quot;&gt;Amazon EC2 console&lt;/a&gt;, and click on &lt;strong&gt;Spot Requests&lt;/strong&gt;
in the left hand navigation pane. Alternatively, you can directly login to
&lt;a href=&quot;https://console.aws.amazon.com/ec2sp/v1/spot&quot;&gt;Amazon EC2 Spot Requests console&lt;/a&gt;. Then click on the
&lt;strong&gt;Request Spot Instances&lt;/strong&gt; button at the top of the dashboard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Spot instance launch wizard, select the &lt;strong&gt;Request &amp;amp; Maintain&lt;/strong&gt; option to request a Spot fleet that automatically
provisions the most cost-effective EC2 Spot instances, and replenishes them if interrupted. Enter an initial
target capacity, choose an AMI, and select multiple instance types to automatically provision the lowest priced
instances available.&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/aws/wDW63sm.jpg&quot; alt=&quot;wDW63sm&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the next page, ensure that you have selected a key pair, complete the launch wizard, and note the Spot
fleet request ID.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Amazon EC2 Spot fleet automates finding the lowest priced instances for you, and enables your Jenkins cluster
to maintain the required capacity; so, you don’t need any bidding algorithms to provision the optimal Spot
instances over time.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;configure-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-jenkins&quot; /&gt;Configure Jenkins&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;install-the-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#install-the-plugin&quot; /&gt;Install the Plugin&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the Jenkins dashboard, select &lt;strong&gt;Manage Jenkins&lt;/strong&gt;, and then click &lt;strong&gt;Manage Plugins&lt;/strong&gt;. On the &lt;strong&gt;Available&lt;/strong&gt; tab,
search for and select the &lt;em&gt;EC2 Fleet Jenkins Plugin&lt;/em&gt;. Then click the &lt;strong&gt;Install&lt;/strong&gt; button.&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/aws/iOfvSD8.jpg&quot; alt=&quot;iOfvSD8&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the plugin installation is completed, select &lt;strong&gt;Manage Jenkins&lt;/strong&gt; from the Jenkins dashboard, and
click &lt;strong&gt;Configure System&lt;/strong&gt;. In the &lt;strong&gt;Cloud&lt;/strong&gt; section, select &lt;em&gt;Amazon Spot Fleet&lt;/em&gt; to add a new Cloud.&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/aws/MtvaRLU.jpg&quot; alt=&quot;MtvaRLU&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;configure-aws-credentials&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configure-aws-credentials&quot; /&gt;Configure AWS Credentials&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, we will configure the AWS and agent node credentials. Click the &lt;strong&gt;Add&lt;/strong&gt; button next to AWS Credentials,
select Jenkins, and enter your AWS Access Key, secret, and ID.&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/aws/oCkHRu5.jpg&quot; alt=&quot;oCkHRu5&quot; /&gt;
&lt;span class=&quot;image center&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/aws/Mh9TabQ.jpg&quot; alt=&quot;Mh9TabQ&quot; /&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, click the &lt;strong&gt;Add&lt;/strong&gt; button in the Spot fleet launcher to configure your agents with an SSH key.
Select Jenkins, and enter the username and private key (from the key pair you configured in your Spot fleet request)
as shown below.&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/aws/EuPvQdU.jpg&quot; alt=&quot;EuPvQdU&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Confirm that the AWS and SSH credentials you just added are selected. Then choose the region, and the Spot fleet
request ID from the drop-down. You can also enter the maximum idle time before your cluster automatically scales
down, and the maximum cluster size that it can scale up to.&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/aws/fk65vh7.jpg&quot; alt=&quot;fk65vh7&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;submit-jobs-and-view-status&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#submit-jobs-and-view-status&quot; /&gt;Submit Jobs and View Status&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After you have finished the previous step, you can view the &lt;strong&gt;EC2 Fleet Status&lt;/strong&gt; in the left hand navigation pane on
the Jenkins dashboard. Now, as you submit more jobs, Jenkins will automatically scale your Spot fleet to add more
nodes. You can view these new nodes executing jobs under the Build Executor Status.
After the jobs are done, if the nodes remain free for the specified idle time (configured in the previous step),
then Jenkins releases the nodes, automatically scaling down your Spot fleet nodes.&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/aws/P2eIB08.jpg&quot; alt=&quot;P2eIB08&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;build-faster-and-cheaper&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-faster-and-cheaper&quot; /&gt;Build faster and cheaper&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have a story to share about your team or product, or have a question to ask, do leave a comment
for us; we’d love to connect with you!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/06/01/gsoc-automatic-plugin-documentation/</id>
<title>GSOC Project Intro: Automatic Plugin Documentation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-06-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/06/01/gsoc-automatic-plugin-documentation/" />
<author>
<name>cynthia</name>
</author>
<category term='gsoc'></category>
<category term='plugins'></category>
<summary>
About me

I am Cynthia Anyango from Nairobi, Kenya. I am a second year student at Maseno
University. I am currently specializing on Ruby on Rails and trying to learn
Python. I recently started contributing to Open source projects.My major
contribution was at Mozilla, where I worked with the QA for Cloud services. I did
manual and automated tests for various cloud services. I wrote documentation
too. Above that, I am competent and I am always passionate about what I get my
hands on.



Project summary

Currently Jenkins plugin documentation is being stored in Confluence. Sometimes
the documentation is scattered and outdated. In order to improve the situation we
would like...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-me&quot; /&gt;About me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am Cynthia Anyango from Nairobi, Kenya. I am a second year student at Maseno
University. I am currently specializing on Ruby on Rails and trying to learn
Python. I recently started contributing to Open source projects.My major
contribution was at Mozilla, where I worked with the QA for Cloud services. I did
manual and automated tests for various cloud services. I wrote documentation
too. Above that, I am competent and I am always passionate about what I get my
hands on.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-summary&quot; /&gt;Project summary&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently Jenkins plugin documentation is being stored in Confluence. Sometimes
the documentation is scattered and outdated. In order to improve the situation we
would like to follow the documentation-as-code approach and to put docs to
plugin repositories and then publish them on the project website using the
awestruct engine. The project aims an implementation of a documentation
continuous deployment flow powered by Jenkins and Pipeline Plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The idea is to automatically pull in the README and other docs from GitHub, show
changelogs with versions and releases dates. I will be designing file templates
that will contain most of the  docs information that will be required from
plugin developers. Initially the files will be written in
&lt;a href=&quot;https://asciidoctor.org/&quot;&gt;AsciiDoc&lt;/a&gt;. Plugin developers will get a chance to
review the templates. The templates will be prototyped by various plugin
developers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The docs that will be automatically pulled from github and will be published on
&lt;a href=&quot;https://www.jenkins.io/&quot;&gt;Jenkins.io&lt;/a&gt; under the Documentation section.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My mentors are &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R.Tyler&lt;/a&gt; and
&lt;a href=&quot;https://github.com/batmat&quot;&gt;Baptiste Mathus&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope to achieve this by 25th June when we will be having our mid-term
evaluations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I will update more on the progress.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://summerofcode.withgoogle.com/dashboard/project/5120513768685568/details/&quot;&gt;Gsoc Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016&quot;&gt;Jenkins Gsoc Page &lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/kNZMOsF_ueA&quot;&gt;Mailing List discussion on Jenkins-Developers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/@anyango_cynthia&quot;&gt;My blog on Medium&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/05/31/pipeline-snippetizer/</id>
<title>New display of Pipeline’s &quot;snippet generator&quot;</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/31/pipeline-snippetizer/" />
<author>
<name>jglick</name>
</author>
<category term='pipeline'></category>
<summary>
Those of you updating the Pipeline Groovy plugin
to 2.3 or later will notice a change to the appearance of the configuration form.
The Snippet Generator tool is no longer a checkbox enabled inside the configuration page.
Rather, there is a link Pipeline Syntax which opens a separate page with several options.
(The link appears in the project’s sidebar; Jenkins 2 users will not see the sidebar from the configuration screen,
so as of 2.4 there is also a link beneath the Pipeline definition.)





Snippet Generator continues to be available for learning the available
Pipeline steps and creating sample calls given various configuration options.
The new page also...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Those of you updating the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Groovy+Plugin&quot;&gt;Pipeline Groovy plugin&lt;/a&gt;
to 2.3 or later will notice a change to the appearance of the configuration form.
The &lt;em&gt;Snippet Generator&lt;/em&gt; tool is no longer a checkbox enabled inside the configuration page.
Rather, there is a link &lt;em&gt;Pipeline Syntax&lt;/em&gt; which opens a separate page with several options.
(The link appears in the project’s sidebar; Jenkins 2 users will not see the sidebar from the configuration screen,
so as of 2.4 there is also a link beneath the Pipeline definition.)&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/jenkins2-snippetizer-demo.png&quot; alt=&quot;Snippet Generator&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Snippet Generator&lt;/em&gt; continues to be available for learning the available
Pipeline steps and creating sample calls given various configuration options.
The new page also offers clearer links to static reference documentation, online
Pipeline documentation resources, and an IntelliJ IDEA code completion file
(Eclipse support is unfinished).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One motivation for this change
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31831&quot;&gt;JENKINS-31831&lt;/a&gt;) was to
give these resources more visual space and more prominence.  But another
consideration was that people using multibranch projects or organization folders
should be able to use &lt;em&gt;Snippet Generator&lt;/em&gt; when setting up the project, before
any code is committed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Those using
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Multibranch+Plugin&quot;&gt;Pipeline
Multibranch plugin&lt;/a&gt; or organization folder plugins should upgrade to 2.4 or
later to see these improvements as well.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/05/26/introducing-blue-ocean/</id>
<title>Introducing Blue Ocean: a new user experience for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/26/introducing-blue-ocean/" />
<author>
<name>i386</name>
</author>
<category term='blueocean'></category>
<category term='ux'></category>
<category term='pipeline'></category>
<summary>
In recent years developers have become rapidly attracted to tools that are not
only functional but are designed to fit into their workflow seamlessly and are
a joy to use. This shift represents a higher standard of design and user
experience that Jenkins needs to rise to meet.


We are excited to share and invite the community to join us on a project we’ve
been thinking about over the last few months called Blue Ocean.


Blue Ocean is a project that rethinks the user experience of Jenkins, modelling
and presenting the process of software delivery by surfacing information that&#8217;s
important to development teams with as few clicks as...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In recent years developers have become rapidly attracted to tools that are not
only functional but are designed to fit into their workflow seamlessly and are
a joy to use. This shift represents a higher standard of design and user
experience that Jenkins needs to rise to meet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are excited to share and invite the community to join us on a project we’ve
been thinking about over the last few months called Blue Ocean.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is a project that rethinks the user experience of Jenkins, modelling
and presenting the process of software delivery by surfacing information that’s
important to development teams with as few clicks as possible, while still
staying true to the extensibility that is core to Jenkins.&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/blueocean/pipeline-run.png&quot; alt=&quot;Pipeline execution&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While this project is in the alpha stage of development, the intent is that
Jenkins users can install Blue Ocean side-by-side with the Jenkins Classic UI
via a plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not all the features listed on this blog are complete but we will be hard at
work over the next few months preparing Blue Ocean for general use. We intend
to provide regular updates on this blog as progress is made.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is &lt;a href=&quot;https://github.com/cloudbees/blueocean&quot;&gt;open source today&lt;/a&gt;
and we invite you to give us feedback and to contribute to the project.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;iframe width=&quot;853&quot; height=&quot;480&quot; src=&quot;https://www.youtube-nocookie.com/embed/3dITffteCD4?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean will provide development teams:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;new-modern-user-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-modern-user-experience&quot; /&gt;New modern user experience&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The UI aims to improve clarity, reduce clutter and navigational depth to make
the user experience very concise. A modern visual design gives developers much
needed relief throughout their daily usage and screens respond instantly to
changes on the server making manual page refreshes a thing of the past.&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/blueocean/pipeline-dashboard.png&quot; alt=&quot;Project dashboard&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;advanced-pipeline-visualisations-with-built-in-failure-diagnosis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#advanced-pipeline-visualisations-with-built-in-failure-diagnosis&quot; /&gt;Advanced Pipeline visualisations with built-in failure diagnosis&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/solutions/pipeline&quot;&gt;Pipelines&lt;/a&gt; are visualised on screen along with the
steps and logs to allow simplified comprehension of the continuous delivery
pipeline – from the simple to the most sophisticated scenarios.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Scrolling through 10,000 line log files is a thing of the past. Blue Ocean
breaks down your log per step and calls out where your build failed.&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/blueocean/failing-pipeline.png&quot; alt=&quot;Failing Pipeline&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;branch-and-pull-request-awareness&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#branch-and-pull-request-awareness&quot; /&gt;Branch and Pull Request awareness&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Modern pipelines make use of multiple Git branches, and Blue Ocean is designed
with this in mind. Drop a &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;&lt;code&gt;Jenkinsfile&lt;/code&gt; into your Git
repository&lt;/a&gt; that defines your pipeline and Jenkins will automatically discover
and start automating any  Branches and validating Pull Requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins will report the status of your pipeline right inside Github or
Bitbucket on all your commits, branches or pull requests.&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/blueocean/pr-view.png&quot; alt=&quot;Pull request view&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;personalised-view&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#personalised-view&quot; /&gt;Personalised View&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Favourite any pipelines, branches or pull requests and see them appear on your
personalised dashboard. Intelligence is being built into the dashboard. Jobs
that need your attention, say a Pipeline waiting for approval or a failing job
that you have recently changed, appear on the top of the 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/blueocean/personalized-dashboard.png&quot; alt=&quot;Personalized dashboard&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can read more about Blue Ocean and its goals on the
&lt;a href=&quot;https://www.jenkins.io/projects/blueocean&quot;&gt;project page&lt;/a&gt; and developers should watch the
&lt;a href=&quot;https://www.jenkins.io/content/mailing-lists&quot;&gt;Developers list&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For Jenkins developers and plugin authors:&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;jenkins-design-language&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-design-language&quot; /&gt;Jenkins Design “Language”&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Design Language (JDL) is a set of standardised React components and
a style guide that help developers create plugins that retain the look and feel
of Blue Ocean in an effortless way. We will be publishing more on the JDL,
including the style guide and developer documentation, over the next few weeks.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;modern-javascript-toolchain&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#modern-javascript-toolchain&quot; /&gt;Modern JavaScript toolchain&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins plugin tool chain has been extended so that developers can use
&lt;a href=&quot;https://medium.com/@rajaraodv/5-javascript-bad-parts-that-are-fixed-in-es6-c7c45d44fd81&quot;&gt;ES6&lt;/a&gt;,
&lt;a href=&quot;https://facebook.github.io/react/&quot;&gt;React&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/&quot;&gt;NPM&lt;/a&gt;
in their plugins without endless yak-shaving. Jenkins
&lt;a href=&quot;https://github.com/jenkinsci/js-modules&quot;&gt;js-modules&lt;/a&gt; are already in use in
Jenkins today, and this builds on this, using the same tooling.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;client-side-extension-points&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#client-side-extension-points&quot; /&gt;Client side Extension points&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Client Side plugins use Jenkins plugin infrastructure. The Blue Ocean libraries
built on ES6 and React.js provide an extensible client side component model
that looks familiar to developers who have built Jenkins plugins before. Client
side extension points can help isolate failure, so one bad plugin doesn’t take
a whole page down.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;server-sent-events&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#server-sent-events&quot; /&gt;Server Sent Events&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events&quot;&gt;Server Sent Events&lt;/a&gt;
(SSE) allow plugin developers to tap into changes of state on the server and make
their UI update in real time (&lt;a href=&quot;https://www.youtube.com/watch?v=EttzK5OOpv0&quot;&gt;watch this for a
demo&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To make Blue Ocean a success, we’re asking for help and support from Jenkins
developers and plugin authors. Please join in our Blue Ocean discussions on the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Jenkins Developer
mailing list&lt;/a&gt; and the &lt;code&gt;#jenkins-ux&lt;/code&gt; IRC channel on Freenode!&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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/blueocean&quot;&gt;Blue Ocean project page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/cloudbees/blueocean&quot;&gt;Blue Ocean GitHub repository&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;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/05/26/gsoc-jenkins-web-ui-project/</id>
<title>GSoC Project Intro: Improving Job Creation/Configuration</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/26/gsoc-jenkins-web-ui-project/" />
<author>
<name>samatdav</name>
</author>
<category term='core'></category>
<category term='gsoc'></category>
<summary>
About me

My name is Samat Davletshin and I am from HSE University from Moscow, Russia. I
interned at Intel and Yandex, and cofounded a startup
project where I personally developed front-end and back-end of the website.


I am excited to participate in GSoC with Jenkins this summer as a chanсe to make
a positive change for thousands of users as well as to learn from great mentors.



Abstract

Although powerful, Jenkins new job creation and configuration process may be non
obvious and time consuming. This can be improved by making UI more intuitive,
concise, and functional. I plan to achieve this by creating a simpler new job
creation, configuration...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-me&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-me&quot; /&gt;About me&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My name is Samat Davletshin and I am from HSE University from Moscow, Russia. I
interned at Intel and Yandex, and cofounded &lt;a href=&quot;https://expfood.ru/&quot;&gt;a startup
project&lt;/a&gt; where I personally developed front-end and back-end of the website.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am excited to participate in GSoC with Jenkins this summer as a chanсe to make
a positive change for thousands of users as well as to learn from great mentors.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;abstract&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#abstract&quot; /&gt;Abstract&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although powerful, Jenkins new job creation and configuration process may be non
obvious and time consuming. This can be improved by making UI more intuitive,
concise, and functional. I plan to achieve this by creating a simpler new job
creation, configuration process focused on essential elements, and embedding new
functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My mentors are &lt;a href=&quot;https://github.com/lanwen&quot;&gt;Kirill Merkushev&lt;/a&gt; and
&lt;a href=&quot;https://github.com/michaelneale&quot;&gt;Michael Neale&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;deliverables&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#deliverables&quot; /&gt;Deliverables&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;new-job-creation&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#new-job-creation&quot; /&gt;New job creation&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;New job name validation&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Initially, job validation was unresponsive, job creation was still allowed with
an invalid name, and some allowed characters even crashed Jenkins. Happily, two
of this problems were fixed in recent improvements and I plan add only a real
time name check for invalid characters.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Popup window&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/gsoc-job-config/popup-window.gif&quot; alt=&quot;Popup window&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has a lot of windows reloads that may time consuming. The creation of
new job is a simple process requiring only job name and job type. This way UI
may be improved by reducing page reloads and putting new job creation interface
in a dialog window. Such popup would likely consist of three steps of
implementation: rendering a dialog window, receiving JSON with job types,
sending a POST request to create the job.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;configuration-page&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#configuration-page&quot; /&gt;Configuration page&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Changing help information&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/gsoc-job-config/changing-help.gif&quot; alt=&quot;Changing help information&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As reported by some users, it would be useful to have the functionality to
change help information. Installation administrators would be able to change the
help info and choose editing rights for other users. That would likely require a
creation of extension points and a plugin using them. I also would like to
include the ability to style the help information using markdown as shown above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;[Optional] The functionality is extended to creation of crowd sourced &quot;wiki like&quot; documentation&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As in
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Translation+Assistance+Plugin&quot;&gt;localization
plugin&lt;/a&gt; the changes are gathered and applied beyond installation of a particular
user.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;More intuitive configuration page.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pursuing to solve &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/32578&quot;&gt;this  issue&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although there are a lot improvements in new configuration page, there is always
a room for improvements. An advanced job still has a very complicated and hard
to read configuration page. It is still open to discussion, but I may approach
it by better division of configuration parts such as an accordion based
navigation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;home-page&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#home-page&quot; /&gt;Home page&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;[Optional] Removing &quot;My Views&quot; page&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/gsoc-job-config/removing-views.jpg&quot; alt=&quot;Removing My Views&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;My Views&quot; page may unnecessary complicate essential sidepanel navigation. Since
it contains very small functionality, the functions may be moved to the home
page and the whole page may be removed. That may be implemented by adding icons
to &quot;My Views&quot; tabs. Additionally, the standard view creation page can create
either of the types&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;[Optional] Reducing number of UI elements&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The home page may contain some UI elements that are not essential and rarely
used. This way elements &quot;enable auto refresh&quot;, “edit description”, “icon sizes”,
”legend”, “RSS” may be removed from home page and placed under &quot;Manage Jenkins&quot;
or an upper menu. It is also possible to create new extension points to support
new UI elements through plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;credentials-store-page&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#credentials-store-page&quot; /&gt;Credentials store page&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;[Optional] Grouping credentials and their domains&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/gsoc-job-config/credentials-grouping.jpg&quot; alt=&quot;Grouping credentials&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Credentials page has too many reloads and requires many clicks to get to a
required credentials page. That may be improved by removing the last page and
showing credentials under domains.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-progress&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-progress&quot; /&gt;Current progress&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By May 25th I learned about the structure and tools of Jenkins and started
working on the first project:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I started with New Job Name validation first. Luckily, in last updates the
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/2324/files&quot;&gt;changes of recena&lt;/a&gt; there
were implemented all of the changes I proposed except real time check on name
validity. &lt;a href=&quot;https://goo.gl/3tHDkI&quot;&gt;Here I proposed the change&lt;/a&gt; which fixes it by
sending GET request on keyup event in addition to blur.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I also made a New Job Popup with using existing interface.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/images/post-images/gsoc-job-config/current-popup.gif&quot;&gt;&lt;strong&gt;View the current
pop-up progress&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I used &lt;a href=&quot;https://github.com/VodkaBears/Remodal&quot;&gt;Remodal&lt;/a&gt; library for popup and put
there
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/master/core/src/main/resources/hudson/model/View/newJob.jelly&quot;&gt;existing
New Job container&lt;/a&gt;. Surprisingly, it was fully functional right away. On the GIF
you can see that popup receives all job types and then successfully submits the
post form creating a new job. I think that could be a good first step. Further I
can start changing the window itself.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/document/d/122ZGtEZ9aJtkvaV5lsH_ea-Ao1pmM44LL1YnHwvW9l8&quot;&gt;Initial proposal of the project&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/fk5deO_SszU&quot;&gt;The project discussion on mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016&quot;&gt;Jenkins GSoC Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/samatdav/GSOC-Jenkins-Web-UI-Project&quot;&gt;Project repository&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/2016/05/25/update-plugin-for-pipeline/</id>
<title>Refactoring a Jenkins plugin for compatibility with Pipeline jobs</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/25/update-plugin-for-pipeline/" />
<author>
<name>cprice404</name>
</author>
<category term='core'></category>
<category term='pipeline'></category>
<category term='plugins'></category>
<summary>
This is a guest post by Chris Price.
Chris is a software engineer at Puppet, and has been
spending some time lately on automating performance testing using the latest
Jenkins features.





In this blog post, I&#8217;m going to attempt to provide some step-by-step notes on
how to refactor an existing Jenkins plugin to make it compatible with the new
Jenkins Pipeline jobs.  Before we get to the fun stuff, though, a little
background.


How&#8217;d I end up here?

Recently, I started working on a project to automate some performance tests for
my company&#8217;s products.  We use the awesome Gatling load
testing tool for these tests, but we&#8217;ve largely been...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/cprice404&quot;&gt;Chris Price&lt;/a&gt;.
Chris is a software engineer at &lt;a href=&quot;https://puppet.com&quot;&gt;Puppet&lt;/a&gt;, and has been
spending some time lately on automating performance testing using the latest
Jenkins features.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post, I’m going to attempt to provide some step-by-step notes on
how to refactor an existing Jenkins plugin to make it compatible with the new
Jenkins Pipeline jobs.  Before we get to the fun stuff, though, a little
background.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;howd-i-end-up-here&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#howd-i-end-up-here&quot; /&gt;How’d I end up here?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently, I started working on a project to automate some performance tests for
my company’s products.  We use the awesome &lt;a href=&quot;https://gatling.io/#/&quot;&gt;Gatling&lt;/a&gt; load
testing tool for these tests, but we’ve largely been handling the testing very
manually to date, due to a lack of bandwidth to get them automated in a clean,
maintainable, extensible way.  We have a years-old Jenkins server where we use
the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gatling+Plugin&quot;&gt;gatling jenkins
plugin&lt;/a&gt; to track the
history of certain tests over time, but the setup of the Jenkins instance was
very delicate and not easy to reproduce, so it had fallen into a state of
disrepair.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the last few days I’ve been putting some effort into getting things more
automated and repeatable so that we can really maximize the value that we’re
getting out of the performance tests.  With some encouragement from the fine
folks in the &lt;code&gt;#jenkins&lt;/code&gt; &lt;a href=&quot;https://www.jenkins.io/content/chat&quot;&gt;IRC channel&lt;/a&gt;, I ended up exploring
the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Job+DSL+Plugin&quot;&gt;JobDSL
plugin&lt;/a&gt; and the new &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Pipeline jobs&lt;/a&gt;.  Combining those two
things with some Puppet code to provision a Jenkins server via the
&lt;a href=&quot;https://github.com/jenkinsci/puppet-jenkins&quot;&gt;jenkins puppet module&lt;/a&gt; gave me
a really nice way to completely automate my Jenkins setup and get a seed job in
place that would create my perf testing jobs.  And the Pipeline job format is
just an &lt;strong&gt;awesome&lt;/strong&gt; fit for what I wanted to do in terms of being able to easily
monitor the stages of my performance tests, and to make the job definitions
modular so that it would be really easy to create new performance testing jobs
with slight variations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So everything’s going GREAT up to this point.  I’m really happy with how it’s
all shaping up.  But then…​ (you knew there was a &quot;but&quot; coming, right?) I
started trying to figure out how to add the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gatling+Plugin&quot;&gt;Gatling Jenkins
plugin&lt;/a&gt; to the Pipeline jobs, and kind of ran into a wall.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As best as I could tell from my Googling, the plugin was probably going to
require some modifications in order to be able to be used with Pipeline jobs.
However, I wasn’t able to find any really cohesive documentation that
definitively confirmed that or explained how everything fits together.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Eventually, I got it all sorted out.  So, in hopes of saving the next person a
little time, and encouraging plugin authors to invest the time to get their
plugins working with Pipeline, here are some notes about what I learned.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Spoiler:&lt;/strong&gt; if you’re just interested in looking at the individual git commits that
I made on may way to getting the plugin working with Pipeline, have a look at
&lt;a href=&quot;https://github.com/cprice404/gatling-plugin/commits/feature/master/compatibility-with-jenkins-pipeline.individual-commits&quot;&gt;this github
branch&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;creating-a-pipeline-step&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-a-pipeline-step&quot; /&gt;Creating a pipeline step&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The main task that the Gatling plugin performs is to archive Gatling reports
after a run.  I figured that the end game for this exercise was that I was going
to end up with a Pipeline &quot;step&quot; that I could include in my Pipeline scripts, to
trigger the archiving of the reports.  So my first thought was to look for an
existing plugin / Pipeline &quot;step&quot; that was doing something roughly similar, so
that I could use it as a model.  The Pipeline &quot;Snippet Generator&quot; feature
(create a pipeline job, scroll down to the &quot;Definition&quot; section of its
configuration, and check the &quot;Snippet Generator&quot; checkbox) is really helpful for
figuring out stuff like this; it is automatically populated with all of the
steps that are valid on your server (based on which plugins you have installed),
so you can use it to verify whether or not your custom &quot;step&quot; is recognized, and
also to look at examples of existing steps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking through the list of existing steps, I figured that the &lt;code&gt;archive&lt;/code&gt; step
was pretty likely to be similar to what I needed for the gatling plugin:&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/update-plugin-for-pipeline-tutorial/05_snippet_generator_archive.png&quot; alt=&quot;archive snippet&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, I started poking around to see what magic it was that made that &lt;code&gt;archive&lt;/code&gt;
step show up there.  There are some mentions of this in the
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-plugin/blob/6cffbecd874b924677ce3b3c5b1e0e2f45689cc5/DEVGUIDE.md#build-steps&quot;&gt;pipeline-plugin
DEVGUIDE.md&lt;/a&gt; and the
&lt;a href=&quot;https://github.com/jenkinsci/workflow-step-api-plugin/blob/ee8f181c5561d70207a6b84b4d91ca24312c8a39/README.md&quot;&gt;workflow-step-api-plugin
README.md&lt;/a&gt;, but the real breakthrough for me was finding the &lt;a href=&quot;https://github.com/jenkinsci/workflow-basic-steps-plugin/blob/300fe6c02b41f072e50a501cfec3e2f425048446/src/main/java/org/jenkinsci/plugins/workflow/steps/ArtifactArchiverStep.java#L37-L53&quot;&gt;definition of the
&lt;code&gt;archive&lt;/code&gt; step in the &lt;code&gt;workflow-basic-steps-plugin&lt;/code&gt; source
code&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With that as an example, I was able to start poking at getting a
&lt;code&gt;gatlingArchive&lt;/code&gt; step to show up in the Snippet Generator.  The first thing that
I needed to do was to &lt;a href=&quot;https://github.com/cprice404/gatling-plugin/commit/b321192bc635eee529ff70e4795591c4594f3664&quot;&gt;update the &lt;code&gt;gatling-plugin&lt;/code&gt; project’s &lt;code&gt;pom.xml&lt;/code&gt; to depend
on a recent enough version of Jenkins, as well as specify dependencies on the
appropriate pipeline
plugins&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once that was out of the way, I noticed that the &lt;code&gt;archive&lt;/code&gt; step had some tests
written for it, using what looks to be a pretty awesome test API for pipeline
jobs and plugins.  Based on &lt;a href=&quot;https://github.com/jenkinsci/workflow-basic-steps-plugin/blob/300fe6c02b41f072e50a501cfec3e2f425048446/src/test/java/org/jenkinsci/plugins/workflow/steps/ArtifactArchiverStepTest.java#L26-L44&quot;&gt;those &lt;code&gt;archive&lt;/code&gt;
tests&lt;/a&gt;,
I added
&lt;a href=&quot;https://github.com/cprice404/gatling-plugin/commit/ed9df4b54c36cee467b3a82e42cb2111e93f9df5&quot;&gt;a
skeleton for a test for the &lt;code&gt;gatlingArchive&lt;/code&gt; step&lt;/a&gt; that I was about to write.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then, I moved on to
&lt;a href=&quot;https://github.com/cprice404/gatling-plugin/commit/3de3485be591c7b750ec2671e74558a79efc4319&quot;&gt;actually
creating the step&lt;/a&gt;.  The meat of the code was 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;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GatlingArchiverStep&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AbstractStepImpl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@DataBoundConstructor&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GatlingArchiverStep&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;nd&quot;&gt;@Extension&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DescriptorImpl&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AbstractStepDescriptorImpl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;DescriptorImpl&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;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;GatlingArchiverStepExecution&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&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;nd&quot;&gt;@Override&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getFunctionName&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;gatlingArchive&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;nd&quot;&gt;@NonNull&lt;/span&gt;
        &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getDisplayName&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Archive Gatling reports&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;Note that in that commit I also added a &lt;code&gt;config.jelly&lt;/code&gt; file.  This is how you
define the UI for your step, which will show up in the Snippet Generator.  In
the case of this Gatling step there’s really not much to configure, so my
&lt;code&gt;config.jelly&lt;/code&gt; is basically empty.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With that (and the rest of the code from that commit) in place, I was able to
fire up the development Jenkins server (via &lt;code&gt;mvn hpi:run&lt;/code&gt;, and note that you
need to go into the &quot;Manage Plugins&quot; screen on your development server and
install the Pipeline plugin once before any of this will work) and visit the
Snippet Generator to see if my step showed up in the dropdown:&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/update-plugin-for-pipeline-tutorial/10_snippet_generator.png&quot; alt=&quot;gatlingArchive snippet&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GREAT SUCCESS!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This step doesn’t actually &lt;strong&gt;do&lt;/strong&gt; anything yet, but it’s recognized by Jenkins and
can be included in your pipeline scripts at that point, so, we’re on our way!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-step-metastep&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-step-metastep&quot; /&gt;The &lt;code&gt;step&lt;/code&gt; metastep&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The step that we created above is a first-class DSL addition that can be used in
Pipeline scripts.  There’s another way to make your plugin work usable from a
Pipeline job, without making it a first-class build step.  This is by use of the
&lt;code&gt;step&lt;/code&gt; &quot;metastep&quot;, mentioned in the &lt;a href=&quot;https://github.com/jenkinsci/pipeline-plugin/blob/893e3484a25289c59567c6724f7ce19e3d23c6ee/DEVGUIDE.md#build-steps&quot;&gt;pipeline-plugin
DEVGUIDE&lt;/a&gt;.
When using this approach, you simply refactor your &lt;code&gt;Builder&lt;/code&gt; or &lt;code&gt;Publisher&lt;/code&gt; to
extend &lt;code&gt;SimpleBuildStep&lt;/code&gt;, and then you can reference the build step from the
Pipeline DSL using the &lt;code&gt;step&lt;/code&gt; method.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the Jenkins GUI, go to the config screen for a Pipeline job and click on the
Snippet Generator checkbox.  Select &#39;step: General Build Step&#39; from the
dropdown, and then have a look at the options that appear in the &#39;Build Step&#39;
dropdown.  To compare with our previous work, let’s see what &quot;Archive the
artifacts&quot; looks like:&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/update-plugin-for-pipeline-tutorial/15_archive_metastep_snippet.png&quot; alt=&quot;archive metastep plugin&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the snippet generator we can see that it’s possible to trigger an Archive
action with syntax like:&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;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;ArtifactArchiver&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;artifacts:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;foo*&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;excludes:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&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 &quot;metastep&quot;.  It’s a way to trigger any build action that implements
&lt;code&gt;SimpleBuildStep&lt;/code&gt;, without having to actually implement a real &quot;step&quot; that
extends the Pipeline DSL like we did above.  In many cases, it might only make
sense to do one or the other in your plugin; you probably don’t really need
both.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the purposes of this tutorial, we’re going to do both.  For a couple of reasons:&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;Why the heck not?  :)  It’s a good demonstration of how the metastep stuff
works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Because implementing the &quot;for realz&quot; step will be a lot easier if the Gatling
action that we’re trying to call from our &lt;code&gt;gatlingArchive()&lt;/code&gt; syntax is using the
newer Jenkins APIs that are required for subclasses of &lt;code&gt;SimpleBuildStep&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;GatlingPublisher&lt;/code&gt; is the main build action that we’re interested in using in
Pipeline jobs.  So, with all of that in mind, here’s our next goal: get
&lt;code&gt;step([$class: &#39;GatlingPublisher&#39;, …​)&lt;/code&gt; showing up in the Snippet Generator.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/jenkins-1.651.2/core/src/main/java/jenkins/tasks/SimpleBuildStep.java#L51-L66&quot;&gt;javadocs for the SimpleBuildStep
class&lt;/a&gt;
have some notes on what you need to do when porting an existing &lt;code&gt;Builder&lt;/code&gt; or
&lt;code&gt;Publisher&lt;/code&gt; over to implement the &lt;code&gt;SimpleBuildStep&lt;/code&gt; interface.  In all
likelihood, most of what you’re going to end up doing is to replace occurrences
of &lt;code&gt;AbstractBuild&lt;/code&gt; with references to the &lt;code&gt;Run&lt;/code&gt; class, and replace occurrences
of &lt;code&gt;AbstractProject&lt;/code&gt; with references to the &lt;code&gt;Job&lt;/code&gt; class.  The APIs are pretty
similar, so it’s not too hard to do once you understand that that’s the game.
There is some discussion of this in the &lt;a href=&quot;https://github.com/jenkinsci/pipeline-plugin/blob/893e3484a25289c59567c6724f7ce19e3d23c6ee/DEVGUIDE.md#historical-background&quot;&gt;pipeline-plugin
DEVGUIDE&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the Gatling plugin, my
&lt;a href=&quot;https://github.com/cprice404/gatling-plugin/commit/288041c696840ea8eaf21705caf756d3d4bb1f94&quot;&gt;initial
efforts to port the &lt;code&gt;GatlingPublisher&lt;/code&gt; over to implement &lt;code&gt;SimpleBuildStep&lt;/code&gt;&lt;/a&gt; only
required the &lt;code&gt;AbstractBuild&lt;/code&gt; → &lt;code&gt;Run&lt;/code&gt; refactor.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After making these changes, I fired up the development Jenkins server, and, voila!&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/update-plugin-for-pipeline-tutorial/20_gatling_metastep_snippet.png&quot; alt=&quot;gatling metastep snippet&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, now, we can add a line like this to a Pipeline build script:&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;step&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;GatlingPublisher&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;enabled:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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;And it’ll effectively be the same as if we’d added the Gatling &quot;Post-Build
Action&quot; to an old-school Freestyle project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well…​ mostly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;build-actions-vs-project-actions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-actions-vs-project-actions&quot; /&gt;Build Actions vs. Project Actions&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this point our modified Gatling plugin should work the same way as it always
did in a Freestyle build, but in a Pipeline build, it only partially works.
Specifically, the Gatling plugin implements two different &quot;Actions&quot; to surface
things in the Jenkins GUI: a &quot;Build&quot; action, which adds the Gatling icon to the
left sidebar in the GUI when you’re viewing an individual build in the build
history of a job, and a &quot;Project&quot; action, which adds that same icon to the left
sidebar of the GUI of the main page for a job.  The &quot;Project&quot; action also adds a
&quot;floating panel&quot; on the main job page, which shows a graph of the historical
data for the Gatling runs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a Pipeline job, though, assuming we’ve added a call to the metastep, we’re
only seeing the &quot;Build&quot; actions.  Part of this is because, in the last round of
changes that I linked, we only modified the &quot;Build&quot; action, and not the
&quot;Project&quot; action.  Running the metastep in a Pipeline job has no visible effect
at all on the project/job page at this point.  So that’s what we’ll tackle next.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The key thing to know about getting &quot;Project&quot; actions working in a Pipeline job
is that, with a Pipeline job, there is no way for Jenkins to know up front what
steps or actions are going to be involved in a job.  It’s only after the job
runs once that Jenkins has a chance to introspect what all the steps were.  As
such, there’s no list of Builders or Publishers that it knows about up front to
call &lt;code&gt;getProjectAction&lt;/code&gt; on, like it would with a Freestyle job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is where
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/blob/jenkins-1.651.2/core/src/main/java/jenkins/tasks/SimpleBuildStep.java#L81-L97&quot;&gt;&lt;code&gt;SimpleBuildStep.LastBuildAction&lt;/code&gt;&lt;/a&gt;
comes into play.  This is an interface that you can add to your Build actions,
which give them their own &lt;code&gt;getProjectActions&lt;/code&gt; method that Jenkins recognizes and
will call when rendering the project page after the job has been run at least
once.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, effectively, what we need to do is to
&lt;a href=&quot;https://github.com/cprice404/gatling-plugin/commit/34d811add49ba7f07149a70000c380aadd2407bc&quot;&gt;get
rid of the &lt;code&gt;getProjectAction&lt;/code&gt; method on our &lt;code&gt;Publisher&lt;/code&gt; class, modify the Build
action to implement &lt;code&gt;SimpleBuildStep.LastBuildAction&lt;/code&gt;, and encapsulate our
Project action instances in the Build action&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The build action class now constructs an instance of the Project action and
makes it accessible via &lt;code&gt;getProjectActions&lt;/code&gt; (which comes from the
&lt;code&gt;LastBuildAction&lt;/code&gt; interface):&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;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GatlingBuildAction&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SimpleBuildStep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;LastBuildAction&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;GatlingBuildAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;BuildSimulation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sims&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;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;simulations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sims&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;nc&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;GatlingProjectAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;projectActions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ArrayList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;projectActions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GatlingProjectAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getParent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()));&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;projectActions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;projectActions&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;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Collection&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;?&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getProjectActions&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;projectActions&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;After making these changes, if we run the development Jenkins server, we can see
that after the first successful run of the Pipeline job that calls the
&lt;code&gt;GatlingPublisher&lt;/code&gt; metastep, the Gatling icon indeed shows up in the sidebar on
the main project page, and the floating box with the graph shows up as well:&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/update-plugin-for-pipeline-tutorial/25_gatling_project_page.png&quot; alt=&quot;gatling project page&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;making-our-dsl-step-do-something&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#making-our-dsl-step-do-something&quot; /&gt;Making our DSL step do something&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So at this point we’ve got the metastep syntax working from end-to-end, and
we’ve got a valid Pipeline DSL step (&lt;code&gt;gatlingArchive()&lt;/code&gt;) that we can use in our
Pipeline scripts without breaking anything…​ but our custom step doesn’t
actually do anything.  Here’s the part where we tie it all together…​ and it’s
pretty easy!  All we need to do is to &lt;a href=&quot;https://github.com/cprice404/gatling-plugin/commit/d81229f86a8e3cb0a0496ed2c71b6b94f4707720&quot;&gt;make our step &quot;Execution&quot; class
instantiate a Publisher and call &lt;code&gt;perform&lt;/code&gt; on
it&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As per the
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-plugin/blob/893e3484a25289c59567c6724f7ce19e3d23c6ee/DEVGUIDE.md#variable-substitutions&quot;&gt;notes
in the pipeline-plugin DEVGUIDE&lt;/a&gt;, we can use the &lt;code&gt;@StepContextParameter&lt;/code&gt;
annotation to inject in the objects that we need to pass to the Publisher’s
&lt;code&gt;perform&lt;/code&gt; method:&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;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GatlingArchiverStepExecution&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AbstractSynchronousNonBlockingStepExecution&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Void&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@StepContextParameter&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;transient&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TaskListener&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;listener&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@StepContextParameter&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;transient&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FilePath&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ws&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@StepContextParameter&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;transient&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Run&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@StepContextParameter&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;transient&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Launcher&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;launcher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;listener&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getLogger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Running Gatling archiver step.&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;nc&quot;&gt;GatlingPublisher&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;publisher&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GatlingPublisher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;publisher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;perform&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ws&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;launcher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;listener&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&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;After these changes, we can fire up the development Jenkins server, and hack up
our Pipeline script to call &lt;code&gt;gatlingArchive()&lt;/code&gt; instead of the metastep
&lt;code&gt;step([$class: &#39;GatlingPublisher&#39;, enabled: true])&lt;/code&gt; syntax.  One of these is
nicer to type and read than the other, but I’ll leave that as an exercise for
the reader.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;fin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fin&quot; /&gt;Fin&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With that, our plugin now works just as well in the brave new Pipeline world as
it did in the olden days of Freestyle builds.  I hope these notes save someone
else a little bit of time and googling on your way to writing (or porting) an
awesome plugin for Jenkins Pipeline jobs!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&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/solutions/pipeline/&quot;&gt;Jenkins Pipeline Overview&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/pipeline-plugin/blob/master/DEVGUIDE.md&quot;&gt;Pipeline Plugin Developer Guide&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/jenkins&quot;&gt;Jenkins Source Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-step-api-plugin&quot;&gt;Workflow Step API Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-basic-steps-plugin&quot;&gt;Workflow Basic Steps Plugin&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/05/23/external-workspace-manager-plugin/</id>
<title>GSoC Project Intro: External Workspace Manager Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/23/external-workspace-manager-plugin/" />
<author>
<name>alexsomai</name>
</author>
<category term='pipeline'></category>
<category term='plugins'></category>
<category term='gsoc'></category>
<summary>
About myself

My name is Alexandru Somai.
I&#8217;m following a major in Software Engineering at the Babes-Bolyai University of Cluj-Napoca, Romania.
I have more than two years hands-on experience working in Software Development.


I enjoy writing code in Java, Groovy and JavaScript.
The technologies and frameworks that I&#8217;m most familiar with are: Spring Framework, Spring Security, Hibernate,
JMS, Web Services, JUnit, TestNG, Mockito.
As build tools and continuous integration, I&#8217;m using Maven and Jenkins.
I&#8217;m a passionate software developer who is always learning, always looking for new challenges.
I want to start contributing to the open source community and Google Summer of Code is a starting point for me.



Project...
</summary>
<content type='html'>
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-myself&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-myself&quot; /&gt;About myself&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My name is Alexandru Somai.
I’m following a major in Software Engineering at the Babes-Bolyai University of Cluj-Napoca, Romania.
I have more than two years hands-on experience working in Software Development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I enjoy writing code in Java, Groovy and JavaScript.
The technologies and frameworks that I’m most familiar with are: Spring Framework, Spring Security, Hibernate,
JMS, Web Services, JUnit, TestNG, Mockito.
As build tools and continuous integration, I’m using Maven and Jenkins.
I’m a passionate software developer who is always learning, always looking for new challenges.
I want to start contributing to the open source community and Google Summer of Code is a starting point for me.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;project-summary&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#project-summary&quot; /&gt;Project summary&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently, Jenkins’ build workspace may become very large in size due to the fact that some compilers generate
very large volumes of data.
The existing plugins that share the workspace across builds are able to do this by copying the files from
one workspace to another, process which is inefficient.
A solution is to have a Jenkins plugin that is able to manage and reuse the same workspace between multiple builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As part of the &lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;Google Summer of Code&lt;/a&gt; 2016 I will be working on
the &lt;em&gt;External Workspace Manager&lt;/em&gt; plugin.
My mentors for this project are &lt;a href=&quot;https://github.com/oleg-nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;
and &lt;a href=&quot;https://github.com/martinda&quot;&gt;Martin d’Anjou&lt;/a&gt;.
This plugin aims to provide an external workspace management system.
It should facilitate workspace share and reuse across multiple Jenkins jobs.
It should eliminate the need to copy, archive or move files.
The plugin will be written for &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Plugin&quot;&gt;Pipeline&lt;/a&gt; jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;usage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#usage&quot; /&gt;Usage&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;prerequisites&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#prerequisites&quot; /&gt;Prerequisites&lt;/h4&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Multiple physical disks accessible from controller.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The same physical disks must be accessible from Jenkins Nodes (renamed to Agents in Jenkins 2.0).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the Jenkins global configuration, define a disk pool (or many) that will contain the physical disks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In each Node configuration, define the mounting point from the current node to each physical disk.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The following diagram gives you an overview of how an &lt;em&gt;External Workspace Manager&lt;/em&gt; configuration may look like:&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/ewm/ewm-config.png&quot; alt=&quot;ewm config&quot; title=&quot;Simplified EWM config&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;example-one&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#example-one&quot; /&gt;Example one&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s assume that we have one Jenkins job. In this job, we want to use the same workspace on multiple Jenkins nodes.
Our pipeline code may look like 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;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;Stage 1. Allocate workspace&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extWorkspace&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exwsAllocate&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;id:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;diskpool1&#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#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;exws&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extWorkspace&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Stage 2. Build on the build server&#39;&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;url:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;...&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn clean install&#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;node&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;exws&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extWorkspace&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Stage 3. Run tests on a test machine&#39;&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 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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Note: The &lt;code&gt;stage()&lt;/code&gt; steps are optional from the &lt;em&gt;External Workspace Manager&lt;/em&gt; plugin perspective.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;stage-1-allocate-workspace&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-1-allocate-workspace&quot; /&gt;Stage 1. Allocate workspace&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;exwsAllocate&lt;/code&gt; step selects a disk from &lt;em&gt;diskpool1&lt;/em&gt;
(default behavior: the disk with the most available size).
On that disk, let’s say &lt;em&gt;disk1&lt;/em&gt;, it allocates a directory.
The computed directory path is: &lt;code&gt;/physicalPathOnDisk/$JOB_NAME/$BUILD_NUMBER&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, Let’s assume that the &lt;code&gt;$JOB_NAME&lt;/code&gt; is &lt;em&gt;integration&lt;/em&gt; and the &lt;code&gt;$BUILD_NUMBER&lt;/code&gt; is &lt;em&gt;14&lt;/em&gt;.
Then, the resulting path is: &lt;code&gt;/jenkins-project/disk1/integration/14&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;stage-2-build-on-the-build-server&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-2-build-on-the-build-server&quot; /&gt;Stage 2. Build on the build server&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All the nodes labeled &lt;em&gt;linux&lt;/em&gt; must have access to the disks defined in the disk pool.
In the Jenkins Node configurations we have defined the local paths that are the mounting points to each disk.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;exws&lt;/code&gt; step concatenates the node’s local path with the path returned by the &lt;code&gt;exwsAllocate&lt;/code&gt; step.
In our case, the node labeled &lt;em&gt;linux&lt;/em&gt; has its local path to &lt;em&gt;disk1&lt;/em&gt; defined as: &lt;code&gt;/linux-node/disk1/&lt;/code&gt;.
So, the complete workspace path is: &lt;code&gt;/linux-node/disk1/jenkins-project/disk1/integration/14&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;stage-3-run-tests-on-a-test-machine&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-3-run-tests-on-a-test-machine&quot; /&gt;Stage 3. Run tests on a test machine&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Further, we want to run our tests on a different node, but we want to reuse the previously created workspace.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the node labeled &lt;em&gt;test&lt;/em&gt; we have defined the local path to &lt;em&gt;disk1&lt;/em&gt; as: &lt;code&gt;/test-node/disk1/&lt;/code&gt;.
By applying the &lt;code&gt;exws&lt;/code&gt; step, our tests will be able to run in the same workspace as the build.
Therefore, the path is: &lt;code&gt;/test-node/disk1/jenkins-project/disk1/integration/14&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;example-two&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#example-two&quot; /&gt;Example two&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s assume that we have two Jenkins jobs, one called &lt;em&gt;upstream&lt;/em&gt; and the other one called &lt;em&gt;downstream&lt;/em&gt;.
In the &lt;em&gt;upstream&lt;/em&gt; job, we clone the repository and build the project, and in the &lt;em&gt;downstream&lt;/em&gt; job we run the tests.
In the &lt;em&gt;downstream&lt;/em&gt; job we don’t want to clone and re-build the project, we need to use the same
workspace created in the &lt;em&gt;upstream&lt;/em&gt; job.
We have to be able to do so without copying the workspace content from one location to another.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The pipeline code in the &lt;em&gt;upstream&lt;/em&gt; job is the following:&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;Stage 1. Allocate workspace in the upstream job&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extWorkspace&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exwsAllocate&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;id:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;diskpool1&#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;linux&#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;exws&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extWorkspace&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Stage 2. Build in the upstream job&#39;&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;url:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;...&#39;&lt;/span&gt;
           &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;mvn clean install&#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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And the &lt;em&gt;downstream&lt;/em&gt;&#39;s pipeline code is:&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;Stage 3. Allocate workspace in the downstream job&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;extWorkspace&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exwsAllocate&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;id:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;diskpool1&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;upstream:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;upstream&#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;node&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;exws&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;extWorkspace&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;stage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;Stage 4. Run tests in the downstream job&#39;&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 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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;stage-1-allocate-workspace-in-the-upstream-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-1-allocate-workspace-in-the-upstream-job&quot; /&gt;Stage 1. Allocate workspace in the upstream job&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The functionality is the same as in example one - stage 1.
In our case, the allocated directory on the physical disk is: &lt;code&gt;/jenkins-project/disk1/upstream/14&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;stage-2-build-in-the-upstream-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-2-build-in-the-upstream-job&quot; /&gt;Stage 2. Build in the upstream job&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Same functionality as example one - stage 2.
The final workspace path is: &lt;code&gt;/linux-node/disk1/jenkins-project/disk1/upstream/14&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;stage-3-allocate-workspace-in-the-downstream-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-3-allocate-workspace-in-the-downstream-job&quot; /&gt;Stage 3. Allocate workspace in the downstream job&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By passing the &lt;em&gt;upstream&lt;/em&gt; parameter to the &lt;code&gt;exwsAllocate&lt;/code&gt; step,
it selects the most recent stable upstream workspace (default behavior).
The workspace path pattern is like this: &lt;code&gt;/physicalPathOnDisk/$UPSTREAM_NAME/$MOST_RECENT_STABLE_BUILD&lt;/code&gt;.
Let’s assume that the last stable build number is &lt;em&gt;12&lt;/em&gt;, then the resulting path is:
&lt;code&gt;/jenkins-project/disk1/upstream/12&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect4&quot;&gt;
&lt;h5 id=&quot;stage-4-run-tests-in-the-downstream-job&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#stage-4-run-tests-in-the-downstream-job&quot; /&gt;Stage 4. Run tests in the downstream job&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;code&gt;exws&lt;/code&gt; step concatenates the node’s local path with the path returned by the &lt;code&gt;exwsAllocate&lt;/code&gt; step in stage 3.
In this scenario, the complete path for running tests is: &lt;code&gt;/test-node/disk1/jenkins-project/disk1/upstream/12&lt;/code&gt;.
It will reuse the workspace defined in the upstream job.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;additional-details&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#additional-details&quot; /&gt;Additional details&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You may find the complete project proposal, along with the design details, features, more examples and use cases,
implementation ideas and milestones in the &lt;a href=&quot;https://goo.gl/fq3RAe&quot;&gt;design document&lt;/a&gt;.
The plugin repository will be available on &lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A prototype version of the plugin should be available in late June and the releasable version in late August.
I will be holding plugin functionality demos within the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I do appreciate any feedback.
You may add comments in the &lt;a href=&quot;https://goo.gl/fq3RAe&quot;&gt;design document&lt;/a&gt;.
I will be posting updates from time to time about the plugin status on the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Jenkins developers&lt;/a&gt; mailing list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;link:https://app.gitter.im/#/room/#jenkinsci_external-workspace-manager-&lt;a href=&quot;https://plugins.jenkins.io/gitter.im&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://badges.gitter.im/jenkinsci/external-workspace-manager-plugin.svg&quot; alt=&quot;title: &amp;quot;Gitter&amp;quot;&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/span&gt;
&lt;/a&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://goo.gl/fq3RAe&quot;&gt;Design document&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://summerofcode.withgoogle.com/&quot;&gt;GSoC program&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016&quot;&gt;Jenkins GSoC Page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/external-workspace-manager-plugin&quot;&gt;Project repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/05/18/announcing-azure-partnership/</id>
<title>Partnering with Microsoft to run Jenkins infrastructure on Azure</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/18/announcing-azure-partnership/" />
<author>
<name>rtyler</name>
</author>
<category term='azure'></category>
<category term='infra'></category>
<category term='infrastructure'></category>
<summary>
I am pleased to announce that we have partnered with Microsoft to migrate and
power the Jenkins project&#8217;s infrastructure with
Microsoft Azure. The partnership comes
at an important time, after the recent launch of Jenkins 2.0,
Jenkins users are more readily adopting Pipeline as
Code and many other plugins at an increasing rate, elevating the importance of
Jenkins infrastructure to the overall success of the project. That strong and
continued growth has brought new demands to our infrastructure&#8217;s design and
implementation, requiring the next step in its evolution. This partnership helps
us grow with the rest of the project by unifying our existing infrastructure
under one comprehensive, modern and scalable...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am pleased to announce that we have partnered with Microsoft to migrate and
power the Jenkins project’s infrastructure with
&lt;a href=&quot;https://azure.microsoft.com/en-us/&quot;&gt;Microsoft Azure&lt;/a&gt;. The partnership comes
at an important time, after the recent launch of &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;Jenkins 2.0&lt;/a&gt;,
Jenkins users are more readily adopting &lt;a href=&quot;https://www.jenkins.io/solutions/pipeline&quot;&gt;Pipeline as
Code&lt;/a&gt; and many other plugins at an increasing rate, elevating the importance of
Jenkins infrastructure to the overall success of the project. That strong and
continued growth has brought new demands to our infrastructure’s design and
implementation, requiring the next step in its evolution. This partnership helps
us grow with the rest of the project by unifying our existing infrastructure
under one comprehensive, modern and scalable platform.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In March we
&lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins-meeting/2016/jenkins-meeting.2016-03-30-18.00.html&quot;&gt;discussed
the potential partnership&lt;/a&gt; in our regularly scheduled
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Meeting+Agenda&quot;&gt;project
meeting&lt;/a&gt;,
highlighting some of the infrastructure challenges that we face:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Currently we have infrastructure in four different locations, with four
different infrastructure providers, each with their own APIs and tools for
managing resources, each with varying capabilities and capacities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Project infrastructure is managed by a team of volunteers, operating
more than 15 different services and managing a number of additional external
services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our current download/mirror network, while geographically distributed, is
relatively primitive and its implementation prevents us from using more modern
distribution best practices.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In essence, five years of tremendous growth for Jenkins has outpaced our
organically grown, unnecessarily complex, project infrastructure. Migrating to
Azure simplifies and improves our infrastructure in a dramatic way that would
not be possible without a comprehensive platform consisting of: compute, CDN,
storage and data-store services. Our partnership covers, at minimum, the next
three years of the project’s infrastructure needs, giving us a great home for
the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Azure also enables a couple of projects that &lt;a href=&quot;https://github.com/rtyler&quot;&gt;I&lt;/a&gt;
have long been dreaming of providing to Jenkins users and contributors:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;End-to-end TLS encrypted distribution of Jenkins packages, plugins and
metadata via the &lt;a href=&quot;https://azure.microsoft.com/en-us/services/cdn/&quot;&gt;Azure CDN&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More complete build/test/release support and capacity on
&lt;a href=&quot;https://ci.jenkins.io&quot;&gt;ci.jenkins.io&lt;/a&gt; for plugin developers using
&lt;a href=&quot;https://azure.microsoft.com/en-us/services/container-service/&quot;&gt;Azure
Container Service&lt;/a&gt; and generic VMs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins infrastructure is &lt;a href=&quot;https://github.com/jenkins-infra&quot;&gt;all open
source&lt;/a&gt; which means  all of our Docker containers, Puppet code and many of our
tools are all available &lt;a href=&quot;https://github.com/jenkins-infra&quot;&gt;on GitHub&lt;/a&gt;. Not
only can you watch the migration process to Azure as it happens, but I also
invite you to &lt;strong&gt;participate&lt;/strong&gt; in making our project’s infrastructure better (join
us in the &lt;code&gt;#jenkins-infra&lt;/code&gt; channel on &lt;a href=&quot;https://freenode.net&quot;&gt;Freenode&lt;/a&gt; or our
&lt;a href=&quot;https://lists.jenkins-ci.org/mailman/listinfo/jenkins-infra&quot;&gt;mailing list&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Suffice it to say, I’m very excited about the bright [blue] future for the
Jenkins project and the infrastructure that powers it!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/05/17/state-of-jam/</id>
<title>The State of Jenkins Area Meetups (JAM)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/17/state-of-jam/" />
<author>
<name>alyssat</name>
</author>
<category term='meetup'></category>
<category term='JAM'></category>
<category term='event'></category>
<summary>
Recently, the Jenkins project announced the release of
Jenkins 2.0, a first major release
after 10 years and 655 weekly releases. This has been a major milestone for
Jenkins and its growing community of developers, testers, designers and other
users in the software delivery process.


With its rising popularity and wide adoption, the Jenkins community continues to
grow and evolve into the millions. Jenkins community meetup activity has risen
to an all time high since the first Jenkins meetup which was established on
August 23 2010, in San Francisco.


Over the last six months the number of
Jenkins Area Meetup (JAM) Groups has
grown from 5 to 30, with coverage in...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently, the Jenkins project announced the release of
&lt;a href=&quot;https://www.jenkins.io/blog/2016/04/26/jenkins-20-is-here/&quot;&gt;Jenkins 2.0&lt;/a&gt;, a first major release
after 10 years and 655 weekly releases. This has been a major milestone for
Jenkins and its growing community of developers, testers, designers and other
users in the software delivery process.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With its rising popularity and wide adoption, the Jenkins community continues to
grow and evolve into the millions. Jenkins community meetup activity has risen
to an all time high since the first Jenkins meetup which was established on
August 23 2010, in San Francisco.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the last six months the number of
&lt;a href=&quot;https://www.meetup.com/pro/jenkins/&quot;&gt;Jenkins Area Meetup (JAM) Groups&lt;/a&gt; has
grown from 5 to 30, with coverage in Asia, North America, South America and
Europe.  That’s an average growth of &lt;strong&gt;4 new JAMs per month&lt;/strong&gt;.&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/state-of-jam-2016/JAM-map.png&quot; alt=&quot;JAM map&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of today, there are over &lt;strong&gt;4,100&lt;/strong&gt; Jenkins fans within the Jenkins meetup
community.  This is the result of contributions from community JAM leaders who
have volunteered their time to provide a platform for learning, sharing and
networking all things Jenkins within their local communities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For anyone who has not organized a meetup before, there are many moving parts
that have to come together at a specific location, date and time. This process
takes significant effort to methodically plan out. From planning the food and
beverages to securing speaker(s), a venue, audio/visual setup, technical
logistics and of course promoting the meetup. It does takes a level of passion
and effort to make it all happen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many &lt;strong&gt;THANKS&lt;/strong&gt; to the &lt;strong&gt;55&lt;/strong&gt; JAM leaders, who share this passion - they have
successfully organized over &lt;strong&gt;41&lt;/strong&gt; meetups within the past six months in North
America, South America and Europe. That’s about 6 meetups a month!&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/state-of-jam-2016/JAMs-over-time.png&quot; alt=&quot;JAMs over time&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are still plenty of opportunities to be a JAM organizer. If there is not a
JAM &lt;a href=&quot;https://www.meetup.com/pro/jenkins/&quot;&gt;near you&lt;/a&gt;, we’d love to hear from
you! Here’s
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;how you can get
started&lt;/a&gt;.&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/state-of-jam-2016/toulouse-jam.png&quot; alt=&quot;Toulouse JAM 1&quot; width=&quot;500&quot; /&gt;&lt;/span&gt;
&lt;/p&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/state-of-jam-2016/toulouse-jam-2.png&quot; alt=&quot;Toulouse JAM 2&quot; width=&quot;500&quot; /&gt;&lt;/span&gt;
&lt;/p&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/state-of-jam-2016/seville-jam.png&quot; alt=&quot;Seville JAM&quot; width=&quot;500&quot; /&gt;&lt;/span&gt;
&lt;/p&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/state-of-jam-2016/peru-jam.png&quot; alt=&quot;Peru JAM&quot; width=&quot;500&quot; /&gt;&lt;/span&gt;
&lt;/p&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/state-of-jam-2016/barcelona-jam.png&quot; alt=&quot;Barcelona JAM&quot; width=&quot;500&quot; /&gt;&lt;/span&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/05/12/sf-jam-jenkins-and-azure/</id>
<title>SF JAM Report: Scaling Jenkins for Continuous Delivery with Azure</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/12/sf-jam-jenkins-and-azure/" />
<author>
<name>rtyler</name>
</author>
<category term='jam'></category>
<category term='azure'></category>
<category term='meetup'></category>
<summary>
A few weeks ago, my colleague Brian Dawson
and I were invited to present on
Scaling Jenkins for
Continuous Delivery with Microsoft Azure in Microsoft&#8217;s
Reactor space. Azure is Microsoft&#8217;s
public cloud offering and one of the many tools available to Jenkins users for
adding elastic compute capacity, among other things, to their build/test/deploy
infrastructure. While our presentations are applicable to practically
any cloud-based Jenkins environment, Thiago Almeida and Oguz Pastirmaci from
Microsoft were also on-hand and presented some interesting Azure-specific
offerings like
Azure
Container Service with Jenkins.


While we do not have video from the meetup, Brian and I did record
a
session with Thiago and Oguz for Channel9
which covers much of the same...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few weeks ago, my colleague &lt;a href=&quot;https://github.com/brianvdawson&quot;&gt;Brian Dawson&lt;/a&gt;
and I were invited to present on
&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/228524373/&quot;&gt;Scaling Jenkins for
Continuous Delivery with Microsoft Azure&lt;/a&gt; in Microsoft’s
&lt;a href=&quot;https://developer.microsoft.com/en-us/reactor/&quot;&gt;Reactor space&lt;/a&gt;. Azure is Microsoft’s
public cloud offering and one of the many tools available to Jenkins users for
adding elastic compute capacity, among other things, to their build/test/deploy
infrastructure. While our presentations are applicable to practically
any cloud-based Jenkins environment, Thiago Almeida and Oguz Pastirmaci from
Microsoft were also on-hand and presented some interesting Azure-specific
offerings like
&lt;a href=&quot;https://azure.microsoft.com/en-us/services/container-service/&quot;&gt;Azure
Container Service&lt;/a&gt; with Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we do not have video from the meetup, Brian and I did record
&lt;a href=&quot;https://channel9.msdn.com/Series/TECHPOSITORY/Scaling-Jenkins-on-Azure&quot;&gt;a
session&lt;/a&gt; with Thiago and Oguz for &lt;a href=&quot;https://channel9.msdn.com&quot;&gt;Channel9&lt;/a&gt;
which covers much of the same content:&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;
  &lt;iframe src=&quot;https://channel9.msdn.com/Series/TECHPOSITORY/Scaling-Jenkins-on-Azure/player&quot; width=&quot;640&quot; height=&quot;360&quot; allowFullScreen=&quot;&quot; frameBorder=&quot;0&quot; /&gt;
&lt;/center&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To kick-off the meetup we asked attendees a few polling questions and
received very telling responses:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How big is your Development/IT organization?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What is your role?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;By show of hands do you practice CI/CD/DevOps/etc?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At what scale (tooling and practice)?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The responses indicated that the majority of attendees were from small to medium
organizations where they practiced Continuous Delivery across multiple teams. A
notable 25% or greater attendees considered themselves &quot;fullstack&quot; or
participating in all of the roles of Developer, QA, and Operations. Interesting
when paired with the high number (~80%) of those who practice CD.  This is
likely because modern teams, with mature CD practices, tend to blur the
traditional lines of Developer, QA and Operations. However, In my experience,
while this is often the case for small to medium companies in large
organizations team members tend to fall into the traditional roles, with CD
providing the practice and platform to unify teams across roles.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Brian Dawson
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After gauging the audience, Thiago and Brian reviewed Continuous Delivery (CD)
and implementing it at scale. They highlighted the fact that CD is being rapidly
adopted across teams and organizations, providing the ability: to deliver a demonstrably
higher quality product, shipping more rapidly than before, and to keep team members happier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, when organizations fail to properly support CD as they scale, they run
into issues such as: developers acting as administrators at the cost of
productivity, potential lack of security and/or exposure of IP and difficulty in
sharing best practices across teams.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thiago then highlighted that properly scaling CD practices in the organization
along with the infrastructure itself can alleviate these issues, and discussed
the benefits of scaling CD to on cloud platforms to provide &quot;CD-as-a-Service.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Overall I found the &quot;theory&quot; discussion to be on point, continuous delivery is
not just a technology nor a people problem. Successful organizations scale their
processes and tooling &lt;em&gt;together&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The slides from our respective presentations are linked below:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;(Brian) &lt;a href=&quot;https://www.jenkins.io/files/sf-jam-azure/Scaling%20Jenkins%20for%20CD%20with%20Azure.pdf&quot;&gt;Scaling Jenkins for Continuous Delivery&lt;/a&gt; (.pdf)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(Tyler) &lt;a href=&quot;https://www.jenkins.io/files/sf-jam-azure/Scaling%20Jenkins%20with%20Azure.pdf&quot;&gt;Scaling Jenkins with Azure&lt;/a&gt; (.pdf)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope you join us at future
&lt;a href=&quot;https://www.meetup.com/San-Francisco-Jenkins-Area-Meetup/&quot;&gt;&lt;strong&gt;San Francisco
JAM&lt;/strong&gt;&lt;/a&gt;s!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/05/11/security-update/</id>
<title>Security updates for Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/11/security-update/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We just released security updates to Jenkins that fix a number of low and medium severity issues. For an overview of what was fixed, see the security advisory.


One of the fixes may well break some of your use cases in Jenkins, at least until plugins have been adapted: SECURITY-170. This change removes parameters that are not defined on a job from the build environment. So, right now, a job could even be unparameterized, and plugins were able to pass parameters anyway. Since build parameters are added to the environment variables of scripts run during a build, parameters such as PATH...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released security updates to Jenkins that fix a number of low and medium severity issues. For an overview of what was fixed, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2016-05-11/&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the fixes may well break some of your use cases in Jenkins, at least until plugins have been adapted: SECURITY-170. This change removes parameters that are not defined on a job from the build environment. So, right now, a job could even be unparameterized, and plugins were able to pass parameters anyway. Since build parameters are added to the environment variables of scripts run during a build, parameters such as &lt;code&gt;PATH&lt;/code&gt; or &lt;code&gt;DYLD_LIBRARY_PATH&lt;/code&gt; can be defined — on jobs which don’t even expect those as build parameters — to change the behavior of builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A number of plugins define additional parameters for builds. For example, GitHub Pull Request Builder passes a number of additional parameters describing the pull request. Release Plugin also allows adding several additional parameters to a build that are not considered to be defined in the job as part of this security fix.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please see &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins+affected+by+fix+for+SECURITY-170&quot;&gt;this wiki page&lt;/a&gt; for a list of plugins known to be affected by this change.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Until these plugins have been adapted to work with the new restriction (and advice on that is available further down), you can define the following system properties to work around this limitation, at least for a time:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Set &lt;code&gt;hudson.model.ParametersAction.keepUndefinedParameters&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;, e.g. &lt;code&gt;java -Dhudson.model.ParametersAction.keepUndefinedParameters=true -jar jenkins.war&lt;/code&gt; to revert to the old behavior of allowing any build parameters. Depending on your environment, this may be unsafe, as it opens you up to attacks as described above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set &lt;code&gt;hudson.model.ParametersAction.safeParameters&lt;/code&gt; to a comma-separated list of safe parameter names, e.g. &lt;code&gt;java -Dhudson.model.ParametersAction.safeParameters=FOO,BAR_baz,quX -jar jenkins.war&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;I realize this change, among a few others that improve the security of Jenkins, may be difficult to adapt for some, but given the valuable secrets typically stored in Jenkins, I’m certain that this is the correct approach. We made sure to release this fix with the options described above, so that this change doesn’t block updating those that rely on this behavior.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers have several options to adapt to this change:&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;ParametersAction&lt;/code&gt; actually stores all parameters, but &lt;code&gt;getParameters()&lt;/code&gt; only returns those that are defined on the job. The new method &lt;code&gt;getAllParameters()&lt;/code&gt; returns all of them. This can be used, for example by &lt;code&gt;EnvironmentContributor&lt;/code&gt; extensions, to add known safe parameters to build environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t pass extra arguments, but define a &lt;code&gt;QueueAction&lt;/code&gt; for your metadata instead. Those can still be made available to the build environment as needed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/content/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/05/10/jenkins-20-vjam/</id>
<title>Jenkins 2.0 Online JAM Wrap-up</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-05-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/05/10/jenkins-20-vjam/" />
<author>
<name>rtyler</name>
</author>
<category term='jenkins2'></category>
<category term='jam'></category>
<category term='meetup'></category>
<summary>
Last week we hosted our first ever
Online JAM with the debut
topic of: Jenkins 2.0. Alyssa, our
Events officer, and I pulled together a
series of
sessions focusing on some of the most notable aspects of Jenkins 2 with:




A Jenkins 2.0 keynote from project founder
Kohsuke Kawaguchi


An overview of "Pipeline as Code" from Patrick
Wolf


A deep-dive into Pipeline and related plugins like Multibranch, etc from
Jesse Glick and
Kishore Bhatia


An overview of new user experience changes in 2.0 from
Keith Zantow


A quick lightning talk about documentation by yours truly


Wrapping up the sessions, was Kohsuke again, talking about the road beyond
Jenkins 2.0 and what big projects he sees on the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week we hosted our first ever
&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;Online JAM&lt;/a&gt; with the debut
topic of: &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;Jenkins 2.0&lt;/a&gt;. &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa&lt;/a&gt;, our
Events officer, and I pulled together a
&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/230154841/&quot;&gt;series of
sessions&lt;/a&gt; focusing on some of the most notable aspects of Jenkins 2 with:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A Jenkins 2.0 keynote from project founder
&lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An overview of &quot;Pipeline as Code&quot; from &lt;a href=&quot;https://github.com/hrmpw&quot;&gt;Patrick
Wolf&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A deep-dive into Pipeline and related plugins like Multibranch, etc from
&lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; and
&lt;a href=&quot;https://github.com/kishorebhatia&quot;&gt;Kishore Bhatia&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An overview of new user experience changes in 2.0 from
&lt;a href=&quot;https://github.com/kzantow&quot;&gt;Keith Zantow&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A quick lightning talk about documentation by yours truly&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wrapping up the sessions, was Kohsuke again, talking about the road beyond
Jenkins 2.0 and what big projects he sees on the horizon.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;center&gt;
  &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/emV60CcDVV0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;
&lt;/center&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The event was really interesting for me, and I hope informative for those who
participated in the live stream and Q&amp;amp;A session. I look forward to hosting more
Virtual JAM events in the future, and I hope you will
&lt;strong&gt;&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;join us!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;questions-and-answers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#questions-and-answers&quot; /&gt;Questions and Answers&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below are a collection of questions and answers, that were posed during the
Virtual JAM. Many of these were answered during the course of the sessions, but
for posterity all are included below.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;pipeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline&quot; /&gt;Pipeline&lt;/h4&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What kind of DSL is used behind pipeline as code? Groovy or allow freely use
different languages as a user prefer?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline uses a Groovy-based domain specific language.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How do you test your very own pipeline DSL?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Replay helps in testing/debugging while creating pipelines and at the branch
level. There are some ideas which &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;
has proposed for testing &lt;code&gt;Jenkinsfile&lt;/code&gt; and Pipeline libraries captured in
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/33925&quot;&gt;JENKINS-33925&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Isn’t &quot;Survive Jenkins restart&quot; exclusive to [CloudBees] Jenkins Enterprise?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No, this feature does not need
&lt;a href=&quot;https://www.cloudbees.com/capabilities/continuous-integration&quot;&gt;CloudBees
Jenkins Enterprise&lt;/a&gt;. All features shown
during the virtual JAM are free and open source. CloudBees&#39; Jenkins Enterprise
product does support restarting from a specified stage however, and that is not
open source.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How well is jenkins 2.0 integrate with github for tracking job definitions?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/GitHub+Organization+Folder+Pluginp&quot;&gt;GitHub
Organization Folder plugin&lt;/a&gt;, Jenkins can automatically detect a &lt;code&gt;Jenkinsfile&lt;/code&gt; in
source repositories to create Pipeline projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please make the ability for re-run failed stages Open Source too :)&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This has been passed on to our friends at CloudBees for consideration :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If &lt;code&gt;Jenkinsfile&lt;/code&gt; is in the repo, co-located with code, does this mean Jenkins can
auto-detect new jobs for different branches?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is possible using the
&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/#creating-multibranch-pipelines&quot;&gt;Pipeline Multibranch plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What documentation sources are there for Pipeline?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our &lt;a href=&quot;https://www.jenkins.io/doc/&quot;&gt;documentation section&lt;/a&gt; contains a number of pagesaround Pipeline.
There is also additional documentation and examples in the plugin’s
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-plugin&quot;&gt;git repository&lt;/a&gt; and the
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-examples&quot;&gt;jenkinsci/pipeline-examples&lt;/a&gt;
repository. (contributions welcome!)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Where we can find the DSL method documentation?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is generated &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps&quot;&gt;documentation on jenkins.io&lt;/a&gt; which
includes steps from all public plugins. Inside of a running Jenkins instance,
you can also navigate to
&lt;a href=&quot;http://localhost:8080/workflow-cps-snippetizer/dslReference&quot;&gt;JENKINS_URL/workflow-cps-snippetizer/dslReference&lt;/a&gt;
to see the documentation for the plugins which are installed in that instance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If Pipeline is not support some plugins (there is a lot actually), I needed
SonarQube Runner but unfortunately it’s not supported yet, in Job DSL plugin i
can use &quot;Configure Block&quot; and cover any plugin via XML, how i can achieve the
same with a Pipeline?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not at this time&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Is there a possibility to create custom tooltips i.e. with a quick reference or
a link to internal project documentation? Might be useful i.e. for junior team
members who need to refer to external docs.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not generally. Though in the case of Pipeline global libraries, you can create
descriptions of vars/functions like &lt;code&gt;standardBuild&lt;/code&gt; in the demo, and these will
appear in Snippet Generator under Global Variables.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Oh pipeline supports joining jobs? It’s really good, but I cannot find document
on &lt;a href=&quot;https://www.jenkins.io/doc/&quot;&gt;jenkins.io&lt;/a&gt; could you tell me where is it?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is a &lt;code&gt;build&lt;/code&gt; step, but the Pipeline system is optimized for single-job
pipelines&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have multiple projects that we would like to follow the same pipeline.  How
would I write a common pipeline that can be shared across multiple projects.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You may want to look at implementing some additional steps using the
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-examples/tree/master/global-library-examples&quot;&gt;Pipeline Global
Library&lt;/a&gt; feature. This would allow you to define
organization-specific extensions to the Pipeline DSL to abstract away common
patterns between projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How much flexibility is there with creating context / setting environment
variables or changing / modifying build tool options when calling a web hook /
api to parameterize pipelines for example to target deployments to different env
using same pipeline&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Various environment variables are exposed under the &lt;code&gt;env&lt;/code&gt; variable in the Groovy
DSL which would allow you to construct logic as simple or as complex as
necessary to achieve your goal.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you set up the job for the first time, does it build every branch in git,
or is there a way to stop it from building old branches?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not at this time, the best way to prevent older branches from being built is to
remove the &lt;code&gt;Jenkinsfile&lt;/code&gt; in those branches. Alternatively, you could use the
&quot;include&quot; or &quot;exclude&quot; patterns when setting up the SCM configuration of your
multibranch Pipeline. See also
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/32396&quot;&gt;JENKINS-32396&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Similar to GitHub organizations, will BitBucket &quot;projects&quot; (ways of organizing
collections of repos) be supported?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, these are supported via the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Bitbucket+Branch+Source+Plugin&quot;&gt;Bitbucket
Branch Source plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How do you handle build secrets with the pipeline plugin? Using unique
credentials stored in the credentials plugin per project and/or branch?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This can be accomplished by using the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Credentials+Binding+Plugin&quot;&gt;Credentials
Binding plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Similar to GitHub Orgs, are Gitlab projects supported in the same way?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;GitLab projects are not explicitly supported at this time, but the extension
points which the GitHub Organization Folder plugin uses could be extended in a
similar manner for GitLab. See also &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/34396&quot;&gt;JENKINS-34396&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Is Perforce scm supported by the Pipeline plugin?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a SCM source for discovering a &lt;code&gt;Jenkinsfile&lt;/code&gt;, not at this time. The
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/P4+Plugin&quot;&gt;P4&lt;/a&gt;
plugin does provide some &lt;code&gt;p4&lt;/code&gt; steps which can be used in a Pipeline script
however, &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/steps/p4&quot;&gt;see here for documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Is Mercurial supported with multibranch?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, it is.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Can &lt;code&gt;Jenkinsfile&lt;/code&gt; detect when it’s running against a pull request vs an approved commit, so that it can perform a different type of build?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, via the &lt;code&gt;env&lt;/code&gt; variables provided in the DSL scope. Using an &lt;code&gt;if&lt;/code&gt; statement,
one could guard specific behaviors with:&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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;CHANGE_ID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&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;cm&quot;&gt;/* do things! */&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;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s say I’m building RPMs with Jenkins and use build number as an RPM
version/release number. Is there a way to maintain build numbers and leverage
versioning of &lt;code&gt;Jenkinsfile&lt;/code&gt;?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Through the &lt;code&gt;env&lt;/code&gt; variable, it’s possible to utilize &lt;code&gt;env.BUILD_NUMBER&lt;/code&gt; or the
SCM commit ID, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Love the snippet generator! Any chance of separating it out from the pipeline
into a separate page on its own, available in the left nav?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, this is tracked in
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31831&quot;&gt;JENKINS-31831&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Any tips on pre-creating the admin user credential and selecting plugins to
automate the Jenkins install?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are various &lt;a href=&quot;https://github.com/jenkinsci/puppet-jenkins&quot;&gt;configuration
management modules&lt;/a&gt; which provide parts of this functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m looking at the pipeline syntax (in Jenkins 2.0) how do I detect a
&lt;code&gt;step([…​])&lt;/code&gt; has failed and create a notification inside the &lt;code&gt;Jenkinsfile&lt;/code&gt;?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This can be done by wrapping a step invocation with a Groovy &lt;code&gt;try/catch&lt;/code&gt; block.
See also &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/28119&quot;&gt;JENKINS-28119&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;user-interfaceexperience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#user-interfaceexperience&quot; /&gt;User Interface/Experience&lt;/h4&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Is the user experience same as before when we replace the Jenkins.war(1.x to
2.x) in an existing (with security in place) installation?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will get the new UI features like redesigned configuration forms, but the
initial setup wizard will be skipped. In its stead, Jenkins will offer to
install Pipeline-related functionality.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Is it possible to use custom defined syntax highlighting ?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Within the Pipeline script editor itself, no. It is using the
&lt;a href=&quot;https://ace.c9.io/&quot;&gt;ACE editor&lt;/a&gt; system,
so it may be possible for a plugin to change the color scheme used.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Can you elaborate on what the Blue Ocean UI is? Is there a link or more
information on it?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Blue Ocean is the name of user experience an design project, unfortunately at
this point in time there is not more information available on it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;general&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#general&quot; /&gt;General&lt;/h4&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How well this integrate with cloud environment?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins controller and agents can run easily in any public cloud environment
that supports running Java applications. Through the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Amazon+EC2+Plugin&quot;&gt;EC2&lt;/a&gt;,
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/JClouds+Plugin&quot;&gt;JClouds&lt;/a&gt;,
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Azure+Slave+Plugin&quot;&gt;Azure&lt;/a&gt;, or
any other plugins which extend the cloud
&lt;a href=&quot;https://www.jenkins.io/doc/developer/extensions/jenkins-core/#cloud&quot;&gt;extension
point&lt;/a&gt;, it is possible to dynamically provision new build agents on a configured
cloud provider.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Are help texts and other labels and messages updated for other localizations /
languages as well?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Practically every string in Jenkins core is localizable. The extent to which those
strings have been translated depends on contributors by speakers of those
languages to the project. If you want to contribute translations, this
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Internationalization#Internationalization-Whattranslatorsneedtoknow%2Fdo&quot;&gt;wiki
page&lt;/a&gt; should get you started.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Any additional WinRM/Windows remoting functionality in 2.0?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Is there a CLI to find all the jobs created by a specific user?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No, out-of-the-box Jenkins does not keep track of which user created which jobs.
The functionality provided by the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Ownership+Plugin&quot;&gt;Ownership&lt;/a&gt;
plugin may be of interest though.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please consider replacing terms like &quot;master&quot; and &quot;slave&quot; with &quot;primary&quot; and
&quot;secondary&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;slave&quot; has been replaced with &quot;agent&quot; in Jenkins 2.0.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Updated 2020-09-18&lt;/strong&gt;: The term &quot;master&quot; is being replaced with &quot;controller&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve been making tutorial videos on Jenkins for awhile (mostly geared toward
passing the upcoming CCJPE). Because of that we’re using 1.625.2 (since that is
what is listed on the exam), but should we instead base the videos on 2.0?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of right now all of the
&lt;a href=&quot;https://www.cloudbees.com/jenkins-certification&quot;&gt;Jenkins Certification&lt;/a&gt; work done by CloudBees is
focused around the Jenkins LTS 1.625.x.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/26/jenkins-20-is-here/</id>
<title>Jenkins 2.0 is here!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/26/jenkins-20-is-here/" />
<author>
<name>kohsuke</name>
</author>
<category term='jenkins2'></category>
<summary>
Over the past 10 years, Jenkins has really
grown to a
de-facto standard tool that millions of people use to handle automation in
software development and beyond.  It is quite remarkable for a project that
originally started as a hobby project under a different name. I&#8217;m very proud.


Around this time last year,
we&#8217;ve
celebrated 10 years, 1000 plugins, and 100K installations. That was a good time
to retrospect, and we started thinking about the next 10 years of Jenkins and
what&#8217;s necessary to meet that challenge.  This project has long been on a
weekly "train" release model, so it was useful to step back and think about...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past 10 years, Jenkins has really
&lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/svg/svgs.html&quot;&gt;grown&lt;/a&gt; to a
de-facto standard tool that millions of people use to handle automation in
software development and beyond.  It is quite remarkable for a project that
originally started as a hobby project under a different name. I’m very proud.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Around this time last year,
&lt;a href=&quot;https://www.jenkins.io/blog/2015/02/09/jenkins-celebration-day-is-february-26/&quot;&gt;we’ve&lt;/a&gt;
celebrated 10 years, 1000 plugins, and 100K installations. That was a good time
to retrospect, and we started thinking about the next 10 years of Jenkins and
what’s necessary to meet that challenge.  This project has long been on a
weekly &quot;train&quot; release model, so it was useful to step back and think about a
big picture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That is where three pillars of Jenkins 2.0 have emerged from.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, one of the challenges our users are facing today is that the automation
that happens between a commit and a production has significantly grown in its
scope. Because of this, the clothing that used to fit (aka &quot;freestyle project&quot;,
which was the workhorse of Jenkins) no longer fits. We now need something that
better fits today’s use cases like &quot;continuous delivery pipeline.&quot; This is why
in 2.0 we’ve added the &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;pipeline capability&lt;/a&gt;. This 2 year old effort allows you
to describe your chain of automation in a textual form. This allows you to
version control it, put it alongside your source tree, etc. It is also actually
a domain specific language (DSL) of &lt;a href=&quot;https://groovy-lang.org/&quot;&gt;Groovy&lt;/a&gt;, so when your pipeline grows in
complexity/sophistication, you can manage its complexity and keep it
understandable far more easily.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Second, over time, Jenkins has developed the &quot;assembly required before initial
use&quot; feeling. As the project has grown, the frontier of interesting development
has shifted to plugins, which is how it should be, but we have left it up to
users to discover &amp;amp; use them. As a result, the default installation became very
thin and minimal, and every user has to find several plugins before Jenkins
becomes really functional. This created a &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Paradox_of_Choice&quot;&gt;paradox of choice&lt;/a&gt; and unnecessarily
hurt the user experience. In 2.0, we reset this thinking and tried to create
more sensible out of the box experience that solves 80% use cases for 80% of
people. You get something useful out of the box, and you can get some
considerable mileage out of it before you start feeling the need of plugins.
This allows us to focus our development &amp;amp; QA effort around this base
functionality, too. By the way, the focus on the out of the box experience
doesn’t stop at functionality, either. The initial security setup of Jenkins is
improved, too, to prevent unprotected Jenkins instances from getting abused by
botnets and attacks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Third, we were fortunate to have a number of developers with UX background
spend some quality time on Jenkins, and they have made a big dent in improving
various parts of Jenkins web UI. The setup wizard that implements the out of
the box experience improvement is one of them, and it also includes other parts
of Jenkins that you use all the time, such as job configuration pages and new
item pages. This brings much needed attention to the web UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see, 2.0 brings a lot of exciting features on the table, but this is
an evolutionary release, built on top of the same foundation, so that your
existing installations can upgrade smoothly. After this initial release, we’ll
get back to our usual weekly release march.  Improvements will be made
to those pillars and others in coming months and years continuously. If you’d
like to get a more in-depth look at Jenkins 2.0, please join us in &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/events/230154841/&quot;&gt;our virtual
Jenkins meetup 2.0 launch event&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you very much for everyone who made Jenkins 2.0 possible. There are
&lt;a href=&quot;https://github.com/jenkinsci/jenkins/graphs/contributors&quot;&gt;too many of you&lt;/a&gt;
to thank individually, but you know who you are. I wanted to thank CloudBees in
particular for sponsoring the time of many of those people. Ten years ago, all I
could utilize was my own night &amp;amp; weekend time. Now I’ve got a team of smart
people working with me to carry this torch forward, and a big effort like 2.0
wouldn’t have been possible without such organized effort.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/22/possible-infra-compromise/</id>
<title>Possible Jenkins Project Infrastructure Compromise</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/22/possible-infra-compromise/" />
<author>
<name>rtyler</name>
</author>
<category term='infra'></category>
<category term='security'></category>
<summary>
Last week, the infrastructure team identified the potential compromise of a key
infrastructure machine. This compromise could have taken advantage of, what
could be categorized as, an attempt to target contributors with elevated
access. Unfortunately, when facing the uncertainty of a potential compromise,
the safest option is to treat it as if it were an actual incident, and react
accordingly. The machine in question had access to binaries published to our
primary and secondary mirrors, and to contributor account information.


Since this machine is not the source of truth for Jenkins binaries, we verified
that the files distributed to Jenkins users: plugins, packages, etc, were not
tampered with. We...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week, the infrastructure team identified the potential compromise of a key
infrastructure machine. This compromise could have taken advantage of, what
could be categorized as, an attempt to target contributors with elevated
access. Unfortunately, when facing the uncertainty of a &lt;em&gt;potential&lt;/em&gt; compromise,
the safest option is to treat it as if it were an actual incident, and react
accordingly. The machine in question had access to binaries published to our
primary and secondary mirrors, and to contributor account information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since this machine is not the source of truth for Jenkins binaries, we verified
that the files distributed to Jenkins users: plugins, packages, etc, were not
tampered with. We cannot, however, verify that contributor account information
was not accessed or tampered with and, as a proactive measure, we are issuing a
password reset for all contributor accounts. We have also spent significant effort
migrating all key services off of the potentially compromised machine to
(virtual) hardware so the machine can be re-imaged or decommissioned entirely.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-you-should-do-now&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-you-should-do-now&quot; /&gt;What you should do now&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have ever filed an issue in &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;JIRA&lt;/a&gt;,
edited a &lt;a href=&quot;https://wiki.jenkins.io&quot;&gt;wiki&lt;/a&gt; page, released a plugin or
otherwise created an &lt;a href=&quot;https://accounts.jenkins.io&quot;&gt;account&lt;/a&gt; via the Jenkins
website, you have a Jenkins community account. You should be receiving a
password reset email shortly, but if you have re-used your Jenkins account
password with other services we strongly encourage you to update your passwords
with those other services.  If you’re not already using one, we also encourage
the use of a password manager for generating and managing service-specific
passwords.&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;The generated password sent out is &lt;strong&gt;temporary&lt;/strong&gt; and will expire if you do not
use it to update your account. Once it expires you will need recover your
account with the &lt;a href=&quot;https://accounts.jenkins.io/passwordReset&quot;&gt;password reset&lt;/a&gt;
in the accounts app.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This does not apply to your own Jenkins installation, or any account that you
may use to log into it. If you do not have a Jenkins community account, there is
no action you need to take.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-were-doing-to-prevent-events-like-this-in-the-future&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-were-doing-to-prevent-events-like-this-in-the-future&quot; /&gt;What we’re doing to prevent events like this in the future&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As stated above, the potentially compromised machine is being removed from our
infrastructure. That helps address the immediate problem but doesn’t put
guarantees in place for the future. To help prevent potential issues in the
future we’re taking the following actions:&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;&lt;strong&gt;Incorporating more security policy enforcement&lt;/strong&gt; into our
&lt;a href=&quot;https://github.com/jenkins-infra&quot;&gt;Puppet-driven infrastructure&lt;/a&gt;. Without a
configuration management tool enforcing a given state for some legacy services,
user error and manual misconfigurations can adversely affect project security.
As of right now, all key services are managed by Puppet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Balkanizing our machine and permissions model&lt;/strong&gt; more. The machine affected was
literally the first independent (outside of Sun) piece of project
infrastructure and like many legacy systems, it grew to host a multitude of
services. We are rapidly evolving away from that model with increasing levels
of user and host separation for project services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In a similar vein, we have also introduced a trusted zone in our
infrastructure which is not routable on the public internet, where sensitive
operations, such as generating update center information, can be managed and
secured more effectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;We are performing an infrastructure permissions audit&lt;/strong&gt;. Some portions of our
infrastructure are 6+ years old and have had contributors come and go. Any
inactive users with unnecessarily elevated permissions in the project
infrastructure will have those permissions revoked.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to extend thanks, on behalf of the Jenkins project, to
&lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; for their help in funding and
migrating this infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have further questions about the Jenkins project infrastructure, you can
join us in the &lt;code&gt;#jenkins-infra&lt;/code&gt; channel on &lt;a href=&quot;https://freenode.net&quot;&gt;Freenode&lt;/a&gt;
or in an Infrastructure Q&amp;amp;A session I’ve scheduled for next Wednesday (April
27) at 20:00 UTC (12:00 PST).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/22/pipeline-2/</id>
<title>Pipeline 2.x plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/22/pipeline-2/" />
<author>
<name>jglick</name>
</author>
<category term='pipeline'></category>
<category term='jenkins2'></category>
<summary>
Those of you who routinely apply all plugin updates may already have noticed that the version numbers of the plugins in the Pipeline suite have switched to a 2.x scheme. Besides aligning better with the upcoming Jenkins 2.0 core release, the plugins are now being released with independent lifecycles.


“Pipeline 1.15” (the last in the 1.x line) included simultaneous releases of a dozen or so plugins with the 1.15 version number (and 1.15+ dependencies on each other). All these plugins were built out of a single workflow-plugin repository. While that was convenient in the early days for prototyping wide-ranging changes, it...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Those of you who routinely apply all plugin updates may already have noticed that the version numbers of the plugins in the Pipeline suite have switched to a 2.x scheme. Besides aligning better with the upcoming Jenkins 2.0 core release, the plugins are now being released with independent lifecycles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;“Pipeline 1.15” (the last in the 1.x line) included simultaneous releases of a dozen or so plugins with the 1.15 version number (and 1.15+ dependencies on each other). All these plugins were built out of a single &lt;code&gt;workflow-plugin&lt;/code&gt; repository. While that was convenient in the early days for prototyping wide-ranging changes, it has become an encumbrance now that the Pipeline code is fairly mature, and more people are experimenting with additions and patches.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of 2.0, all the plugins in the system live in their own repositories on GitHub—named to match the plugin code name, which in most cases uses the historical &lt;em&gt;workflow&lt;/em&gt; term, so for example &lt;code&gt;workflow-job-plugin&lt;/code&gt;. Some complex steps were moved into their own plugins, such as &lt;code&gt;pipeline-build-step-plugin&lt;/code&gt;. The 1.x changelog is closed; now each plugin keeps a changelog in its own wiki, for example &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Job+Plugin&quot;&gt;here&lt;/a&gt; for the Pipeline Job plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Among other benefits, this change makes it easier to cut new plugin releases for even minor bug fixes or enhancements, or for developers to experiment with patches to certain plugins. It also opens the door for the “aggregator” plugin (called simply &lt;em&gt;Pipeline&lt;/em&gt;) to pull in dependencies on other plugins that seem broadly valuable, like the stage view.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The original repository has been renamed &lt;code&gt;pipeline-plugin&lt;/code&gt; and for now &lt;a href=&quot;https://github.com/jenkinsci/pipeline-plugin/&quot;&gt;still holds some documentation&lt;/a&gt;, which might later be moved to jenkins.io.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You need not do anything special to “move” to the 2.x line; 1.642.x and later users can just accept all Pipeline-related plugin updates. Note that if you update &lt;em&gt;Pipeline Supporting APIs&lt;/em&gt; you &lt;strong&gt;must&lt;/strong&gt; update &lt;em&gt;Pipeline&lt;/em&gt;, or at least install/update some related plugins &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Supporting+APIs+Plugin&quot;&gt;as noted in the wiki&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/21/dsl-plugins/</id>
<title>Making your own DSL with plugins, written in Pipeline script</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/21/dsl-plugins/" />
<author>
<name>michaelneale</name>
</author>
<category term='jenkins'></category>
<category term='dsl'></category>
<category term='pipeline'></category>
<category term='plugins'></category>
<summary>
In this post I will show how you can make your own DSL extensions and distribute
them as a plugin, using Pipeline Script.


A quick refresher


Pipeline has a well kept secret: the ability to add your own DSL
elements. Pipeline is itself a DSL, but you can extend it.


There are 2 main reasons I can think you may want to do this:




You want to reduce boilerplate by encapsulating common snippets/things you do
in one DSL statement.


You want to provide a DSL that provides a prescriptive way that your builds
work - uniform across your organisations Jenkinsfiles.




A DSL could look as simple as



acmeBuild {
  ...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this post I will show how you can make your own DSL extensions and distribute
them as a plugin, using &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Pipeline&lt;/a&gt; Script.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;a-quick-refresher&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#a-quick-refresher&quot; /&gt;A quick refresher&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline has a well kept secret: the ability to add your own DSL
elements. Pipeline is itself a DSL, but you can extend it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are 2 main reasons I can think you may want to do this:&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;You want to reduce boilerplate by encapsulating common snippets/things you do
in one DSL statement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You want to provide a DSL that provides a prescriptive way that your builds
work - uniform across your organisations Jenkinsfiles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A DSL could look as simple as&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;acmeBuild&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./bin/ci&quot;&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;s2&quot;&gt;&quot;nginx&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;team&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;evil-devs&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deployBranch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;production&quot;&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 could be the entirety of your &lt;code&gt;Jenkinsfile&lt;/code&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this &quot;simple&quot; example, it could actually be doing a multi stage build with
retries, in a specified docker container, that deploys only from the production
branch.  Detailed notifications are sent to the right team on important events
(as defined by your org).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Traditionally this is done via the
&lt;a href=&quot;https://github.com/jenkinsci/workflow-cps-global-lib-plugin/blob/master/README.md#pipeline-global-library&quot;&gt;global
library&lt;/a&gt;.  You take a snippet of DSL you want to want to make into a DSL, and
drop it in the git repo that is baked into Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A great trivial
&lt;a href=&quot;https://github.com/jenkinsci/workflow-cps-global-lib-plugin/blob/master/README.md#define-more-structured-dsl&quot;&gt;example&lt;/a&gt;
is 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;groovy&quot;&gt;&lt;span class=&quot;n&quot;&gt;jenkinsPlugin&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;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;Which is enabled by git pushing the following into &lt;code&gt;vars/jenkinsPlugin.groovy&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
The name of the file is the name of the DSL expression you use in the &lt;code&gt;Jenkinsfile&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;body&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;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&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;body&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;resolveStrategy&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Closure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DELEGATE_FIRST&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;delegate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// This is where the magic happens - put your pipeline snippets in here, get variables from config.&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;node&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;url:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;https://github.com/jenkinsci/${config.name}-plugin.git&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;mvn install&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;mail&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;to:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;subject:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;${config.name} plugin build&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;body:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;...&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can imagine many more pipelines, or even archetypes/templates of pipelines
you could do in this way, providing a really easy &lt;code&gt;Jenkinsfile&lt;/code&gt; syntax for your
users.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;making-it-a-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#making-it-a-plugin&quot; /&gt;Making it a plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using the global DSL library is a handy thing if you have a single Jenkins, or
want to keep the DSLs local to a Jenkins instance.  But what if you want to
distribute it around your org, or, perhaps it is general purpose enough you want
to share it with the world?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well this is possible, by wrapping it in a plugin. You use the same pipeline
snippet tricks you use in the global lib, but put it in the dsl directory of a
plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My &lt;a href=&quot;https://github.com/jenkinsci/simple-build-for-pipeline-plugin&quot;&gt;simple
build plugin&lt;/a&gt; shows how it is done.  To make your own 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;Create a new plugin project, either fork the simple build one, or add a
dependency to it in your &lt;code&gt;pom.xml&lt;/code&gt; / &lt;code&gt;build.gradle&lt;/code&gt; file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Put your dsl in the resources directory in a similar fashion to
&lt;a href=&quot;https://github.com/jenkinsci/simple-build-for-pipeline-plugin/blob/master/src/main/resources/dsl/simpleBuild.groovy&quot;&gt;this&lt;/a&gt;
(note the &quot;package dsl&quot; declaration at the top)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create the equivalent extension that just points to the DSL by name like
&lt;a href=&quot;https://github.com/jenkinsci/simple-build-for-pipeline-plugin/blob/master/src/main/java/org/jenkinsci/plugins/simplebuild/SimpleBuildDSL.java&quot;&gt;this&lt;/a&gt;
  This is mostly &quot;boiler plate&quot; but it tells Jenkins there is a &lt;code&gt;GlobalVariable&lt;/code&gt; extension available when Pipelines run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy it to an Jenkins Update Center to share with your org, or everyone!&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The advantage of delivering this DSL as a plugin is that it has a version (you
can also put tests in there), and distributable just like any other plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the more advanced, &lt;a href=&quot;https://github.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt; has a Simple
Travis Runner plugin that
&lt;a href=&quot;https://github.com/jenkinsci/simple-travis-runner-plugin&quot;&gt;interprets and runs
travis.yml files&lt;/a&gt; which is also implemented in pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, approximately, you can build plugins for pipeline that extend pipeline, in
pipeline script (with a teeny bit of boiler plate).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/15/the-need-for-pipeline/</id>
<title>The Need For Jenkins Pipeline</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/15/the-need-for-pipeline/" />
<author>
<name>rtyler</name>
</author>
<category term='jenkins2'></category>
<category term='pipeline'></category>
<summary>
This is a cross-post of
an article authored
by Viktor Farcic on the
CloudBees blog. Viktor is also the author
of The DevOps 2.0 Toolkit, which
explores Jenkins, the Pipeline plugin, and the ecosystem
around it in much more detail.









Over the years, Jenkins has become the undisputed ruler among continuous
integration (CI), delivery and deployment (CD) tools. It, in a way, defined the
CI/CD processes we use today. As a result of its leadership, many other products
have tried to overthrow it from its position. Among others, we got Bamboo and
Team City attempting to get a piece of the market. At the same time, new
products emerged with a service...
</summary>
<content type='html'>
&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;This is a cross-post of
&lt;a href=&quot;https://www.cloudbees.com/blog/need-jenkins-pipeline&quot;&gt;an article&lt;/a&gt; authored
by &lt;a href=&quot;https://github.com/vfarcic&quot;&gt;Viktor Farcic&lt;/a&gt; on the
&lt;a href=&quot;https://www.cloudbees.com/blog/&quot;&gt;CloudBees blog&lt;/a&gt;. Viktor is also the author
of &lt;a href=&quot;https://leanpub.com/the-devops-2-toolkit&quot;&gt;The DevOps 2.0 Toolkit&lt;/a&gt;, which
explores Jenkins, the &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Pipeline plugin&lt;/a&gt;, and the ecosystem
around it in much more detail.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/angry-jenkins_128.png&quot; alt=&quot;angry jenkins 128&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the years, Jenkins has become the undisputed ruler among continuous
integration (CI), delivery and deployment (CD) tools. It, in a way, defined the
CI/CD processes we use today. As a result of its leadership, many other products
have tried to overthrow it from its position. Among others, we got Bamboo and
Team City attempting to get a piece of the market. At the same time, new
products emerged with a service approach (as opposed to on-premises). Some of
them are Travis, CircleCI and Shippable. Be that as it may, none managed to get
even close to Jenkins&#39; adoption. Today, depending on the source we use, Jenkins
holds between 50-70% of the whole CI/CD tools market. The reason behind such a
high percentage is its dedication to open source principles set from the very
beginning by &lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;. Those same principles were the reason he forked
Jenkins from Hudson. The community behind the project, as well as commercial
entities behind enterprise versions, are continuously improving the way it works
and adding new features and capabilities. They are redefining not only the way
Jenkins behaves but also the CI/CD practices in a much broader sense. One of
those new features is the Jenkins &lt;a href=&quot;https://www.jenkins.io/doc/pipeline&quot;&gt;Pipeline plugin&lt;/a&gt;. Before we
dive into it, let us take a step back and discuss the reasons that led us to
initiate the move away from Freestyle jobs and towards the Pipeline.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-need-for-change&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-need-for-change&quot; /&gt;The Need for Change&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over time, Jenkins, like most other self-hosted CI/CD tools, tends to accumulate
a vast number of jobs. Having a lot of them causes quite an increase in
maintenance cost. Maintaining ten jobs is easy. It becomes a bit harder (but
still bearable) to manage a hundred. When the number of jobs increases to
hundreds or even thousands, managing them becomes very tedious and time
demanding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are not proficient with Jenkins (or other CI/CD tools) or you do not work
for a big project, you might think that hundreds of jobs is excessive. The truth
is that such a number is reached over a relatively short period when teams
are practicing continuous delivery or deployment. Let’s say that an average
CD flow has the following set of tasks that should be run on each commit:
building, pre-deployment testing, deployment to a staging environment,
post-deployment testing and deployment to production. That’s five groups of
tasks that are often divided into, at least, five separate Jenkins jobs. In
reality, there are often more than five jobs for a single CD flow, but let
us keep it an optimistic estimate. How many different CD flows does a medium
sized company have? With twenty, we are already reaching a three digits
number. That’s quite a lot of  jobs to cope with even though the estimates
we used are too optimistic for all but the smallest entities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, imagine that we need to change all those jobs from, let’s say, Maven to
Gradle. We can choose to start modifying them through the Jenkins UI, but that
takes too much time. We can apply changes directly to Jenkins XML files that
represent those jobs but that is too complicated and error prone. Besides,
unless we write a script that will do the modifications for us, we would
probably not save much time with this approach. There are quite a few plugins
that can help us to apply changes to multiple jobs at once, but none of them is
truly successful (at least among free plugins). They all suffer from one
deficiency or another. The problem is not whether we have the tools to perform
massive changes to our jobs, but whether jobs are defined in a way that they can
be easily maintained.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Besides the sheer number of Jenkins jobs, another critical Jenkins&#39; pain point
is centralization. While having everything in one location provides a lot of
benefits (visibility, reporting and so on), it also poses quite a few
difficulties. Since the emergence of agile methodologies, there’s been a huge
movement towards self-sufficient teams. Instead of horizontal organization with
separate development, testing, infrastructure, operations and other groups, more
and more companies are moving (or already moved) towards self-sufficient teams
organized vertically. As a result, having one centralized place that defines all
the CD flows becomes a liability and often impedes us from splitting teams
vertically based on projects. Members of a team should be able to collaborate
effectively without too much reliance on other teams or departments. Translated
to CD needs, that means that each team should be able to define the deployment
flow of the application they are developing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, Jenkins, like many other tools, relies heavily on its UI. While that is
welcome and needed as a way to get a visual overview through dashboards and
reports, it is suboptimal as a way to define the delivery and deployment flows.
Jenkins originated in an era when it was fashionable to use UIs for everything.
If you worked in this industry long enough you probably saw the swarm of tools
that rely completely on UIs, drag &amp;amp; drop operations and a lot of forms that
should be filled. As a result, we got tools that produce artifacts that cannot
be easily stored in a code repository and are hard to reason with when anything
but simple operations are to be performed. Things changed since then, and now we
know that many things (deployment flow being one of them) are much easier to
express through code. That can be observed when, for example, we try to define a
complex flow through many Jenkins jobs. When deployment complexity requires
conditional executions and some kind of a simple intelligence that depends on
results of different steps, chained jobs are truly complicated and often
impossible to create.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All things considered, the major pain points Jenkins had until recently are as
follows.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tendency to create a vast number of jobs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Relatively hard and costly maintenance&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Centralization of everything&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lack of powerful and easy ways to specify deployment flow through code&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This list is, by no means, unique to Jenkins. Other CI/CD tools have at least
one of the same problems or suffer from deficiencies that Jenkins solved a long
time ago. Since the focus of this article is Jenkins, I won’t dive into a
comparison between the CI/CD tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Luckily, all those, and many other deficiencies are now a thing of the past.
With the emergence of the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Plugin&quot;&gt;Pipeline
plugin&lt;/a&gt; and many others that were created on
top of it, Jenkins entered a new era and proved itself as a dominant player in
the CI/CD market. A whole new ecosystem was born, and the door was opened for
very exciting possibilities in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before we dive into the Jenkins Pipeline and the toolset that surrounds it, let
us quickly go through the needs of a modern CD flow.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;continuous-delivery-or-deployment-flow-with-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#continuous-delivery-or-deployment-flow-with-jenkins&quot; /&gt;Continuous Delivery or Deployment Flow with Jenkins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When embarking on the CD journey for the first time, newcomers tend to think
that the tasks that constitute the flow are straightforward and linear. While
that might be true with small projects, in most cases things are much more
complicated than that. You might think that the flow consists of building,
testing and deployment, and that the approach is linear and follows the
all-or-nothing rule. Build invokes testing and testing invokes deployment. If
one of them fails, the developer gets a notification, fixes the problem and
commits the code that will initiate the repetition of the process.&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;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/need-for-pipeline/simple-cd-flow.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/need-for-pipeline/simple-cd-flow-small.png&quot; alt=&quot;simple cd flow small&quot; title=&quot;A simple and, in most cases, insufficient CD flow&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In most instances, the process is far more complex. There are many tasks to run,
and each of them might produce a failure. In some cases, a failure should only
stop the process. However, more often than not, some additional logic should be
executed as part of the after-failure cleanup. For example, what happens if
post-deployment tests fail after a new release was deployed to production? We
cannot just stop the flow and declare the build a failure. We might need to
revert to the previous release, rollback the proxy, de-register the service and
so on. I won’t go into many examples of situations that require complex flow
with many tasks, conditionals that depend on results, parallel execution and so
on. Instead, I’ll share a diagram of one of the flows I worked on.&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;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/need-for-pipeline/complex-cd-flow.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/need-for-pipeline/complex-cd-flow-small.png&quot; alt=&quot;complex cd flow small&quot; title=&quot;A more complex CD flow&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some tasks are run in one of the testing servers (yellow) while others are run
on the production cluster (blue). While any task might produce an error, in some
cases such an outcome triggers a separate set of tasks. Some parts of the flow
are not linear and depend on task results. Some tasks should be executed in
parallel to improve the overall time required to run them. The list goes on and
on. Please note that this discussion is not about the best way to execute the
deployment flow but only a demonstration that the complexity can be, often, very
high and cannot be solved by a simple chaining of Freestyle jobs. Even in cases
when such chaining is possible, the maintenance cost tends to be very high.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the CD objectives we are unable to solve through chained jobs, or is
proved to be difficult to implement, is conditional logic. In many cases, it is
not enough to simply chain jobs in a linear fashion. Often, we do not want only
to create a job A that, once it’s finished running, executes job B, which, in
turn, invokes job C. In real-world situations, things are more complicated than
that. We want to run some tasks (let’s call them job A), and, depending on the
result, invoke jobs B1 or B2, then run in parallel C1, C2 and C3, and, finally,
execute job D only when all C jobs are finished successfully. If this were a
program or a script, we would have no problem accomplishing something like that,
since all modern programming languages allow us to employ conditional logic in a
simple and efficient way. Chained Jenkins jobs, created through its UI, pose
difficulties to create even a simple conditional logic. Truth be told, some
plugins can help us with conditional logic. We have Conditional Build Steps,
Parameterised Trigger, Promotions and others. However, one of the major issues
with these plugins is configuration. It tends to be scattered across multiple
locations, hard to maintain and with little visibility.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Resource allocation needs a careful thought and is, often, more complicated than
a simple decision to run a job on a predefined agent. There are cases when agent
should be decided dynamically, workspace should be defined during runtime and
cleanup depends on a result of some action.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While a continuous deployment process means that the whole pipeline ends with
deployment to production, many businesses are not ready for such a goal or have
use-cases when it is not appropriate. Any other process with a smaller scope, be
it continuous delivery or continuous integration, often requires some human
interaction. A step in the pipeline might need someone’s confirmation, a failed
process might require a manual input about reasons for the failure, and so on.
The requirement for human interaction should be an integral part of the pipeline
and should allow us to pause, inspect and resume the flow. At least, until we
reach the true continuous deployment stage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The industry is, slowly, moving towards microservices architectures. However,
the transformation process might take a long time to be adopted, and even more
to be implemented. Until then, we are stuck with monolithic applications that
often require a long time for deployment pipelines to be fully executed. It is
not uncommon for them to run for a couple of hours, or even days. In such cases,
failure of the process, or the whole node the process is running on, should not
mean that everything needs to be repeated. We should have a mechanism to
continue the flow from defined checkpoints, thus avoiding costly repetition,
potential delays and additional costs. That is not to say that long-running
deployment flows are appropriate or recommended. A well-designed CD process
should run within minutes, if not seconds. However, such a process requires not
only the flow to be designed well, but also the architecture of our applications
to be changed. Since, in many cases, that does not seem to be a viable option,
resumable points of the flow are a time saver.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All those needs, and many others, needed to be addressed in Jenkins if it was to
continue being a dominant CI/CD tool. Fortunately, developers behind the project
understood those needs and, as a result, we got the Jenkins Pipeline plugin. The
future of Jenkins lies in a &lt;strong&gt;transition from Freestyle chained jobs to a single
pipeline expressed as code&lt;/strong&gt;. Modern delivery flows cannot be expressed and easily
maintained through UI drag &#39;n drop features, nor through chained jobs. They can
neither be defined through YAML (Yet Another Markup Language) definitions
proposed by some of the newer tools (which I’m not going to name). &lt;strong&gt;We need to go
back to code as a primary way to define not only the applications and services
we are developing but almost everything else&lt;/strong&gt;. Many other types of tools adopted
that approach, and it was time for us to get that option for CI/CD processes as
well.&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/2016/04/14/replay-with-pipeline/</id>
<title>Replay a Pipeline with script edits</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/14/replay-with-pipeline/" />
<category term='jenkins2'></category>
<category term='pipeline'></category>
<summary>
This is a cross-post of
an article authored by
Pipeline plugin maintainer Jesse Glick on the
CloudBees blog.






For those of you not checking their Updates tab obsessively, Pipeline 1.14 [up
to 2.1 now] was
released
a couple of weeks ago and I wanted to highlight the major feature in this
release: JENKINS-32727,
or replay. Some folks writing "Jenkinsfiles" in the field had grumbled that it
was awkward to develop the script incrementally, especially compared to jobs
using inline scripts stored in the Jenkins job configuration: to try a change to
the script, you had to edit Jenkinsfile in SCM, commit it (perhaps to a
branch), and then go back to Jenkins to...
</summary>
<content type='html'>
&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;This is a cross-post of
&lt;a href=&quot;https://www.cloudbees.com/blog/replay-pipeline&quot;&gt;an article&lt;/a&gt; authored by
Pipeline plugin maintainer &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; on the
&lt;a href=&quot;https://www.cloudbees.com/blog/&quot;&gt;CloudBees blog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For those of you not checking their &lt;em&gt;Updates&lt;/em&gt; tab obsessively, Pipeline 1.14 [up
to 2.1 now] was
&lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin/blob/master/CHANGES.md#114-feb-25-2016&quot;&gt;released
a couple of weeks ago&lt;/a&gt; and I wanted to highlight the major feature in this
release: &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/32727&quot;&gt;JENKINS-32727&lt;/a&gt;,
or &lt;em&gt;replay&lt;/em&gt;. Some folks writing &quot;Jenkinsfiles&quot; in the field had grumbled that it
was awkward to develop the script incrementally, especially compared to jobs
using inline scripts stored in the Jenkins job configuration: to try a change to
the script, you had to edit &lt;code&gt;Jenkinsfile&lt;/code&gt; in SCM, commit it (perhaps to a
branch), and then go back to Jenkins to follow the output. Now this is a little
easier. If you have a Pipeline build which did not proceed exactly as you
expected, for reasons having to do with Jenkins itself (say, inability to find &amp;amp;
publish test results, as opposed to test failures you could reproduce locally),
try clicking the &lt;strong&gt;Replay&lt;/strong&gt; link in the build’s sidebar. The quickest way to try
this for yourself is to run the
&lt;a href=&quot;https://hub.docker.com/r/jenkinsci/workflow-demo/&quot;&gt;stock CD demo&lt;/a&gt; in its
latest release:&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;$ docker run --rm -p 2222:2222 -p 8080:8080 -p 8081:8081 -p 9418:9418 -ti jenkinsci/workflow-demo:1.14-3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you see &lt;a href=&quot;http://localhost:8080/job/cd/branch/master/1/replay/&quot;&gt;the page &lt;strong&gt;Replay
#1&lt;/strong&gt;&lt;/a&gt;, you are shown two
(Groovy) editor boxes: one for the main
&lt;a href=&quot;https://github.com/jenkinsci/workflow-aggregator-plugin/blob/master/demo/repo/Jenkinsfile&quot;&gt;&lt;code&gt;Jenkinsfile&lt;/code&gt;&lt;/a&gt;, one for a library script
it loaded
(&lt;a href=&quot;https://github.com/jenkinsci/workflow-aggregator-plugin/blob/de1d61b651220200ca6ae7a7d7c4da6a924d05d4/demo/repo/servers.groovy&quot;&gt;&lt;code&gt;servers.groovy&lt;/code&gt;&lt;/a&gt;, introduced to help demonstrate this feature). You
can make edits to either or both. For example, the original demo allocates a
temporary web application with a random name like
&lt;code&gt;9c89e9aa-6ca2-431c-a04a-6599e81827ac&lt;/code&gt; for the duration of the functional tests.
Perhaps you wished to prefix the application name with &lt;code&gt;tmp-&lt;/code&gt; to make it obvious
to anyone encountering the &lt;a href=&quot;http://localhost:8081/&quot;&gt;Jetty index page&lt;/a&gt; that these
URLs are transient. So in the second text area, find the line&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;def id = UUID.randomUUID().toString()&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;and change it to read&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;def id = &quot;tmp-${UUID.randomUUID()}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;then click &lt;strong&gt;Run&lt;/strong&gt;. In
&lt;a href=&quot;http://localhost:8080/job/cd/branch/master/2/console&quot;&gt;the new build’s log&lt;/a&gt;
you will now see&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;Replayed #1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;and later something like&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;… test -Durl=http://localhost:8081/tmp-812725bb-74c6-41dc-859e-7d9896b938c3/ …&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;with the improved URL format. Like the result? You will want to make it
permanent. So jump to the
&lt;a href=&quot;http://localhost:8080/job/cd/branch/master/2/&quot;&gt;second build’s index page&lt;/a&gt;
where you will see a note
that this build &amp;gt; Replayed #1 (diff) If you
&lt;a href=&quot;http://localhost:8080/job/cd/branch/master/2/replay/diff&quot;&gt;click on &lt;strong&gt;diff&lt;/strong&gt;&lt;/a&gt; you
will see:&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;diff&quot;&gt;&lt;span class=&quot;gd&quot;&gt;--- old/Script1
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+++ new/Script1
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@@ -8,7 +8,7 @@&lt;/span&gt;
 }
&lt;span class=&quot;err&quot;&gt;
&lt;/span&gt; def runWithServer(body) {
&lt;span class=&quot;gd&quot;&gt;-    def id = UUID.randomUUID().toString()
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+    def id = &quot;tmp-${UUID.randomUUID()}&quot;
&lt;/span&gt;     deploy id
     try {
         body.call id&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;so you can know exactly what you changed from the last-saved version. In fact if you replay #2 and change &lt;code&gt;tmp&lt;/code&gt; to &lt;code&gt;temp&lt;/code&gt; in the loaded script, in the diff view for #3 you will see the diff from the &lt;em&gt;first&lt;/em&gt; build, the aggregate diff:&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;diff&quot;&gt;&lt;span class=&quot;gd&quot;&gt;--- old/Script1
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+++ new/Script1
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@@ -8,7 +8,7 @@&lt;/span&gt;
 }
&lt;span class=&quot;err&quot;&gt;
&lt;/span&gt; def runWithServer(body) {
&lt;span class=&quot;gd&quot;&gt;-    def id = UUID.randomUUID().toString()
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+    def id = &quot;temp-${UUID.randomUUID()}&quot;
&lt;/span&gt;     deploy id
     try {
         body.call id&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this point you could touch up the patch to refer to &lt;code&gt;servers.groovy&lt;/code&gt;
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31838&quot;&gt;JENKINS-31838&lt;/a&gt;), &lt;code&gt;git
apply&lt;/code&gt; it to a clone of your repository, and commit. But why go to the trouble
of editing Groovy in the Jenkins web UI and then manually copying changes back
to your IDE, when you could stay in your preferred development environment from
the start?&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;$ git clone git://localhost/repo
Cloning into &#39;repo&#39;...
remote: Counting objects: 23, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 23 (delta 1), reused 0 (delta 0)
Receiving objects: 100% (23/23), done.
Resolving deltas: 100% (1/1), done.
Checking connectivity... done.
$ cd repo
$ $EDITOR servers.groovy
# make the same edit as previously described
$ git diff
diff --git a/servers.groovy b/servers.groovy
index 562d92e..63ea8d6 100644
--- a/servers.groovy
+++ b/servers.groovy
@@ -8,7 +8,7 @@ def undeploy(id) {
 }

 def runWithServer(body) {
-    def id = UUID.randomUUID().toString()
+    def id = &quot;tmp-${UUID.randomUUID()}&quot;
     deploy id
     try {
         body.call id
$ ssh -p 2222 -o StrictHostKeyChecking=no localhost replay-pipeline cd/master -s Script1 &amp;lt; servers.groovy
Warning: Permanently added &#39;[localhost]:2222&#39; (RSA) to the list of known hosts.
# follow progress in Jenkins (see JENKINS-33438)
$ git checkout -b webapp-naming
M                                                                              servers.groovy
Switched to a new branch &#39;webapp-naming&#39;
$ git commit -a -m &#39;Adjusted transient webapp name.&#39;
[webapp-naming …] Adjusted transient webapp name.
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git push origin webapp-naming
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 330 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To git://localhost/repo
 * [new branch]      webapp-naming -&amp;gt; webapp-naming&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using the &lt;code&gt;replay-pipeline&lt;/code&gt; CLI command (in this example &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+SSH#JenkinsSSH-JenkinsCLIvsJenkinsSSH&quot;&gt;via
SSH&lt;/a&gt;)
you can prepare, test, and commit changes to your Pipeline script code without
copying anything to or from a browser. That is all for now. Enjoy!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/14/jenkins-world-registration-is-open/</id>
<title>Registration is Open for Jenkins World 2016!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/14/jenkins-world-registration-is-open/" />
<author>
<name>alyssat</name>
</author>
<category term='event'></category>
<category term='jenkinsworld'></category>
<category term='jenkinsworld2016'></category>
<summary>
This is a guest post by Alyssa Tong.
Alyssa works for CloudBees, helping to organize
Jenkins community events around the
world.








Jenkins World 2016 will be the largest gathering of Jenkins users in the world. This event will bring together Jenkins experts, continuous delivery thought leaders and the ecosystem offering complementary technologies for Jenkins. Join us September 13-15, 2016 in Santa Clara, California to learn and explore, network face-to-face and help shape the next evolution of Jenkins development and solutions for DevOps.


Registration for Jenkins World 2016 is now live. Take advantage of the Super Early Bird rate of $399 (available until July 1st).


And don&#8217;t...
</summary>
<content type='html'>
&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;em&gt;This is a guest post by &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;.
Alyssa works for &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;, helping to organize
Jenkins community events &lt;a href=&quot;https://www.meetup.com/pro/jenkins&quot;&gt;around the
world&lt;/a&gt;.&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://jenkins-cfp.herokuapp.com/events/jenkins-world-2016&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 2016&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;&lt;strong&gt;Jenkins World 2016&lt;/strong&gt;&lt;/a&gt; will be the largest gathering of Jenkins users in the world. This event will bring together Jenkins experts, continuous delivery thought leaders and the ecosystem offering complementary technologies for Jenkins. Join us &lt;strong&gt;September 13-15, 2016&lt;/strong&gt; in Santa Clara, California to learn and explore, network face-to-face and help shape the next evolution of Jenkins development and solutions for DevOps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cvent.com/events/jenkins-world/event-summary-9d5c7937a3c34f048fb9b4045a449f38.aspx&quot;&gt;Registration&lt;/a&gt; for Jenkins World 2016 is now live. Take advantage of the Super Early Bird rate of $399 (available until July 1st).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And don’t forget, the &lt;a href=&quot;https://jenkins-cfp.herokuapp.com/events/jenkins-world-2016&quot;&gt;Call for Papers&lt;/a&gt; will be ending on May 1st. That’s 2.5 short weeks left to get your proposal(s) in.  We anxiously await your amazing stories.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/11/run-your-api-tests-continuously-with-jenkins-and-dhc/</id>
<title>Run Your API Tests Continuously with Jenkins and DHC</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/11/run-your-api-tests-continuously-with-jenkins-and-dhc/" />
<author>
<name>glaforge</name>
</author>
<category term='development'></category>
<category term='webapis'></category>
<category term='testing'></category>
<summary>
This is a guest post by Guillaume Laforge.
Well known for his contribution to the Apache Groovy project,
Guillaume is also the "Product Ninja and Advocate" of Restlet,
a company focusing on Web APIs:
with DHC (an API testing client),
Restlet Studio (an API designer),
APISpark (an API platform in the cloud),
and the Restlet Framework
open source project for developing APIs.





Modern mobile apps, single-page web sites and applications, are more and more relying on Web APIs,
as the nexus of the interaction between the frontend and the backend services.
Web APIs are also central to third-party integration, when you want to share your services with others,
or when you need...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://twitter.com/glaforge&quot;&gt;Guillaume Laforge&lt;/a&gt;.
Well known for his contribution to the &lt;a href=&quot;https://www.groovy-lang.org/&quot;&gt;Apache Groovy&lt;/a&gt; project,
Guillaume is also the &quot;Product Ninja and Advocate&quot; of &lt;a href=&quot;https://restlet.com/&quot;&gt;Restlet&lt;/a&gt;,
a company focusing on Web APIs:
with &lt;a href=&quot;https://restlet.com/products/dhc/&quot;&gt;DHC&lt;/a&gt; (an API testing client),
&lt;a href=&quot;https://restlet.com/products/restlet-studio/&quot;&gt;Restlet Studio&lt;/a&gt; (an API designer),
&lt;a href=&quot;https://restlet.com/products/apispark/&quot;&gt;APISpark&lt;/a&gt; (an API platform in the cloud),
and the &lt;a href=&quot;https://restlet.com/projects/restlet-framework/&quot;&gt;Restlet Framework&lt;/a&gt;
open source project for developing APIs.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Modern mobile apps, single-page web sites and applications, are more and more relying on Web APIs,
as the nexus of the interaction between the frontend and the backend services.
Web APIs are also central to third-party integration, when you want to share your services with others,
or when you need to consume existing APIs to build your own solution on top of their shoulders.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With APIs being a key element of your architecture and big picture,
it’s obviously important to assess that this API is functioning the way it should, thanks to proper testing.
Your framework of choice, regardless of the technology stack or programming language used,
will hopefully offer some facilities for testing your code,
whether in the form of unit tests, or ideally with integration tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;coding-web-api-tests&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#coding-web-api-tests&quot; /&gt;Coding Web API tests&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From a code perspective, as I said, most languages and frameworks provide approaches to testing APIs built with them.
There’s one I wanted to highlight in particular, which is one developed with a DSL approach (Domain-Specific Language),
using the &lt;a href=&quot;https://groovy-lang.org&quot;&gt;Apache Groovy&lt;/a&gt; programming language, it’s
&lt;a href=&quot;https://github.com/Codearte/accurest/wiki/3.-Contract-DSL&quot;&gt;AccuREST&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To get started, you can have a look at the &lt;a href=&quot;https://github.com/Codearte/accurest/wiki/1.-Introduction&quot;&gt;introduction&lt;/a&gt;,
and the &lt;a href=&quot;https://github.com/Codearte/accurest/wiki/2.-Usage&quot;&gt;usage&lt;/a&gt; guide.
If you use the &lt;a href=&quot;https://github.com/Codearte/accurest/wiki/3.-Contract-DSL&quot;&gt;contract DSL&lt;/a&gt;,
you’ll be able to write highly readable examples of requests you want to issue against your API,
and the assertions that you expect to be true when getting the response from that call.
Here’s a concrete example from the documentation:&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;GroovyDsl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;request&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;method&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;POST&#39;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;urlPath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;/users&#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;queryParameters&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;parameter&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;limit&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;parameter&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;offset&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;containing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;parameter&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;filter&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;email&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;n&quot;&gt;headers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;header&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Content-Type&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;application/json&#39;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&#39;&#39;{ &quot;login&quot; : &quot;john&quot;, &quot;name&quot;: &quot;John The Contract&quot; }&#39;&#39;&#39;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;status&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;headers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;header&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;Location&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;/users/john&#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;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Notice that the response is expected to return a status code 200 OK, and a Location header pointing at &lt;code&gt;/users/john&lt;/code&gt;.
Indeed, a very readable way to express the requests and responses!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;tooling-to-test-your-apis&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tooling-to-test-your-apis&quot; /&gt;Tooling to test your APIs&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From a tooling perspective, there are some interesting tools that can be used to test Web APIs,
like &lt;a href=&quot;https://luckymarmot.com/paw&quot;&gt;Paw&lt;/a&gt; (on Macs),
&lt;a href=&quot;https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?hl=en-US&quot;&gt;Advanced REST client&lt;/a&gt;,
&lt;a href=&quot;https://www.getpostman.com/&quot;&gt;Postman&lt;/a&gt; or
&lt;a href=&quot;https://insomnia.rest/&quot;&gt;Insomnia&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But in this article, I’ll offer a quick look at &lt;a href=&quot;https://restlet.com/products/dhc/&quot;&gt;DHC&lt;/a&gt;,
a handy visual tool, that you can use both manually to craft your tests and assertions,
and whose test scenarios you can export and integrate in your build and continuous integration pipeline,
thanks to &lt;a href=&quot;https://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; and Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the end of this post, you should be able to see the following reporting in your Jenkins dashboard,
when visualising the resulting API test execution:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-5-jenkins-report-big.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-5-jenkins-report.png&quot; alt=&quot;Export a scenario&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;introducing-dhc&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#introducing-dhc&quot; /&gt;Introducing DHC&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;DHC is a Chrome extension, that you can
&lt;a href=&quot;https://chrome.google.com/webstore/detail/dhc-resthttp-api-client/aejoelaoggembcahagimdiliamlcdmfm&quot;&gt;install from the Chrome Web Store&lt;/a&gt;,
in your Chrome browser. There’s also an &lt;a href=&quot;https://dhc.restlet.com/&quot;&gt;online service&lt;/a&gt; available, with some limitations.
For the purpose of this article, we’ll use the Chrome extension.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-1-interface-big.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-1-interface.png&quot; alt=&quot;DHC interface&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the main area, you can create your request, define the URL to call, specify the various request headers or params,
chose the method you want to use, and then, you can click the send button to issue the request.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the left pane, that’s where you’ll be able to see your request history, create and save your project in the cloud,
or also set context variables.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latter is important when testing your Web API, as you’ll be able to insert variables like for example
&lt;code&gt;{localhost}&lt;/code&gt; for testing locally on your machine or &lt;code&gt;{staging}&lt;/code&gt; and &lt;code&gt;{prod}&lt;/code&gt; to run your tests in different environments.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the bottom pane, you have access to actual raw HTTP exchange, as well as the assertions pane.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Again, a very important pane to look at! With assertions, you’ll be able to ensure that your Web API works as expected.
For instance, you can check the status code of the call, check the payload contains a certain element,
by using JSON Path or XPath to go through the JSON or XML payload respectively.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-2-assertions-big.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-2-assertions.png&quot; alt=&quot;DHC interface&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond assertions, what’s also interesting is that you can chain requests together.
A call request can depend on the outcome of a previous request!
For example, in a new request, you could pass a query parameter whose value would be the value of some element
of the JSON payload of a previously executed request.
And by combining assertions, linked requests and context variables together, you can create full-blown test scenarios,
that you can then save in the cloud, but also export as a JSON file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-4-scenario-big.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-4-scenario.png&quot; alt=&quot;Running a test scenario&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To export that test scenario, you can click on the little export icon in the bottom left hand corner,
and you’ll be able to select exactly what you want to export:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-3-export-big.png&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/dhc/dhc-3-export.png&quot; alt=&quot;Export a scenario&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;running-your-web-api-tests-with-maven&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-your-web-api-tests-with-maven&quot; /&gt;Running your Web API tests with Maven&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now things become even more interesting, as we’ll proceed to using Maven and Jenkins!
As the saying goes, there’s a Maven plugin for that! For running those Web API tests in your build!
Even if your Web API is developed in another technology than Java, you can still create a small Maven build
just for your Web API tests.
And the icing on the cake, when you configure Jenkins to run this build, as the plugin outputs JUnit-friendly test reports,
you’ll be able to see the details of your successful and failed tests, just like you would see JUnit’s!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s sketch your Maven POM:&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;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;project&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://maven.apache.org/POM/4.0.0&quot;&lt;/span&gt;
         &lt;span class=&quot;na&quot;&gt;xmlns:xsi=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;/span&gt;
         &lt;span class=&quot;na&quot;&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://maven.apache.org/POM/4.0.0
                        https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span class=&quot;nt&quot;&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.example&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;my-first-api-test&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.2.3&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.restlet.dhc&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;dhc-maven-plugin&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.1&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;executions&amp;gt;&lt;/span&gt;
         &lt;span class=&quot;nt&quot;&gt;&amp;lt;execution&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;phase&amp;gt;&lt;/span&gt;test&lt;span class=&quot;nt&quot;&gt;&amp;lt;/phase&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;goals&amp;gt;&lt;/span&gt;
              &lt;span class=&quot;nt&quot;&gt;&amp;lt;goal&amp;gt;&lt;/span&gt;test&lt;span class=&quot;nt&quot;&gt;&amp;lt;/goal&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/goals&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
              &lt;span class=&quot;nt&quot;&gt;&amp;lt;file&amp;gt;&lt;/span&gt;companies-scenario.json&lt;span class=&quot;nt&quot;&gt;&amp;lt;/file&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;nt&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
          &lt;span class=&quot;nt&quot;&gt;&amp;lt;/execution&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/executions&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;pluginRepositories&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;pluginRepository&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;id&amp;gt;&lt;/span&gt;restlet-maven&lt;span class=&quot;nt&quot;&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;Restlet public Maven repository Release Repository&lt;span class=&quot;nt&quot;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;url&amp;gt;&lt;/span&gt;https://maven.restlet.com&lt;span class=&quot;nt&quot;&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/pluginRepository&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/pluginRepositories&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/project&amp;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;visualizing-web-api-test-executions-in-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#visualizing-web-api-test-executions-in-jenkins&quot; /&gt;Visualizing Web API test executions in Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once you’ve configured your Jenkins server to launch the &lt;code&gt;test&lt;/code&gt; goal of this Maven project,
you’ll be able to see nice test reports for your Web API scenarios, like in the screenshot in introduction of this article!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, you can easily run your Web API tests when developers commit changes to the API,
or schedule regular builds with Jenkins to monitor an online Web API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information, be sure to read the tutorial on
&lt;a href=&quot;https://restlet.com/blog/2016/02/03/testing-web-apis-using-dhc-by-restlet/&quot;&gt;testing Web APIs with DHC&lt;/a&gt;.
There are also some more resources like a
&lt;a href=&quot;https://restlet.com/blog/2016/02/19/screencast-testing-apis-with-dhc-by-restlet/&quot;&gt;screencast&lt;/a&gt;,
as well as the
&lt;a href=&quot;https://restlet.com/technical-resources/dhc/guide&quot;&gt;user guide&lt;/a&gt;, if you want to learn more.
And above all, happy testing!&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/2016/04/11/jenkins-plugins-security-update/</id>
<title>Security fixes in Script Security Plugin and Extra Columns Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/11/jenkins-plugins-security-update/" />
<author>
<name>daniel-beck</name>
</author>
<category term='plugins'></category>
<category term='security'></category>
<summary>
The Script Security Plugin and the Extra Columns Plugin were updated today to fix medium-severity security vulnerabilities. For detailed information about the security content of these updates, see the security advisory.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Script Security Plugin and the Extra Columns Plugin were updated today to fix medium-severity security vulnerabilities. For detailed information about the security content of these updates, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2016-04-11/&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/content/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/11/gsoc2016-mentors-call/</id>
<title>Google Summer of Code. Call for Mentors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/11/gsoc2016-mentors-call/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='general'></category>
<category term='jenkins2'></category>
<category term='gsoc'></category>
<summary>
As you probably know, Jenkins project has been accepted to
Google Summer of Code 2016.


During last month we were working with students in order to discuss their project ideas and to review their application drafts.
Thanks again to all students and mentors for your hard work during about ten office hours and dozens of other calls/chats!


Current status



We have successfully handled the student application period


We have received a bunch of good project proposals (mentors cannot disclose the number)


We have done the preliminary filtering of applications


GSoC mentors and organization admins have prepared the project slot application draft




Currently we are looking for mentors.
We have a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you probably know, Jenkins project has been accepted to
&lt;a href=&quot;https://developers.google.com/open-source/gsoc/timeline&quot;&gt;Google Summer of Code 2016&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During last month we were working with students in order to discuss their project ideas and to review their application drafts.
Thanks again to all students and mentors for your hard work during about ten office hours and dozens of other calls/chats!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;current-status&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#current-status&quot; /&gt;Current status&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We have successfully handled the student application period&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have received a bunch of good project proposals (mentors cannot disclose the number)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have done the preliminary filtering of applications&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GSoC mentors and organization admins have prepared the project slot application draft&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently we are &lt;strong&gt;looking for mentors&lt;/strong&gt;.
We have a minimal required number for the current project slot application plan, but additional expertise would allow us to share the load and to provide more expertise to students.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;if-you-want-to-be-a-mentor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#if-you-want-to-be-a-mentor&quot; /&gt;If you want to be a mentor:&lt;/h3&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Check out mentor requirements &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016#GoogleSummerOfCode2016-Mentorshiprules&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check out the project ideas
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Student application period is finished, so it is too late to propose project ideas for this year&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can join the mentor team for one of the mentioned projects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hot areas: UI improvements, Fingerprints, External Workspace Manager&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contact Google GSoC admins via &lt;a href=&quot;mailto:jenkinsci-gsoc-org@googlegroups.com&quot;&gt;jenkinsci-gsoc-org@googlegroups.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016&quot;&gt;GSoC2016 page on our Wiki&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://summerofcode.withgoogle.com/organizations/5668199471251456/&quot;&gt;Jenkins page on the GSoC2016 website&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/07/pipeline-for-runs-on-hardware/</id>
<title>Automating test runs on hardware with Pipeline as Code</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/07/pipeline-for-runs-on-hardware/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='jenkins2'></category>
<category term='pipeline'></category>
<category term='embedded'></category>
<summary>
In addition to Jenkins development, during last 8 years I&#8217;ve been involved into continuous integration for hardware and embedded projects.
At JUC2015/London
I have conducted a talk about common automation challenges in the area.


In this blog post I would like to concentrate on Pipeline (formerly known as Workflow), which is a new ecosystem in Jenkins that allows implementing jobs in a domain specific language.
It is in the suggested plugins list in the upcoming Jenkins 2.0 release.


The first time I tried Pipeline two and half years ago, it unfortunately did not work for my use-cases at all.
I was very disappointed but tried it...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to Jenkins development, during last 8 years I’ve been involved into continuous integration for hardware and embedded projects.
At JUC2015/London
&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/presentations/JUC-2015-Europe-Jenkins-Based-CI-for-Nenashev.pdf&quot;&gt;I have conducted a talk&lt;/a&gt; about common automation challenges in the area.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this blog post I would like to concentrate on &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/&quot;&gt;Pipeline&lt;/a&gt; (formerly known as Workflow), which is a new ecosystem in Jenkins that allows implementing jobs in a domain specific language.
It is in the suggested plugins list in the upcoming &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;Jenkins 2.0 release&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first time I tried Pipeline two and half years ago, it unfortunately did not work for my use-cases at all.
I was very disappointed but tried it again a year later.
This time, the plugin had become much more stable and useful.
It had also attracted more contributors and started evolving more rapidly with the development of plugins extending the Pipeline ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently, Pipeline a powerful tool available for Jenkins users to implement a variety of software delivery pipelines in code.
I would like to highlight several Pipeline features which may be interesting to Jenkins users working specifically with embedded and hardware projects.&lt;/p&gt;
&lt;/div&gt;
&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;In Embedded projects it’s frequently required to run tests on specific hardware peripherals: development boards, prototypes, etc.
It may be required for both software and hardware areas, and especially for products involving both worlds.
CI and CD methodologies require continuous integration and system testing, and Jenkins comes to help here.
Jenkins is an automation framework, which can be adjusted to reliably work with hardware attached to its nodes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;area-challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#area-challenges&quot; /&gt;Area challenges&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Generally, any peripheral hardware device can be attached to a Jenkins node.
Since Jenkins nodes require Java only, almost every development machine can be attached.
Below you can find a common connection scheme:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/pipeline-as-code-for-hardware/connectBoard.png&quot; alt=&quot;Connecting the external device&quot; width=&quot;550&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the connection, Jenkins jobs could invoke common EDA tools via command-line interfaces.
It can be easily done by a &lt;em&gt;Execute shell&lt;/em&gt; build steps in free-style projects.
Such testing scheme is commonly affected by the following issues:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nodes with peripherals are being shared across several projects.
Jenkins must ensure the correctness of access (e.g. by throttling the access).&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In a single Freestyle project builds utilize the node for a long period. If you synthesize the item before the run, much of the peripheral utilization file may be wasted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The issue can be solved by one of concurrency management plugins:
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Throttle+Concurrent+Builds+Plugin&quot;&gt;Throttle Concurrent Builds&lt;/a&gt;, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Lockable+Resources+Plugin&quot;&gt;Lockable Resources&lt;/a&gt;
 or
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Exclusion-Plugin&quot;&gt;Exclusions&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Test parallelization on multiple nodes requires using of multiple projects or
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Matrix+Project+Plugin&quot;&gt;Matrix configurations&lt;/a&gt;, so it causes job chaining again.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;These build chains can be created via
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Parameterized+Trigger+Plugin&quot;&gt;Parameterized Trigger&lt;/a&gt; and
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Copy+Artifact+Plugin&quot;&gt;Copy Artifacts&lt;/a&gt;, but it complicates job management and build history investigation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hardware infrastructure is usually flaky.
If it fails during the build due to any reason, it’s hard to diagnose the issue and re-run the project if the issue comes from hardware.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Build+Failure+Analyzer&quot;&gt;Build Failure Analyzer&lt;/a&gt; allows to identify the root cause of a build failure (e.g. by build log parsing).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Conditional+BuildStep+Plugin&quot;&gt;Conditional Build Step&lt;/a&gt; and
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Flexible+Publish+Plugin&quot;&gt;Flexible Publish&lt;/a&gt; plugins allow altering the build flow according to the analysis results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Combination of the plugins above is possible, but it makes job configurations extremely large.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tests on hardware peripherals may take much time.
If an infrastructure fails, we may have to restart the run from scratch.
So the builds should be robust against infrastructure issues including network failures and Jenkins controller restarts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tests on hardware should be reproducible, so the environment and input parameters should be controlled well.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins supports
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Workspace+Cleanup+Plugin&quot;&gt;cleaning workspaces&lt;/a&gt;, so it can get rid of temporary files generated by previous runs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins provides support of agents connected via containers (e.g.
  &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Docker+Plugin&quot;&gt;Docker&lt;/a&gt;) or VMs, which allow creating clean environments for every new run.
It’s important for 3rd-party tools, which may modify files outside the workspace: user home directory, temporary files, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These environments still need to be connected to hardware peripherals, which may be a serious obstacle for Jenkins admins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The classic automation approaches in Jenkins are based on Free-style and Multi-configuration project types.
Links to various articles on this topic are collected on the
&lt;a href=&quot;https://www.jenkins.io/solutions/embedded/&quot;&gt;HW/Embedded Solution page&lt;/a&gt;Embedded on the Jenkins website.
Tests automation on hardware peripherals has been covered in several publications by Robert Martin, Steve Harris, JL Gray, Gordon McGregor, Martin d’Anjou, and Sarah Woodall.
There is also a top-level overview of classic approaches made by me at JUC2015/London (a bit outdated now).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the other hand, there is no previous publications, which would address &lt;a href=&quot;https://www.jenkins.io/doc/pipeline/&quot;&gt;Pipeline&lt;/a&gt; usage for the Embedded area.
In this post I want to address this use-case.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;pipeline-as-code-for-test-runs-on-hardware&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-as-code-for-test-runs-on-hardware&quot; /&gt;Pipeline as Code for test runs on hardware&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline as Code is an approach for describing complex automation flows in software lifecycles: build, delivery, deployment, etc.
It is being advertised in Continuous Delivery and DevOps methodologies.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In Jenkins there are two most popular plugins:
&lt;a href=&quot;https://www.jenkins.io/doc/pipeline/&quot;&gt;Pipeline&lt;/a&gt; and &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Job+DSL+Plugin&quot;&gt;Job DSL&lt;/a&gt;.
JobDSL Plugin internally generates common freestyle jobs according to the script, so it’s functionality is similar to the classic approaches.
Pipeline is fundamentally different, because it provides a new engine controlling flows independently from particular nodes and workspaces.
So it provides a higher job description level, which was not available in Jenkins before.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below you can find an example of Pipeline scripts, which runs tests on FPGA board. The id of this board comes from build parameters (&lt;em&gt;fpgaId&lt;/em&gt;). In this script we also presume that all nodes have pre-installed tools (Xilinx ISE in this case).&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;c1&quot;&gt;// Run on node having my_fpga label&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;linux &amp;amp;&amp;amp; ml509&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;n&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;url:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;https://github.com/oleg-nenashev/pipeline_hw_samples&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;make all&quot;&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;But such scenario could be also implemented in a Free-style project.
What would we get from Pipeline plugin?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;getting-added-value-from-pipeline-as-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#getting-added-value-from-pipeline-as-code&quot; /&gt;Getting added-value from Pipeline as code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline provides much added-value features for hardware-based tests.
I would like to highlight the following advantages:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Robustness against restarts of Jenkins controller.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Robustness against network disconnects. &lt;code&gt;sh()&lt;/code&gt; steps are based on the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Durable+Task+Plugin&quot;&gt;Durable Task plugin&lt;/a&gt;, so Jenkins can safely continue the execution flow once the node reconnects to the controller.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It’s possible to run tasks on multiple nodes without creating complex flows based on job triggers and copy artifact steps, etc. It can be achieved via combination of &lt;code&gt;parallel()&lt;/code&gt; and &lt;code&gt;node()&lt;/code&gt; steps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ability to store the shared logic in standalone Pipeline libraries&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First two advantages allow to improve the robustness of Jenkins nodes against infrastructure failures.
It is critical for long-running tests on hardware.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last two advantages address the flexibility of Pipeline flows.
There are also plugins for freestyle projects, but they are not flexible enough.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;utilizing-pipeline-features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#utilizing-pipeline-features&quot; /&gt;Utilizing Pipeline features&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The sample Pipeline script above is very simple.
We would like to get some added value from Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;general-improvements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#general-improvements&quot; /&gt;General improvements&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s enhance the script by using several features being provided by pipeline in order to get visualization of stages, report publishing and build notifications.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also want to minimize the time being spent on the node with the attached FPGA board.
So we will split the bitfile generation and further runs to two different nodes in this case: a general purpose linux node, and the node with the hardware attached.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find the resulting Pipeline script below:&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;c1&quot;&gt;// Synthesize on any node&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imageId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;linux&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;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Prepare environment&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;url:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;https://github.com/oleg-nenashev/pipeline_hw_samples&quot;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Construct the bitfile image ID from commit ID&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;git rev-parse HEAD &amp;gt; GIT_COMMIT&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;imageId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;myprj-${fpgaId}-&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;GIT_COMMIT&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;take&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&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;s2&quot;&gt;&quot;Synthesize project&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;make FPGA_TYPE=$fpgaId synthesize_for_fpga&quot;&lt;/span&gt;
  &lt;span class=&quot;cm&quot;&gt;/* We archive the bitfile before running the test, so it won&#39;t be lost it if something happens with the FPGA run stage. */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;archive&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;target/image_${fpgaId}.bit&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;stash&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;includes:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;target/image_${fpgaId}.bit&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;name:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bitfile&#39;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* Run on a node with &#39;my_fpga&#39; label.
In this example it means that the Jenkins node contains the attacked FPGA of such type.*/&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;linux &amp;amp;&amp;amp; $fpgaId&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;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Blast bitfile&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;url:&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;https://github.com/oleg-nenashev/pipeline_hw_samples&quot;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;artifact&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;target/image_&#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fpgaId&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;.bit&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Using ${artifact}&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;unstash&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;bitfile&#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;make FPGA_TYPE=$fpgaId impact&quot;&lt;/span&gt;

  &lt;span class=&quot;cm&quot;&gt;/* We run automatic tests.
  Then we report test results from the generated JUnit report. */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Auto Tests&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;make FPGA_TYPE=$fpgaId tests&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;perl scripts/convertToJunit.pl --from=target/test-results/* --to=target/report_${fpgaId}.xml --classPrefix=\&quot;myprj-${fpgaId}.\&quot;&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;junit&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;target/report_${fpgaId}.xml&quot;&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;stage&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Finalization&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;make FPGA_TYPE=$fpgaId flush_fpga&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;hipchatSend&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;${imageId} testing has been completed&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;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you may see, the pipeline script mostly consists of various calls of command-line tools via the &lt;code&gt;sh()&lt;/code&gt; command.
All EDA tools provide great CLIs, so we do not need special plugins in order to invoke common operations from Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot; /&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Makefile above is a sample stuff for demo purposes.
It implements a set of unrelated routines merged into a single file without dependency declarations.
Never write such makefiles.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is possible to continue expanding the pipeline in such way.
&lt;a href=&quot;https://github.com/jenkinsci/pipeline-examples&quot;&gt;Pipeline Examples&lt;/a&gt;
contain examples for common cases: build parallelization, code sharing between pipelines, error handling, etc.&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;lessons-learned&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#lessons-learned&quot; /&gt;Lessons learned&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During last 2 years I’ve been using Pipeline for Hardware test automation several times.
The first attempts were not very successful, but the ecosystem has been evolving rapidly.
I feel Pipeline has become a really powerful tool, but there are several missing features.
I would like to mention the following ones:&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;Shared resource management across different pipelines&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Runs of a single Pipeline job can be synchronized using the &lt;code&gt;concurrency&lt;/code&gt; parameter of the &lt;code&gt;stage()&lt;/code&gt; step&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It can be done by the incoming Pipeline integration in the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Lockable+Resources+Plugin&quot;&gt;Lockable Resources plugin&lt;/a&gt;
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/30269&quot;&gt;JENKINS-30269&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another case is integration with
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Throttle+Concurrent+Builds+Plugin&quot;&gt;Throttle Concurrent Builds plugin&lt;/a&gt;, which is an effective engine for limiting the license utilization in automation infrastructures
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31801&quot;&gt;JENKINS-31801&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Better support of CLI tools&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;EDA tools frequently need a complex environment, which should be deployed on nodes somehow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integration with
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Custom+Tools+Plugin&quot;&gt;Custom Tools Plugin&lt;/a&gt; seems to be the best option, especially in the case of multiple tool versions
(&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/30680&quot;&gt;JENKINS-30680&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pipeline package manager&lt;/strong&gt; (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/34186&quot;&gt;JENKINS-34186&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Since there is almost no plugins for EDA tools in Jenkins, developers need to implement similar tasks at multiple jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A common approach is to keep the shared &quot;functions&quot; in libraries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-cps-global-lib-plugin&quot;&gt;Pipeline Global Library&lt;/a&gt; and
&lt;a href=&quot;https://github.com/jenkinsci/workflow-remote-loader-plugin&quot;&gt;Pipeline Remote Loader&lt;/a&gt; can be used, but they do not provide features like dependency management.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pipeline debugger&lt;/strong&gt; (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/34185&quot;&gt;JENKINS-34185&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hardware test runs are very slow, so it is difficult to troubleshoot and fix issues in the Pipeline code if you have to run every build from scratch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are several features in Pipeline, which simplify the development, but we still need an IDE-alike implementation for complex scripts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&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;conclusions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusions&quot; /&gt;Conclusions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is a powerful &lt;strong&gt;automation framework&lt;/strong&gt;, which can be used in many areas.
Even though Jenkins has no dedicated plugins for test runs on hardware, it provides many general-purpose &quot;building blocks&quot;, which allow implementing almost any flow.
That’s why Jenkins is so popular in the hardware and embedded areas.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline as code can greatly simplify the implementation of complex flows in Jenkins.
It continues to evolve and extend support of use-cases.
if you’re developing embedded projects, consider Pipeline as a durable, extensible and versatile means of implementing your automation.&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;Jenkins automation server dominates in the HW/Embedded area, but unfortunately there is not so much experience sharing for these use-cases.
So Jenkins community encourages everybody to share the experience in this area by writing docs and articles for Jenkins website and other resources.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is just a a first blog post on this topic.
I am planning to provide more examples of Pipeline usage for Embedded and Hardware tests in the future posts.
The next post will be about concurrency and shared resource management in Pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am also going to talk about running tests on hardware at the
&lt;a href=&quot;https://www.eventbrite.com/e/accelerating-automotive-innovation-with-continuous-integration-delivery-tickets-20809772590&quot;&gt;upcoming Automotive event&lt;/a&gt; in Stuttgart on April 26th.
This event is being held by
&lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;, but there will be several talks addressing Jenkins open-source as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to share your experience about Jenkins usage in Hardware/Embedded areas, consider submitting a talk for the
&lt;a href=&quot;https://jenkins-cfp.herokuapp.com/events/jenkins-world-2016&quot;&gt;Jenkins World conference&lt;/a&gt; or join/organize a
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;Jenkins Area Meetup&lt;/a&gt; in your city.
There is also a
&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;Jenkins Online Meetup&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;Links&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Related articles and events:&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/solutions/embedded/&quot;&gt;HW/Embedded Solution page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/presentations/JUC-2015-Europe-Jenkins-Based-CI-for-Nenashev.pdf&quot;&gt;Jenkins-Based CI for Heterogeneous Hardware/Software Projects&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.eventbrite.com/e/accelerating-automotive-innovation-with-continuous-integration-delivery-tickets-20809772590&quot;&gt;Accelerating Automotive Innovation with Continuous Integration &amp;amp; Delivery&lt;/a&gt; - meetup in Stuttgart&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pipeline:&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/solutions/pipeline&quot;&gt;Pipeline page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/onenashev/spb-jenkins-meetup-number-1-jenkins-2-dot-0-i-pipeline-as-code-eng&quot;&gt;Jenkins 2.0 and Pipeline as code overview&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin/blob/master/TUTORIAL.md&quot;&gt;Pipeline Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/pipeline-examples&quot;&gt;Pipeline Examples&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/2016/04/07/jenkins-community-survey-results-blog/</id>
<title>Jenkins Community Survey Results</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/07/jenkins-community-survey-results-blog/" />
<author>
<name>bvdawson</name>
</author>
<category term='continuousdelivery'></category>
<category term='pipeline'></category>
<category term='docker'></category>
<summary>
This is a guest post by Brian
Dawson at CloudBees, where he works as a DevOps Evangelist responsible for
developing and sharing continuous delivery and DevOps best practices. He also
serves as the CloudBees Product Marketing Manager for Jenkins.








Last fall CloudBees asked attendees at the Jenkins User Conference – US West
(JUC), and other in the Jenkins community to take a survey.  Almost 250 people
did – and thanks to their input, we have results which provided interesting
insights into how Jenkins is being used.


Back in 2012, at the time of the last community survey, 83% of respondents felt
that Jenkins was mission-critical. By 2015, the...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://twitter.com/brianvdawson&quot;&gt;Brian
Dawson&lt;/a&gt; at CloudBees, where he works as a DevOps Evangelist responsible for
developing and sharing continuous delivery and DevOps best practices. He also
serves as the CloudBees Product Marketing Manager for Jenkins.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/logo_128.png&quot; alt=&quot;logo 128&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last fall CloudBees asked attendees at the Jenkins User Conference – US West
(JUC), and other in the Jenkins community to take a survey.  Almost 250 people
did – and thanks to their input, we have results which provided interesting
insights into how Jenkins is being used.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back in 2012, at the time of the last community survey, 83% of respondents felt
that Jenkins was mission-critical. By 2015, the percentage saying that
Jenkins was mission-critical was 92%. Additionally, echoing the
importance of Jenkins, 89% of respondents said their use of Jenkins had
increased over the last year, while 11% said it had stayed the same. 0%
said that it had decreased.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The trend in the industry over the last couple of years has been to adopt
continuous delivery (CD), thus pushing automation further down the pipeline –
from development all the way into production.  Jenkins being an automation
engine applicable to any phase of the software delivery lifecycle, is readily
supporting this trend. Jenkins&#39; extensible architecture and unparalleled plugin
ecosystem enables integration with and orchestration of practically any tool in
any phase of software delivery.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The trend towards adoption of CD is clearly reflected amongst the community: 59%
of respondents are using Jenkins for continuous integration (CI), but an
additional 30% have extended CI into CD and are manually deploying code to
production.  Finally, 11% are practicing continuous deployment – they have
extended CI to CD and are deploying code automatically into production.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another trend tied to the adoption of CD and DevOps is the frequent deployment
of incremental releases to production. 26% of those respondents using continuous
delivery practices are deploying code at least once per day.  Another 37% are
deploying code at least once per week.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In keeping with the move to CD, 30% of survey takers are already using the
relatively new &lt;a href=&quot;https://www.jenkins.io/solutions/pipeline&quot;&gt;Pipeline&lt;/a&gt; plugin to automate their
software delivery pipelines.  Of those not using the Pipeline plugin, 79% plan
to adopt it in the next 12 months.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Survey respondents are also using Jenkins for many different activities.  97% of
survey takers use it for &quot;build&quot; – no surprise, since that is where Jenkins got
its start - but 58% now also use it for their deployment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image left&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2015-community-survey/2016-survey-blog-strongbutler.png&quot; alt=&quot;2016 survey blog strongbutler&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When the 2012 community survey was conducted, container technology was not as
well understood as it is today,  and many didn’t know what a “Docker” was. A
short four years later, 96% of survey respondents who use Linux containers are
using Docker.  Container technology has seen impressive adoption and arguably is
revolutionizing the way application infrastructure is delivered.  When coupled
with Jenkins as an automation engine, containers help accelerate software
delivery by providing rapid access to lightweight environments.  The Jenkins
community has recognized and embraced the power of containers by
&lt;a href=&quot;https://www.jenkins.io/solutions/docker&quot;&gt;providing plugins for Docker&lt;/a&gt; and Kubernetes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins improvements which survey respondents desired the most were
quality/timely bug fixes, a better UI and more documentation/examples.
Interestingly, Jenkins 2.0 - which is just about to officially launch,
provides UI improvements and the new Jenkins.io website
provides improved, centralized documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/2015-community-survey/2016-survey-blog-bb8.png&quot; alt=&quot;2016 survey blog bb8&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, the respondents favorite Star Wars character was R2-D2, followed by
Obi-Wan and Darth Vader. Yoda and Han Solo also got a fair amount of votes. The
votes for Jar-Jar Binks and Jabba the Hutt left us puzzled. Notably, BB-8 had a
write-in vote despite the fact the new Star Wars movie hadn’t been released yet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As to where the community is headed, our prediction is that by the next Jenkins Community Survey:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;More Jenkins users will have transitioned from just continuous
integration to continuous delivery with some evening practicing continuous
deployment&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pipeline plugin adoption and improvements will continue, leading to
pipeline-as-code becoming an essential solution for automating the software
(and infrastructure) delivery process&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There will be a significant increase in use of the Docker plugin to support
elastic Jenkins infrastructure and continuous delivery of containers using
software development best practices&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BB-8 will be the next favorite Star Wars character! &amp;lt;3&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you at Jenkins World, September 13-15, in Santa Clara, California!
&lt;a href=&quot;https://www.cloudbees.com/jenkinsworld/home&quot;&gt;Register now&lt;/a&gt; for the largest Jenkins event on the planet in 2016 – and get the Early Bird discount. The &lt;a href=&quot;https://jenkins-cfp.herokuapp.com/events/jenkins-world-2016&quot;&gt;Call for Papers&lt;/a&gt; is still open – so submit a talk and share your knowledge with the community about 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://www.jenkins.io/files/2015-Jenkins-Community-Survey-Results.pdf&quot;&gt;2015 Community Survey Results (PDF)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/files/State-of-Jenkins-Infographic-2015.pdf&quot;&gt;State of Jenkins Infographic (PDF)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/07/2/</id>
<title>Jenkins 2.0 Release Candidate available!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/07/2/" />
<author>
<name>rtyler</name>
</author>
<category term='jenkins2'></category>
<summary>
Those who fervently watch the
jenkinsci-dev@
list, like I do, may have caught Daniel
Beck's email today which quietly referenced a significant milestone on the
road to 2.0 which has been reached: the first 2.0 release
candidate is here!


The release candidate process, in short, is the final stabilization and testing
period before the final release of Jenkins 2.0. If you have the
cycles to help test, please download the release candidate and give
us your feedback as soon as possible!


The release candidate process also means that changes targeting release after
2.0 can start landing in the master branch, laying the groundwork 2.1 and
beyond.




I pushed the merge to 'master'. So...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Those who fervently watch the
&lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;jenkinsci-dev@&lt;/a&gt;
list, like I do, may have caught &lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel
Beck&lt;/a&gt;&#39;s email today which quietly referenced a significant milestone on the
road to &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;2.0&lt;/a&gt; which has been reached: the first &lt;strong&gt;2.0 release
candidate&lt;/strong&gt; is &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The release candidate process, in short, is the final stabilization and testing
period before the &lt;em&gt;final&lt;/em&gt; release of &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;Jenkins 2.0&lt;/a&gt;. If you have the
cycles to help test, please &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;download the release candidate&lt;/a&gt; and give
us your feedback as soon as possible!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The release candidate process also means that changes targeting release &lt;strong&gt;after&lt;/strong&gt;
2.0 can start landing in the &lt;code&gt;master&lt;/code&gt; branch, laying the groundwork 2.1 and
beyond.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I pushed the merge to &#39;master&#39;. So anything targeting 2.1+ can be now proposed
in pull requests to that branch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anything happening on &#39;2.0&#39; branch will be limited to critical fixes for the 2.0
release specifically.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
— Daniel Beck
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Compared to the
&lt;a href=&quot;https://www.jenkins.io/blog/2016/03/24/jenkins-2-beta-released/&quot;&gt;2.0 beta release&lt;/a&gt;, the first
release candidate has a number of fixes for issues discovered in the alpha and beta
process. Most notable perhaps is the stabilization of a system property which
configuration management tools, like Puppet/Chef/Ansible/etc, can use to suppress
the user-friendly Getting Started wizard. Since users of those tools
have alternative means of ensuring security and correctness of their Jenkins
installations, the out-of-the-box experience can be skipped.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Based on our
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+2.0#Jenkins2.0-RoughTimeline&quot;&gt;rough
timeline&lt;/a&gt; this gives us a couple weeks to test the release candidates and get
ready for a big exciting release of 2.0 at the end of April!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/04/01/march-2016-jam-st-petersburg/</id>
<title>March 2016 St. Petersburg Jenkins Meetup Report</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-04-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/04/01/march-2016-jam-st-petersburg/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='jam'></category>
<category term='jenkins_ru'></category>
<category term='jenkins2'></category>
<summary>
On March 10th we have conducted the second Jenkins meetup in Saint Petersburg,
Russia.  The meetup topic was "Jenkins and Continuous Delivery".  We had 3
talks addressing various aspects of Jenkins usage in this area.







Talks




Introduction slides  [ru]


Jenkins 2.0 and Pipeline-as-Code



Speaker: Oleg Nenashev, CloudBees


Presentation (en)


Presentation (ru)





Continuous Delivery for Documentation



Speaker: Stanislav Ovchar, Motorola Solutions


Presentation (ru)





Continuous Delivery with Jenkins at ZeroTurnaround



Speaker: Sergei Egorov, ZeroTurnaround


Presentation (en)







We also had a long Jenkins afterparty. Starting from the next meetup we hope to
make this part more official.




Links




St. Petersburg Meetup page (follow the events here)


Event page on the Yandex.Events portal


St. Petersburg Meetup Twitter


Jenkins RU Twitter


Jenkins RU Gitter...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On March 10th we have conducted the second Jenkins meetup in Saint Petersburg,
Russia.  The meetup topic was &lt;strong&gt;&quot;Jenkins and Continuous Delivery&quot;&lt;/strong&gt;.  We had 3
talks addressing various aspects of Jenkins usage in this area.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock right&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/sites/default/files/images/stpetersburg-butler_0.jpeg&quot; alt=&quot;stpetersburg butler 0&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;talks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#talks&quot; /&gt;Talks&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;https://speakerdeck.com/onenashev/spb-jenkins-meetup-number-1-intro-rus&quot;&gt;Introduction slides&lt;/a&gt;  [ru]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jenkins 2.0 and Pipeline-as-Code&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Speaker: &lt;a href=&quot;https://twitter.com/oleg_nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt;, &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/onenashev/spb-jenkins-meetup-number-1-jenkins-2-dot-0-i-pipeline-as-code-eng&quot;&gt;Presentation&lt;/a&gt; (en)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/onenashev/spb-jenkins-meetup-number-1-jenkins-2-dot-0-i-pipeline-as-code-rus&quot;&gt;Presentation&lt;/a&gt; (ru)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous Delivery for Documentation&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Speaker: &lt;a href=&quot;https://events.yandex.ru/lib/people/3857500/&quot;&gt;Stanislav Ovchar&lt;/a&gt;, &lt;a href=&quot;https://www.motorolasolutions.com/en_xu.html&quot;&gt;Motorola Solutions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://yadi.sk/i/O0pLrzUfqSNxZ&quot;&gt;Presentation&lt;/a&gt; (ru)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Continuous Delivery with Jenkins at ZeroTurnaround&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Speaker: &lt;a href=&quot;https://twitter.com/bsideup&quot;&gt;Sergei Egorov&lt;/a&gt;, &lt;a href=&quot;https://zeroturnaround.com&quot;&gt;ZeroTurnaround&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/bsideup/continuous-delivery-with-jenkins-at-zeroturnaround&quot;&gt;Presentation&lt;/a&gt; (en)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also had a long Jenkins afterparty. Starting from the next meetup we hope to
make this part more official.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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.meetup.com/St-Petersburg-Jenkins-Meetup/&quot;&gt;St. Petersburg Meetup page&lt;/a&gt; (follow the events here)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://events.yandex.ru/events/yagosti/10-march-2016/&quot;&gt;Event page on the Yandex.Events portal&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/jenkins_spb&quot;&gt;St. Petersburg Meetup Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/jenkins_ru&quot;&gt;Jenkins RU Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://app.gitter.im/#/room/#jenkinsci-ru_public:gitter.im&quot;&gt;Jenkins RU Gitter Chat&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;acknowledgments&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#acknowledgments&quot; /&gt;Acknowledgments&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The event has been organized with the help from
&lt;a href=&quot;https://yandex.com/company/&quot;&gt;Yandex&lt;/a&gt; and
&lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&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;more-jenkins-meetups&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#more-jenkins-meetups&quot; /&gt;More Jenkins meetups&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to organize a Jenkins meetup in St. Petersburg or to be a speaker
there, please contact us via the
&lt;a href=&quot;https://www.meetup.com/St-Petersburg-Jenkins-Meetup/messages/boards/&quot;&gt;Meetup
discussions page&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regarding other areas, check out where
&lt;a href=&quot;https://www.meetup.com/pro/Jenkins/&quot;&gt;Jenkins Area Meetups&lt;/a&gt; (JAMs) are
located in the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t see a JAM in your area?  Why not start your own,
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;find out
how&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/2016/03/30/usage-statistics-privacy-advisory/</id>
<title>Important notice regarding usage statistics</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-03-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/03/30/usage-statistics-privacy-advisory/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<summary>
A bug was introduced in Jenkins versions 1.645 and 1.642.2 which caused Jenkins
to send
anonymous
usage statistics, even if the administrator opted-out of reporting usage data
in the Jenkins web UI.


If you are running one of the affected versions, the best/easiest solution is
to upgrade. The bug does not affect Jenkins 1.653 or newer, or Jenkins LTS
1.642.4 or newer.


If you cannot upgrade, it is possible to immediately disable submission of
usage statistics by running the following script in "Manage Jenkins » Script Console":



    hudson.model.UsageStatistics.DISABLED = true



This will immediately disable usage data submission until you restart Jenkins.
To make this permanent, change your Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A bug was introduced in Jenkins versions 1.645 and 1.642.2 which caused Jenkins
to send
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Usage+Statistics&quot;&gt;anonymous
usage statistics&lt;/a&gt;, even if the administrator opted-out of reporting usage data
in the Jenkins web UI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are running one of the affected versions, the best/easiest solution is
to upgrade. The bug does not affect Jenkins 1.653 or newer, or Jenkins LTS
1.642.4 or newer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you cannot upgrade, it is possible to immediately disable submission of
usage statistics by running the following script in &quot;Manage Jenkins » Script Console&quot;:&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;hudson&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;UsageStatistics&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DISABLED&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&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 will immediately disable usage data submission until you restart Jenkins.
To make this permanent, change your Jenkins startup script so it passes a
system property to the &lt;code&gt;java&lt;/code&gt; process:&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;    java &lt;span class=&quot;nt&quot;&gt;-Dhudson&lt;/span&gt;.model.UsageStatistics.disabled&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-jar&lt;/span&gt; …/jenkins.war&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For information how to do this when using one of the installers/packages, see &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Native+Packages&quot;&gt;the
installer/package documentation here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To verify that usage stats submission is disabled, run the following script in
&quot;Manage Jenkins » Script Console&quot; and confirm the result is true:&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;println&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hudson&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;UsageStatistics&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DISABLED&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;We have much more information about the issue and our usage statistics process
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Usage+Statistics+Privacy+Advisory+2016-03-30&quot;&gt;in
our wiki&lt;/a&gt;.&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;
While we do not consider this a security advisory, if you are a Jenkins
administrator we highly recommend subscribing to our
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Security+Advisories&quot;&gt;jenkinsci-advisories@&lt;/a&gt;
mailing list.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/03/24/jenkins-2-beta-released/</id>
<title>Jenkins 2.0 beta released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-03-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/03/24/jenkins-2-beta-released/" />
<author>
<name>daniel-beck</name>
</author>
<category term='jenkins2'></category>
<summary>
We released the Jenkins 2.0 beta earlier today. Download it here and try it!


Besides a number of bug fixes and minor improvements, the following changes are new since the last alpha preview release:


Redesigned "New Item" page

We redesigned the "New Item" page. Item types now have icons to be more visually distinctive.


Additionally, item types can now define a category they belong to (such as "Project" or "Folder"). Once the complexity of the "New Item" page reaches a certain threshold, the item types will be grouped into categories to be easier to find. However, for now, it&#8217;s unlikely that you will see...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We released the Jenkins 2.0 beta earlier today. &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;Download it here and try it!&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Besides a number of bug fixes and minor improvements, the following changes are new since the last alpha preview release:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;redesigned-new-item-page&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#redesigned-new-item-page&quot; /&gt;Redesigned &quot;New Item&quot; page&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We redesigned the &quot;New Item&quot; page. Item types now have icons to be more visually distinctive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, item types can now define a category they belong to (such as &quot;Project&quot; or &quot;Folder&quot;). Once the complexity of the &quot;New Item&quot; page reaches a certain threshold, the item types will be grouped into categories to be easier to find. However, for now, it’s unlikely that you will see these categories, as support for this mechanism will need to be added in plugins. This is a new API in core, and we invite plugin developers to support it to make Jenkins easier to use for users with a large number of item types. It doesn’t even require raising the minimum supported Jenkins version.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;separate-configuration-page-for-tools&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#separate-configuration-page-for-tools&quot; /&gt;Separate configuration page for tools&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The length and complexity of the &lt;em&gt;Configure Jenkins&lt;/em&gt; page once a few dozen plugins are installed made it unnecessarily difficult to use. To improve that we’re moving the tools configuration (Git, Maven, Gradle, Ant, etc.) out of that page, into the new &lt;em&gt;Global Tools Configuration&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;upgrade-notice-and-plugin-installer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#upgrade-notice-and-plugin-installer&quot; /&gt;Upgrade notice and plugin installer&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Pipeline plugin suite is a big part of Jenkins 2. Over the past few weeks, open-source plugins adding support for visualization (Pipeline Stage View), automatic GitHub project creation (GitHub Branch Source Plugin) and Bitbucket project creation (Bitbucket Branch Source Plugin) have been released. However, when upgrading from Jenkins 1.x, users weren’t even given any information on these features.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To address this, users upgrading from Jenkins 1.x will now be shown a banner when they first log into Jenkins as administrator, offering them to install the suite of Pipeline plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/03/21/vjam/</id>
<title>vJAM: Virtual Jenkins Area Meetup</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-03-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/03/21/vjam/" />
<author>
<name>alyssat</name>
</author>
<category term='jam'></category>
<summary>
Over the past few months, I&#8217;m happy to say, the number of
Jenkins Area Meetups (JAMs) has grown
tremendously! The excitement around JAMs has gotten us thinking about something
larger, something more globally focused. That led us to create
vJAM, an online Jenkins Area
Meetup, where we can share what we&#8217;re learning together. The effort will be
spear-headed by long time Jenkins contributor, R. Tyler Croy.


The key goals for the Virtual Jenkins Area Meetup are:




Connect the global Jenkins user and developer community.


Help spread the latest and greatest best practices.


Support other JAMs by offering
another, broader, audience for speakers and organizers




vJAM, originally inspired by Virtual JUG, will
supplement local...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past few months, I’m happy to say, the number of
&lt;a href=&quot;https://www.meetup.com/pro/jenkins&quot;&gt;Jenkins Area Meetups&lt;/a&gt; (JAMs) has grown
tremendously! The excitement around JAMs has gotten us thinking about something
larger, something more globally focused. That led us to create
&lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;vJAM&lt;/a&gt;, an online Jenkins Area
Meetup, where we can share what we’re learning together. The effort will be
spear-headed by long time Jenkins contributor, &lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The key goals for the Virtual Jenkins Area Meetup are:&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;Connect the global Jenkins user and developer community.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help spread the latest and greatest best practices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support &lt;a href=&quot;https://www.meetup.com/pro/jenkins/&quot;&gt;other JAMs&lt;/a&gt; by offering
another, broader, audience for speakers and organizers&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;vJAM, originally inspired by &lt;a href=&quot;https://virtualjug.com/&quot;&gt;Virtual JUG&lt;/a&gt;, will
supplement local JAMs but nothing virtual can replace the value of talking with
other Jenkins users over pizza and drinks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re currently working on the agenda for the first vJAM, which will be posted
to &lt;a href=&quot;https://www.meetup.com/Jenkins-online-meetup/&quot;&gt;this Meetup group&lt;/a&gt;, so be
sure to sign up if you’re interested in participating!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in creating your own local Jenkins Area Meetup, read
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;this page&lt;/a&gt;
for more details.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/03/18/jenkins-20-test-fest/</id>
<title>Jenkins 2.0 community test fest!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-03-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/03/18/jenkins-20-test-fest/" />
<author>
<name>omehegan</name>
</author>
<category term='jenkins2'></category>
<summary>
The beta release of Jenkins 2.0 is rapidly approaching! The development team is working hard to find and squash as many bugs as possible, but do you know what would make that effort even more successful? You! A big part of Jenkins&#8217;s power lies in its extensive flexibility, but that flexibility poses challenges to testing. In short, it&#8217;s difficult for the core team to test in all the myriad environments and with all the different workflows that Jenkins users have. To give just one example, users of Jenkins on Windows often uncover Windows-specific issues that are missed during development.


That&#8217;s where...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The beta release of &lt;a href=&quot;https://jenkins-ci.org/2.0/&quot;&gt;Jenkins 2.0&lt;/a&gt; is rapidly approaching! The development team is working hard to find and squash as many bugs as possible, but do you know what would make that effort even more successful? You! A big part of Jenkins’s power lies in its extensive flexibility, but that flexibility poses challenges to testing. In short, it’s difficult for the core team to test in all the myriad environments and with all the different workflows that Jenkins users have. To give just one example, users of Jenkins on Windows often uncover Windows-specific issues that are missed during development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s where you come in! The Jenkins team has organized a Test Fest to take place all day on Monday, March 21st, wherever you are. We encourage you to download the latest alpha release of Jenkins 2.0, start it up, and configure it in the way you would your production Jenkins installation. Try out your usual workflows, install those plugins you just can’t live without, and let us know about any issues you encounter. You can file them in the &lt;a href=&quot;https://issues.jenkins.io/secure/Dashboard.jspa&quot;&gt;Jenkins JIRA,&lt;/a&gt; with the label &#39;2.0,&#39; or you can discuss them with us in the #jenkins-testfest IRC channel on the Freenode IRC network (connect to irc.freenode.org). We encourage you to hang out with us on IRC regardless; it’ll be an all-day party!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also find the list of the discovered Jenkins 2.0 issues using &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/33718?jql=labels%20%3D%202.0%20and%20status%20%3D%20Open&quot;&gt;this link&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks in advance for joining us, and for supporting Jenkins!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/03/15/jenkins-certification/</id>
<title>Introducing Jenkins Certification</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-03-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/03/15/jenkins-certification/" />
<author>
<name>fdechery</name>
</author>
<category term='certification'></category>
<summary>
This is a guest post by Francois
Dechery, he works at CloudBees managing Customer Engagement/Support, Consulting
and Training. He is also leading the Jenkins Certification program at CloudBees
which has been discussed in some of our previous (1,
2,
3)
governance
meetings.





In the IT world, namely in software, "certification" is used in many different
ways and for many different purposes. From very simple and light certifications
to very heavy and complex ones. In the "light" category you can usually be
certified on the basis of a short quiz at the end of an online training. At the
other end of the spectrum, certifications are based on a proctored
multiple-choice questionnaire-based exam and/or...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://twitter.com/francoisdechery&quot;&gt;Francois
Dechery&lt;/a&gt;, he works at CloudBees managing Customer Engagement/Support, Consulting
and Training. He is also leading the Jenkins Certification program at CloudBees
which has been discussed in some of our previous (&lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins/2015/jenkins.2015-08-05-18.00.html&quot;&gt;1&lt;/a&gt;,
&lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins-meeting/2016/jenkins-meeting.2016-02-17-19.00.html&quot;&gt;2&lt;/a&gt;,
&lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins-meeting/2016/jenkins-meeting.2016-03-02-19.00.html&quot;&gt;3&lt;/a&gt;)
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Meeting+Agenda&quot;&gt;governance
meetings&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the IT world, namely in software, &quot;certification&quot; is used in many different
ways and for many different purposes. From very simple and light certifications
to very heavy and complex ones. In the &quot;light&quot; category you can usually be
certified on the basis of a short quiz at the end of an online training. At the
other end of the spectrum, certifications are based on a proctored
multiple-choice questionnaire-based exam and/or hands-on labs. In some
industries, certifications are even more demanding. For instance, to become a
Certified Public Accountant in the US, you have to pass a standard examination
and, on top of this, each state/jurisdiction has its own set of education and
experience requirements that individuals must meet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;creating-the-jenkins-certification&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-the-jenkins-certification&quot; /&gt;Creating the Jenkins certification&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When we started our internal discussions at CloudBees regarding a certification
program for Jenkins, we were aware of this broad set of certification
definitions. Therefore, our first goal was to define what type of certification
we wanted to develop and for what purpose. We quickly agreed on the fact that it
should be &lt;em&gt;a professional-grade certification, whose purpose would be to provide
a professional standard for the Jenkins ecosystem,&lt;/em&gt; benefiting both individuals
and organizations, thanks to a common, respected and well-known body of
knowledge and practice. &quot;Professional&quot; means that you have the expected level of
skills and experience in order to leverage them in a professional environment,
for example in enterprise projects or as a consultant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many members of the CloudBees team have firsthand experience with certification
programs developed in other IT ecosystems such as telecoms (Cisco),
infrastructure (Microsoft, Red Hat) or business applications (SAP), to name a
few. This was definitely the type of professional certification we wanted to
bring to Jenkins. We knew it would represent a substantial investment but we
also knew that the whole Jenkins ecosystem would benefit. Whether at the overall
community or individual level, as well as IT organizations, system integrators
or recruiting firms looking for qualified Jenkins personnel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have had the privilege to supervise the creation and implementation of the
&lt;a href=&quot;https://www.cloudbees.com/jenkins-certification&quot;&gt;Jenkins Certification Program&lt;/a&gt;
at CloudBees. The program is comprised of two certifications: &quot;Certified Jenkins
Engineer&quot; (CJE) for Jenkins certification, and Certified CloudBees Jenkins
Platform Engineer (CCJPE) for certification on the CloudBees Jenkins Platform.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We started by creating a Certification Advisory Board whose members are:
&lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;, Jenkins creator and CTO at
CloudBees; &lt;a href=&quot;https://github.com/harpreetsingh&quot;&gt;Harpreet Singh&lt;/a&gt;, VP Products at
CloudBees; &lt;a href=&quot;https://github.com/olivergondza&quot;&gt;Oliver Gondža&lt;/a&gt;, initially
representing the Jenkins community; &lt;a href=&quot;https://twitter.com/jsin&quot;&gt;Jason Shawn&lt;/a&gt;,
senior director DevOps at Ellucian, representing the CloudBees customer
constituency; and &lt;a href=&quot;https://twitter.com/alvarezjj1&quot;&gt;Jose Alvarez&lt;/a&gt;,
managing director at Zivra, representing the CloudBees partner ecosystem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This dedicated group helped us first to create the certification blueprint which
defines the main sections of the exam and their relative importance in the
overall scoring. This blueprint also provides the high-level table of contents
of the certification
&lt;a href=&quot;https://www.cloudbees.com/sites/default/files/cje_study_guide_final.pdf&quot;&gt;study guides&lt;/a&gt;.
They also helped to define the Jenkins Engineer profile that the certification
assesses.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With this blueprint in hand, we put together a team of 40 Jenkins subject-matter
experts (SMEs), mostly from CloudBees with a few from partners. Together they
worked for several months on the creation of hundreds of exam questions, doing
iterative peer reviews, filtering out any irrelevant or ambiguous questions and
narrowing down the pool of questions to the best questions for each section.
All this, plus a thorough analysis and balancing exercise to make sure the level
of difficulty was evenly distributed across each section of the exam.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The big lesson from the exam creation experience is that creating a
professional-grade exam is hard! And it requires very specific experience. In
short, being a subject-matter expert is definitely not enough and we’re glad to
have collaborated with &lt;a href=&quot;https://www.prometric.com/&quot;&gt;Prometric&lt;/a&gt;&#39;s
certification specialists who guided us through this process. The result is
definitely worth the effort. Either of the two certifications offered within the
Jenkins Certification Program are truly what we would consider
&quot;professional-grade certifications.&quot;&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-certification-get-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-does-certification-get-you&quot; /&gt;What does certification get you?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Getting certified means being recognized for your skills and experience as a
Jenkins professional. However, like any exam-based recognition, its actual value
depends on three criteria: the level of difficulty of the exam, its quality and
its integrity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As far as &lt;strong&gt;difficulty&lt;/strong&gt; is concerned, it is clear that not everyone will pass and
that is expected from a professional-grade certification, as mentioned earlier.
We have definitely created an exam that is demanding. It does not only measure
your theoretical knowledge of Jenkins but also your hands-on practical
experience. To ensure its &lt;strong&gt;quality&lt;/strong&gt;, we have applied best-industry practices
regarding the exam’s creation and review process, working with certification
specialists. It includes the weighing of questions, the distribution of easy,
medium and difficult ones, the removal of any ambiguous wording, as well as
alpha and beta final test procedures, in order to only keep the most appropriate
questions. We are also putting in place a formal maintenance process to capture
any &quot;bug&quot; in the exam and adapt the questions to Jenkins evolutions over time.
Last but not least, we ensure the exam’s &lt;strong&gt;integrity&lt;/strong&gt; by working with Prometric
for the administration of exams. Tests are taken in fully secured and proctored
test rooms, without any access to any human or electronic resource and
without any doubt about who takes the test. Thanks to Prometric’s hundreds
of test centers around the world, this integrity is ensured in any location.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beyond this external recognition, getting certified is also a process that lets
you take a step back from your day-to-day practice of Jenkins and assess your
skills and knowledge. You start this reassessment process by reading the Study
Guides for the certifications. Then, by taking the test itself, you can identify
your strengths and weaknesses in a very practical way. In short, a certification
gives you a measurable goal to achieve.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Click &lt;a href=&quot;https://www.cloudbees.com/jenkins-certification&quot;&gt;here&lt;/a&gt; for more
information on the Jenkins Certification Program by CloudBees.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/03/11/new-jenkins-20-preview/</id>
<title>Jenkins 2.0-alpha-3 Preview Build has been released!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-03-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/03/11/new-jenkins-20-preview/" />
<author>
<name>daniel-beck</name>
</author>
<category term='jenkins2'></category>
<summary>
We just published the new Jenkins 2.0-alpha-3 preview build.


What&#8217;s new?




Jenkins is now secure out of the box:
Administrators previously had to set up authentication and authorization
while Jenkins was accessible to anyone on the same network.  Now, Jenkins is
protected out of the box, so that it is always safe from unauthorized
access.











Plugin selection for setup:
We refined the plugin selection on the setup dialog.
You&#8217;ve always wondered why Jenkins does not install the Git Plugin by default?
Now it does, along with a number of other plugins popular in the Jenkins community.
We&#8217;re also including more plugins complementing the
Pipeline plugin:
The
Pipeline
Stage View plugin lets you quickly see...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just published the new Jenkins 2.0-alpha-3 preview build.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-new&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-new&quot; /&gt;What’s new?&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;Jenkins is now secure out of the box&lt;/strong&gt;:
Administrators previously had to set up authentication and authorization
while Jenkins was accessible to anyone on the same network.  Now, Jenkins is
protected out of the box, so that it is always safe from unauthorized
access.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/alpha3/alpha3_unlock.png&quot; alt=&quot;Unlock Jenkins&quot; width=&quot;500&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 selection for setup&lt;/strong&gt;:
We refined the plugin selection on the setup dialog.
You’ve always wondered why Jenkins does not install the Git Plugin by default?
Now it does, along with a number of other plugins popular in the Jenkins community.
We’re also including more plugins complementing the
&lt;a href=&quot;https://www.jenkins.io/solutions/pipeline&quot;&gt;Pipeline plugin&lt;/a&gt;:
The
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pipeline+Stage+View+Plugin&quot;&gt;Pipeline
Stage View&lt;/a&gt; plugin lets you quickly see what’s going on in your CD pipeline,
and the &lt;a href=&quot;https://github.com/jenkinsci/github-organization-folder-plugin#github-organization-folder&quot;&gt;GitHub
Organization Folder&lt;/a&gt; will automatically scan your GitHub organization for
repositories with Pipeline definitions (e.g. &lt;code&gt;Jenkinsfile&lt;/code&gt;), and set up jobs for those.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/alpha3/alpha3_suggested_plugins.png&quot; alt=&quot;Install suggested plugins&quot; width=&quot;500&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;Redesigned job configuration forms&lt;/strong&gt;:
The job configuration form has been redesigned so its structure is visually
clear when showing complex configuration forms.  Additionally, the tabs on
the top of the page show where you are, and can be used to quickly navigate
between the different sections of the configuration form.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/post-images/alpha3/alpha3_configuration.png&quot; alt=&quot;Job configuration&quot; width=&quot;500&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;download-now&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#download-now&quot; /&gt;Download now!&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://www.jenkins.io/2.0/&quot;&gt;Get Jenkins 2.0 alpha 3 now&lt;/a&gt;, and tell us what you think:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you use Twitter, you can leave us some feedback
&lt;a href=&quot;https://twitter.com/intent/tweet?text=@jenkinsci%20I%20think%20%23jenkins2%20is%20&quot;&gt;on
Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our
&lt;a href=&quot;https://groups.google.com/group/jenkinsci-users/topics&quot;&gt;jenkinsci-users@&lt;/a&gt;
mailing list is also available for feedback in
&lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-users/fEWFVUj0UVY/GbG0ChvkIgAJ&quot;&gt;this
thread&lt;/a&gt;..&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And of course, since this is a preview release, if you find any issues please
report them on our
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Issue+Tracking&quot;&gt;Issue Tracker&lt;/a&gt;
to the &lt;strong&gt;JENKINS&lt;/strong&gt; project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have a list of
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/2.0+Errata&quot;&gt;known issues&lt;/a&gt; on
our wiki but if you’re not sure whether you’re experiencing a known issue or
not, don’t hesitate to ask!&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/2016/03/03/gsoc2016-announcement/</id>
<title>Jenkins joins the Google Summer of Code 2016</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-03-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/03/03/gsoc2016-announcement/" />
<author>
<name>oleg_nenashev</name>
</author>
<category term='general'></category>
<category term='jenkins2'></category>
<category term='gsoc'></category>
<summary>
We are happy to announce that Jenkins project application has been accepted to
Google Summer of Code 2016 (GSoC). Thanks
to everybody who helped prepare the application and submitted project ideas!


We would like to invite students to join the Jenkins community and work together
on the ongoing Jenkins 2.0 activities and other medium-term projects.


The student projects we are primarily interested in would improve the overall
Jenkins user experience in a number of different aspects. This includes user
interface changes and stability improvements but also major new features such
as Pipeline as code.


The projects we&#8217;ve suggested revolve around all parts of the Jenkins project:
core, plugins, website and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are happy to announce that Jenkins project application has been accepted to
&lt;a href=&quot;https://developers.google.com/open-source/gsoc/timeline&quot;&gt;Google Summer of Code 2016&lt;/a&gt; (GSoC). Thanks
to everybody who helped prepare the application and submitted project ideas!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We would like to invite students to join the Jenkins community and work together
on the ongoing &lt;a href=&quot;https://www.jenkins.io/2.0&quot;&gt;Jenkins 2.0&lt;/a&gt; activities and other medium-term projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The student projects we are primarily interested in would improve the overall
Jenkins user experience in a number of different aspects. This includes user
interface changes and stability improvements but also major new features such
as &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/2.0+Pipeline+as+Code&quot;&gt;Pipeline as code&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The projects we’ve suggested revolve around all parts of the Jenkins project:
core, plugins, website and our internal automation infrastructure. More details
on what has been suggested can be found &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016#GoogleSummerOfCode2016-Projectideas&quot;&gt;on the
wiki&lt;/a&gt;
which include:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins web interface improvements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Update Center 2.0&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New generation of the fingerprinting engine&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;External workspace manager&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integration of &lt;a href=&quot;https://www.jenkins.io/solutions/docker/&quot;&gt;Docker plugins&lt;/a&gt; with Jenkins 2.0 features&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugins for Electronic Design Automation and Embedded tools integration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improvements of the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Support+Core+Plugin&quot;&gt;Support&lt;/a&gt; plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improvements to Jenkins project infrastructure: core infra, website, plugin documentation and more&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;if-you-are-a-student&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#if-you-are-a-student&quot; /&gt;If you are a student:&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;Check out the project ideas &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016#GoogleSummerOfCode2016-Projectideas&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select an interesting project idea or draft your own proposal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are not familiar with Jenkins, we highly recommend trying it out with one of your previous projects. You can also try available Jenkins features from the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016#GoogleSummerOfCode2016-Projectideas&quot;&gt;project ideas&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Introduce yourself the community and start your project proposal discussion (see the guidelines &lt;a href=&quot;https://summerofcode.withgoogle.com/organizations/5668199471251456/&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Join us at &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016#GoogleSummerOfCode2016-Forinterestedstudents&quot;&gt;GSoC office hours&lt;/a&gt;. We plan to have two meetings starting on March 7th.&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;if-you-want-to-be-a-mentor&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#if-you-want-to-be-a-mentor&quot; /&gt;If you want to be a mentor:&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;Feel free to team up with other mentors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We accept extra project proposals from mentors until March 9th.&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;links&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#links&quot; /&gt;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://summerofcode.withgoogle.com/organizations/5668199471251456/&quot;&gt;Jenkins project page&lt;/a&gt; on the GSoC2016 website&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Summer+Of+Code+2016&quot;&gt;GSoC2016 page&lt;/a&gt; on our wiki&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/jenkinsci/status/704384831124209664&quot;&gt;Announcement in Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/03/02/toulousejam-hackergarten/</id>
<title>Jenkins Hackergarten : mercredi 9 mars 2016 à Toulouse</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-03-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/03/02/toulousejam-hackergarten/" />
<author>
<name>batmat</name>
</author>
<category term='hackergarten'></category>
<category term='jam'></category>
<category term='meetup'></category>
<summary>
Vous êtes développeuse ou développeur, vous avez envie de découvrir le projet
Jenkins de l&#8217;intérieur, en bricolant sur un sujet qui vous intéresse, lisez
la suite !


Mercredi 9 mars, le Toulouse Jenkins Area Meetup
organise à Toulouse un Hackergarten Jenkins, occasion idéale pour faire ses
premiers pas dans la communauté assisté(e) d&#8217;un contributeur au projet.


Hackergart quoi ?


Hackergarten est un mot qui provient de la contraction des mots Hacker et
Kindergarten, ce dernier étant le mot allemand qui désigne en gros l&#8217;école
maternelle.




Comment ça va se passer ?


En partenariat avec le Toulouse Java User Group
(c&#8217;est sur ce lien qu&#8217;il faut s&#8217;inscrire), nous nous donnons rendez-vous à
partir de...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vous êtes développeuse ou développeur, vous avez envie de découvrir le projet
Jenkins de l’intérieur, en bricolant sur un sujet qui vous intéresse, lisez
la suite !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mercredi 9 mars, le &lt;a href=&quot;https://www.meetup.com/fr-FR/Toulouse-Jenkins-Area-Meetup/events/228709190/&quot;&gt;Toulouse Jenkins Area Meetup&lt;/a&gt;
organise à Toulouse un Hackergarten Jenkins, occasion idéale pour faire ses
premiers pas dans la communauté assisté(e) d’un contributeur au projet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;hackergart-quoi&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hackergart-quoi&quot; /&gt;&lt;em&gt;Hackergart&lt;/em&gt; quoi ?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hackergarten est un mot qui provient de la contraction des mots &lt;em&gt;Hacker&lt;/em&gt; et
&lt;em&gt;Kindergarten&lt;/em&gt;, ce dernier étant le mot allemand qui désigne en gros l’école
maternelle.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;comment-ça-va-se-passer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#comment-ça-va-se-passer&quot; /&gt;Comment ça va se passer ?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En partenariat avec le &lt;a href=&quot;https://www.meetup.com/fr-FR/Toulouse-Java-User-Group/events/228708579/&quot;&gt;Toulouse Java User Group&lt;/a&gt;
(c’est sur ce lien qu’il &lt;strong&gt;faut&lt;/strong&gt; s’inscrire), nous nous donnons rendez-vous à
partir de 18h30 dans les locaux de l’Epitech Toulouse, chacun avec son
ordinateur (non fourni), et on commence à jouer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Et c’est bien sûr &lt;strong&gt;gratuit et ouvert à tous&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Un &lt;a href=&quot;https://trello.com/b/fpT5dJqS/toulousejam-hackergarten-february-2016&quot;&gt;tableau trello a été initialisé&lt;/a&gt;
pour tenter de s’organiser un peu. La liste des choses à faire n’est pas du
tout figée, et les idées sont les bienvenues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les commentaires sont ouverts à tous, et l’accès sera donné à quiconque en fait
la demande (façon communauté Jenkins :-)).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;goodies&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#goodies&quot; /&gt;Goodies !&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Grâce à l’aide de CloudBees, on a pas mal de goodies à offrir : stickers,
badges, t-shirts et bobble-heads !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;les-bobble-heads-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#les-bobble-heads-jenkins&quot; /&gt;Les Bobble Heads Jenkins&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2878/9725573715_fa056b6652_n.jpg&quot; alt=&quot;9725573715 fa056b6652 n&quot; /&gt;
Nous en avons 2 ! Et ceux-ci
seront &lt;strong&gt;offerts au deux premiers participants à voir leur pull-request
envoyée pendant la soirée &lt;em&gt;mergée&lt;/em&gt;&lt;/strong&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;que-faire-pour-se-préparer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#que-faire-pour-se-préparer&quot; /&gt;Que faire pour (se) préparer ?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si vous n’en avez pas, créez-vous un compte pour les services suivants :&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://accounts.jenkins.io&quot;&gt;Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/join&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://trello.com/signup&quot;&gt;Trello&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;Au niveau machine, idéalement, vous avez :&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;Git&lt;/code&gt; et &lt;code&gt;Maven&lt;/code&gt; bien installés&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Docker&lt;/code&gt; installé (natif sous Linux), ou via
&lt;a href=&quot;https://www.docker.com/products/docker-toolbox&quot;&gt;Docker Toolbox&lt;/a&gt; pour
les autres OS&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Des informations plus précises seront normalement données très bientôt aux
inscrits via &lt;em&gt;&lt;a href=&quot;https://www.meetup.com/fr-FR/Toulouse-Java-User-Group/events/228708579/&quot;&gt;meetup&lt;/a&gt;&lt;/em&gt; quant à la préparation des machines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;quels-langages-faut-il-connaître&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#quels-langages-faut-il-connaître&quot; /&gt;Quel(s) langage(s) faut-il connaître ?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Idéalement, puisque Jenkins est écrit en Java, il serait souhaitable que vous
 connaissiez au moins les bases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Toutefois, même si par exemple vos compétences sont plutôt côté Web, il y aura
aussi des choses à faire, que ce soit jouer avec le
&lt;a href=&quot;https://trello.com/c/imxNcDEj/1-new-website&quot;&gt;nouveau site en préparation&lt;/a&gt;,
ou ajouter une &lt;a href=&quot;https://trello.com/c/07doPalc/2-statistics&quot;&gt;page web câblée
sur certains fichiers json des statistiques&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Connaître au moins les bases de Git sera un gain de temps, mais ce n’est pas
indispensable.&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;récapitulatif&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#récapitulatif&quot; /&gt;Récapitulatif&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.meetup.com/Toulouse-Java-User-Group/events/228708579/?&amp;lt;em&amp;gt;locale=fr-FR&quot;&gt;Pour s’inscrire (indiquez Jenkins à la question posée au _RSVP&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;p&gt;le &lt;a href=&quot;https://trello.com/b/fpT5dJqS/toulousejam-hackergarten-february-2016&quot;&gt;tableau Trello dédié aux activités de la soirée&lt;/a&gt; (demandez l’accès !)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cf. ci-dessus pour les choses à installer sur votre machine&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;N’hésitez pas : l’ambiance est accueillante, et on offre les pizzas !&lt;/p&gt;
&lt;/li&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/02/29/jenkins2-alphas/</id>
<title>Jenkins 2.0 alphas released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-02-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/02/29/jenkins2-alphas/" />
<author>
<name>rtyler</name>
</author>
<category term='core'></category>
<category term='jenkins2'></category>
<summary>
After first
announcing the
Jenkins 2.0 effort last fall, we are pleased to announce the availability of
the first Jenkins 2.0 alpha builds. For months we have had builds
available from the jenkins_2.0
branch of development, but the "alpha" builds mark Jenkins 2.0 being
officially made available for testing and feedback.


Download 2.0-alpha now







Jenkins 2.0 Highlights


Pipeline as Code

The new Pipeline functionality in Jenkins allows you
to define configuration as code, which can be checked in and version controlled
along with the rest of your project&#8217;s source code.







Defining your pipeline&#8217;s configuration as code makes it easier to create a
simple "build and test" pipeline, while enabling more advanced and complex
pipelines through...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After first
&lt;a href=&quot;https://www.jenkins.io/blog/2015/10/01/upcoming-in-office-hours-jenkins-2-0/&quot;&gt;announcing the
Jenkins 2.0 effort&lt;/a&gt; last fall, we are pleased to announce the availability of
the first Jenkins &lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;2.0 &lt;strong&gt;alpha&lt;/strong&gt; builds&lt;/a&gt;. For months we have had builds
available from the &lt;a href=&quot;https://ci.jenkins.io/job/Core/job/jenkins/&quot;&gt;jenkins_2.0&lt;/a&gt;
branch of development, but the &quot;alpha&quot; builds mark &lt;a href=&quot;https://www.jenkins.io/2.0&quot;&gt;Jenkins 2.0&lt;/a&gt; being
officially made available for testing and feedback.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/2.0/&quot;&gt;Download 2.0-alpha now&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.jenkins.io/2.0/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/getting-started-setup.png&quot; alt=&quot;Getting Started with Jenkins 2.0&quot; width=&quot;550&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;jenkins-2-0-highlights&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jenkins-2-0-highlights&quot; /&gt;Jenkins 2.0 Highlights&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;pipeline-as-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#pipeline-as-code&quot; /&gt;Pipeline as Code&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new &lt;a href=&quot;https://www.jenkins.io/solutions/pipeline&quot;&gt;Pipeline&lt;/a&gt; functionality in Jenkins allows you
to define configuration as code, which can be checked in and version controlled
along with the rest of your project’s source code.&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/hello-world-pipeline.png&quot; alt=&quot;A simple build/test pipeline&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Defining your pipeline’s configuration as code makes it easier to create a
simple &quot;build and test&quot; pipeline, while enabling more advanced and complex
pipelines through the expressive Groovy-based domain specific language.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;out-of-the-box-experience&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#out-of-the-box-experience&quot; /&gt;Out of the box experience&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For new users, Jenkins 2.0 starts off with set of recommended plugins, seen in
the image above,  to help get you started with the right set of tools to get up
and running with Jenkins quickly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the more adventurous users, the Jenkins 2.0 initial setup process
also allows you to pick and choose exactly the plugins you want to meet
your specific needs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;totally-backwards-compatible&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#totally-backwards-compatible&quot; /&gt;Totally backwards compatible&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 2.0 is a drop-in replacement of the Jenkins 1.x series of releases
and fully backward compatible. There will be practically no reason &lt;em&gt;not&lt;/em&gt; to
upgrade once 2.0 is released in the next couple of months.&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;tell-us-what-you-think&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tell-us-what-you-think&quot; /&gt;Tell us what you think!&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re very interested in your feedback on what you think of the Jenkins 2.0
preview releases.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you use Twitter, you can leave us some feedback
&lt;a href=&quot;https://twitter.com/intent/tweet?text=@jenkinsci%20I%20think%20%23jenkins2%20is%20&quot;&gt;on
Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our &lt;a href=&quot;https://groups.google.com/group/jenkinsci-users/topics&quot;&gt;jenkinsci-users&lt;/a&gt;
mailing list is also available for feedback in
&lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-users/fEWFVUj0UVY/GbG0ChvkIgAJ&quot;&gt;this thread&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And of course, since this is a preview release, if you find any issues please
report them to our
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Issue+Tracking&quot;&gt;issue tracker&lt;/a&gt;
to the &lt;strong&gt;JENKINS&lt;/strong&gt; project.&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/2016/02/24/jenkins-security-update/</id>
<title>Jenkins security updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-02-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/02/24/jenkins-security-update/" />
<author>
<name>daniel-beck</name>
</author>
<category term='core'></category>
<category term='security'></category>
<summary>
We released Jenkins updates today that include important security fixes: 1.650 and 1.642.2. For detailed information about the security content of these updates, see the security advisory.


Subscribe to the jenkinsci-advisories mailing list to receive important notifications related to Jenkins security....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We released Jenkins updates today that include important security fixes: 1.650 and 1.642.2. For detailed information about the security content of these updates, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2016-02-24/&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Subscribe to the &lt;a href=&quot;https://www.jenkins.io/content/mailing-lists&quot;&gt;jenkinsci-advisories mailing list&lt;/a&gt; to receive important notifications related to Jenkins security.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/02/19/january-2016-sf-jam/</id>
<title>January 2016 San Francisco JAM Report</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-02-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/02/19/january-2016-sf-jam/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
On January 20, the first San Francisco JAM
(Jenkins Area Meetup)
of the new year was held at Mesosphere’s offices.
We had two speakers - myself, and Roger Ignazio, an infrastructure automation
engineer at Mesosphere. Around forty people attended and enjoyed the food and
drinks Mesosphere provided for us.


Links to the talks are below:




Elastic
Jenkins with Mesos and DCOS, by Roger
Ignazio


Who is Jenkins?,
by Andrew Bayer




More JAMs will be happening in the coming months - for example, the first
Los Angeles JAM is
tentatively planned for early March, 2016! You can always find out the latest
on JAMs around the world at the
Jenkins Area Meetup page....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On January 20, the first San Francisco JAM
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;(Jenkins Area Meetup)&lt;/a&gt;
of the new year was held at &lt;a href=&quot;https://mesosphere.com/&quot;&gt;Mesosphere&lt;/a&gt;’s offices.
We had two speakers - myself, and Roger Ignazio, an infrastructure automation
engineer at Mesosphere. Around forty people attended and enjoyed the food and
drinks Mesosphere provided for us.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Links to the talks are below:&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.slideshare.net/mesosphere/elastic-jenkins-with-mesos-and-dcos-2016-0120&quot;&gt;Elastic
Jenkins with Mesos and DCOS&lt;/a&gt;, by &lt;a href=&quot;https://twitter.com/rogerignazio&quot;&gt;Roger
Ignazio&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.slideshare.net/andrewbayer/who-is-jenkins&quot;&gt;Who is Jenkins?&lt;/a&gt;,
by &lt;a href=&quot;https://twitter.com/abayer&quot;&gt;Andrew Bayer&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;More JAMs will be happening in the coming months - for example, the first
&lt;a href=&quot;https://www.meetup.com/Los-Angeles-Jenkins-Area-Meetup/&quot;&gt;Los Angeles JAM&lt;/a&gt; is
tentatively planned for early March, 2016! You can always find out the latest
on JAMs around the world at &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;the
Jenkins Area Meetup page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/02/06/scale14x-conference-report/</id>
<title>SCaLE 14x Conference Report</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-02-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/02/06/scale14x-conference-report/" />
<author>
<name>rtyler</name>
</author>
<category term='scale'></category>
<category term='meetup'></category>
<summary>
Historically January has always been a very big month for the Jenkins
community. Between FOSDEM
Southern California Linux Expo  (also known as
SCaLE) we seem to hand out more stickers during the last week in January than
any other week of the year.


This year&#8217;s SCaLE 14X conference finally outgrew the LAX Hilton in Los Angeles,
where it had been hosted in years past, and moved over to the Pasadena
Convention Center in Pasadena California. While the organizers of the
conference expanded their scope, so did the Jenkins project!


In addition to our normal Jenkins stickers, we also had some special edition stickers with special logos to give...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Historically January has always been a very big month for the Jenkins
community. Between &lt;a href=&quot;https://fosdem.org&quot;&gt;FOSDEM&lt;/a&gt;
&lt;a href=&quot;https://socallinuxexpo.org&quot;&gt;Southern California Linux Expo&lt;/a&gt;  (also known as
SCaLE) we seem to hand out more stickers during the last week in January than
any other week of the year.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year’s SCaLE 14X conference finally outgrew the LAX Hilton in Los Angeles,
where it had been hosted in years past, and moved over to the Pasadena
Convention Center in Pasadena California. While the organizers of the
conference expanded their scope, so did the Jenkins project!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to our normal Jenkins stickers, we also had some special edition stickers with &lt;a href=&quot;https://www.jenkins.io/artwork/&quot;&gt;special logos&lt;/a&gt; to give away this year, namely:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Angry Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;General Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Superhero Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Cute&quot; Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ninja Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To accompany the stickers we also had both blue Jenkins and red &quot;Angry Jenkins&quot;
pins. Savvy Jenkins users might recognize &quot;Angry Jenkins&quot; from the Jenkins
server’s internal 500 page; fortunately however very few people that came by
the booth to say &#39;hello&#39; were familiar with Angry Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;talking-points&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#talking-points&quot; /&gt;Talking Points&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aside from talking about the cool stickers and pins, we spent the vast
majority of time talking about Jenkins to two groups of people:&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;those who never had actually used Jenkins, even if they had heard of it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;users who knew plenty about Jenkins but hadn’t actually heard about some of
the &lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposals&quot;&gt;Jenkins 2.0 Proposals&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anecdotally, it seemed like most of the people that I talked to about &quot;Jenkins
2.0&quot; were pretty excited about the &lt;code&gt;Jenkinsfile&lt;/code&gt; idea and starting to define
their &lt;a href=&quot;https://www.jenkins.io/solutions/pipeline&quot;&gt;build processes and delivery pipelines as code&lt;/a&gt;
in their source repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Perhaps more importantly though, we spoke with many users about where Jenkins
is causing them pain or frustration. Speaking directly with users at events
like SCaLE or Jenkins Area Meetups is always fun, having a high-bandwidth
conversation about what we can do better and/or offering solutions/workarounds
to hopefully relieve some pain-points.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In one such case, a contributor approached me and complained that he had
emailed the developers&#39; mailing list and frustratingly never actually received
a response. Comically enough, neither of us were able to find the email he had
sent the mailing list (whoops!) but because of the dynamic nature of booth-duty
at SCaLE, we got him squared away with a repository to contribute a
&lt;a href=&quot;https://github.com/jenkinsci/jenkins-charm&quot;&gt;Jenkins Charm&lt;/a&gt; for the Juju
configuration management tool.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;jammin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#jammin&quot; /&gt;Jammin&#39;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Among the booth-duty highlights was meeting a few folks who were interested on
starting a southern California Jenkins meetup. Over the days following the
conference, and a brief discussion on the
&lt;a href=&quot;https://groups.google.com/d/msgid/jenkinsci-jam/a071f664-30ab-44eb-b65f-a6f19cfbfdf5%40googlegroups.com.&quot;&gt;jenkinsci-jam@
mailing list&lt;/a&gt;, and the
&lt;strong&gt;&lt;a href=&quot;https://www.meetup.com/Los-Angeles-Jenkins-Area-Meetup/&quot;&gt;Los Angeles
Jenkins Area Meetup&lt;/a&gt;&lt;/strong&gt; was born!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m looking forward to the meetup growing over the next couple months and
helping build a stronger local Jenkins community in Southern Califonia for the
other 51 weeks a year that SCaLE isn’t happening.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://socallinuxexpo.org&quot;&gt;SCaLE&lt;/a&gt; is one of my more favorite
open source conferences, the positive community in attendance, a kid-friendly
atmosphere (&quot;Game Night&quot; was a blast) and the broad spectrum of sessions
available make it a great way to spent the weekend in southern California.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We hope to see you there again next year!&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/01/27/jenkins-world-call-for-papers/</id>
<title>Jenkins World 2016: Call For Papers Is Open!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-01-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/01/27/jenkins-world-call-for-papers/" />
<author>
<name>alyssat</name>
</author>
<category term='jenkins world'></category>
<category term='event'></category>
<category term='jenkins'></category>
<summary>
This is a guest post by Alyssa Tong.
Alyssa works for CloudBees, helping to organize
Jenkins community events around the
world.








Planning is underway for Jenkins World, a major Jenkins event for developers,
release engineers and others interested in automation. The conference will be
held from September 13th to 15th in Santa Clara, California and is being
organized and sponsored in part by CloudBees.
Just like the "Jenkins User Conferences" before it, this year&#8217;s event will
feature many experts from the Jenkins community that help make Jenkins
the most popular open source automation server on the planet. We&#8217;ve found that
we outgrew the popular multi-city one-day Jenkins User Conferences, so unlike
previous...
</summary>
<content type='html'>
&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;em&gt;This is a guest post by &lt;a href=&quot;https://github.com/alyssat&quot;&gt;Alyssa Tong&lt;/a&gt;.
Alyssa works for &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;, helping to organize
Jenkins community events &lt;a href=&quot;https://www.meetup.com/pro/jenkins&quot;&gt;around the
world&lt;/a&gt;.&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://jenkins-cfp.herokuapp.com/events/jenkins-world-2016&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/Jenkins-World_125x125.png&quot; alt=&quot;Jenkins World 2016&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Planning is underway for &lt;strong&gt;Jenkins World&lt;/strong&gt;, a major Jenkins event for developers,
release engineers and others interested in automation. The conference will be
held from &lt;strong&gt;September 13th to 15th&lt;/strong&gt; in Santa Clara, California and is being
organized and sponsored in part by &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;.
Just like the &quot;Jenkins User Conferences&quot; before it, this year’s event will
feature many experts from the Jenkins community that help make Jenkins
the most popular open source automation server on the planet. We’ve found that
we outgrew the popular multi-city one-day Jenkins User Conferences, so unlike
previous years Jenkins World will be a three-day event in one place with an
incredible amount of great content.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The goal of the event is to bring Jenkins contributors and users of all levels
together, from around the world, to discuss, share and learn from one another.
Starting &lt;em&gt;today&lt;/em&gt; we’re opening the
&lt;strong&gt;&lt;a href=&quot;https://jenkins-cfp.herokuapp.com/events/jenkins-world-2016&quot;&gt;call for
proposals&lt;/a&gt;&lt;/strong&gt;. As a global event, users from all over the world are encouraged to
submit a talk between now and &lt;strong&gt;May 1st, 2016 (11:59pm PST)&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We look forward to receiving your amazing submission, and seeing you in Santa
Clara this fall.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://jenkins-cfp.herokuapp.com/events/jenkins-world-2016&quot;&gt;Submit a
proposal today!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/01/26/office-hour-javascript-development/</id>
<title>Office Hour: The State of JavaScript in Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-01-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/01/26/office-hour-javascript-development/" />
<author>
<name>daniel-beck</name>
</author>
<category term='office hours'></category>
<summary>
Tom Fennelly will host tomorrow&#8217;s office hour on JavaScript in Jenkins.
The intended audience for this presentation is core and plugin developers.
In his own words:




I believe strongly that we can make meaningful user experience improvements to Jenkins, but it will require having more weapons in our arsenal in terms of how we build plugins etc. This is what we&#8217;ll be talking about in this week&#8217;s office hour. It will be a developer-focused session where we&#8217;ll start off by talking a little about how UI development has traditionally been done in Jenkins, before moving on to some newer patterns and tools that...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tfennelly&quot;&gt;Tom Fennelly&lt;/a&gt; will host tomorrow’s office hour on JavaScript in Jenkins.
The intended audience for this presentation is core and plugin developers.
In his own words:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I believe strongly that we can make meaningful user experience improvements to Jenkins, but it will require having more weapons in our arsenal in terms of how we build plugins etc. This is what we’ll be talking about in this week’s office hour. It will be a developer-focused session where we’ll start off by talking a little about how UI development has traditionally been done in Jenkins, before moving on to some newer patterns and tools that we have been developing over the last few months that let us make use of a wider range of more modern client-side development tools. We’ll also dissect and run some sample plugins that show these newer client-side dev tools in action.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As usual, the session will start 11am PST. Links to watch and participate will be posted to the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;Office Hours wiki page&lt;/a&gt; before it starts.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/01/10/beautiful-jenkins-dashboard/</id>
<title>A beautiful Jenkins dashboard</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-01-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/01/10/beautiful-jenkins-dashboard/" />
<author>
<name>kj187</name>
</author>
<category term='dashboard'></category>
<summary>
This is a guest post by Julian Kleinhans,
Software Architect at AOE, who is outlining some of the
Jenkins dashboard work he&#8217;s done with
dashing-js





Jenkins offers a handful of third party dashboards, but none of them are really
beautiful and flexible enough from my point of view. For example, I could not
find a solution which gives me the possibility to easily decide which data
should be display in the widget and which not. It also doesn`t have the
possibility to add additional widgets to the dashboard which have nothing to do
with Jenkins. So I came up with something interesting that includes Jenkins
data. But I cannot do...
</summary>
<content type='html'>
&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;
This is a guest post by &lt;a href=&quot;https://github.com/kj187&quot;&gt;Julian Kleinhans&lt;/a&gt;,
Software Architect at &lt;a href=&quot;https://www.aoe.com&quot;&gt;AOE&lt;/a&gt;, who is outlining some of the
Jenkins dashboard work he’s done with
&lt;a href=&quot;https://github.com/fabiocaseri/dashing-js&quot;&gt;dashing-js&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins offers a handful of third party dashboards, but none of them are really
beautiful and flexible enough from my point of view. For example, I could not
find a solution which gives me the possibility to easily decide which data
should be display in the widget and which not. It also doesn`t have the
possibility to add additional widgets to the dashboard which have nothing to do
with Jenkins. So I came up with something interesting that includes Jenkins
data. But I cannot do that with the existing built-in dashboards from Jenkins
plugins which are Jenkins-content specific.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So I decided to write a new, flexible and extensible dashboard. To avoid
re-inventing the wheel I also decided to use
&lt;a href=&quot;https://github.com/fabiocaseri/dashing-js&quot;&gt;dashing-js&lt;/a&gt; as a basis and not
Jenkins itself. dashing-js is a Node.js port of
&lt;a href=&quot;https://dashing.io/&quot;&gt;Dashing&lt;/a&gt;, a &lt;a href=&quot;https://sinatrarb.com&quot;&gt;Sinatra&lt;/a&gt;-based
framework that lets you build beautiful dashboards.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The key features of Dashing are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use pre-made widgets, or fully create your own with &lt;a href=&quot;https://sass-lang.com/&quot;&gt;Sass&lt;/a&gt;, HTML and &lt;a href=&quot;https://coffeescript.org/&quot;&gt;CoffeeScript&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Widgets harness the power of data bindings (via &lt;a href=&quot;https://web.archive.org/web/20160111000701/https://batmanjs.org/&quot;&gt;batman.js&lt;/a&gt;) to keep things &lt;a href=&quot;https://en.wikipedia.org/wiki/Don%27t_repeat_yourself&quot;&gt;DRY&lt;/a&gt; and simple&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the API to push data to your dashboards or make use of a simple Node.js script for fetching data&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Drag &amp;amp; drop interface for re-arranging your widgets&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The advantage over a native Java-based Jenkins plugin is that you don’t need to
know Java and the whole Java stack. You can also easily add other pre-made
third-party widgets, for example a GitHub Pull Request count widget or an AWS
statistic widget or whatever else. In other words, it is completely independent
of Jenkins. All you need is Node.js and the permission to access the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Remote+access+API&quot;&gt;Jenkins API&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beside dashing-js you will need my
&lt;a href=&quot;https://kj187.github.io/dashing-jenkins_job/&quot;&gt;Jenkins Job widget&lt;/a&gt;. It is a
generic widget for Jenkins jobs which provides a highly visible view of the
build status and build progress of selected Jenkins jobs. Via configuration it
is possible to add multiple widgets for different Jenkins jobs (as you can see
in the screenshot below).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, all you need is dashing-js, my Jenkins Job widget and some
&lt;a href=&quot;https://npmjs.org&quot;&gt;npm&lt;/a&gt; packages.  The installation and the setup is really
easy and can be found &lt;a href=&quot;https://kj187.github.io/dashing-jenkins_job/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Example&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/post-images/kj187_Dashboard_2_i4wkw6.png&quot; alt=&quot;Example&quot; width=&quot;550&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/01/07/official-code-of-conduct/</id>
<title>Jenkins Code of Conduct</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-01-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/01/07/official-code-of-conduct/" />
<author>
<name>rtyler</name>
</author>
<summary>
Over the past couple months, we have been working on a long overdue
Code of Conduct for the Jenkins project (meeting minutes
here
and
here).
Following in the footsteps of other projects like the
Apache Software
Foundation, Go lang and
countless others, we have adopted this
code of conduct to help set guidelines for what behaviors are acceptable, and
what behaviors are not, when acting within the Jenkins community or on behalf
of the Jenkins project.


I would like to extend our gratitude to the authors of
the Contributor Covenant who provided us
with a very good and mostly finished Code of Conduct template. We have
adapted the covenant to meet the unique needs of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past couple months, we have been working on a long overdue
&lt;a href=&quot;https://www.jenkins.io/project/conduct&quot;&gt;Code of Conduct&lt;/a&gt; for the Jenkins project (meeting minutes
&lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins-meeting/2015/jenkins-meeting.2015-12-09-19.01.html&quot;&gt;here&lt;/a&gt;
and
&lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins-meeting/2016/jenkins-meeting.2016-01-06-19.01.html&quot;&gt;here&lt;/a&gt;).
Following in the footsteps of other projects like the
&lt;a href=&quot;https://www.apache.org/foundation/policies/conduct.html&quot;&gt;Apache Software
Foundation&lt;/a&gt;, &lt;a href=&quot;https://golang.org/conduct&quot;&gt;Go lang&lt;/a&gt; and
&lt;a href=&quot;https://contributor-covenant.org/&quot;&gt;countless others&lt;/a&gt;, we have adopted this
code of conduct to help set guidelines for what behaviors are acceptable, and
what behaviors are not, when acting within the Jenkins community or on behalf
of the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to extend our gratitude to the authors of
&lt;a href=&quot;https://contributor-covenant.org/&quot;&gt;the Contributor Covenant&lt;/a&gt; who provided us
with a very good and mostly finished Code of Conduct template. We have
&lt;a href=&quot;https://www.jenkins.io/project/conduct&quot;&gt;adapted the covenant&lt;/a&gt; to meet the unique needs of a multifaceted
project like Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The document itself is broken down into three sections, all of which I
encourage you to read:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/project/conduct#code-of-conduct&quot;&gt;code of conduct&lt;/a&gt; itself&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/project/conduct#reporting&quot;&gt;Instructions on how to report problems&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/project/conduct#handling-of-violations&quot;&gt;An outline of how violations will be handled&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;Similar to many other process and philosophical documents in the Jenkins
project, the document is not etched in stone and is therefore intended to be
updated. If you’re interested in participating in the discussion about this,
and other topics around how the Jenkins project operates, I invite you to the
&lt;code&gt;#jenkins-community&lt;/code&gt; IRC channel on the &lt;a href=&quot;https://freenode.net&quot;&gt;Freenode
network&lt;/a&gt; or to our regularly scheduled
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Meeting+Agenda&quot;&gt;governance
meetings&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/01/05/new-website/</id>
<title>A new Jenkins website</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-01-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/01/05/new-website/" />
<author>
<name>rtyler</name>
</author>
<category term='www'></category>
<summary>
When I first started working on the Jenkins
website, then called by a different name, I selected
Drupal, an extensible content management system, to
get the job done. Like Jenkins itself, Drupal is easy to set up, install
plugins and authoring content is done in a web UI. For the past seven years Drupal
has served us well, but it is time to move on to something better suited for our needs.


The general requirements for something newer were:




Easy to edit and create content


Changes to content should be tracked and reviewable


Any Jenkins contributor should be able to participate


Support mixed content types




The consensus was that a statically-generated...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When &lt;a href=&quot;https://github.com/rtyler&quot;&gt;I&lt;/a&gt; first started working on the Jenkins
website, then called by a different name, I selected
&lt;a href=&quot;https://drupal.org&quot;&gt;Drupal&lt;/a&gt;, an extensible content management system, to
get the job done. Like Jenkins itself, Drupal is easy to set up, install
plugins and authoring content is done in a web UI. For the past seven years Drupal
has served us well, but it is time to move on to something better suited for our needs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The general requirements for something newer were:&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;Easy to edit and create content&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Changes to content should be tracked and reviewable&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Any Jenkins contributor should be able to participate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support mixed content types&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The consensus was that a statically-generated site, with raw content hosted on
GitHub, would meet the majority of the &quot;ease-of-use&quot; type requirements. The
remainder could be addressed depending on the implementation. A couple of years
ago I tried to rebuild the site with static content using
&lt;a href=&quot;https://github.com/jekyll/jekyll&quot;&gt;Jekyll&lt;/a&gt;, commonly used by
&lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt;, but the effort stalled as I ran
into challenges with the mixture of content types we need to manage (stories,
events, pages, people, etc).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Having recently discovered &lt;a href=&quot;http://awestruct.org/&quot;&gt;Awestruct&lt;/a&gt;, a more
versatile and sophisticated static-site generator that powers sites like
&lt;a href=&quot;https://asciidoctor.org&quot;&gt;asciidoctor.org&lt;/a&gt;, I ventured down that path.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To make a long story short, over the holiday break I finally pulled the trigger
and switched &lt;code&gt;jenkins-ci.org&lt;/code&gt; over to the new site. In fact, the page you’re
reading &lt;strong&gt;right now&lt;/strong&gt; was authored and published via our new
&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io&quot;&gt;jenkins static site&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you look at the bottom left-hand corner of this page
there is a link titled &quot;Improve this page&quot; which will take you directly to
GitHub to edit this post!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have many more improvements to come for the Jenkins website, which are
&lt;a href=&quot;https://issues.jenkins.io/secure/RapidBoard.jspa?rapidView=1&amp;amp;projectKey=WEBSITE&quot;&gt;tracked
in JIRA&lt;/a&gt;, but for now I invite members of the Jenkins community to help curate,
correct and create new blog posts and pages for &lt;code&gt;jenkins-ci.org&lt;/code&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkins-infra/jenkins.io&quot;&gt;Check it all out on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2016/01/04/jenkins-at-scale14x/</id>
<title>Jenkins at SCaLE 14x</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2016-01-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2016/01/04/jenkins-at-scale14x/" />
<author>
<name>rtyler</name>
</author>
<category term='meetup'></category>
<category term='jam'></category>
<summary>
For the past few years, a couple members of the Jenkins project have made the
trip to Los Angeles for the
Southern California Linux Expo.
Despite the name it&#8217;s a fairly broad open source technology conference and
since it is hosted prior to FOSDEM, it&#8217;s also a good
conference to get us in the open source mood after the holiday break.


Unlike previous years, when SCaLE was hosted at the LAX Hilton, this year it has
grown and moved to the
Pasadena Convention
Center. There, as with previous years, we&#8217;ll have a table in the expo hall with plenty of
stickers and perhaps some other forms of swag available for...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image right&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.socallinuxexpo.org/scale/14x&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/images/conferences/scale_14x.png&quot; alt=&quot;SCaLE 14x&quot; width=&quot;180&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the past few years, a couple members of the Jenkins project have made the
trip to Los Angeles for the
&lt;a href=&quot;https://www.socallinuxexpo.org/scale/14x&quot;&gt;Southern California Linux Expo&lt;/a&gt;.
Despite the name it’s a fairly broad open source technology conference and
since it is hosted prior to &lt;a href=&quot;https://fosdem.org&quot;&gt;FOSDEM&lt;/a&gt;, it’s also a good
conference to get us in the open source mood after the holiday break.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unlike previous years, when SCaLE was hosted at the LAX Hilton, this year it has
grown and moved to the
&lt;a href=&quot;https://www.socallinuxexpo.org/scale/14x/venue&quot;&gt;Pasadena Convention
Center&lt;/a&gt;. There, as with previous years, we’ll have a table in the expo hall with &lt;a href=&quot;https://twitter.com/kohsukekawa/status/662718638135181313&quot;&gt;plenty of
stickers&lt;/a&gt; and &lt;em&gt;perhaps&lt;/em&gt; some other forms of swag available for devotees to
collect.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The expo hall will be open January 23rd and January 24th, and a few Jenkins
contributors will be there to ask questions to, talk about CI/CD and hand out
stickers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally, &lt;a href=&quot;https://github.com/rtyler&quot;&gt;I&lt;/a&gt; have a presentation on
Saturday, January 23rd titled
&quot;&lt;a href=&quot;https://www.socallinuxexpo.org/scale/14x/presentations/continuous-delivery-infrastructure-jenkins&quot;&gt;Continuous
Delivery of Infrastructure with Jenkins&lt;/a&gt;&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Talk abstract&lt;/div&gt;
&lt;p&gt;&quot;&quot;
In this talk we will review continuous delivery concepts and put them into
practice by building a continuous delivery pipeline with Jenkins to test, stage
and deploy to infrastructure code to production. Reducing the effort, error
rate and time it takes to deploy a configuration to change to production means
less time fighting fires and more time doing what you want.
&quot;&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the talk I’ll be highlighting some of the positive, and negative,
patterns used by the &lt;a href=&quot;https://github.com/jenkins-infra&quot;&gt;Jenkins
infrastructure&lt;/a&gt; team to manage, test and deliver the Jenkins project’s own
infrastructure. Sort of a followup from my
&lt;a href=&quot;https://www.youtube.com/watch?v=3hqLGKa4QwA&quot;&gt;2014 PuppetConf talk&lt;/a&gt; about
migrating Jenkins infrastructure from controllerless
&lt;a href=&quot;https://puppetlabs.com&quot;&gt;Puppet&lt;/a&gt; to a
&lt;a href=&quot;https://docs.puppetlabs.com/pe/index.html&quot;&gt;Puppet Enterprise&lt;/a&gt; oriented
installation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re in the LA area, we hope to see you for &lt;a href=&quot;https://www.socallinuxexpo.org/scale/14x&quot;&gt;SCaLE 14X&lt;/a&gt; in Pasadena!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/21/december-jam-world-tour-toulouse-france/</id>
<title>December JAM World Tour: Toulouse, France</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/21/december-jam-world-tour-toulouse-france/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='jenkinsci'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
On December 15, the Toulouse
JAM
was co-hosted with the Toulouse
JUG and Toulouse
DevOps. Indeed it made sense since Jenkins is
written in Java, makes use of Groovy code in many places (system groovy script,
job dsl, workflow&#8230;&#8203;), and it also made sense to co-organize with the local
DevOps community since Jenkins is also a great tool to enable Continuous
Integration, Continuous Delivery and automation in general. There were 103
RSVPs, with 80 to 90 people in attendance.


There were 3 talks planned for the evening:




Job DSL
Intro [fr], by Ghislain Mahieux



Video recording





Workflow plugin [fr], by Michaël Pailloncy (co-maintainer of the Build Trigger Badge plugin)



Video recording





Feedback on almost 10 years...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/sites/default/files/images/toulouse-jam_0.jpeg&quot; alt=&quot;toulouse jam 0&quot; width=&quot;150&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On December 15, the &lt;a href=&quot;https://www.meetup.com/Toulouse-Java-User-Group/events/226522097/?eventId=226522097&quot;&gt;Toulouse
JAM&lt;/a&gt;
was co-hosted with the &lt;a href=&quot;https://www.toulousejug.org/2015/11/06/jenkins.html&quot;&gt;Toulouse
JUG&lt;/a&gt; and &lt;a href=&quot;https://toulousedevops.org/&quot;&gt;Toulouse
DevOps&lt;/a&gt;. Indeed it made sense since Jenkins is
written in Java, makes use of Groovy code in many places (system groovy script,
job dsl, workflow…​), and it also made sense to co-organize with the local
DevOps community since Jenkins is also a great tool to enable Continuous
Integration, Continuous Delivery and automation in general. There were 103
RSVPs, with 80 to 90 people in attendance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were 3 talks planned for the evening:&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://fr.slideshare.net/gmahieux/jenkins-job-dsl-plugin-56347061&quot;&gt;Job DSL
Intro&lt;/a&gt; [fr], by &lt;a href=&quot;https://twitter.com/ghislainmahieux&quot;&gt;Ghislain Mahieux&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ddxoOaSDQCE&quot;&gt;Video recording&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://mpailloncy.github.io/presentations/jenkins-workflow-plugin/index.html&quot;&gt;Workflow plugin&lt;/a&gt; [fr], by &lt;a href=&quot;https://twitter.com/mpailloncy&quot;&gt;Michaël Pailloncy&lt;/a&gt; (co-maintainer of the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Build+Trigger+Badge+Plugin&quot;&gt;Build Trigger Badge plugin&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=_f16qTAAMYs&quot;&gt;Video recording&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://batmat.github.io/presentations/rex-forge-2015/prez.html&quot;&gt;Feedback on almost 10 years of CI and what’s upcoming&lt;/a&gt; [fr], demo with &lt;a href=&quot;https://twitter.com/bmathus/status/677271839282999297&quot;&gt;Jenkins build scaling with Docker Swarm&lt;/a&gt;, by &lt;a href=&quot;https://twitter.com/bmathus&quot;&gt;Baptiste Mathus&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=AB-OBl1hAPs&quot;&gt;Video recording&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://goo.gl/photos/1Usd96trfreFnWrZ8&quot;&gt;Photos can be found here&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/18/join-us-at-the-jenkins-2-0-contributor-summit/</id>
<title>Join us at the Jenkins 2.0 Contributor Summit!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/18/join-us-at-the-jenkins-2-0-contributor-summit/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
As I mentioned in yesterday&#8217;s post, we&#8217;re planning a "Contributor Summit" on February 1st, after FOSDEM 2016 (January 30th/31st), to focus on Jenkins 2.0. Since many of us are already planning, the Monday following the event turned out to be the ideal time to discuss 2.0.








If you&#8217;re not already familiar with some of the key proposals that were put forth, you can review them in the Jenkins 2.0 proposals summery page.





We&#8217;ve hosted one or two Contributor Summits in the past, and they&#8217;re usually a day-long event where we try to gather a number of Jenkins core/plugin developers and active/power users...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/fosdem-2013.png&quot; alt=&quot;fosdem 2013&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I mentioned in &lt;a href=&quot;https://www.jenkins.io/content/fosdem-2016-travel-grant-program&quot;&gt;yesterday’s post&lt;/a&gt;, we’re planning a &quot;Contributor Summit&quot; on February 1st, after &lt;a href=&quot;https://fosdem.org/2016&quot;&gt;FOSDEM 2016&lt;/a&gt; (January 30th/31st), to focus on Jenkins 2.0. Since many of us &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/FOSDEM+2016&quot;&gt;are already planning&lt;/a&gt;, the Monday following the event turned out to be the ideal time to discuss 2.0.&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;
If you’re not already familiar with some of the key proposals that were put forth, you can review them in the &lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposals&quot;&gt;Jenkins 2.0 proposals summery page&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve hosted &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/203777932/&quot;&gt;one&lt;/a&gt; or &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/126595572/&quot;&gt;two&lt;/a&gt; Contributor Summits in the past, and they’re usually a day-long event where we try to gather a number of Jenkins core/plugin developers and active/power users to have detailed discussions around the theme of the summit. For this &quot;Jenkins 2.0 Contributor Summit&quot; we do not have a complete agenda yet, but we will post that to the &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/227463345/&quot;&gt;Meetup event&lt;/a&gt; once it is fully prepared in the next couple weeks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Suffice it to say, we’ll be discussing a lot!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;venue-and-rsvp&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#venue-and-rsvp&quot; /&gt;Venue and RSVP&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Contributor Summit will be hosted in a &lt;a href=&quot;https://cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; office at: &lt;a href=&quot;https://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;q=Rue+des+Colonies%2C+11%2C+Belgium%2C+be&quot;&gt;Rue des Colonies, 11, Brussels, Belgium&lt;/a&gt;. If you’re already planning on attending FOSDEM, the office is near Grand Place and Cafe Delerium (where the Friday beer event is hosted).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The venue is of limited size, so if you’re planning to join us, &lt;strong&gt;please&lt;/strong&gt; RSVP to &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/227463345/&quot;&gt;the Meetup event&lt;/a&gt; as soon as you’re certain you will be able to attend. If you find yourself unable to attend, please remove yourself from the list to ensure that we can fit as many active contributors into the office as possible!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/18/december-jam-world-tour-st-petersburg-russia/</id>
<title>December JAM World Tour: St. Petersburg, Russia </title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/18/december-jam-world-tour-st-petersburg-russia/" />
<author>
<name>alyssat</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='jenkinsci'></category>
<summary>
The first Jenkins meetup in Saint Petersburg, Russia took place on December
9th. The event has been organized with the help from Yandex and CloudBees.


In total there were about 80 attendees at the meetup. In addition to
meetup.com
the event has been promoted by Yandex so we quickly reached capacity limit.


There were 3 talks conducted, speakers from Yandex, ZeroTurnaround and
CloudBees. We discussed the current open-source project state, ongoing
activities in the community, Jenkins-powered CD case studies from
ZeroTurnaround and Jenkins plugin development approaches.




Intro slides [ru]


Who is Mr. Jenkins? Current State, common usage issues and trends in the community [ru], by Oleg Nenashev -  ...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/sites/default/files/images/stpetersburg-butler_0.jpeg&quot; alt=&quot;stpetersburg butler 0&quot; width=&quot;150&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.meetup.com/St-Petersburg-Jenkins-Meetup/events/226875933/&quot;&gt;first Jenkins meetup&lt;/a&gt; in Saint Petersburg, Russia took place on December
9th. The event has been organized with the help from &lt;a href=&quot;https://yandex.com/company/&quot;&gt;Yandex&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In total there were about 80 attendees at the meetup. In addition to
&lt;a href=&quot;https://www.meetup.com/St-Petersburg-Jenkins-Meetup/events/226875933/&quot;&gt;meetup.com&lt;/a&gt;
the event has been promoted by Yandex so we quickly reached capacity limit.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were 3 talks conducted, speakers from Yandex, ZeroTurnaround and
CloudBees. We discussed the current open-source project state, ongoing
activities in the community, Jenkins-powered CD case studies from
ZeroTurnaround and Jenkins plugin development approaches.&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://speakerdeck.com/onenashev/spb-jenkins-meetup-number-0-intro-slides&quot;&gt;Intro slides&lt;/a&gt; [ru]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/onenashev/spb-jenkins-meetup-number-0-who-is-mr-jenkins&quot;&gt;Who is Mr. Jenkins? Current State, common usage issues and trends in the community&lt;/a&gt; [ru], by &lt;a href=&quot;https://twitter.com/oleg_nenashev&quot;&gt;Oleg Nenashev&lt;/a&gt; -   [&lt;a href=&quot;https://events.yandex.ru/lib/talks/3302/&quot;&gt;video&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/onenashev/who-is-mr-jenkins-english-version&quot;&gt;English version&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/bsideup/spb-jenkins-meetup-number-0-jenkins-at-zeroturnaround&quot;&gt;Jenkins beyond CI. ZeroTurnaround’s experience&lt;/a&gt; [en], by &lt;a href=&quot;https://twitter.com/bsideup&quot;&gt;Sergei Egorov&lt;/a&gt; - [&lt;a href=&quot;https://events.yandex.ru/lib/talks/3304/&quot;&gt;video&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://speakerdeck.com/lanwen/spb-jenkins-meetup-number-0-kak-nachat-pisat-plaghin-dlia-jenkins-i-koghda-etogho-nie-dielat&quot;&gt;When to write your own plugin and when not to&lt;/a&gt; [ru], by &lt;a href=&quot;https://github.com/lanwen&quot;&gt;Kirill Merkushev&lt;/a&gt; - [&lt;a href=&quot;https://events.yandex.ru/lib/talks/3305/&quot;&gt;video&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Q&amp;amp;A Session [ru], all speakers - [&lt;a href=&quot;https://events.yandex.ru/lib/talks/3306/&quot;&gt;video&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;Check out where &lt;a href=&quot;https://www.meetup.com/pro/Jenkins/&quot;&gt;Jenkins Area Meetups&lt;/a&gt; (JAMs) are located in the world. Don’t see a JAM in your area? Why not start your own, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;here’s how&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/18/december-jam-world-tour-lima-peru/</id>
<title>December JAM World Tour:  Lima, Peru</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/18/december-jam-world-tour-lima-peru/" />
<author>
<name>alyssat</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='jenkinsci'></category>
<summary>
Although December is a short month due to the holidays, there has been a good
amount of local Jenkins activities that took place regardless of holiday
obligations. Today and tomorrow I will be doing a series of posts to summarize
December JAM World Tour. Special thanks to the JAM organizers and co-organizers
who made it all happen in these cities:




Lima, Peru


St.Petersburg, Russia


Toulouse, France


Bay Area, CA




On December 9 Lima JAM
hosted their first Jenkins meetup in Lima, Peru. There were attendance from
various roles of DevOps: Dev, QA, and Ops. There was also a good mixture of
different levels of Jenkins users, some were new and just starting...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/sites/default/files/images/peru-butler_0.jpeg&quot; alt=&quot;peru butler 0&quot; width=&quot;150&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Although December is a short month due to the holidays, there has been a good
amount of local Jenkins activities that took place regardless of holiday
obligations. Today and tomorrow I will be doing a series of posts to summarize
December JAM World Tour. Special thanks to the JAM organizers and co-organizers
who made it all happen in these cities:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Lima, Peru&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;St.Petersburg, Russia&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Toulouse, France&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bay Area, CA&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On December 9 &lt;a href=&quot;https://www.meetup.com/Lima-Jenkins-Area-Meetup/&quot;&gt;Lima JAM&lt;/a&gt;
hosted their first Jenkins meetup in Lima, Peru. There were attendance from
various roles of DevOps: Dev, QA, and Ops. There was also a good mixture of
different levels of Jenkins users, some were new and just starting to use
Jenkins while others had extensive Jenkins experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The group has been invited by Docker and Ansible meetup organizers for a joint
event in January to showcase technologies from Jenkins, Docker, and Ansible.
Congrats to Lima JAM group.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Slides from the meetup can be found
&lt;a href=&quot;https://speakerdeck.com/eddumelendez/peru-jam-intro&quot;&gt;here&lt;/a&gt;. Additional shared resources used in
the Lima JAM can be found &lt;a href=&quot;https://jenkinsperu.github.io/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check out where &lt;a href=&quot;https://www.meetup.com/pro/Jenkins/&quot;&gt;Jenkins Area Meetups&lt;/a&gt;
(JAMs) are located in the world. Don’t see a JAM in your area? why not start
your own, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;here’s
how&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/18/december-jam-world-tour-jenkins-developers-and-users-meetup-group-sf/</id>
<title>December JAM World Tour: Jenkins Developers and Users Meetup Group, SF</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/18/december-jam-world-tour-jenkins-developers-and-users-meetup-group-sf/" />
<author>
<name>alyssat</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='jenkinsci'></category>
<summary>
Thank you to Netflix for sponsoring the yummy
burrito bar and offered up their brand new auditorium to host Jenkins
Developers and Users Meetup group on Dec 16. We had 96 RSVPs which was
impressive. Our speaker for the evening was Akshay Dayal, Software Engineer at
Google. Akshay&#8217;s session was about Scaling Jenkins - how and why Google decided
to scale their existing Jenkins cluster (OSS) to meet their
security/availability and failover requirements and how heavy automation played
an important role in this effort.


The second talk was about how Google worked with Jenkins to read config data
externally. Slides are listed below. The video will be posted on...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;Jenkins Butler 0&quot; width=&quot;150&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to &lt;a href=&quot;https://www.netflix.com/&quot;&gt;Netflix&lt;/a&gt; for sponsoring the yummy
burrito bar and offered up their brand new auditorium to host Jenkins
Developers and Users Meetup group on Dec 16. We had 96 RSVPs which was
impressive. Our speaker for the evening was &lt;strong&gt;Akshay Dayal&lt;/strong&gt;, Software Engineer at
Google. Akshay’s session was about Scaling Jenkins - how and why Google decided
to scale their existing Jenkins cluster (OSS) to meet their
security/availability and failover requirements and how heavy automation played
an important role in this effort.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second talk was about how Google worked with Jenkins to read config data
externally. Slides are listed below. The video will be posted on &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/226844066/&quot;&gt;the meetup
page&lt;/a&gt;) once it becomes
available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Slides for the talks are linked below:&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.cloudbees.com/jenkins/juc-2015/presentations/JUC-2015-USWest-Scaling-Jenkins-Dayal.pdf&quot;&gt;Scaling Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://files.meetup.com/1695538/Jenkins%20ExternalProject.pdf&quot;&gt;External Project&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;Check out where &lt;a href=&quot;https://www.meetup.com/pro/Jenkins/&quot;&gt;Jenkins Area Meetups&lt;/a&gt;
(JAMs) are located in the world. Don’t see a JAM in your area? why not start
your own, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;here’s
how&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/17/fosdem-2016-travel-grant-program/</id>
<title>FOSDEM 2016 Travel Grant Program</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/17/fosdem-2016-travel-grant-program/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<summary>
While we are gearing up for FOSDEM 2016 early next year in Brussels, I wanted to remind the Jenkins community about our Travel Grant Program. We&#8217;re a little late on mentioning it, but the board has allocated the money to help Jenkins contributors travel to Brussels to participate in FOSDEM and the Jenkins Contributor Summit which we will be hosting the day after, Feb 1st, which we&#8217;ll discuss more in a later blog post.


For the FOSDEM Travel Grant Program, we are able to cover up to $500 (USD) in expenses to help community members participate in FOSDEM.


If you&#8217;re interested, please...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/fosdem-2013.png&quot; alt=&quot;fosdem 2013&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we are gearing up for &lt;a href=&quot;https://fosdem.org/2016/&quot;&gt;FOSDEM 2016&lt;/a&gt; early next year in Brussels, I wanted to remind the Jenkins community about our &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Travel+Grant+Program&quot;&gt;Travel Grant Program&lt;/a&gt;. We’re a little late on mentioning it, but the board has allocated the money to help Jenkins contributors travel to Brussels to participate in FOSDEM and the Jenkins Contributor Summit which we will be hosting the day after, Feb 1st, which we’ll discuss more in a later blog post.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the FOSDEM Travel Grant Program, we are able to cover up to $500 (USD) in expenses to help community members participate in FOSDEM.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested, please read the description of the program below. &lt;strong&gt;Please note that some of the details of the program are different from the linked grant program page&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regardless we hope to see you all at &lt;a href=&quot;https://fosdem.org/2016/&quot;&gt;FOSDEM&lt;/a&gt; on January 30th and 31st, 2016, in Brussels!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;eligibility&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#eligibility&quot; /&gt;Eligibility&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All community members are eligible for support unless they’ve received a travel grant within the last year (based on the event’s date). However, as we have very limited funds to support this program, we’ll prefer applications by active contributors to the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have other possible funding sources, please look to them first. This will allow more people to attend a Jenkins community event.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;application&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#application&quot; /&gt;Application&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The application process for FOSDEM, due to our poor timing, deviates from the traditional &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Travel+Grant+Program&quot;&gt;Travel Grant Program&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To apply for a travel grant, send an email with the following information to the &lt;a href=&quot;https://www.jenkins.io/project/board&quot;&gt;Governance Board&lt;/a&gt; at &lt;code&gt;jenkinsci-board@googlegroups.com&lt;/code&gt; before &lt;strong&gt;January 6th&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;Your name&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The event you’d like to attend&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The expected cost of travel (airfare, hotel, conference fees, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A description of your contributions to the Jenkins project, such as:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plugins you developed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pull requests you authored&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Documentation you wrote&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Public presentations on Jenkins-related topics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Why should we sponsor your trip?&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;applicants-responsibilities&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#applicants-responsibilities&quot; /&gt;Applicants Responsibilities&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve been selected for a travel grant, we’ll expect you to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Be available for a blog post about this program before the event.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help out at the Jenkins &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/FOSDEM+2016&quot;&gt;stand at FOSDEM&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If your schedule permits, we’d love to see you at the Jenkins 2.0 Contributor Summit the day after FOSDEM.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It should go without saying that we expect all Jenkins contributors representing the project at an event such as FOSDEM to act in a respectful and constructive manner. As we have not yet formally adopted our own &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Code+of+Conduct&quot;&gt;Code of Conduct&lt;/a&gt;, we recommend reviewing the &lt;a href=&quot;https://fosdem.org/2016/practical/conduct/&quot;&gt;FOSDEM Code of Conduct&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the trip, please submit a travel report to &lt;code&gt;jenkinsci-dev@googlegroups.com&lt;/code&gt; mailing list. This report should include the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;What you accomplished at the event&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What you learned at the event&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contacts you made&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Other useful information&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also expect you to submit your receipts via email to the person mentioned in the travel grant confirmation for review. We will reimburse actually incurred costs up to the 500 USD limit.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/16/workflow-best-practices-and-examples-repo-on-github/</id>
<title>Workflow Best Practices and Examples repo on GitHub</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/16/workflow-best-practices-and-examples-repo-on-github/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
A lot of people are using the Workflow plugin, but as with any scripting environment, users often have to start from scratch and learn the same lessons and shortcuts that other users have already learned. While there are blog posts from developers and users in various places, and some samples in the Workflow plugin documentation, more examples and tips and tricks are always, always useful. To help with that, we&#8217;ve created the workflow-examples repository on GitHub, as a place to store community-developed Workflow scripts that can help new users get started, show how to accomplish some non-trivial goals, and find...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A lot of people are using the &lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin/blob/master/README.md&quot;&gt;Workflow plugin&lt;/a&gt;, but as with any scripting environment, users often have to start from scratch and learn the same lessons and shortcuts that other users have already learned. While there are blog posts from developers and users in various places, and some samples in the Workflow plugin documentation, more examples and tips and tricks are always, always useful. To help with that, we’ve created the &lt;em&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-examples&quot;&gt;workflow-examples&lt;/a&gt;&lt;/em&gt; repository on GitHub, as a place to store community-developed Workflow scripts that can help new users get started, show how to accomplish some non-trivial goals, and find tips and trick for taking your Workflow pipeline to the next level.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The repository has four directories:&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;docs/&lt;/code&gt; - documentation, guides, and more. Including a &lt;a href=&quot;https://github.com/jenkinsci/workflow-examples/blob/master/docs/BEST_PRACTICES.md&quot;&gt;Best Practices document&lt;/a&gt;. We’d love to see more contributions to that doc, as well as any new ones that would be helpful to Workflow users!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;workflow-examples/&lt;/code&gt; - general Workflow examples, showing how to use a given plugin with Workflow, quirks of the Workflow DSL syntax, and more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;global-library-examples/&lt;/code&gt; - examples of how to write code for &lt;a href=&quot;https://github.com/jenkinsci/workflow-cps-global-lib-plugin&quot;&gt;the Workflow global library&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jenkinsfile-examples/&lt;/code&gt; - Sample &lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin/blob/master/TUTORIAL.md#creating-multibranch-projects&quot;&gt;Jenkinsfiles&lt;/a&gt; or other Workflow scripts from SCM .&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During &lt;a href=&quot;https://www.jenkins.io/content/hacksgiving-left-overs&quot;&gt;Hacksgiving&lt;/a&gt; some initial content was added, but not everything is covered yet, which is why I’m posting this - more is needed. We’d love to see your tips, examples, gotchas and more. If you’ve got Workflow scripts you’d like to contribute, please read the &lt;a href=&quot;https://github.com/jenkinsci/workflow-examples#introduction&quot;&gt;README&lt;/a&gt; and send a &lt;a href=&quot;https://github.com/jenkinsci/workflow-examples/pulls&quot;&gt;pull request&lt;/a&gt;. Thanks!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/09/security-updates-released-today/</id>
<title>Security updates released today</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/09/security-updates-released-today/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='jenkinsci'></category>
<summary>
We released Jenkins updates today that include important security fixes: 1.641 and 1.625.3. For detailed information about the security content of these updates, see the security advisory.


One of these fixes, SECURITY-95, results in possible problems in plugins such as Maven Plugin, Javadoc Plugin, and HTML Publisher Plugin, so make sure to read all about that in the documentation.


Please note that the update site may lag a bit behind. If you want to update as soon as possible, download the releases from our site....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We released Jenkins updates today that include important security fixes: 1.641 and 1.625.3. For detailed information about the security content of these updates, see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2015-12-09/&quot;&gt;security advisory&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of these fixes, SECURITY-95, results in possible problems in plugins such as &lt;strong&gt;Maven Plugin&lt;/strong&gt;, &lt;strong&gt;Javadoc Plugin&lt;/strong&gt;, and &lt;strong&gt;HTML Publisher Plugin&lt;/strong&gt;, so make sure to &lt;a href=&quot;https://www.jenkins.io/doc/book/system-administration/security/configuring-content-security-policy&quot;&gt;read all about that in the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please note that the update site may lag a bit behind. If you want to update as soon as possible, download the releases from our site.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/03/pipeline-as-code-with-multibranch-workflows-in-jenkins/</id>
<title>Pipeline-as-code with Multibranch Workflows in Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/03/pipeline-as-code-with-multibranch-workflows-in-jenkins/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
Note: This is a guest post by Kishore Bhatia. Kishore works for CloudBees, building custom frameworks with Open Source software and helping customers solve engineering problems around continuous delivery and DevOps at scale.



This year some great new Jenkins features came out of the butler&#8217;s goodie bag - amongst them, the most important one being the ability to realize continuous delivery pipeline as code!
The features like Workflow Multibranch, pipeline-as-code (with a marker file that Jenkins looks for in your application&#8217;s SCM repository/branch, aptly named Jenkinsfile) are the foundations to making Jenkins super intelligent to automagically create workflows (rather, a CI/CD pipeline)...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Note: This is a guest post by &lt;a href=&quot;https://github.com/kishorebhatia&quot;&gt;Kishore Bhatia&lt;/a&gt;. &lt;a href=&quot;https://twitter.com/BhatiaKishore&quot;&gt;Kishore&lt;/a&gt; works for &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;, building custom frameworks with Open Source software and helping customers solve engineering problems around continuous delivery and DevOps at scale.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year some great new Jenkins features came out of the butler’s goodie bag - amongst them, the most important one being the ability to realize &lt;a href=&quot;https://www.voxxed.com/blog/2015/06/kohsuke-kawaguchi-the-main-challenge-for-jenkins-is-with-itself/&quot;&gt;continuous delivery pipeline as code&lt;/a&gt;!
The features like Workflow Multibranch, pipeline-as-code (with a marker file that Jenkins looks for in your application’s SCM repository/branch, aptly named Jenkinsfile) are the foundations to making Jenkins super intelligent to automagically create workflows (rather, a CI/CD pipeline) to build your code and orchestrate the work required to drive your application from concept to delivery!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;overview&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#overview&quot; /&gt;Overview&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Workflow Multibranch feature (provided by the &lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin&quot;&gt;workflow plugin&lt;/a&gt;) provides the following key abilities:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Automatic Workflow (job) creation in Jenkins per new branch in the repo (assuming webhooks are registered from GH to Jenkins).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build specific to that child-branch and its unique scm change and build history.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic job pruning/deletion for branches deleted from the repository, according to the settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flexibility to individually configure branch properties, by overriding the parent properties, if required.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins pipeline-as-code (concept) enables you to maintain your CI/CD workflow logic in the project/application source code repo with no additional configuration to be maintained per branch in Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Workflow script to build/test/deploy your code is always synchronized with the rest of the source code you are working on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;To demonstrate the concept here&lt;/strong&gt; - Let’s use a basic Java Web application project with a Maven pom.xml as shown in the structure below (this is using GitHub as the SCM but you can do this on SVN or Mercurial too).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kishorebhatia/pipeline-as-code-demo&quot;&gt;This project&lt;/a&gt; has a marker file for Jenkins in the repo - &lt;code&gt;Jenkinsfile&lt;/code&gt;.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/pipeline-as-code-guest-blog/Pic1.png&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;So, what’s a Jenkinsfile?&lt;/strong&gt; The &lt;a href=&quot;https://github.com/kishorebhatia/pipeline-as-code-demo/blob/master/Jenkinsfile&quot;&gt;Jenkinsfile&lt;/a&gt; is essentially your Jenkins Workflow, a script, that defines the CI/CD pipeline logic for a project with steps to build/test/deploy etc. captured in various stages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So for our sample Java web application, a basic Jenkinsfile could be something like -&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;node {
   // Mark the code checkout &#39;stage&#39;....
   stage &#39;Checkout&#39;

   // Checkout code from repository
   checkout scm

   // Get the maven tool.
   // ** NOTE: This &#39;M3&#39; maven tool must be configured
   // **       in the global configuration.
   def mvnHome = tool &#39;M3&#39;

   // Mark the code build &#39;stage&#39;....
   stage &#39;Build&#39;
   // Run the maven build
   sh &quot;${mvnHome}/bin/mvn clean install&quot;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just having this file in the source code repo root would mean that -&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins will automatically recognize this branch and create appropriate jobs by itself.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quick, 1-step code checkout using: “checkout scm” in your workflow&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Every time a new change is pushed to this branch, the branch is built and the commit status gets updated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the branch is destroyed in the repository, or if Jenkinsfile is removed, the corresponding job gets destroyed from Jenkins automatically (&lt;em&gt;You can retain these jobs and/or archive the builds for audit/compliance requirements using the retention property - Orphan Item strategy&lt;/em&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&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;
there are various mechanisms to promote reuse of Workflow scripts, such as the &lt;a href=&quot;https://github.com/jenkinsci/workflow-cps-global-lib-plugin&quot;&gt;Workflow Global Library&lt;/a&gt;.
&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;required-jenkins-configuration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#required-jenkins-configuration&quot; /&gt;Required Jenkins configuration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Make sure you’ve the latest &lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin&quot;&gt;Workflow&lt;/a&gt; and (v1.11 as of writing this blog) Workflow Multibranch plugins installed on your Jenkins instance&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/pipeline-as-code-guest-blog/Pic2.png&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, ensure that other dependencies, like SCM plugins and build tools, are met:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Either SVN/Git/Mercurial (depending on your SCM)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub Branch Source Plugin (optimized to use the GitHub API and improve performance)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maven build tool&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, make sure you’ve created the required Webhook from your SCM (Github in this case) to Jenkins.
Here’s how to do that:&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://thepracticalsysadmin.com/setting-up-a-github-webhook-in-jenkins/&quot;&gt;Setting up GitHub Webhooks in Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://gist.github.com/misterbrownlee/3708738&quot;&gt;Step-by-step guide to setting up Jenkins for GitHub projects&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;Then create a new &lt;em&gt;Multibranch Workflow&lt;/em&gt; Job with configuration as shown below - mainly selecting the Branch Sources (Git, in this example) and providing the branch/repo URL with credentials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Branch sources&lt;/em&gt; (Git) - &lt;code&gt;https://github.com/kishorebhatia/pipeline-as-code-demo&lt;/code&gt; (or a repo where you’ve cloned this source code with Jenkinsfile)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Leave all other properties default and &lt;em&gt;Save&lt;/em&gt;.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/pipeline-as-code-guest-blog/Pic3.png&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll observe that Jenkins would perform Branch Indexing on that “cd” job folder and start the workflow for the master branch, with an automatically created new job, named master, under the “cd” folder.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The workflow does a dummy step for application deploys to the environments in this sequence &lt;em&gt;Staging&lt;/em&gt; -&amp;gt; Waits for manual approval -&amp;gt; &lt;em&gt;PROD&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, let’s create a new branch off of this master branch in your cloned git repo:&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;git branch newBranch&lt;/code&gt; (create a newBranch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;git checkout newBranch&lt;/code&gt; (switches to newBranch)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;git push --set-upstream origin newBranch&lt;/code&gt; (pushes newBranch)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll observe that your Jenkins instance automatically picks up this newBranch and starts running the workflow (with the Jenkinsfile in this newBranch) to build/test/deploy the code.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/pipeline-as-code-guest-blog/Pic4.png&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next, if you now delete this &lt;code&gt;newBranch&lt;/code&gt; (&lt;code&gt;git branch -D newBranch&lt;/code&gt;), Jenkins will automatically remove the orphan Workflow job for &lt;code&gt;newBranch&lt;/code&gt;. You can retain these jobs even after the branches are deleted using the &lt;em&gt;Orphaned Item Strategy&lt;/em&gt; property in the main &quot;cd&quot; job’s configuration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we observed the following benefits of this pipeline-as-code approach:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Overall job definition is a script (Jenkinsfile)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Calls your build tools and scripts for details&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The build script can be versioned alongside project sources&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins handles feature/experimental branches automatically&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep less configuration in &lt;code&gt;$JENKINS_HOME&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;dockerized-demo-environment&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#dockerized-demo-environment&quot; /&gt;Dockerized Demo environment&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also use the following docker image to run this demo with a preconfigured Jenkins environment and the sample job: &lt;code&gt;jenkinsci/workflow-demo&lt;/code&gt; (i.e. &lt;code&gt;docker pull jenkinsci/workflow-demo&lt;/code&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This docker container includes Jenkins with Workflow and Workflow Multibranch plugins, a local git repo with the aforementioned Java web application and Jetty to demonstrate a continuous delivery pipeline of this application deployed and tested across multiple environments in the pipeline with an approval gate before promoting to PROD (like QA, Staging and PROD).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s a &quot;cd&quot; job pre-configured as a multibranch Workflow job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Launch the docker demo as: &lt;code&gt;docker run -p 8080:8080 -p 8081:8081 -p 9418:9418 -ti jenkinsci/workflow-demo&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, you can access Jenkins on port 8080 and Jetty on port 8081 from localhost or the IP of your boot2docker/docker-machine environment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The demo container has a local git repo so you can clone: &lt;code&gt;git://localhost/repo&lt;/code&gt;. When creating new branches, each branch automatically creates a matching subproject in Jenkins and triggers the build for that branch. The workflow:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Checks out source code from the same repository and commit as &lt;code&gt;Jenkinsfile&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Builds sources via Maven with unit testing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runs two parallel integration tests that involve deploying the app to ephemeral server instances, which get thrown away when tests are done (this is done by using auto-deployment of Jetty)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once integration tests are successful, the webapp gets to the staging server at &lt;a href=&quot;http://localhost:8081/staging/&quot;&gt;localhost:8081/staging&lt;/a&gt; (or your docker-machine/boot2docker instance IP)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requires a human to Manually inspect the staging instance, and when ready, approves the deployment to the production server at &lt;a href=&quot;http://localhost:8081/production/&quot; class=&quot;bare&quot;&gt;http://localhost:8081/production/&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;references&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#references&quot; /&gt;References&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://developer-blog.cloudbees.com/2015/08/workflow-19-and-multibranch-beta.html&quot;&gt;Developer blog by jglick introducing multibranch support&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin/blob/master/TUTORIAL.md&quot;&gt;workflow plugin tutorial&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin#presentations&quot;&gt;workflow plugin presentations&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-aggregator-plugin/tree/master/demo&quot;&gt;workflow plugin demo readme&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/12/02/hacksgiving-left-overs/</id>
<title>Hacksgiving Left-overs</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-12-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/12/02/hacksgiving-left-overs/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='video'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
Last week we hosted our first Hacksgiving event, a two-day virtual hackathon with a number of recorded sessions and plenty of pull requests submitted, I would say it was a success! I would like to thank everybody who took the time to watch, chat and present in the Hacker Hangout.


Now that everybody has had time to recover from the turkey and travel, we have some videos of the sessions sliced out and ready for publication.


In addition to the recorded sessions, there were a number of notes captured with useful links associated with practically each session. You can find those notes...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week we hosted our first &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hacksgiving+2015&quot;&gt;Hacksgiving&lt;/a&gt; event, a two-day virtual hackathon with a number of recorded sessions and plenty of pull requests submitted, &lt;a href=&quot;https://github.com/rtyler&quot;&gt;I&lt;/a&gt; would say it was a success! I would like to thank everybody who took the time to watch, chat and present in the Hacker Hangout.&lt;center&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/hacksgiving-platter.png&quot; alt=&quot;hacksgiving platter&quot; /&gt;&lt;/span&gt;&lt;/center&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now that everybody has had time to recover from the turkey and travel, we have some videos of the sessions sliced out and ready for publication.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the recorded sessions, there were a number of notes captured with useful links associated with practically each session. You can find those notes &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hacksgiving+2015#Hacksgiving2015-HacksgivingNotes&quot;&gt;at the bottom of the Hacksgiving page&lt;/a&gt;.&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;
The following videos are all available in this &lt;a href=&quot;https://www.youtube.com/playlist?list=PLN7ajX_VdyaOX2dHsUpLGUMewG_TFdsP2&quot;&gt;YouTube playlist&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;intro-to-the-jenkins-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#intro-to-the-jenkins-project&quot; /&gt;Intro to the Jenkins project&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This session was hosted by &lt;a href=&quot;https://github.com/rtyler&quot;&gt;rtyler&lt;/a&gt; and meant to provide a cursory overview of where to get started with contributing to the Jenkins project&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/RV_VqY3H1II?list=PLN7ajX_VdyaOX2dHsUpLGUMewG_TFdsP2&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;intro-to-plugin-development-workshop&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#intro-to-plugin-development-workshop&quot; /&gt;Intro to Plugin Development Workshop&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This session was given both days of Hacksgiving by &lt;a href=&quot;https://github.com/christ66&quot;&gt;schristou&lt;/a&gt; and does a really great job of introducing the viewer to getting started with developing a Jenkins plugin with Java.&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/eUzYZZsNBIA?list=PLN7ajX_VdyaOX2dHsUpLGUMewG_TFdsP2&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;workflow-qa-and-demo-session&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#workflow-qa-and-demo-session&quot; /&gt;Workflow Q&amp;amp;A and Demo Session&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This session was not originally scheduled, but some folks on the Jenkins &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/IRC+Channel&quot;&gt;IRC channel&lt;/a&gt; had some &lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin&quot;&gt;Workflow&lt;/a&gt; questions and &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; jumped into the Hacker Hangout to help us out!&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/-b4MdGAvUz0?list=PLN7ajX_VdyaOX2dHsUpLGUMewG_TFdsP2&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;internationalization-live-coding-qa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#internationalization-live-coding-qa&quot; /&gt;Internationalization Live Coding / Q&amp;amp;A&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another impromptu session, this time with &lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;danielbeck&lt;/a&gt; hosting. In this session Daniel walks through a plugin he was working on for Hacksgiving and adds internationalization support while answering a few questions here and there.&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/4UxVffTpf4A?list=PLN7ajX_VdyaOX2dHsUpLGUMewG_TFdsP2&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;intro-to-the-new-static-site&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#intro-to-the-new-static-site&quot; /&gt;Intro to the new static site&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kicking off day two of Hacksgiving, &lt;a href=&quot;https://github.com/rtyler&quot;&gt;rtyler&lt;/a&gt; hosted a session on the new &lt;a href=&quot;https://github.com/jenkinsci/jenkins.io&quot;&gt;statically-generated Jenkins site&lt;/a&gt;. The new site will dramatically lower the barrier to entry for contribution to Jenkins documentation and blogs, by pushing everything through GitHub.&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/1wMKQ70pEug?list=PLN7ajX_VdyaOX2dHsUpLGUMewG_TFdsP2&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;plugin-developer-open-qa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-developer-open-qa&quot; /&gt;Plugin Developer Open Q&amp;amp;A&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This was the last session of Hacksgiving, hosted by &lt;a href=&quot;https://github.com/abayer&quot;&gt;abayer&lt;/a&gt; and ended up being more like a casual discussion of the current status and future work in the plugin development ecosystem.&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/0QI-gg-AqZY?list=PLN7ajX_VdyaOX2dHsUpLGUMewG_TFdsP2&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/11/16/celebrating-hacksgiving/</id>
<title>Celebrating Hacksgiving!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-11-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/11/16/celebrating-hacksgiving/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='just for fun'></category>
<summary>
Next week in the US we have a national holiday where, generally speaking, lots of turkey gets converted into left-over turkey sandwiches. For many software developers the Thanksgiving holiday also represents a lull in project schedules, freeing up some time to hack on pet projects or even contribute to open source projects.


Taking a cue from the Adopt a Plugin program that Daniel wrote about earlier this month, we thought it would be fun to organize a "virtual hackathon" to coincide with that gap in project schedules. Thus Hacksgiving 2015 was created!


We&#8217;ll be hosting Hacksgiving Nov 23rd and Nov 24 from...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next week in the US we have a national holiday where, generally speaking, lots of turkey gets converted into left-over turkey sandwiches. For many software developers the Thanksgiving holiday also represents a lull in project schedules, freeing up some time to hack on pet projects or even contribute to open source projects.&lt;center&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/hacksgiving-platter.png&quot; alt=&quot;hacksgiving platter&quot; /&gt;&lt;/span&gt;&lt;/center&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Taking a cue from the &lt;a href=&quot;https://www.jenkins.io/content/adopt-plugin-0&quot;&gt;Adopt a Plugin&lt;/a&gt; program that &lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel&lt;/a&gt; wrote about earlier this month, we thought it would be fun to organize a &quot;virtual hackathon&quot; to coincide with that gap in project schedules. Thus &lt;strong&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hacksgiving+2015&quot;&gt;Hacksgiving 2015&lt;/a&gt;&lt;/strong&gt; was created!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll be hosting Hacksgiving &lt;strong&gt;Nov 23rd&lt;/strong&gt; and &lt;strong&gt;Nov 24&lt;/strong&gt; from 7:00PST - 15:00PST (10:00EST - 18:00EST) and would love for you to join! (&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/226735213/&quot;&gt;RSVP here&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;You don’t need to know Java to help!&lt;/strong&gt; We will have documentation and design hacking going on as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have a few goals for Hacksgiving:&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;Introduce new contributors to the process of writing code and/or documentation (&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hacksgiving+2015#Hacksgiving2015-Documentationhacking&quot;&gt;documentation hacking details here&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find some plugins which &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-governance/adopt-a-plugin#which-plugins-are-currently-up-for-adoption&quot;&gt;are up for adoption&lt;/a&gt; new maintainers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clean up or merge some existing plugins which need some care (&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hacksgiving+2015#Hacksgiving2015-Pluginstocleanup&quot;&gt;listed here&lt;/a&gt;).&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;=== Sessions to note&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here are some of the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hacksgiving+2015#Hacksgiving2015-Schedule&quot;&gt;sessions scheduled&lt;/a&gt; that will be hosted by members of community that may interest you:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Day One&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;7:00PST/10:00EST (&lt;em&gt;15-30min&lt;/em&gt;) - &lt;a href=&quot;https://github.com/rtyler&quot;&gt;rtyler&lt;/a&gt; will host a welcome and introduction to contribution to the Jenkins project (walking through our &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beginners+Guide+to+Contributing&quot;&gt;contributors guide&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;10:00PST/13:00EST (&lt;em&gt;60min&lt;/em&gt;) - &lt;a href=&quot;https://github.com/christ66&quot;&gt;schristou&lt;/a&gt; will host a workshop titled &quot;Introduction to plugin development for Jenkins&quot;&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;Day Two&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;10:00PST/13:00EST (&lt;em&gt;60min&lt;/em&gt;) - &lt;a href=&quot;https://github.com/abayer&quot;&gt;abayer&lt;/a&gt; will be hosting a &quot;Plugin Developer Open Q&amp;amp;A&quot; session, so bring your questions!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hacksgiving is very &lt;a href=&quot;https://en.wikipedia.org/wiki/Unconference&quot;&gt;unconference&lt;/a&gt; structured right now, so if you’re interested in hosting a session please let us know in the &lt;code&gt;#jenkins-community&lt;/code&gt; channel or by signing up for a session on &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hacksgiving+2015#Hacksgiving2015-Schedule&quot;&gt;the schedule&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-participate&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-participate&quot; /&gt;How to participate&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since this is a virtual hackathon, we’ll be congregating and chatting in a couple of ways:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;On the &lt;code&gt;#jenkins&lt;/code&gt; &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/IRC+Channel&quot;&gt;IRC channel&lt;/a&gt; as per usual&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We’ll be hosting sessions and tutorials via Google Hangouts, see the &quot;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hacksgiving+2015#Hacksgiving2015-HackerHangout&quot;&gt;hacker hangout&lt;/a&gt;* section on the wiki page up to date details&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Via the &lt;code&gt;#hacksgiving&lt;/code&gt; hashtag on Twitter&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can also RSVP on our &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/226735213/&quot;&gt;meetup page!&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We hope you can join in the festivities!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/11/11/new-jenkins-releases-with-important-security-fixes/</id>
<title>New Jenkins releases with important security fixes</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-11-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/11/11/new-jenkins-releases-with-important-security-fixes/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='news'></category>
<category term='releases'></category>
<category term='jenkinsci'></category>
<summary>
We just released Jenkins 1.638 and 1.625.2 which contain important security fixes, including a fix for the zero-day vulnerability published on Friday. Please see the security advisory for more information.


Want to be kept up to date on Jenkins security releases, including advance notice on scheduled security updates? Subscribe to the jenkinsci-advisories mailing list!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just released Jenkins 1.638 and 1.625.2 which contain important security fixes, including a fix for the &lt;a href=&quot;https://www.jenkins.io/content/mitigating-unauthenticated-remote-code-execution-0-day-jenkins-cli&quot;&gt;zero-day vulnerability published on Friday&lt;/a&gt;. Please see the &lt;a href=&quot;https://www.jenkins.io/security/advisory/2015-11-11/&quot;&gt;security advisory&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Want to be kept up to date on Jenkins security releases, including advance notice on scheduled security updates? Subscribe to &lt;a href=&quot;https://groups.google.com/g/jenkinsci-advisories&quot;&gt;the jenkinsci-advisories mailing list&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/11/06/october-jams/</id>
<title>October JAMs</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-11-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/11/06/october-jams/" />
<author>
<name>alyssat</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='meetup'></category>
<summary>
It is great to see the pick up of local activities through hosted JAMs. In October, the Jenkins community hosted Atlanta JAM and Bay Area JAM. Many thanks to our sponsors: Ericsson, CloudBees, Blazemeter, NetRoadShow.


Here&#8217;s a summary of what was discussed:




Atlanta JAM - Jenkins workflow and Docker to reduce friction in DevOps efforts.


Bay Area JAM- Performance testing strategies, incorporating performance tests into Jenkins workflows and the metrics that matter most for troubleshooting and diagnosing issues.




A look forward to November and December:




Hacksgiving


Barcelona, Spain JAM


Toulouse,France JAM




As usual, if you&#8217;re interested in becoming an organizer or sponsor, here&#8217;s how to get started. If...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/october-jams-image_0.jpeg&quot; alt=&quot;october jams image 0&quot; width=&quot;250&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is great to see the pick up of local activities through hosted JAMs. In October, the Jenkins community hosted &lt;a href=&quot;https://www.meetup.com/Atlanta-Jenkins-Meetup/events/225877826/&quot;&gt;Atlanta JAM&lt;/a&gt; and &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/225860998/&quot;&gt;Bay Area JAM&lt;/a&gt;. Many thanks to our sponsors: &lt;a href=&quot;https://www.ericsson.com/&quot;&gt;Ericsson&lt;/a&gt;, &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt;, &lt;a href=&quot;https://blazemeter.com/&quot;&gt;Blazemeter&lt;/a&gt;, &lt;a href=&quot;https://www.netroadshow.com/nrs/wp/default.html&quot;&gt;NetRoadShow&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s a summary of what was discussed:&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.meetup.com/Atlanta-Jenkins-Meetup/events/225877826/&quot;&gt;Atlanta&lt;/a&gt; JAM - Jenkins workflow and Docker to reduce friction in DevOps efforts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/225860998/&quot;&gt;Bay Area&lt;/a&gt; JAM- Performance testing strategies, incorporating performance tests into Jenkins workflows and the metrics that matter most for troubleshooting and diagnosing issues.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A look forward to November and December:&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://wiki.jenkins.io/display/JENKINS/Hacksgiving+2015&quot;&gt;Hacksgiving&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Barcelona-Jenkins-Area-Meetup/&quot;&gt;Barcelona, Spain JAM&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Toulouse-Jenkins-Area-Meetup/events/226522484/?eventId=226522484&quot;&gt;Toulouse,France JAM&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;As usual, if you’re interested in becoming an organizer or sponsor, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;here’s how to get started&lt;/a&gt;. If you’ve heard of a great Jenkins talk out there, shoot us an email with speaker info to &lt;a href=&quot;mailto:jenkinsci-jam@googlegroups.com&quot;&gt;jenkinsci-jam@googlegroups.com&lt;/a&gt; so we can invite him/her to our next meetups.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/11/06/mitigating-unauthenticated-remote-code-execution-0-day-in-jenkins-cli/</id>
<title>Mitigating unauthenticated remote code execution 0-day in Jenkins CLI</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-11-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/11/06/mitigating-unauthenticated-remote-code-execution-0-day-in-jenkins-cli/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='news'></category>
<summary>
Updated 2015-11-11 15:00 UTC: We have released Jenkins 1.638 and 1.625.2 which contain a fix for this vulnerability. See the security advisory for more information about these releases.



Updated 2015-11-06 03:55 UTC: Included a updated mitigation script which doesn&#8217;t have a Jenkins boot race condition



Earlier today we received numerous reports about a previously undisclosed "zero day" critical remote code execution vulnerability and exploit in Jenkins core. Unfortunately the vulnerability was not disclosed to us ahead of its publication so we&#8217;re still working on more thorough fix. In the meantime however, we wanted to inform you of the issue and provide a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Updated 2015-11-11 15:00 UTC:&lt;/strong&gt; We have released Jenkins 1.638 and 1.625.2 which contain a fix for this vulnerability. &lt;a href=&quot;https://www.jenkins.io/security/advisory/2015-11-11/&quot;&gt;See the security advisory for more information about these releases&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Updated 2015-11-06 03:55 UTC:&lt;/strong&gt; Included a updated mitigation script which doesn’t have a Jenkins boot race condition&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Earlier today we received numerous reports about a previously undisclosed &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Zero-day_%28computing%29&quot;&gt;zero day&lt;/a&gt;&quot; critical remote code execution vulnerability and exploit in Jenkins core. Unfortunately the vulnerability was not disclosed to us ahead of its publication so we’re still working on more thorough fix. In the &lt;em&gt;meantime&lt;/em&gt; however, we wanted to inform you of the issue and provide a workaround which will help prevent this exploit from being used against public Jenkins installations, for future reference this issue is being tracked privately as &lt;code&gt;SECURITY-218&lt;/code&gt; in our &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;issue tracker&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The attack is mounted through the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+CLI&quot;&gt;Jenkins CLI&lt;/a&gt; subsystem, so the work-around is to remove/disable the CLI support inside of the running Jenkins server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using the following Groovy script you can disable the attack vector in your Jenkins installations by navigating to “Manage Jenkins” and then to “Script Console”, or just go to &lt;code&gt;https://your-jenkins-installation/script&lt;/code&gt;. This only addresses the current running Jenkins process, in order to make the workaround persist between restarts of the Jenkins server, add the script below to &lt;code&gt;$JENKINS_HOME/init.groovy.d/cli-shutdown.groovy&lt;/code&gt; (create the directory if necessary, and the file).&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;import jenkins.*;
import jenkins.model.*;
import hudson.model.*;

// disabled CLI access over TCP listener (separate port)
def p = AgentProtocol.all()
p.each { x -&amp;gt;
  if (x.name.contains(&quot;CLI&quot;)) p.remove(x)
}

// disable CLI access over /cli URL
def removal = { lst -&amp;gt;
  lst.each { x -&amp;gt; if (x.getClass().name.contains(&quot;CLIAction&quot;)) lst.remove(x) }
}
def j = Jenkins.instance;
removal(j.getExtensionList(RootAction.class))
removal(j.actions)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;in order to make the workaround persist between restarts of the Jenkins server, add the script below to &lt;code&gt;$JENKINS_HOME/init.groovy.d/cli-shutdown.groovy&lt;/code&gt; (create the directory if necessary, and the file).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latest version of this script can be found &lt;a href=&quot;https://github.com/jenkinsci-cert/SECURITY-218&quot;&gt;in this GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As previously announced on the &lt;a href=&quot;https://groups.google.com/d/forum/jenkinsci-advisories&quot;&gt;jenkinsci-advisories&lt;/a&gt; mailing list we’re preparing a security release for this upcoming Wednesday which will include patches for both the latest and LTS lines of Jenkins core. The Jenkins Security team is working to include a fix for this previously undisclosed exploit in or before this planned security release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have questions about this exploit, join us in the &lt;a href=&quot;https://webchat.freenode.net/?channels=%23jenkins&amp;amp;uio=d4&quot;&gt;#jenkins channel on Freenode&lt;/a&gt; or ask on the &lt;a href=&quot;https://groups.google.com/d/forum/jenkinsci-users&quot;&gt;jenkinsci-users@ mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For security researchers and hobbyists, if you believe you have found a security vulnerability in Jenkins, we have some disclosure guidelines &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Security+Advisories&quot;&gt;on this wiki page&lt;/a&gt; which will help us mitigate any discovered issues as quickly and safely as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Be sure to subscribe to the jenkinsci-advisories mailing list (&lt;a href=&quot;https://groups.google.com/d/forum/jenkinsci-advisories&quot;&gt;jenkinsci-advisories&lt;/a&gt;), it’s the fastest way to get updates by the Jenkins Security team.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/11/03/what-jvm-versions-are-running-jenkins/</id>
<title>What JVM versions are running Jenkins?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-11-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/11/03/what-jvm-versions-are-running-jenkins/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<summary>
Preceding some of last week&#8217;s Jenkins 2.0 discussions, there had been some threads on whether we should move Jenkins to require Java 8. The introduction of Java 8 last year brought performance improvements and highly desirable API changes, which make developing Java-based applications (arguably) much easier than before. The release was followed earlier this year by the end-of-life announcement for Java 7; the writing is on the wall: upgrade to Java 8.


I wanted to answer the question "does it even make sense to force an upgrade to Java 8?" There are plenty of technical discussions that we can have in...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Preceding some of last week’s &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+2.0&quot;&gt;Jenkins 2.0&lt;/a&gt; discussions, there had been &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/sw_WepGw0Pk/0gO2V9UXy-8J&quot;&gt;some threads&lt;/a&gt; on whether we should move Jenkins to require Java 8. The introduction of &lt;a href=&quot;https://www.oracle.com/events/us/en/java8/index.html&quot;&gt;Java 8&lt;/a&gt; last year brought performance improvements and highly desirable API changes, which make developing Java-based applications (arguably) much easier than before. The release was followed earlier this year by the &lt;a href=&quot;https://www.java.com/en/download/faq/java_7.xml&quot;&gt;end-of-life announcement&lt;/a&gt; for Java 7; the writing is on the wall: upgrade to Java 8.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I wanted to answer the question &quot;does it even make sense to force an upgrade to Java 8?&quot; There are plenty of technical discussions that we can have in the community on whether or not this is the right approach, but my goal was to try and measure the current Jenkins install base for Java 8 preparedness.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While we do not currently (to my knowledge) collect Java runtime versions in our &lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/&quot;&gt;anonymous usage statistics&lt;/a&gt;, we do have access logs from our &lt;a href=&quot;http://mirrors.jenkins-ci.org&quot;&gt;mirror redirector&lt;/a&gt; which might provide some insight.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With some access logs data, I went through the millions of requests made to Jenkins infrastructure in 2015 and started filtering out the user agent which made those requests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; This data is totally not scientific and is only meant to provide a coarse insight into what versions of Java access Jenkins web infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When Jenkins hits the mirror network, it’s not overriding the default user agent from the Java runtime, so many of the user agents for the HTTP request are something like &lt;code&gt;Java/1.7.0_75&lt;/code&gt;. This indicates that the request came from a Java Runtime version 1.7.0 (update 75).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking at the major JVM versions making (non-unique) requests to Jenkins infrastructure we have:&lt;center&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/major-jvm-versions.png&quot; alt=&quot;major jvm versions&quot; /&gt;&lt;/span&gt;&lt;/center&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1.8.0&lt;/strong&gt;: 21,278,960&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1.7.0&lt;/strong&gt;: 27,340,214&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1.6.0&lt;/strong&gt;: 4,148,833&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This breaks down across various updates as well, which is also particularly interesting to me because many of these Java versions have long since had security advisories posted against them.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/jvm-versions-with-updates.png&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I mentioned before, this is not a rigorous analysis of the access log data and is also not filtered by unique IP addresses. What I found most interesting though is that the Java 8 upgrade numbers are actually &lt;em&gt;fairly strong&lt;/em&gt;, which I didn’t expect. I expect that piece of the pie will continue to grow. Hopefully so much so that we’re able to move over to Java 8 before the end of 2016!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/11/01/adopt-a-plugin/</id>
<title>Adopt a plugin!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-11-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/11/01/adopt-a-plugin/" />
<author>
<name>daniel-beck</name>
</author>
<category term='development'></category>
<category term='meta'></category>
<category term='plugins'></category>
<summary>
With more than a thousand public plugins in the Jenkins community now, it should come as no surprise that some of them are no longer actively maintained. Plugin authors move on when they change jobs, or lose interest in the plugin, and that&#8217;s fine. Plugins are hosted on the Jenkins project infrastructure after all, and when a maintainer moves on, others can continue their work.


The major problem of course is that it&#8217;s often difficult to tell whether a plugin is still maintained (and there&#8217;s just not a lot going on), or whether its maintainer has lost interest. Most plugins don&#8217;t...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With more than a thousand public plugins in the Jenkins community now, it should come as no surprise that some of them are no longer actively maintained. Plugin authors move on when they change jobs, or lose interest in the plugin, and that’s fine. Plugins are hosted on the Jenkins project infrastructure after all, and when a maintainer moves on, others can continue their work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The major problem of course is that it’s often difficult to tell whether a plugin is still maintained (and there’s just not a lot going on), or whether its maintainer has lost interest. Most plugins don’t get released every few weeks, or even every few months, and still do their job just fine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To connect plugins that aren’t actively maintained with potential maintainers, we recently implemented the &quot;Adopt-a-plugin&quot; initiative: We built a list of plugins that are up for &quot;adoption&quot;, and display a prominent message on the plugins&#39; wiki pages. Anyone interested in taking over as a plugin maintainer can then contact us, and we’ll set you up.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Are you interested in becoming a plugin maintainer? Maybe one of your favorite plugins isn’t actively maintained right now. Check out the &lt;a href=&quot;https://www.jenkins.io/doc/developer/plugin-governance/adopt-a-plugin/&quot;&gt;Adopt a Plugin page&lt;/a&gt; for more details on this program, and a list of plugins that would benefit from your help.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/10/30/jenkins-2-0-proposal-improved-out-of-the-box-user-experience/</id>
<title>Jenkins 2.0 Proposal: Improved &quot;Out of the box&quot; user experience</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-10-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/10/30/jenkins-2-0-proposal-improved-out-of-the-box-user-experience/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='feedback'></category>
<summary>
This week we have featured a number of proposals for what we would like to see in "Jenkins
2.0", the vision of which is to make Jenkins users more efficient, productive and happy. We started with some more internally facing changes and have slowly progressed from the "inside-out" to today&#8217;s topic: improving the out of the box user experience. That is to say, the experience that a brand-new Jenkins user has when getting started with the server.


Just to recap, so far we&#8217;ve reviewed:




Introducing a policy for API deprecation


Splitting Groovy out of 'core'


Pipeline as code front and center


User experience improvements (part one)




The...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week we have featured a number of proposals for what we would like to see in &quot;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+2.0&quot;&gt;Jenkins
2.0&lt;/a&gt;&quot;, the vision of which is to make Jenkins users more efficient, productive and happy. We started with some more internally facing changes and have slowly progressed from the &quot;inside-out&quot; to today’s topic: improving the out of the box user experience. That is to say, the experience that a brand-new Jenkins user has when getting started with the server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just to recap, so far we’ve reviewed:&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/content/jenkins-20-proposal-introduce-policy-api-deprecation&quot;&gt;Introducing a policy for API deprecation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposal-split-groovy-out-core&quot;&gt;Splitting Groovy out of &#39;core&#39;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposal-pipeline-code-front-and-center&quot;&gt;Pipeline as code front and center&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposal-ux-improvements-part-one&quot;&gt;User experience improvements (part one)&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 subject of today’s proposal is captured in &lt;strong&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31157&quot;&gt;JENKINS-31157&lt;/a&gt;&lt;/strong&gt;, which, like yesterday’s &lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposal-ux-improvements-part-one&quot;&gt;proposal&lt;/a&gt;, contains a few issues linked from it with more details.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At a high level, the problem aiming to be solved is:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When a new user installs Jenkins, they are greeted with the main, empty, dashboard which suggests that they &quot;create jobs.&quot; This makes no mention of plugins or the configuration options that are relevant to helping the user make Jenkins match their needs.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In past and current versions of Jenkins, if you know what you’re looking for it’s relatively easy to move around the interface. If you’ve never used Jenkins before, it can be very challenging to find your way around or even know &lt;em&gt;what it is possible&lt;/em&gt; to do with Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The proposed changes aim to address this initial confusion:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of changing the post-install defaults, which may not properly represent the user’s needs, the first-time user experience should help guide the user through configuration and plugin installation quickly so they can use Jenkins for their needs. Effectively it should be as easy as possible for a user to arrive at a good configuration for their usage.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins contributor &lt;a href=&quot;https://github.com/tfennelly&quot;&gt;Tom Fennelly&lt;/a&gt;, who has led this discussion on the mailing lists in the past, has posted a good prototype screencast of what some of this might entail:&lt;center&gt;&lt;iframe width=&quot;480&quot; height=&quot;360&quot; src=&quot;https://www.youtube-nocookie.com/embed/kzRR8XR8hu4?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;providing-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#providing-feedback&quot; /&gt;Providing Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re asking you to read the issues linked from &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31157&quot;&gt;JENKINS-31157&lt;/a&gt; and comment and vote on those issues accordingly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have ever logged in to the &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;issue
tracker&lt;/a&gt; or the
&lt;a href=&quot;https://wiki.jenkins.io/&quot;&gt;wiki&lt;/a&gt;, you have a &quot;Jenkins user account&quot; which
means you’ll be able to log into the issue tracker and vote for, or comment on
the issue linked above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(&lt;em&gt;note&lt;/em&gt;: if you have forgotten your password, use &lt;a href=&quot;https://jenkins-ci.org/account/&quot;&gt;the account
app&lt;/a&gt; to reset it.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re going to review feedback, make any necessary adjustments and either
approve or reject the proposal two weeks from today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This concludes this week’s blog series highlighting some of the Jenkins 2.0 proposals we felt were important to discuss with the broader Jenkins user audience. Many of these, and other minor proposals, can be found on the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+2.0&quot;&gt;Jenkins 2.0 wiki page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/10/29/jenkins-2-0-proposal-ux-improvements-part-one/</id>
<title>Jenkins 2.0 Proposal: UX Improvements (Part One)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-10-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/10/29/jenkins-2-0-proposal-ux-improvements-part-one/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='feedback'></category>
<summary>
We have been featuring a few proposals this week for what "Jenkins
2.0" is going to include. Today we&#8217;ll be diving into the most noticeable changes being proposed for Jenkins 2.0: the User Experience (UX) improvements


Thus far in this blog series we have reviewed proposals covering:




Introducing a policy for API deprecation


Splitting Groovy out of 'core'


Pipeline as code front and center




The UX improvements being proposed aren&#8217;t necessarily as uniform as the proposals from earlier in the week but represent a large amount of prototype and exploratory work done by folks like Tom Fennelly, Gus Reiber and a few others. Those following the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have been featuring a few proposals this week for what &quot;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+2.0&quot;&gt;Jenkins
2.0&lt;/a&gt;&quot; is going to include. Today we’ll be diving into the most noticeable changes being proposed for Jenkins 2.0: the User Experience (UX) improvements&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thus far in this blog series we have reviewed proposals covering:&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/content/jenkins-20-proposal-introduce-policy-api-deprecation&quot;&gt;Introducing a policy for API deprecation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposal-split-groovy-out-core&quot;&gt;Splitting Groovy out of &#39;core&#39;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposal-pipeline-code-front-and-center&quot;&gt;Pipeline as code front and center&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 UX improvements being proposed aren’t necessarily as uniform as the proposals from earlier in the week but represent a large amount of prototype and exploratory work done by folks like &lt;a href=&quot;https://github.com/tfennelly&quot;&gt;Tom Fennelly&lt;/a&gt;, &lt;a href=&quot;https://github.com/gusreiber&quot;&gt;Gus Reiber&lt;/a&gt; and a few others. Those following the dev list may have already seen some of these proposals in some of the &quot;mega threads&quot; that we have had discussing potential UI/UX improvements previously.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The improvements proposed for 2.0 can be found under &lt;strong&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31156&quot;&gt;JENKINS-31156&lt;/a&gt;&lt;/strong&gt;. The most promising proposal under this issue is to update the &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/9802&quot;&gt;plugin manager experience&lt;/a&gt;.&lt;center&gt;&lt;iframe width=&quot;480&quot; height=&quot;360&quot; src=&quot;https://www.youtube-nocookie.com/embed/9vPUMe3lzfo?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;br&gt;
&lt;iframe width=&quot;480&quot; height=&quot;360&quot; src=&quot;https://www.youtube-nocookie.com/embed/jf5s0sqIYBY?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/br&gt;&lt;/center&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another very important proposal for 2.0 worth mentioning is the proposal to &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/21092&quot;&gt;update UI work well on mobile devices&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;providing-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#providing-feedback&quot; /&gt;Providing Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re asking you to read the issues linked from &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31156&quot;&gt;JENKINS-31156&lt;/a&gt; and comment and vote on those issues accordingly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have ever logged in to the &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;issue
tracker&lt;/a&gt; or the
&lt;a href=&quot;https://wiki.jenkins.io/&quot;&gt;wiki&lt;/a&gt;, you have a &quot;Jenkins user account&quot; which
means you’ll be able to log into the issue tracker and vote for, or comment on
the issue linked above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(&lt;em&gt;note&lt;/em&gt;: if you have forgotten your password, use &lt;a href=&quot;https://jenkins-ci.org/account/&quot;&gt;the account
app&lt;/a&gt; to reset it.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re going to review feedback, make any necessary adjustments and either
approve or reject the proposal two weeks from today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for tomorrow’s post covering the remainder of the proposed user experience changes!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/10/28/jenkins-2-0-proposal-pipeline-as-code-front-and-center/</id>
<title>Jenkins 2.0 Proposal: Pipeline as Code front and center</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-10-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/10/28/jenkins-2-0-proposal-pipeline-as-code-front-and-center/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<category term='feedback'></category>
<summary>
We have been featuring a few proposals this week for what "Jenkins
2.0" is going to include, today we&#8217;re discussing my personal favorite, which I believe will have a tremendously positive impact for years to come (not to be too biased!): moving the "Pipeline as Code" support in Jenkins to the front and center.


Thus far in this blog series we have reviewed proposals covering:




Introducing a policy for API deprecation


Splitting Groovy out of 'core'




Today&#8217;s proposal comes from project founder Kohsuke Kawaguchi titled "Pipeline as code front and center" and represents perhaps the most important and dramatic shift we hope to make in...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have been featuring a few proposals this week for what &quot;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+2.0&quot;&gt;Jenkins
2.0&lt;/a&gt;&quot; is going to include, today we’re discussing my personal favorite, which I believe will have a tremendously positive impact for years to come (not to be too biased!): moving the &quot;Pipeline as Code&quot; support in Jenkins to the front and center.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thus far in this blog series we have reviewed proposals covering:&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/content/jenkins-20-proposal-introduce-policy-api-deprecation&quot;&gt;Introducing a policy for API deprecation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposal-split-groovy-out-core&quot;&gt;Splitting Groovy out of &#39;core&#39;&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;Today’s proposal comes from project founder &lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; titled &quot;&lt;strong&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31152&quot;&gt;Pipeline as code front and center&lt;/a&gt;&lt;/strong&gt;&quot; and represents perhaps the most important and dramatic shift we hope to make in Jenkins 2.0.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This functionality has existed through the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Workflow+Plugin&quot;&gt;workflow plugin&lt;/a&gt;, which we have discussed at various Jenkins events before but if you’re not aware of some of the power behind it, check out this presentation from &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt;:&lt;center&gt;&lt;iframe width=&quot;480&quot; height=&quot;360&quot; src=&quot;https://www.youtube-nocookie.com/embed/Q2pZdzaaCXg?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The proposal in &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31152&quot;&gt;JENKINS-31152&lt;/a&gt; expands on the problem we aim to address:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The default interaction model with Jenkins has been very web UI driven, requiring users to manually create jobs, then manually fill in the details through a web browser. This requires large amounts of effort to create and manage jobs to test and build multiple projects and keeps the actual configuration of a job to build/test/deploy a project separate from the actual code being built/tested/deployed. This prevents users from applying their existing CI/CD best practices to the job configurations themselves.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To address this, Kohsuke is proposing that we :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Introduce a new subsystem in Jenkins that:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;lets you design a whole pipeline, not just a single linear set of tasks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;stores the said pipeline configuration as human-editable &lt;code&gt;Jenkinsfile&lt;/code&gt; in your SCM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;makes it automatic to set up new pipelines when &lt;code&gt;Jenkinsfile&lt;/code&gt; is added&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;differentiates multiple branches in the same repository&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is the key new feature that positions Jenkins for continuous delivery use cases and other more complex automations of today.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kohsuke’s proposal is largely about bringing together a lot of already existing pieces together to provide a &lt;em&gt;very&lt;/em&gt; compelling experience for new and existing users alike. I hope it is clear now why this proposal is so exciting to me.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;providing-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#providing-feedback&quot; /&gt;Providing Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re asking you to read the proposal in
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31152&quot;&gt;JENKINS-31152&lt;/a&gt;, which itself have some additional tickets linked under it, and provide
feedback if you have it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have ever logged in to the &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;issue
tracker&lt;/a&gt; or the
&lt;a href=&quot;https://wiki.jenkins.io/&quot;&gt;wiki&lt;/a&gt;, you have a &quot;Jenkins user account&quot; which
means you’ll be able to log into the issue tracker and vote for, or comment on
the issue linked above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(&lt;em&gt;note&lt;/em&gt;: if you have forgotten your password, use &lt;a href=&quot;https://jenkins-ci.org/account/&quot;&gt;the account
app&lt;/a&gt; to reset it.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re going to review feedback, make any necessary adjustments and either
approve or reject the proposal two weeks from today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for a couple more posts covering proposals to improve the Jenkins interface and user experience!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/10/27/jenkins-2-0-proposal-split-groovy-out-of-core/</id>
<title>Jenkins 2.0 Proposal: Split Groovy out of &quot;core&quot;</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-10-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/10/27/jenkins-2-0-proposal-split-groovy-out-of-core/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='feedback'></category>
<summary>
As I mentioned in yesterday&#8217;s post, there&#8217;s been a lot of discussion recently about what "Jenkins
2.0" means. In a recent "Office Hours" session, Kohsuke Kawaguchi presented his
vision for Jenkins 2.0 in a office
hours session, the slides for
which can be found in this Google
Presentation.
Roughly paraphrasing Kohsuke&#8217;s vision, 2.0 is primarily about making things
better for the thousands of users out there.


This week, we&#8217;ll be reviewing some key areas of the "Jenkins 2.0" proposal.
Asking you, the user community, to provide feedback on these proposals, going
from Jenkins internals to user interface.


Thus far we&#8217;ve covered:




Introducing a policy for API deprecation




Today&#8217;s post involves a proposal originally...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I mentioned in &lt;a href=&quot;https://www.jenkins.io/content/jenkins-20-proposal-introduce-policy-api-deprecation&quot;&gt;yesterday’s post&lt;/a&gt;, there’s been a lot of discussion recently about what &quot;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+2.0&quot;&gt;Jenkins
2.0&lt;/a&gt;&quot; means. In a recent &quot;Office Hours&quot; session, &lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; presented his
vision for &lt;strong&gt;Jenkins 2.0&lt;/strong&gt; in a &lt;a href=&quot;https://www.youtube.com/watch?v=2eVyc_n8i1c&quot;&gt;office
hours&lt;/a&gt; session, the slides for
which can be found &lt;a href=&quot;https://docs.google.com/presentation/d/12ikbbQoMvus_l_q23BxXhYXnW9S5zsVNwIKZ9N8udg4&quot;&gt;in this Google
Presentation&lt;/a&gt;.
Roughly paraphrasing Kohsuke’s vision, 2.0 is primarily about making things
better for the thousands of users out there.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week, we’ll be reviewing some &lt;em&gt;key areas&lt;/em&gt; of the &quot;Jenkins 2.0&quot; proposal.
Asking you, the user community, to provide feedback on these proposals, going
from Jenkins internals to user interface.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thus far we’ve covered:&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/content/jenkins-20-proposal-introduce-policy-api-deprecation&quot;&gt;Introducing a policy for API deprecation&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;Today’s post involves a proposal originally from community member &lt;a href=&quot;https://github.com/jglick&quot;&gt;Jesse Glick&lt;/a&gt; who has proposed in &lt;strong&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/29068&quot;&gt;JENKINS-29068&lt;/a&gt;&lt;/strong&gt; that &lt;a href=&quot;https://groovy-lang.org&quot;&gt;Groovy&lt;/a&gt; be split out from the &quot;core&quot; Jenkins distribution. The linked issue expands on what the problem is here:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently Jenkins embeds a distribution of Groovy into &quot;core&quot; for a variety of scripting and management tasks. This version of Groovy is locked into core in such a way that users cannot upgrade Groovy independently from Jenkins itself. If the Jenkins-bundled version were upgraded to a different major version, it may break users&#39; custom scripts as well as plugins that use Groovy due to API changes.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The proposal is relatively straight-forward and affects the many different users and use-cases for the embedded Groovy scripting support in Jenkins:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For ease of maintenance and modularity it would be useful to split Jenkins&#39; use of Groovy into a library plugin; different clients could request 1.x and 2.x simultaneously by using different versions of the library, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stuff in core using Groovy that would need to either be put in this library (if infrastructure for other features) or put in another plugin depending on it (if first-class features themselves):&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I selected this proposal to feature on this blog, despite its rather technical underpinnings, it will affect core developers, plugin developers, power and casual users alike. I encourage everybody to read through the proposal and its potential impact &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/29068&quot;&gt;on the issue tracker&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;providing-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#providing-feedback&quot; /&gt;Providing Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re asking you to read the proposal in
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/29068&quot;&gt;JENKINS-29068&lt;/a&gt; and provide
feedback if you have it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have ever logged in to the &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;issue
tracker&lt;/a&gt; or the
&lt;a href=&quot;https://wiki.jenkins.io/&quot;&gt;wiki&lt;/a&gt;, you have a &quot;Jenkins user account&quot; which
means you’ll be able to log into the issue tracker and vote for, or comment on
the issue linked above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(&lt;em&gt;note&lt;/em&gt;: if you have forgotten your password, use &lt;a href=&quot;https://jenkins-ci.org/account/&quot;&gt;the account
app&lt;/a&gt; to reset it.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re going to review feedback, make any necessary adjustments and either
approve or reject the proposal two weeks from today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned for the rest of the week as we keep with our theme of going &quot;from the inside out&quot; and help us make Jenkins 2.0 great!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/10/25/jenkins-2-0-proposal-introduce-a-policy-for-api-deprecation/</id>
<title>Jenkins 2.0 Proposal: Introduce a policy for API deprecation</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-10-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/10/25/jenkins-2-0-proposal-introduce-a-policy-for-api-deprecation/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='feedback'></category>
<summary>
Over the past few weeks there has been a vibrant discussion happening on the
jenkinsci-dev@ mailing
list as to what "Jenkins 2.0" means.  While
Jenkins does not currently adhere to semantic versioning,
the change of a major version number does indicate a major milestone for the community.


Project founder, Kohsuke Kawaguchi presented his
vision for Jenkins 2.0 in a office
hours session, the slides for
which can be found in this Google
Presentation.
Roughly paraphrasing Kohsuke&#8217;s vision, 2.0 is primarily about making things
better for the thousands of users out there.


This week, we&#8217;ll be reviewing some key areas of the "Jenkins 2.0" proposal.
Asking you, the user community, to provide feedback...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past few weeks there has been a vibrant discussion happening on the
&lt;a href=&quot;https://groups.google.com/group/jenkinsci-dev/topics&quot;&gt;jenkinsci-dev@&lt;/a&gt; mailing
list as to what &quot;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+2.0&quot;&gt;Jenkins 2.0&lt;/a&gt;&quot; means.  While
Jenkins does not currently adhere to &lt;a href=&quot;https://semver.org/&quot;&gt;semantic versioning&lt;/a&gt;,
the change of a major version number does indicate a major milestone for the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Project founder, &lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; presented his
vision for &lt;strong&gt;Jenkins 2.0&lt;/strong&gt; in a &lt;a href=&quot;https://www.youtube.com/watch?v=2eVyc_n8i1c&quot;&gt;office
hours&lt;/a&gt; session, the slides for
which can be found &lt;a href=&quot;https://docs.google.com/presentation/d/12ikbbQoMvus_l_q23BxXhYXnW9S5zsVNwIKZ9N8udg4&quot;&gt;in this Google
Presentation&lt;/a&gt;.
Roughly paraphrasing Kohsuke’s vision, 2.0 is primarily about making things
better for the thousands of users out there.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week, we’ll be reviewing some &lt;em&gt;key areas&lt;/em&gt; of the &quot;Jenkins 2.0&quot; proposal.
Asking you, the user community, to provide feedback on these proposals, going
from Jenkins internals to user interface.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today’s post involves a proposal to introduce a policy for &lt;strong&gt;API
deprecation&lt;/strong&gt; from community members &lt;a href=&quot;https://github.com/olivergondza&quot;&gt;Oliver
Gondža&lt;/a&gt; and &lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel
Beck&lt;/a&gt;. Extensibility is the heart of Jenkins, but over the past ten
years we’ve not had a proper API deprecation policy other than &quot;try not to
break plugins, ever.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Daniel, expanding more on the problem wrote:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have no backward compatibility policy besides &quot;compatibility matters&quot;.
With 1000+ plugins and basically the entire core being available to
plugins, a lot of difficult or impossible to remove cruft has accumulated over
the last ten years. This limits both what can be changed in core, and makes
documentation difficult to use for plugin developers.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The two have put together a detailed proposal under
&lt;strong&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31035&quot;&gt;JENKINS-31035&lt;/a&gt;&lt;/strong&gt; which
suggests we:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;limit the availability in APIs (classes, methods, fields, …​) provided by core
to a number of releases. Depending on the feature, this can range from a few
months, to a few years (e.g. two years being about 100 releases of Jenkins and
eight LTS baselines).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[…​]&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I highly encourage you to read the entire proposal &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31035&quot;&gt;on the issue
tracker&lt;/a&gt;, where we are
trying to collect feedback/history.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;providing-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#providing-feedback&quot; /&gt;Providing Feedback&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re asking you to read the proposal in
&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/31035&quot;&gt;JENKINS-31035&lt;/a&gt; and provide
feedback if you have it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have ever logged in to the &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;issue
tracker&lt;/a&gt; or the
&lt;a href=&quot;https://wiki.jenkins.io/&quot;&gt;wiki&lt;/a&gt;, you have a &quot;Jenkins user account&quot; which
means you’ll be able to log into the issue tracker and vote for, or comment on
the issue linked above.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(&lt;em&gt;note&lt;/em&gt;: if you have forgotten your password, use &lt;a href=&quot;https://jenkins-ci.org/account/&quot;&gt;the account
app&lt;/a&gt; to reset it.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re going to review feedback, make any necessary adjustments and either
approve or reject the proposal two weeks from today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned, and help make Jenkins 2.0 great!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/10/19/upcoming-in-office-hours-fosdem-planning-session/</id>
<title>Upcoming in office hours: FOSDEM Planning Session</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-10-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/10/19/upcoming-in-office-hours-fosdem-planning-session/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='video'></category>
<category term='office hours'></category>
<summary>
For the past several years we&#8217;ve been attending FOSDEM, a massive free and open source event in Brussels, Belgium. In preparation for this upcoming FOSDEM (2016) event, we will be hosting an open planning meeting via Google Hangouts during this week&#8217;s "Office Hours."


Agenda:




Gauge who can participate and at what capacity.


Pre-FOSDEM Contributor Summit


After-hours meetup/happy hour


Plans for a Jenkins stand (assuming we&#8217;re accepted):


What demo materials


Schwag


Revised Jenkins Flyer




The FOSDEM 2016 wiki page is where we will be recording plans and tasks will be added to JIRA. If you cannot join us via the FOSDEM Office Hours Hangout, we will also be watching the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the past several years we’ve been attending &lt;a href=&quot;https://fosdem.org&quot;&gt;FOSDEM&lt;/a&gt;, a massive free and open source event in Brussels, Belgium. In preparation for this upcoming FOSDEM (2016) event, we will be hosting an open planning meeting via Google Hangouts during this week’s &quot;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;Office Hours&lt;/a&gt;.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Agenda:&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;Gauge who can participate and at what capacity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pre-FOSDEM Contributor Summit&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After-hours meetup/happy hour&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plans for a Jenkins stand (assuming we’re accepted):&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What demo materials&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Schwag&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Revised &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Flyer&quot;&gt;Jenkins Flyer&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 &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/FOSDEM+2016&quot;&gt;FOSDEM 2016&lt;/a&gt; wiki page is where we will be recording plans and &lt;a href=&quot;https://issues.jenkins.io/secure/RapidBoard.jspa?rapidView=11&quot;&gt;tasks will be added to JIRA&lt;/a&gt;. If you cannot join us via the &lt;strong&gt;&lt;a href=&quot;https://hangouts.google.com/call/m5tymcvzqdudu7r7cvvylqn4hya&quot;&gt;FOSDEM Office Hours Hangout&lt;/a&gt;&lt;/strong&gt;, we will also be watching the &lt;code&gt;#jenkins-community&lt;/code&gt; channel on the &lt;a href=&quot;https://freenode.net&quot;&gt;Freenode&lt;/a&gt; network if you cannot participate directly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please join us on &lt;a href=&quot;https://hangouts.google.com/call/m5tymcvzqdudu7r7cvvylqn4hya&quot;&gt;this Google Hangout&lt;/a&gt; at 11:00 a.m. PDT this Wednesday (Oct 21)&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/10/09/cooking-up-jams/</id>
<title>Cooking Up JAMs</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-10-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/10/09/cooking-up-jams/" />
<author>
<name>alyssat</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='meetup'></category>
<category term='jenkinsci'></category>
<summary>
There&#8217;s been some active discussions and planning around Jenkins Area Meetups (JAMs) specifically in the following cities:




Rennes, France


Seville, Spain


Seattle, Washington


Barcelona,Spain


Raleigh, North Carolina


Atlanta, Georgia




I wanted to gauge Jenkins interests in these cities, so let us know at jenkinsci-jam@googlegroups.com if you live in one of these areas, and if you would be interested in becoming a member or be involved in JAM one way or another!


Of course, if the city you live in currently does not have a JAM and you&#8217;re interested in paying it forward, here&#8217;s HOW YOU can become a JAM organizer....
</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://jenkins-ci.org/sites/default/files/images/Seville-JAM_logo_1024px_0.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s been some active discussions and planning around &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;Jenkins Area Meetups (JAMs)&lt;/a&gt; specifically in the following cities:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Rennes-Jenkins-Area-Meetup/&quot;&gt;Rennes, France&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Seville, Spain&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Seattle, Washington&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Barcelona,Spain&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Raleigh-Jenkins-Area-Meetup/&quot;&gt;Raleigh, North Carolina&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/Atlanta-Jenkins-Meetup/&quot;&gt;Atlanta, Georgia&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;I wanted to gauge Jenkins interests in these cities, so let us know at &lt;a href=&quot;mailto:jenkinsci-jam@googlegroups.com&quot;&gt;jenkinsci-jam@googlegroups.com&lt;/a&gt; if you live in one of these areas, and if you would be interested in becoming a member or be involved in JAM one way or another!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, if the city you live in currently does not have a JAM and you’re interested in paying it forward, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+Area+Meetup&quot;&gt;here’s HOW YOU can become a JAM organizer.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/10/02/winners-of-docker-global-hack-day-3-are/</id>
<title>Winners of Docker Global Hack Day #3 are...</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-10-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/10/02/winners-of-docker-global-hack-day-3-are/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='plugins'></category>
<category term='jenkinsci'></category>
<category term='docker'></category>
<summary>
Over 2,000 members of the Docker community attended Docker Hack Day events around the world. One of the forty-two Docker Hacks has some familiar names attached&#8230;&#8203;


Nicolas De Loof and Yoann Dubreuil from Docker Rennes, who are also active in our community, waved the Jenkins flag in this event and produced Jenkins docker agents plugin.


This plugin lets you run builds inside containers, and in that sense it&#8217;s similar to the Docker plugin and the Docker custom build environment plugin. But internally it uses a quite interesting approach.




This fresh new implementation relies on a set of docker containers (aka ‘pod’) to setup...
</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://jenkins-ci.org/sites/default/files/images/docker-hack-day_0.preview.jpg&quot; alt=&quot;image&quot; width=&quot;320&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over 2,000 members of the Docker community attended &lt;a href=&quot;https://www.docker.com/community/hackathon&quot;&gt;Docker Hack Day&lt;/a&gt; events around the world. One of the forty-two Docker Hacks has some familiar names attached…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ndeloof&quot;&gt;Nicolas De Loof&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/yoanndubreuil&quot;&gt;Yoann Dubreuil&lt;/a&gt; from &lt;a href=&quot;https://www.meetup.com/docker-rennes&quot;&gt;Docker Rennes&lt;/a&gt;, who are also active in our community, waved the Jenkins flag in this event and produced &lt;a href=&quot;https://github.com/ndeloof/docker-slaves-plugin&quot;&gt;Jenkins docker agents plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This plugin lets you run builds inside containers, and in that sense it’s similar to &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Docker+Plugin&quot;&gt;the Docker plugin&lt;/a&gt; and &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/CloudBees+Docker+Custom+Build+Environment+Plugin&quot;&gt;the Docker custom build environment plugin&lt;/a&gt;. But internally it uses a quite interesting approach.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This fresh new implementation relies on a set of docker containers (aka ‘pod’) to setup a build executor, letting development team customize the build environment for their need without any constraint or prerequisite, and relying on docker containers to host test resources.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project &lt;a href=&quot;https://blog.docker.com/2015/09/docker-global-hack-day-3-winners/&quot;&gt;won the 3rd place in the Freestyle category of Docker Hack Day&lt;/a&gt;. Congratulations to Nicolas and Yoann on their win! Jenkins + Docker is a winning pair and this plugin will make a huge difference in your projects.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/10/01/upcoming-in-office-hours-jenkins-2-0/</id>
<title>Upcoming in office hours: Jenkins 2.0</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-10-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/10/01/upcoming-in-office-hours-jenkins-2-0/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='video'></category>
<category term='office hours'></category>
<summary>
I hope many of you have had a chance to see the Jenkins 2.0 thread.
I&#8217;m going to use the office hours next Wednesday to go through this proposal.


This is still primarily for developers in the project, as it&#8217;s "just" a proposal with lots of details unspecified. It&#8217;s more meant to help people understand where I&#8217;m coming from and what goals I have in mind for this effort.


As always, this will be on Hangout on air. The event page is here, and if you want to participate in the discussion, join here. Read-only viewers should use YouTube to watch, and you...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope many of you have had a chance to see &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/vbXK7JJekFw&quot;&gt;the Jenkins 2.0 thread&lt;/a&gt;.&lt;br&gt;
I’m going to use &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;the office hours next Wednesday&lt;/a&gt; to go through this proposal.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is still primarily for developers in the project, as it’s &quot;just&quot; a proposal with lots of details unspecified. It’s more meant to help people understand where I’m coming from and what goals I have in mind for this effort.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As always, this will be on Hangout on air. The event page is &lt;a href=&quot;https://plus.google.com/events/co46heshe6i4io1dsaaj1h3th2c&quot;&gt;here&lt;/a&gt;, and if you want to participate in the discussion, join &lt;a href=&quot;https://plus.google.com/hangouts/_/hoaevent/AP36tYfvk_ZBO4dCmxysNPfi-R5_xlkgscU-r9WDq_8zXDv6VnN3kg&quot;&gt;here&lt;/a&gt;. Read-only viewers should use &lt;a href=&quot;https://www.youtube.com/watch?v=fl5xfqtiNko&quot;&gt;YouTube&lt;/a&gt; to watch, and you can still send questions in real time to IRC and I’ll make sure to &lt;a href=&quot;https://jenkins-ci.org/content/chat&quot;&gt;go through them&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/09/30/bay-area-jam/</id>
<title>Bay Area JAM</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-09-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/09/30/bay-area-jam/" />
<author>
<name>alyssat</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='meetup'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
Last week, the first Jenkins Area Meetup (JAM) took place in San Jose, CA on Wednesday, Sept 23. What a way to kick off the first JAM other than to have Docker, John Willis as our guest speaker. John talked about immutable infrastructure and its benefits and role of containers.


Kohsuke discussed Jenkins Workflow, the motivation behind the same and latest features of Jenkins Workflow like multi branch support followed by docker use cases. The highlight of the meetup was definitely Kohsuke breaking the news about Jenkins 2.0 and his vision and motivation behind it.


The next Bay Area JAM is slated...
</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://jenkins-ci.org/sites/default/files/images/Screen%20Shot%202015-09-30%20at%202.15.54%20PM_0.png&quot; alt=&quot;image&quot; width=&quot;320&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week, the first &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/225059665/&quot;&gt;Jenkins Area Meetup (JAM)&lt;/a&gt; took place in San Jose, CA on Wednesday, Sept 23. What a way to kick off the first JAM other than to have Docker, John Willis as our guest speaker. John talked about &lt;a href=&quot;https://www.slideshare.net/botchagalupe/devops-and-immutable-infrastructure-cloud-expo-2015-nyc&quot;&gt;immutable infrastructure&lt;/a&gt; and its benefits and role of containers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kohsuke discussed &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Workflow+Plugin&quot;&gt;Jenkins Workflow&lt;/a&gt;, the motivation behind the same and latest features of Jenkins Workflow like &lt;a href=&quot;https://developer-blog.cloudbees.com/2015/08/workflow-19-and-multibranch-beta.html&quot;&gt;multi branch support&lt;/a&gt; followed by &lt;a href=&quot;https://blog.cloudbees.com/2015/06/building-modern-real-world-software.html&quot;&gt;docker use cases&lt;/a&gt;. The highlight of the meetup was definitely Kohsuke breaking the news about Jenkins 2.0 and his vision and motivation behind it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next Bay Area JAM is slated for Oct 21. Be sure to check &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/&quot;&gt;HERE&lt;/a&gt; for the agenda. We’d love to have you join us if you’re in the area. If you’re interested in speaking, or become a food &amp;amp; bev, venue, or recording sponsor please send email to the organizer or &lt;a href=&quot;mailto:events@lists.jenkins-ci.org&quot;&gt;events@lists.jenkins-ci.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/09/29/gui-improvements-on-the-horizon/</id>
<title>GUI improvements on the horizon</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-09-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/09/29/gui-improvements-on-the-horizon/" />
<author>
<name>gusreiber</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='feedback'></category>
<category term='video'></category>
<category term='workflow'></category>
<summary>
This past Thursday, September 24th, 2015, I presented a couple of prototypes of what I hope will be the future of the Jenkins GUI. Or perhaps more correctly, close enough to the future to start generating positive feedback from you the community that improving the Jenkins GUI is important and some pieces that I am showing are going in the right direction. If you have ~45 minutes to spare, I recommend the video (the narrator&#8217;s voice is very soothing). If not, I offer the following as a reasonable summary.


Jenkins has a lot of strengths as tool. Its robust user community...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This past Thursday, September 24th, 2015, I presented a couple of prototypes of what I hope will be the future of the Jenkins GUI. Or perhaps more correctly, close enough to the future to start generating positive feedback from you the community that improving the Jenkins GUI is important and some pieces that I am showing are going in the right direction. If you have ~45 minutes to spare, I recommend the video (the narrator’s voice is very soothing). If not, I offer the following as a reasonable summary.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has a lot of strengths as tool. Its robust user community along with its thoughtful and extensible design are two of the most immediate. They are the two pillars that have made Jenkins the leader in the CD/CI space and the de facto choice for most of us looking to automate our build and test processes. But let’s face it, by today’s standards, the GUI doesn’t really sing. I will even go so far as to say, I believe it is a platform liability at the moment, and even among we the Jenkins faithful, few of us look forward to using it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In an effort to turn that tide, I traveled to this year’s 3 main JUC events, in DC, London, and Santa Clara, pushing the idea that enhancement is possible and providing an evolving sketch of what that might look like. The three main areas of enhancement I have targeted for a first round of improvement are these:&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://youtu.be/A_lu-P0OhNQ&quot;&gt;Item creation and configuration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=9vPUMe3lzfo&quot;&gt;Plugin selection&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://youtu.be/fja9nxXcykg&quot;&gt;Workflow construction&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;Soon to follow, but not yet prototyped by me would be pieces dedicated to monitoring jobs in Jenkins as well as node and resource utilization and efficiency. Rightly or wrongly, I have started with the create and configure side of the GUI, as I see it as somewhat primary in a typical job creation scenario (you have to create a job before you can monitor it), but this second piece is no less important. Sadly, lips service is all I can offer you today, but more prototypes and video demonstrations are on the way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;item-creation-and-configuration-in-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#item-creation-and-configuration-in-jenkins&quot; /&gt;Item Creation and Configuration in Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In most use cases, item creation means creating a freestyle job, so that is what I use as my base use case example. It is important to note, however, that most configuration in Jenkins happens through a shared set of GUI components. These components are a blend of Jelly files and Javascript and can be found in the …​/main/resources/lib/form directory in the Jenkins source code. In operating on these pieces, I have the opportunity to effectively enhance broad areas of the Jenkins experience, including aspects of plugin use that share these components. This greatly increases the upside of the effort as well as the possible drama and side effects, which I will go into more detail on later.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As for the upside piece, the first bit of improvement I am looking to attain is breaking up the many &#39;toilet paper&#39; style unbroken configuration lists sprinkled throughout Jenkins. The first example of this appears in item creation. On first installation, this issue is not immediately obvious, but if you have installed a variety of plugins or chosen to purchase CloudBee’s Jenkins Enterprise product, you will find that Jenkins can have quite a few types of items to create. While they do have descriptive text, I still find them difficult to differentiate and almost impossible to casually scan. Thus, my first suggestion is to add some form of categorization to the item types. For this to function correctly, the GUI will need to be smart enough to apply the categories only when item counts are sufficient to justify them (if you only have 4 item creation types, it doesn’t make sense to have 8 categories with which to sort them). But if you are a long time Jenkins user with many plugins you may also know it is possible to have more than a dozen item types. So if nothing else, an extension point that allowed for the categorization of item types seems helpful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The configuration form itself, it also can become incredibly long with few landmarks or visual differentiation points. As a remedy, I propose calling out and clearly boxing each of the existing configuration sections and making sure that their names are as meaningful as possible. As an added step, I make the sections collapsible. This allows the user to jump to specific points in the form and tuck other areas out of the way. In some cases, we can make specific sections open by link context or even by user context.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;plugin-selection&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#plugin-selection&quot; /&gt;Plugin Selection&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another essential piece of the Jenkins experience is plugin configuration. Today, if you are looking to add plugins to your Jenkins environment, you are almost certainly using Google to find a 3rd party review site, collecting the name of the plugin you want and then either linking to it on this website, or filtering for it in the Plugin Manager GUI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Neither in the product nor on this website is there a particularly good resource for comparing plugins and evaluating which you might add.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead, I am looking to add something akin to an application store experience to both this website and the product UI. You should be able to group sort and compare plugins by a variety of criteria, including author, installation base, and user review. You should also have a set of general use categories that fits user needs and expectations, rather than the free ranging labels that plugin authors have arbitrarily applied today.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;workflow-script-builder&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#workflow-script-builder&quot; /&gt;Workflow Script Builder&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, I have a GUI that allows for a sort of Drag-n-drop assembly of Workflows. A major tenant of the utility of Workflows as opposed to Freestyle jobs is that they can be completely separated from the Jenkins GUI and stored in a source repository. None-the-less, with absolutely no GUI, there is little to guide the user who is looking to get started without a upfront learning investment. As it turns out, a Workflow/Groovy script is pretty straight forward, but you don’t really know that until you have made one. Also, Workflow allows for the orchestration of jobs across multiple nodes of hardware resources, making it a potentially involved little bit of configuration. Thus, my goal here is two fold. Allow the user to model a workflow quickly and easily and showcase a few of the more advanced features workflow enables. The result is this script builder. My hope is to host the prototype somewhere you all might be able to use it directly, but in the meantime, my hope is that my video pretty well explains how it works. Please take a &lt;a href=&quot;https://youtu.be/fja9nxXcykg&quot;&gt;look&lt;/a&gt; and post whatever comments you see fit.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;and-really-send-along-feedback&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#and-really-send-along-feedback&quot; /&gt;…​and really send along feedback…​&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So with all things community related, please, please, send back whatever feedback makes sense. I can be reached via Twitter &lt;a href=&quot;https://twitter.com/gusreiber&quot;&gt;@gusreiber&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Other places you can find me include, IRC (freenode/#jenkins) and &lt;a href=&quot;https://plus.google.com/GusReiberUI[Google&quot; class=&quot;bare&quot;&gt;https://plus.google.com/GusReiberUI[Google&lt;/a&gt; (&lt;a href=&quot;https://plus.google.com/+GusReiberUI&quot; class=&quot;bare&quot;&gt;https://plus.google.com/+GusReiberUI&lt;/a&gt;)]. I would love to hear from you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;questions-and-answers-from-the-talk&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#questions-and-answers-from-the-talk&quot; /&gt;Questions and Answers from the talk:&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;How likely is it that any of these UI changes will make it into the core open source Jenkins? When would we start seeing them there?&lt;/strong&gt;&lt;br&gt;
Most will be OSS. An exact schedule has not been determined, but most of it is still about a year away. Likely we will have an experimental wars for download along the way.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Is there anyway to determine which GUI attributes are contributed by which plugin?&lt;/strong&gt;&lt;br&gt;
I take it that is a bit of a feature request? It came up at JUC West as well. Should be something that can be surfaced in the GUI. I agree, it would be helpful.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What is the difference between ANT and Jenkins?&lt;/strong&gt;&lt;br&gt;
Ant is a good bit more bare-bones than Jenkins. In fact, you can add an Ant plugin to your Jenkins environment. You would typically use Ant to compile java source files. Jenkins orchestrates the fetching of the source files from some particular repository, the building of those files (often Jenkins uses Ant via its plugin to do this), running and reporting some suite of tests against that build, and then archiving or deploying the artifacts to wherever. Often times this requires navigating several computers with their own security constraints, so Jenkins helps you manage that as well.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What version of the Jenkins it is?&lt;/strong&gt;&lt;br&gt;
This isn’t available today, but I am building against 1.621-SNAPSHOT currently, but will upgrade with Jenkins to the coming December LTS. I’m interested in seeing the list of 100 plugins that you mentioned (by Daniel?) Me too. :^) He and the community (which can be you if want to join IRC freenode.net/#jenkins and attend the hangouts and governance meetings: &lt;a href=&quot;https://jenkins.ci.org&quot; class=&quot;bare&quot;&gt;https://jenkins.ci.org&lt;/a&gt; )&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For IRC, I assume the server is freenode.net?&lt;/strong&gt;&lt;br&gt;
Yes.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Will there be any dashboard kind of feature for the build history in the new GUI?&lt;/strong&gt;&lt;br&gt;
So far, I have been focusing on the create and configuration portion of the Jenkins UX as I see it as a barrier to entry for new users. The read/report/analyze half of the Jenkins UX I actually see as the portion with more long term value, as you tend to read more often than you write, so I am eager to jump in here as well. …​.however, in its core today, Jenkins the tool seems to me to really want to see the world in the same context of flat XML files in folders as it actually persists its configuration data. To really make meaningful dashboards, it needs to be possible to query job configurations and build artifacts by a wide set of criteria that is not at all related to the folder in which the xml file happens to be stored. Also, some of the things you care about in the Jenkins universe are compute resources (controller/agents/exactures). These are also not the same as config files in folders and need to be queryable as their own first class type of entity. …​so what I am saying with a lot of words is that I see the config piece as a somewhat more immediate and urgent fix. The broccoli of the meal, if you will. I will want to get that out as fast as possible to get it out of the way. The reporting piece is actually the wine. At the moment, we are giving you Bartles and Jaymes in paper cups. …​so a lot of work is still needed there.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Have you investigated Google Polymer as UI components for jenkins UI?&lt;/strong&gt;&lt;br&gt;
I have not, but will now. I am actually quite a google fan-boy in much the way a lot of kids love Apple. (I also love Apple… being from Seattle, I even love MS). But, for the super near term, we are most focused on getting JQuery cleanly into core and Prototype.JS deprecated. Walk first, is my feeling.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Are there any tutorials on Jenkins workflow?&lt;/strong&gt;&lt;br&gt;
Jesse Glick or KK are better people to ask about that, really. They are also on IRC: freenode.net/#jenkins. Daniel Beck as well, might be a good person to ask. My little workflow demo is still really just fiction. Will there be a &#39;Expand All&#39; and &#39;Collapse All&#39; buttons for the accordions in new configure GUI? (I would probably inject one if not by default) Yes. Also, they should be URL controllable so that they can be set by link or user context easily. Maybe they should also remember what you had open last? …​stuff to tinker with that really needs to be right.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What impact does the UI changes have on job configuration behind the scenes? Is configuration still stored in XML format?&lt;/strong&gt;&lt;br&gt;
None. The post string stays the same and from then on, Jenkins is Jenkins.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Can the create item screen be configurable? At the moment, no, but ideally yes. It is still a big hand wave at the moment about how those categories are created, managed, and updated. The same categories ought to bubble back up when searching for the plugins to help relate what plugins generate what UI. I am hoping for guidance from the community. How will workflow fit in with new UI?&lt;/strong&gt;&lt;br&gt;
In some respects, the new configuration page is about enhancing the more traditional freestyle job and not workflow. However, the last bit of my presentation with the script builder is exclusively about workflow. The plugin manager is about plugins, so it would apply to both.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;How is a human notified for the wait for approval step in this workflow?&lt;/strong&gt;&lt;br&gt;
So workflow approval can be done via the web GUI. But to get real notification, you would program that into your workflow Jenkins has a fairly large set of notification plugins. So you can use Jenkins to trigger email, or SMS, or HipChat, or Slack, or pretty much whatever. As these plugins are increasingly customized for workflow, you will get nice and nice workflow syntax for instantiating those actions. When my script builder is adopted, you would have a friendly button you could drag into the stage and it would notify you prior to the manual checkpoint.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom plugins still supported?&lt;/strong&gt;&lt;br&gt;
Yes. Though there is supported and supported. The highest level of support for a plugin would be a custom DSL for workflow that would make for streamlined syntax in workflow for interacting with that plugin via Groovy. But existing plugins do not need that level of support to be used within a Jenkins file / Groovy script. Instead, the syntax for accessing the plugin is likely to be more complicated. ….some plugins are freestyle specific, in which case, they no longer make sense in workflow. ….Daniel Beck or Jesse Glick are probably better suited to answering this question, however…​&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Will there be an improvement in performance with docker builds, sonar scanning? From my experience sonar takes 20+ mins with jenkins plugin where as it takes 3 mins with maven plugin&lt;/strong&gt;&lt;br&gt;
Is this times it is taking the GUI to render, or the actual build to run? I am not sure I am following the question exactly, but regardless, I am not well equipped to answer many questions about performance issues in Jenkins. I know of a fairly major performance issue specifically in the configuration form that I believe will be fixed in the new GUI, but that isn’t build performance, it is just form rendering performance.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I like the graphical configuration. Thanks. The scripting of a complex workflow looked a bit daunting.&lt;/strong&gt;&lt;br&gt;
Cool. Yeah, my main and first goal is to get something out there that would allow folks to quickly sketch and deploy an actual working workflow that reasonably reflects an 80%ish use case. No GUI can ever be as fully flexible as a script, but I don’t think most people need the 95% case to get started and see the benefit of a versionable and robust config file format.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Will there be any effort to make the UI mobile friendly for the admin on the go?&lt;/strong&gt;&lt;br&gt;
Absolutely. Especially on the TBD read/reporting end of the UI, but everything new needs to meet a reasonably high bar of device responsiveness. Today, the Jenkins GUI is just not responsive. Which is terrible.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;As a plugin developer do I need to change implementing the ui source from jelly or groovy to some other language/technique or will it be compatible?&lt;/strong&gt;&lt;br&gt;
So you will not NEED to change from whatever you are doing, except if you have built a plugin GUI that has custom script that either relies directly on behavior.js, hudson-behavior.js, or the particulars of the existing DOM structure (you do something in the client that requires your or some other input to be in a particular TABLE TR TD DOM traversal path). …​I believe 2 things are going to continue to happen at a faster and faster rate. New plugin authors are not going to want to write GUIs in Jelly and Prototype.js, but instead use some more modern client side MVC approaches like Angular, where the GUI interacts with a REST api instead of being a dom directly rendered from the server. It is a bit of a different mode of working than Jelly, and maybe slightly less direct, but it is a lot easier to find doc on how to do things with JQuery, Agile, Handlebars and the like, than it is to find doc on Jelly. And the responsiveness and breadth of gestures and controls in Jelly are already terribly behind what is now the main stream of web UI development. So I think plugin builders are, if they aren’t already, going to want better tools available to them. I also think that people are going to gravitate towards workflow or something similar. Since the UI for workflow is foremost a script, making a GUI for a plugin that works with it might be a fundamentally different beast. …​depending on what the plugin is trying to do… So again, new plugins or even upgrading existing plugins to work with workflow are likely want a new technology set, not just because the existing Jenkins GUI is changing, but because new plugins will want to do different and better stuff.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Are there connectors for other source control tools like CVS and Dimensions?&lt;/strong&gt;&lt;br&gt;
I am not sure exactly which connector plugins are already supporting Workflow or how deeply that support goes. Because Jenkins has plugins that provide access to these SCMs, you can use workflow to go and fetch those source trees. A greater level of support for workflow from these plugins would mean a more elegant workflow syntax for that interaction. At the moment, my GUI script builder is still fiction. My plan would be to add GUI buttons for whatever are the most popular SCMs and I will attempt to mask the syntax regardless of its clumsiness. ….the way I am constructing my initial prototype, there is already a reasonably clear extension point for adding buttons that generate some chunk of Groovy syntax when it is dragged into a stage. So I will add the initial set based on community feedback and then the community can continue to add their own.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What are the compatibility issues existing plugin developers needs to be aware of?&lt;/strong&gt;&lt;br&gt;
For plugins that interact with freestyle jobs, or really most job types that aren’t workflow, plugin developers should expect the page DOM structure to change. If for whatever reason, they find they are busting into some custom script to traverse the DOM to compare 1 setting to another, that will break. Also, hudson-behaviors.js itself has a number of functions in it that do DOM traversing, like “findFollowingTR”. In some cases the signatures of those functions might need to change and the DOM structure that they return might also change. If a plugin uses what were meant to have been internal functions, they are likely to break. Finally, the page geometry is going to change. This may seem so superficial and obvious that, who cares, but sometimes changing a column width translates into an important part of a GUI being hidden or otherwise inaccessible. That ends up being as critical a break as any other. …​so to combat these points of possible breakage, we are going to be looking for a handful somewhere between 20 and 100 plugins that we will want to test against. We haven’t made that list yet, let alone run any tests, so that is really a critical next step. For the plugin manager changes, I don’t see much if any of a braking issue, although I would like to add additional sorting and display power to the GUI, which means the GUI will need more metadata than currently exists, if the plugins want to take advantage of that new power in the GUI. This won’t break things, but plugin authors might want to go back to their plugins and fill in whatever the new bits of metadata end up being…. most likely they would be things like, richer descriptions, better category selections, and possibly icons.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;I’ve not seen a lot of Jenkins but what I had I didn’t really get, was awkward for all the reasons Gus mentioned. This looks brilliant. When can we have it?&lt;/strong&gt;&lt;br&gt;
Tom and I, and now our junior pledge, Keith (not actually junior at all, just more fit than me), are busily typing as fast as we can as well as lobbying the community that our vision is more or less a correct one. We have a very interesting initial plugin selection GUI that might make this years final LTS (which I did not demo), which is none-the-less a nice step forward for Jenkins. In it will be a lot of the JS library bundling that will enable most of what I have shown in this demo. Our hope is that with each LTS we will be able to push out an additional piece of the GUI puzzle. Likely starting with the job create and configure GUI, which would be the mid year LTS. I am hoping that a year from now this will be how Jenkins looks and acts. ….in the meantime, we are grappling with how best to push preview releases so people can play with it and send me hate mail.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Is there any way to test front end of Jenkins plugins? And will that improve too?&lt;/strong&gt;&lt;br&gt;
A major and almost blocking portion of this work used to be the custom and somewhat broken version of HTMLUnit that was in core, which greatly hampered including libraries other than Prototype in Jenkins and writing code using those libraries in some sort of testable way. Our new approach to rebuilding the Jelly controls which are the foundation of the Jenkins config page and in general are shared by all plugins that need to post data back to Jenkins, already have a testing strategy backed into our design. Those Jelly form controls are extensible in Jenkins today and would remain so. Our hope would be that any plugin adding custom controls would follow our same design and test pattern we are building in core. ….so that was a long answer, but the short answer YES! Today, building GUI parts into your Jenkins plugin is a bit of a mystery, where most people copy something they saw someone else did, hack it, and the only test is, well…. it worked for me. That is no good and a fundamental piece we are looking to change. ….still a long answer… Node.js and Jasmine are the specific tools we using.&lt;/br&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What’s the estimated rollout date for this workflow feature?&lt;/strong&gt;&lt;br&gt;
The workflow feature is the newest concept I demonstrated, but in a lot of ways may also be the easiest to ship. As a script generator, exclusively, it could be hosted anywhere, and then you just paste your generated workflow script into the whatever existing Jenkins GUI better, submit into your source code. ….but at the moment, it isn’t actually on an official roadmap yet. Assuming the response to it remain positive, I would expect that to change fairly quickly.&lt;/br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/09/19/office-hour-on-form-handling-in-jenkins/</id>
<title>Office hour on form handling in Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-09-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/09/19/office-hour-on-form-handling-in-jenkins/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='office hours'></category>
<summary>
Update: This week&#8217;s office hour has been canceled.


This Wednesday, Sep 23, at 11 am PDT I will host another office hour on Stapler, the web framework used in Jenkins. This time, I&#8217;ll show you how structured form submission in Jenkins works, and how Stapler can help you with it.


As usual, the office hour will use Hangout on Air, and a limited number of people will be able to join and participate. The others will be able to watch the office hour live on YouTube. Links to participate and watch will be posted before the event on the Office Hours wiki...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Update: This week’s office hour has been canceled.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20150923T11&amp;amp;p1=283&amp;amp;ah=1&quot;&gt;This Wednesday, Sep 23, at 11 am PDT&lt;/a&gt; I will host another office hour on &lt;a href=&quot;https://github.com/stapler/&quot;&gt;Stapler&lt;/a&gt;, the web framework used in Jenkins. This time, I’ll show you how structured form submission in Jenkins works, and how Stapler can help you with it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As usual, the office hour will use Hangout on Air, and a limited number of people will be able to join and participate. The others will be able to watch the office hour live on YouTube. &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;Links to participate and watch will be posted before the event on the Office Hours wiki page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Update: This week’s office hour has been canceled.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/09/07/office-hour-on-proposed-ui-ux-changes/</id>
<title>Office hour on proposed UI/UX changes</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-09-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/09/07/office-hour-on-proposed-ui-ux-changes/" />
<author>
<name>daniel-beck</name>
</author>
<category term='development'></category>
<category term='screencast'></category>
<summary>
Gus Reiber will host this week&#8217;s office hour on Wednesday, 11 AM PDT. He&#8217;ll talk about some of the UI/UX improvements in Jenkins that he&#8217;s working on, and will answer your questions about it.


He&#8217;s already given several talks about this, so you can check these out to learn more before the office hour:




JUC US East


JUC Europe


JUC US West




There are also some mailing list threads where he&#8217;s discussing his designs with the community:




February to April discussion


July discussion




The links to the Google Hangout (participate) and Youtube (watch live) will be posted to the wiki before the event. If you don&#8217;t get into...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Gus Reiber will host this week’s office hour on &lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20150909T11&amp;amp;p1=283&amp;amp;ah=1&quot;&gt;Wednesday, 11 AM PDT&lt;/a&gt;. He’ll talk about some of the UI/UX improvements in Jenkins that he’s working on, and will answer your questions about it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;He’s already given several talks about this, so you can check these out to learn more before the office hour:&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.cloudbees.com/jenkins/juc-2015/abstracts/us-east/02-03-1400-reiber-fennelly&quot;&gt;JUC US East&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/01-02-1400-fennelly-reiber&quot;&gt;JUC Europe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-02-1500&quot;&gt;JUC US West&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;There are also some mailing list threads where he’s discussing his designs with the community:&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://groups.google.com/forum/#!topic/jenkinsci-dev/6BdWZt35dTQ&quot;&gt;February to April discussion&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/Tiz-LSqCJmg/3CuYzuBXJpsJ&quot;&gt;July discussion&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 links to the Google Hangout (participate) and Youtube (watch live) &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;will be posted to the wiki before the event&lt;/a&gt;. If you don’t get into the Hangout (limited number of participants), don’t worry: You’ll be able to send questions and suggestions to his &lt;a href=&quot;https://twitter.com/gusreiber&quot;&gt;Twitter account @gusreiber&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/09/03/jenkins-user-conference-west-day-1/</id>
<title>Jenkins User Conference West Day 1</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-09-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/09/03/jenkins-user-conference-west-day-1/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
Boy, what a day! This is the 5th annual JUC in San Francisco bay area, and the crowd is getting bigger.


I brought the LEGO Jenkins + CloudBees logo mosaic that we built at the CloudBees San Jose office:





The community booth was very busy. We have people like Dean Yu (board), Andrew Bayer (board), Mark Waite (git), Jesse Glick (workflow and core), Daniel Beck (core), Vincent Latombe (literate), Steven Christou (subversion) and Owen Mehegan (community outreach) talking to people all day long.


If you are here, make sure to stop by, and if you are not, follow news with #jenkinsconf....
</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://pbs.twimg.com/media/CN6MLZnUsAAj0RD.jpg&quot; alt=&quot;image&quot; width=&quot;300&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Boy, what a day! This is the 5th annual JUC in San Francisco bay area, and the crowd is getting bigger.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I brought the LEGO Jenkins + CloudBees logo mosaic that we built at the CloudBees San Jose office:&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://pbs.twimg.com/media/CN6Cid3UEAEx5xK.jpg&quot; alt=&quot;image&quot; width=&quot;500&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The community booth was very busy. We have people like Dean Yu (board), Andrew Bayer (board), Mark Waite (git), Jesse Glick (workflow and core), Daniel Beck (core), Vincent Latombe (literate), Steven Christou (subversion) and Owen Mehegan (community outreach) talking to people all day long.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are here, make sure to stop by, and if you are not, follow news with &lt;a href=&quot;https://twitter.com/search?q=%23jenkinsconf&quot;&gt;#jenkinsconf&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/09/01/take-the-2015-jenkins-survey/</id>
<title>Take the 2015 Jenkins Survey!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-09-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/09/01/take-the-2015-jenkins-survey/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<summary>
Just as in past years, we are running a survey this year, to get some objective insights into what our users would like to see in the Jenkins project. Obviously, the developers in the project deal with individual bug reports and feature requests all the time, but sometimes those day-to-day issues distract you from a bigger picture.


This year, we kept some of the questions the same, so that we can see the trend over time. But we also wanted to bring in some questions around how you are using Jenkins and what other technologies you leverage such as Linux containers...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just as in past years, &lt;a href=&quot;https://www.surveymonkey.com/s/Jenkins2015&quot;&gt;we are running a survey&lt;/a&gt; this year, to get some objective insights into what our users would like to see in the Jenkins project. Obviously, the developers in the project deal with individual bug reports and feature requests all the time, but sometimes those day-to-day issues distract you from a bigger picture.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, we kept some of the questions the same, so that we can see the trend over time. But we also wanted to bring in some questions around how you are using Jenkins and what other technologies you leverage such as Linux containers and cloud services.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The survey will close at the end of September and, if you participate, you’ll get to see the results first. CloudBees is sponsoring the survey and as an added incentive for us to fill it out, CloudBees has pitched in a $100 Amazon gift card (thanks CloudBees!). Information you submit is only going to be used by the community and not by CloudBees. So please take the survey and let your voice be heard.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudbees.com/2015/09/jenkins-community-survey-your-chance-to.html&quot;&gt;Finally, there are laws that govern prize giveaways like this and CloudBees has put up terms and conditions for this.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;take-the-survey-here&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#take-the-survey-here&quot; /&gt;&lt;a href=&quot;https://www.surveymonkey.com/s/Jenkins2015&quot;&gt;Take the survey here&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;

&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/31/plugin-spotlight-version-column-plugin/</id>
<title>Plugin Spotlight: Version Column Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/31/plugin-spotlight-version-column-plugin/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='plugins'></category>
<summary>
Most Jenkins controllers with a distributed build configuration will leverage nodes that run a agent.jar to start an agent. Regardless of whether the agent.jar is launched through a Java Web Start or SSH launcher, the jar will be copied from https://yourserver:port/jnlpJars/agent.jar to the build node. Keeping this jar up to date ensures that it picks up the newest features in a more recent release, such as the self-restart feature to keep agent JVMs &#8220;clean&#8221; and to automatically reconnect to their controller. Additionally, newer versions of this component may fix bugs or implement newer protocol versions with various improvements.


What is the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most Jenkins controllers with a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Distributed+builds&quot;&gt;distributed build&lt;/a&gt; configuration will leverage nodes that run a &lt;code&gt;agent.jar&lt;/code&gt; to start an agent. Regardless of whether the &lt;code&gt;agent.jar&lt;/code&gt; is launched through a Java Web Start or SSH launcher, the jar will be copied from &lt;code&gt;https://yourserver:port/jnlpJars/agent.jar&lt;/code&gt; to the build node. Keeping this jar up to date ensures that it picks up the newest features in a more recent release, such as the &lt;a href=&quot;https://jenkins-ci.org/content/your-java-web-start-slaves-will-be-always-clean&quot;&gt;self-restart feature&lt;/a&gt; to keep agent JVMs “clean” and to automatically reconnect to their controller. Additionally, newer versions of this component may fix bugs or implement newer protocol versions with various improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-the-version-column-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-the-version-column-plugin&quot; /&gt;What is the Version Column Plugin?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Launch methods designed to pull the latest &lt;code&gt;agent.jar&lt;/code&gt; &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/16490&quot;&gt;are not always reliable&lt;/a&gt; and some launch methods don’t even try to update the &lt;code&gt;agent.jar&lt;/code&gt;. Therefore it can be useful to see what &lt;code&gt;agent.jar&lt;/code&gt; version is running on a given build node and take offline any nodes which fails to update to the latest version of the jar.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Version Column Plugin allows Jenkins controllers to do just this, adding a new column to the “Manage Nodes” view and a new option for version enforcement on the node configuration screen.&lt;/p&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;After installing the Version Column Plugin, navigate to the list of nodes in your Jenkins instance by clicking &lt;em&gt;Build Executor Status&lt;/em&gt; in the executors widget below the side panel on the Jenkins home page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the plugin installed successfully, you will see a new column simply called “Version”. This column displays the version of the &lt;code&gt;agent.jar&lt;/code&gt; that each build node is using.&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/sites/default/files/images/versioncolumn-plugin-screenshot-1-2.png&quot; alt=&quot;versioncolumn plugin screenshot 1 2&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This column is simply displaying the versions, so enforcement of &lt;code&gt;agent.jar&lt;/code&gt; versions will need to be configured elsewhere. To activate this, click on the “Configure” link in the node manager’s left-hand menu.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will then see a set of options for agents. To activate version enforcement, check the “Version” box and apply your changes.&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/sites/default/files/images/versioncolumn-plugin-screenshot-2.png&quot; alt=&quot;versioncolumn plugin screenshot 2&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you update Jenkins, there’s a chance it’ll come with a new version of &lt;code&gt;agent.jar&lt;/code&gt;. Now if the &lt;code&gt;agent.jar&lt;/code&gt; on a particular agent doesn’t get updated automatically, the controller will take it offline and show a warning next to the out-of-date agent version number:&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/sites/default/files/images/versioncolumn-plugin-screenshot-3.png&quot; alt=&quot;versioncolumn plugin screenshot 3&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Version Column Plugin is available for download in the Jenkins plugin manager or from &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/VersionColumn+Plugin&quot;&gt;its wiki page&lt;/a&gt;.&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/2015/08/31/juc-speaker-blog-series-laurette-cisneros-juc-u-s-west/</id>
<title>JUC Speaker Blog Series: Laurette Cisneros, JUC U.S. West</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/31/juc-speaker-blog-series-laurette-cisneros-juc-u-s-west/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
Last year&#8217;s JUC West 2014 was packed with good gems of information – such as "how we did it" talks where the speakers shared their points of view on the tools they use for automating their pipeline. At JUC and other conferences I especially seek out talks about how others implement their Continuous Delivery processes. At the upcoming JUC West 2015, it is my turn to share “how we did it” at Perforce. I will present my talk "Continuous Delivery: Driving Lessons” and describe our journey, the rewards we reaped, and the challenges we faced along the way.


At Perforce, we...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last year’s &lt;a href=&quot;https://www.cloudbees.com/event/juc/2014/san-francisco&quot;&gt;JUC West 2014&lt;/a&gt; was packed with good gems of information – such as &quot;how we did it&quot; talks where the speakers shared their points of view on the tools they use for automating their pipeline. At JUC and other conferences I especially seek out talks about how others implement their Continuous Delivery processes. At the upcoming &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC West 2015&lt;/a&gt;, it is my turn to share “how we did it” at Perforce. I will present my talk &quot;Continuous Delivery: Driving Lessons” and describe our journey, the rewards we reaped, and the challenges we faced along the way.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At &lt;a href=&quot;https://www.perforce.com/&quot;&gt;Perforce&lt;/a&gt;, we see Continuous Delivery as taking the proven technique of automation and expanding it to a solid set of practices that make the pipeline even more efficient. This includes empowering the product teams to own production and quality all the way from requirements to delivery, and moving from a central build and release team to a self-serve infrastructure to remove the &quot;friction&quot; in the workflow. These changes have allowed us to quickly, efficiently and reliably adapt our software in line with user feedback, shifts in the market, and changes to the business strategy.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I look forward to seeing you there!&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://jenkins-ci.org/sites/default/files/images/cisneros_0.preview.jpg&quot; alt=&quot;image&quot; width=&quot;150&quot; height=&quot;224&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Laurette Cisneros, Engineering Tools Manager at Perforce Software. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC U.S. West&lt;/a&gt;, you can attend her talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-03-1500&quot;&gt;&quot;The Road to Continuous Delivery: Driving Lessons&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Register here for a JUC U.S. West, the last JUC of the year!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/31/jenkins-cia-program-and-meetup-updates/</id>
<title>Jenkins CIA Program and Meetup Updates</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/31/jenkins-cia-program-and-meetup-updates/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='meetup'></category>
<category term='jenkinsci'></category>
<summary>
A few years ago, the Jenkins community announced the Jenkins CIA program - the Continuous Integration Ambassador initiative to spread the word of Jenkins. As of recently, there hasn&#8217;t been as much activity, so this program needs to be revived!


There are over 120,000 active Jenkins installations now and that number just keeps climbing and climbing. It&#8217;s important to bring all of us together through big events like the Jenkins User Conference, but not everyone can get there. That is why Meetups and smaller Jenkins events are crucial.


To support this effort, CloudBees has announced that they will be sponsoring the kickoff...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few years ago, the Jenkins community announced the &lt;a href=&quot;https://jenkins-ci.org/content/announcing-jenkins-cia&quot;&gt;Jenkins CIA program&lt;/a&gt; - the Continuous Integration Ambassador initiative to spread the word of Jenkins. As of recently, there hasn’t been as much activity, so this program needs to be revived!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are over 120,000 active Jenkins installations now and that number just keeps climbing and climbing. It’s important to bring all of us together through big events like the Jenkins User Conference, but not everyone can get there. That is why Meetups and smaller Jenkins events are crucial.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To support this effort, CloudBees has announced that they will be sponsoring the kickoff of the CIA revival/https://jenkins-ci.org/content/bay-area-jenkins-area-meet-looking-you[JAM] to help the Jenkins community host these Meetups!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To kick this off, &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/225059665/&quot;&gt;the first Jenkins Area Meetup (JAM)&lt;/a&gt; is in the San Jose CloudBees office on &lt;strong&gt;Sept 23&lt;/strong&gt;. We are shooting to have a JAM everything 3rd Wednesday of every month to consistently bring the community together.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/28/juc-speaker-blog-series-jamie-omeara-juc-u-s-west/</id>
<title>JUC Speaker Blog Series: Jamie O&#39;Meara, JUC U.S. West</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/28/juc-speaker-blog-series-jamie-omeara-juc-u-s-west/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
Cloud Native and the benefits to Continuous Delivery (CD) Pipelines


There’s a lot of discussion lately around Cloud Native. If this term is new to you, I suggest a quick read of Cloud Native: What it Means and Why it Matters? From my perspective, Cloud Native offers tremendous benefit to enterprise companies, startups and developers looking to add value quickly or capture market share. Cloud Native platforms, such as Cloud Foundry, provide a number of features to reduce the effort of developing software and operating it on or off premise. A few notable features include load balancing, application routing, cluster scheduling,...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;cloud-native-and-the-benefits-to-continuous-delivery-cd-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cloud-native-and-the-benefits-to-continuous-delivery-cd-pipelines&quot; /&gt;Cloud Native and the benefits to Continuous Delivery (CD) Pipelines&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s a lot of discussion lately around Cloud Native. If this term is new to you, I suggest a quick read of &lt;a href=&quot;https://www.informationweek.com/cloud/platform-as-a-service/cloud-native-what-it-means-why-it-matters/d/d-id/1321539&quot;&gt;Cloud Native: What it Means and Why it Matters?&lt;/a&gt; From my perspective, Cloud Native offers tremendous benefit to enterprise companies, startups and developers looking to add value quickly or capture market share. Cloud Native platforms, such as Cloud Foundry, provide a number of features to reduce the effort of developing software and operating it on or off premise. A few notable features include load balancing, application routing, cluster scheduling, and containerisation. Cloud Native also offers a significant advancement for building integrated pipelines to deliver software. Before we discuss these advancements, let’s consider the role of the container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;containers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#containers&quot; /&gt;Containers&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most influential components of Cloud Native is the container. At this point, containers are fairly ubiquitous and most developers have experimented or used containers. For instance, if you’ve pushed an application to Cloud Foundry or Pivotal Web Services, you’ve used an container without knowing it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Initially containers were a place to automate the deployment and execution of your code, but over time customization became necessary to handle specific use cases. As a result, container creation now occurs earlier in the development and build phase. As applications are packaged within binaries and containers, validation of the application and container configuration needs to be validated before leaving the developer’s laptop. So what does this mean for the continuous delivery (CD) pipeline?&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cd-pipelines&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cd-pipelines&quot; /&gt;CD Pipelines&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Developers will tell you their role has expanded over the years as agile methodologies have changed the way software is engineered. Techniques like Test Driven Development (TDD) and CD pipelines encourage software teams to deliver higher quality code in every build. Of course, a good CD pipeline starts at the developer’s laptop. Building and testing the start of a pipeline requires the correct tools while preserving the developer’s choice of container.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The diagram below demonstrates a simple CD pipeline. As you can see, the pipeline starts from the developer’s IDE and uses Cloud Foundry’s &lt;a href=&quot;https://lattice.cf/&quot;&gt;Lattice&lt;/a&gt;to provide a sandbox to validate the delivery artifacts. Lattice, based on Cloud Foundry’s container scheduler, delivers a small Cloud Native Platform that can be scaled up in the cloud or scaled down to a laptop. It includes a cluster scheduler, HTTP load balancing, log aggregation and health management for containers. Best part, it offers developer choice. Lattice provides support for both Docker containers and Cloud Foundry buildpacks.&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://jenkins-ci.org/sites/default/files/images/omeara-pic_0.png&quot; alt=&quot;image&quot; width=&quot;600&quot; height=&quot;366&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lattice’s flexibility makes it extremely easy to test how the application, which runs in a Docker container, will function in a Cloud Native environment. It’s also extremely helpful for developers engaged in a spike (prototype phase) where they want to push, validate and demonstrate code and let the platform handle the container creation, runtime environment and deployment artifacts via Cloud Foundry buildpacks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Extending the CD pipeline beyond the developer’s laptop to deliver value to the organization will require additional tools like the &lt;a href=&quot;https://www.cloudbees.com/products/cloudbees-jenkins-platform&quot;&gt;CloudBees Jenkins Platform&lt;/a&gt;, &lt;a href=&quot;https://www.jfrog.com/artifactory/&quot;&gt;Artifactory&lt;/a&gt; and &lt;a href=&quot;https://pivotal.io/platform-as-a-service/pivotal-cloud-foundry&quot;&gt;Pivotal Cloud Foundry&lt;/a&gt;. These enterprise build-and-deploy solutions help developers deliver to a Cloud Native platform and reduce the time to establish the feedback loop. If the enterprise maintains a Hybrid cloud strategy, these tools make it seamless to deploy across different cloud providers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As developers build more Cloud Native applications for Cloud Native platforms, it’s important to establish good tool chains and best practices early in the development phase. Interested to see these tools in action? Join us at Jenkins User Conference West on September 2nd to learn how I use these tools to build &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-01-1400&quot;&gt;Integrated Deployment Pipelines with Jenkins and Cloud Foundry&lt;/a&gt;.&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://jenkins-ci.org/sites/default/files/images/OMeara_0.jpg&quot; alt=&quot;image&quot; width=&quot;145&quot; height=&quot;180&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Jamie O’Meara, Field Engineer at Pivotal. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC U.S. West&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-01-1400&quot;&gt;&quot;An Integrated Deployment Pipeline with Jenkins and Cloud Foundry&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Register here for a JUC U.S. West, the last JUC of the year!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/25/announcing-the-travel-grant-program/</id>
<title>Announcing the travel grant program</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/25/announcing-the-travel-grant-program/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
We&#8217;re currently setting up a program to support community members' travel to Jenkins community events. Our goal is to enable more members of the community to meet each other and exchange ideas in person.


We&#8217;re still hashing out the details, but it&#8217;ll be available to every Jenkins community member. Apply, telling us what Jenkins-related event you&#8217;d like to attend and how awesome you are, and we may support your travel with up to 500 USD. For details on how this will work, see the current draft of the travel grant program.


The first person to be supported in this way is Pradeepto...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re currently setting up a program to support community members&#39; travel to Jenkins community events. Our goal is to enable more members of the community to meet each other and exchange ideas in person.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re still hashing out the details, but it’ll be available to every Jenkins community member. Apply, telling us what Jenkins-related event you’d like to attend and how awesome you are, and we may support your travel with up to 500 USD. For details on how this will work, see the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Travel+Grant+Program&quot;&gt;current draft of the travel grant program&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first person to be supported in this way is Pradeepto Bhattacharya from Pune, India. He was &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/01-01-1400-bhattacharya&quot;&gt;a speaker at this year’s JUC Europe&lt;/a&gt; in London, and will give &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/02-02-1400&quot;&gt;two&lt;/a&gt; &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/02-02-1130&quot;&gt;talks&lt;/a&gt; at &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC US West&lt;/a&gt; next week—​and we help him get there! He asked us a few weeks back whether the Jenkins project could support his trip to the US. We came to the conclusion that this would be a good idea—​so good in fact, that we decided to build a regular program from it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Are you planning to attend a JUC or similar event, but worry about the cost of travel? We may be able to help you out!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/24/juc-speaker-blog-series-kaj-kandler-juc-u-s-west/</id>
<title>JUC Speaker Blog Series: Kaj Kandler, JUC U.S. West</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/24/juc-speaker-blog-series-kaj-kandler-juc-u-s-west/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
Developing Enterprise-Ready Plugins


My greatest surprise at JUC 2014 in Boston was how many enterprise Jenkins CI users had developed plugins for their own use. I had not pictured enterprise release managers as plugin developers. Here at Black Duck Software, we developed Jenkins plugins for four years running. Fabrice Solami, a sales engineer, wanted to do more than automate our code scanning tool via a shell script step in the Jenkins job. He wrote a first plugin that added a build step to run the tool and configure the job more comfortably. The plugin became quickly popular, and when customers asked...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;developing-enterprise-ready-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#developing-enterprise-ready-plugins&quot; /&gt;Developing Enterprise-Ready Plugins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My greatest surprise at JUC 2014 in Boston was how many enterprise Jenkins CI users had developed plugins for their own use. I had not pictured enterprise release managers as plugin developers. Here at &lt;a href=&quot;https://www.blackducksoftware.com/&quot;&gt;Black Duck Software&lt;/a&gt;, we developed Jenkins plugins for four years running. Fabrice Solami, a sales engineer, wanted to do more than automate our code scanning tool via a shell script step in the Jenkins job. He wrote a first plugin that added a build step to run the tool and configure the job more comfortably. The plugin became quickly popular, and when customers asked for it to also support maven builds and run on agents, it was time for help from the engineering team, particularly the integration team I lead.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the years we developed four more plugins and overhauled the original one with the user community (aka paying customers) growing to &amp;gt;75 organizations, mostly large or really large development organizations. In the process, we received lots of feedback and discovered some Jenkins features we feel are essential for good plugin design for the enterprise. Let me share these insights so that you can consider them in your plugin development.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;credentials-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#credentials-plugin&quot; /&gt;Credentials Plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our plugins connect to our web applications and need authentication to utilize our SDK. The first plugins used username and password fields in every job configuration. That made tedious configuration work and stores the passwords in clear text in the configuration files on disk. Ouch!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We did wise up and started using the credentials plugin to manage username/passwords centrally and securely. It even allows setting authorization roles in such a way that the maintainer of a job can use the credentials without seeing the password. With that in place, our plugins are fit for banks and insurance companies and any other security-conscious organization.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;support-the-rest-api&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#support-the-rest-api&quot; /&gt;Support the REST API&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Did you know that Jenkins talks REST? We found it to be an easy way to create and update jobs. It is a really handy tool. The REST API is easy to script for all sorts of external interactions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, plugins need to do a little effort to support it on their part; yet it is almost trivial to do. So from our experience it should not be left out.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We wrote a small Java program that reads, creates, updates job configurations, and can trigger job runs. It reads the jobs and commits them to a file for easy mass editing and updates the jobs afterwards.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our internal use case is to manage regression tests. We have medium-sized lists of jobs that run regression tests. With this tooling we can create a new set of jobs for a given plugin that runs against a new target server, that is, a server version under QA. It all happens in less than 15 minutes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also made this part of our migration from our first plugin to its successor with all the enterprise capabilities, but incompatible configuration. Using the REST API and some more Java programs we can create a csv file / Excel spreadsheet with jobs that are configured with the previous plugin. The user can filter the list with the spreadsheet application as needed, and then use the resulting list as input to the batch upgrade tool. This makes the upgrade a gradual affair and not a tedious exercise in UI configuration changes.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;updatesites-manager-plugin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#updatesites-manager-plugin&quot; /&gt;UpdateSites Manager Plugin&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are developing plugins for in-house use, you have the option to install/update those through file upload. However, in an enterprise you likely have multiple Jenkins servers for different divisions, development groups, or regions. The notification of updates becomes tedious at best. Wouldn’t it be nice to run your own update site, so that your plugin(s) become discoverable in the “Available” tab of the “Manage plugins” screen? Wouldn’t it be a dream if available new versions show up automatically in the “Updates” tab, including Jenkins version compatibility check?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;UpdateSites Manager plugin by IKEDA Yasuyuki is the answer to your prayers. It is easy to install, and the process to create and publish an update site is not too complicated and can become part of your Jenkins job building/releasing the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-02-1400&quot;&gt;my presentation at JUC 2015 West&lt;/a&gt;, I’ll share more details on how this makes a difference and how you can use these techniques to make your plugins enterprise-grade. As a bonus, I’ll show you how to get a &lt;a href=&quot;https://www.blackducksoftware.com/vulnerability-plugin&quot;&gt;free vulnerability report&lt;/a&gt; for your Maven or Gradle builds.&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://jenkins-ci.org/sites/default/files/images/Kandler_0.jpg&quot; alt=&quot;image&quot; width=&quot;152&quot; height=&quot;182&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Kaj Kandler, Integration Manager atBlack Duck Software, Inc. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC U.S. West&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-02-1400&quot;&gt;&quot;Making Plugins that are Enterprise Ready&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Register here for a JUC U.S. West, the last JUC of the year!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/20/volume-9-of-the-jenkins-newsletter-continuous-information-is-out/</id>
<title>Volume 9 of the Jenkins Newsletter: Continuous Information is out</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/20/volume-9-of-the-jenkins-newsletter-continuous-information-is-out/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
The Jenkins Newsletter is out a bit early this quarter. If you are not signed up to receive it via email, check out Volume 9 here.


You will be connected to all sorts of Jenkins resources from Jenkins training sessions, to some Jenkins User Conference news, to how Jenkins works with Kubernetes and Docker.


I hope that you enjoy this issue! Please let me know what content you find to be the most useful, reach out to me with content that you would like to see in the next issue, and feel free to tell me how I can improve the Jenkins...
</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://jenkins-ci.org/sites/default/files/images/volume9_0.preview.png&quot; alt=&quot;image&quot; width=&quot;108&quot; height=&quot;146&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins Newsletter is out a bit early this quarter. If you are not signed up to receive it via email, &lt;a href=&quot;https://pages.cloudbees.com/index.php/email/emailWebview?mkt_tok=3RkMMJWWfF9wsRoksq/LZKXonjHpfsX66%2BQqUKGzlMI/0ER3fOvrPUfGjI4FRcdjI%2BSLDwEYGJlv6SgFSrjGMbBrwLgIWhM%3D&quot;&gt;check out Volume 9 here.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will be connected to all sorts of Jenkins resources from Jenkins &lt;a href=&quot;https://www.forest-technologies.co.uk/events/mastering-continuous-integration-with-jenkins-sep?mkt_tok=3RkMMJWWfF9wsRoksq%2FLZKXonjHpfsX66%2BQqUKGzlMI%2F0ER3fOvrPUfGjI4FRcdjI%2BSLDwEYGJlv6SgFSrjGMbBrwLgIWhM%3D&quot;&gt;training&lt;/a&gt; &lt;a href=&quot;https://www.codecentric.nl/portfolio/training-workshops/deployment-pipeline-workshop/&quot;&gt;sessions&lt;/a&gt;, to some &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Jenkins User Conference news&lt;/a&gt;, to how Jenkins works with &lt;a href=&quot;https://jenkins-ci.org/content/integrating-kubernetes-and-jenkins&quot;&gt;Kubernetes&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/02-01-1030&quot;&gt;Docker.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope that you enjoy this issue! Please let me know what content you find to be the most useful, reach out to me with content that you would like to see in the next issue, and feel free to tell me how I can improve the Jenkins Newsletter: Continuous Information. You can reach out to me at &lt;a href=&quot;mailto:continuous-information@cloudbees.com&quot;&gt;continuous-information@cloudbees.com&lt;/a&gt;. Thanks!&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/20/upcoming-office-hour-on-kubernetes/</id>
<title>Upcoming office hour on Kubernetes</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/20/upcoming-office-hour-on-kubernetes/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='plugins'></category>
<category term='screencast'></category>
<category term='tutorial'></category>
<category term='docker'></category>
<summary>
Nicolas De Loof will host an office hour next Wednesday 11 AM PDT on integrating Kubernetes with Jenkins. Kubernetes is an open-source project by Google that provides a platform for managing Docker containers as a cluster.


During this session, Nicolas will introduce Kubernetes, explain how it can benefit Jenkins and demonstrate the Kubernetes Plugin.
Then he will discuss the design of the Kubernetes plugin and plans he has for future improvements.


Participate in the Hangout on Air or watch live on YouTube....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ndeloof&quot;&gt;Nicolas De Loof&lt;/a&gt; will host an &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;office hour&lt;/a&gt; &lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20150826T11&amp;amp;p1=283&amp;amp;ah=1&quot;&gt;next Wednesday 11 AM PDT&lt;/a&gt; on integrating Kubernetes with Jenkins. &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; is an open-source project by Google that provides a platform for managing &lt;a href=&quot;https://docker.io/&quot;&gt;Docker&lt;/a&gt; containers as a cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During this session, Nicolas will introduce Kubernetes, explain how it can benefit Jenkins and demonstrate the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Kubernetes+Plugin&quot;&gt;Kubernetes Plugin&lt;/a&gt;.
Then he will discuss the design of the Kubernetes plugin and plans he has for future improvements.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/hangouts/_/hoaevent/AP36tYcKf7LmLtXgek2Fjdj8ZUQ5ruOxwTbuLmC_ivKmHYyrHFOJqA?hl=en&quot;&gt;Participate in the Hangout on Air&lt;/a&gt; or &lt;a href=&quot;https://www.youtube.com/watch?v=95WduGqvLRA&quot;&gt;watch live on YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/18/juc-speaker-blog-series-andrew-phillips-juc-u-s-west/</id>
<title>JUC Speaker Blog Series: Andrew Phillips, JUC U.S. West</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/18/juc-speaker-blog-series-andrew-phillips-juc-u-s-west/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
Join Me at JUC West to Discuss Building an Enterprise Continuous Delivery Machine with Jenkins





After a great event on the East Coast in June, now over to the West Coast for another exciting Jenkins User Conference! I&#8217;ll be there for JUC West on September 2-3 with the XebiaLabs team, and am looking forward to talking to the Jenkins users, partners, developers and community members that will be coming together.


At JUC East, I talked about the importance of Automated Testing in your Continuous Delivery pipeline, and I was really pleased by the number of interesting discussions and comments that came about...
</summary>
<content type='html'>
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;join-me-at-juc-west-to-discuss-building-an-enterprise-continuous-delivery-machine-with-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#join-me-at-juc-west-to-discuss-building-an-enterprise-continuous-delivery-machine-with-jenkins&quot; /&gt;Join Me at JUC West to Discuss Building an Enterprise Continuous Delivery Machine with 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&quot;&gt;&lt;img src=&quot;https://blog.xebialabs.com/wp-content/uploads/2015/05/JUc.png&quot; alt=&quot;image&quot; width=&quot;333&quot; height=&quot;90&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;a great event on the East Coast&lt;/a&gt; in June, now over to the West Coast for another exciting &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Jenkins User Conference!&lt;/a&gt; I’ll be there for &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC West&lt;/a&gt; on September 2-3 with the &lt;a href=&quot;https://www.xebialabs.com/&quot;&gt;XebiaLabs&lt;/a&gt; team, and am looking forward to talking to the Jenkins users, partners, developers and community members that will be coming together.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At JUC East, I &lt;a href=&quot;https://www.youtube.com/embed/NMZOnsEuums&quot;&gt;talked about the importance of Automated Testing&lt;/a&gt; in your Continuous Delivery pipeline, and I was really pleased by the number of interesting discussions and comments that came about as a result.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For JUC West, I’ll be taking a broader view, and will talk about building an &quot;Enterprise Continuous Delivery Machine&quot; around Jenkins. I’m going to focus on the challenge of identifying and choosing solutions for the many &quot;adjacent problem spaces&quot; to Continuous Integration that you run into when trying to move to Continuous Delivery: artifact management, feature tracking, environment provisioning, deployment automation, test management, pipeline orchestration, production feedback and more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll discuss some of the options available for each category, with a special focus on app deployment, test result management and pipeline orchestration. We’ll also present a couple of real-world Continuous Delivery Machine architectures, and analyze some of the motivations for each organization’s choices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most of our users use XebiaLabs tools/products in combination with Jenkins to build out their Continuous Delivery stack. If you’re scaling out your Jenkins usage too, stop by the XebiaLabs booth to see if you can pick up some tips and to say hello.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Look forward to seeing you &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-03-1400&quot;&gt;at the event&lt;/a&gt;, or check the slides or recording we will post after the event. Hope to see you there!&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://jenkins-ci.org/sites/default/files/images/phillips_0.jpg&quot; alt=&quot;image&quot; width=&quot;152&quot; height=&quot;182&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Andrew Phillips, VP, Product Management at XebiaLabs. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC U.S. West&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-03-1400&quot;&gt;&quot;Sometimes Even the Best Butler Needs a Footman: Building an Enterprise Continuous Delivery Machine Around Jenkins&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Register here for a JUC U.S. West, the last JUC of the year!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/13/update-wiki-and-issue-tracker-outage/</id>
<title>Update: Wiki and issue tracker outage</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/13/update-wiki-and-issue-tracker-outage/" />
<author>
<name>daniel-beck</name>
</author>
<category term='infrastructure'></category>
<summary>
I recently wrote about the two day outage of our wiki and issue tracker:




While this was a rather lengthy outage, it could have been much worse. We lost none of the data, after all.




OSUOSL have since published their post mortem. I was really wrong about not losing any data:




A further complication was that our backups were pointed at mysql2, which was out-of-date with mysql1, due to the initial synchronization failures. Fortunately, we had the binary logs from the 17th through the 30th. This means that though most data could be restored, some data from between the 15th and the 17th...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-ci.org/content/wiki-and-issue-tracker-outage-over-weekend&quot;&gt;I recently wrote about the two day outage of our wiki and issue tracker&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While this was a rather lengthy outage, it could have been much worse. We lost none of the data, after all.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://osuosl.org/blog/mysql1-vip-outage-post-mortem/&quot;&gt;OSUOSL have since published their post mortem&lt;/a&gt;. I was &lt;em&gt;really&lt;/em&gt; wrong about not losing any data:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A further complication was that our backups were pointed at mysql2, which was out-of-date with mysql1, due to the initial synchronization failures. Fortunately, we had the binary logs from the 17th through the 30th. This means that though most data could be restored, some data from between the 15th and the 17th was lost.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For our issue tracker, that means that issues JENKINS-29432 to JENKINS-29468 were lost, as well as comments posted from about July 15 12:20 PM to July 17 2 AM (UTC). We know this thanks to the &lt;a href=&quot;https://groups.google.com/group/jenkinsci-issues/topics&quot;&gt;jenkinsci-issues&lt;/a&gt; mailing list where the lost issues and comments can be looked up for reposting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We unfortunately don’t have such a record from our wiki.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/10/upcoming-office-hour-on-workflow/</id>
<title>Upcoming office hour on Workflow</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/10/upcoming-office-hour-on-workflow/" />
<author>
<name>daniel-beck</name>
</author>
<category term='development'></category>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
Jesse Glick will host the next office hour this Wednesday, 11 AM PDT on Workflow.


Workflow has been Jesse&#8217;s project for the last year or so. If you don&#8217;t know what Workflow is, check out these talks about it from past JUCes:




June 2014


October 2014


June 2015




This will be a developer-focused session on integrating with Workflow. He&#8217;ll discuss things like how to make sure your plugin can be used as part of workflows, and best practices for extending the workflow DSL. There&#8217;s already been a session on Workflow in January, but Jesse hasn&#8217;t been idle, and there&#8217;s new stuff to share.


Participate in the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jglick/&quot;&gt;Jesse Glick&lt;/a&gt; will host the next office hour &lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20150812T11&amp;amp;p1=283&amp;amp;ah=1&quot;&gt;this Wednesday, 11 AM PDT&lt;/a&gt; on &lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin#introduction&quot;&gt;Workflow&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Workflow has been Jesse’s project for the last year or so. If you don’t know what Workflow is, check out these talks about it from past JUCes:&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.cloudbees.com/event/topic/workflow-jenkins&quot;&gt;June 2014&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/event/topic/workflow-jenkins-0&quot;&gt;October 2014&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-02-1400-glick&quot;&gt;June 2015&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;This will be a developer-focused session on integrating with Workflow. He’ll discuss things like how to make sure your plugin can be used as part of workflows, and best practices for extending the workflow DSL. There’s already been a session on Workflow in January, but Jesse hasn’t been idle, and there’s new stuff to share.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/hangouts/_/hoaevent/AP36tYe_81PXXNUWUvZxqF9VcIgtdsP9nHzt8rhqY8tKpte_sDkMbg&quot;&gt;Participate in the Hangout on Air&lt;/a&gt; or &lt;a href=&quot;https://www.youtube.com/watch?v=4zdy7XGx3PA&quot;&gt;watch live on YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/05/juc-speaker-blog-series-carlo-cadet-juc-u-s-west/</id>
<title>JUC Speaker Blog Series: Carlo Cadet, JUC U.S. West</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/05/juc-speaker-blog-series-carlo-cadet-juc-u-s-west/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<summary>
Mobile is Joining the Party At This Year’s Jenkins User Conference


Consider this as a shout out to mobile app developers: You are invited! For the first time, there’s a mobile track at this year’s Jenkins User Conference to discuss the best ways to extend CI/CD to mobile application testing.


As agile practices take hold, enterprises are expecting more collaboration between dev and test teams. Dev teams are doing more testing while QA teams are becoming more skilled at coding. This is happening now, and as a result open-source test automation frameworks like Selenium and Appium are flourishing. At the same time,...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;mobile-is-joining-the-party-at-this-years-jenkins-user-conference&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mobile-is-joining-the-party-at-this-years-jenkins-user-conference&quot; /&gt;Mobile is Joining the Party At This Year’s Jenkins User Conference&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Consider this as a shout out to mobile app developers: You are invited! For the first time, there’s a mobile track at this year’s Jenkins User Conference to discuss the best ways to extend CI/CD to mobile application testing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As agile practices take hold, enterprises are expecting more collaboration between dev and test teams. Dev teams are doing more testing while QA teams are becoming more skilled at coding. This is happening now, and as a result open-source test automation frameworks like Selenium and Appium are flourishing. At the same time, CI/CD adoption is growing. This is happening more so for web development rather than mobile. It’s no secret that incorporating mobile test automation and CI comes with challenges. Mobile UI testing on real devices is still a manual process for many organizations. Manual testing is perhaps a path of least resistance, but it also commits teams to the longest delivery path. Some argue they lack the environment, resources or skilled people to create test automation. While the argument rages, its clear other teams are solving the challenge. Teams are prioritizing the requirement to build a test framework and aligning disparate tools into an effective CI workflow. Recent webinars with &lt;a href=&quot;https://www.perfectomobile.com/ni/support/resources/webinars/test-automation-works-for-paychex&quot;&gt;Paychex&lt;/a&gt; and &lt;a href=&quot;https://www.perfectomobile.com/ni/support/resources/webinars/journey-devops-replay&quot;&gt;RaboBank&lt;/a&gt; demonstrate CI/CD best practices can effectively extend to mobile app programs using real devices. Particularly when the lab is moved to the cloud and teams can focus on building robust test automation suites.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But overall, the transition to an agile SDLC for mobile apps is happening too slowly. Yet the mobile market demands constant updates. An essential part of an agile SDLC is utilizing automated testing and continuous integration. To test builds using a CI server requires automation which is key to agile development in a fast-paced mobile world because it allows testing to be done by developers early in the lifecycle.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Extending CI to mobile programs is easy with Perfecto Mobile’s support for open source frameworks such as Selenium Remote Web Driver, &lt;a href=&quot;https://www.perfectomobile.com/Company/Media_Room/PRs/perfecto-makes-appium-enterprise-grade&quot;&gt;Appium&lt;/a&gt; and Calabash where existing CI plugins are available. Support for commercial tools like HP UFT is also available. With the &lt;a href=&quot;https://www.perfectomobile.com/integrations/jenkins&quot;&gt;Perfecto Mobile Jenkins Plugin&lt;/a&gt;, you can perform automated functional testing every build. The result is obvious, discover defects earlier, deliver faster feedback and increase release frequency and, ultimately, have better performing apps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Learn more about extending your CI practice to mobile projects in our upcoming JUC mobile session: &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-03-1130&quot;&gt;“Fast Feedback: Jenkins and Functional Mobile App Testing Without Pulling Your Hair Out.”&lt;/a&gt; The session will share suggested coding practices along with planning guidance on maximizing the quality coverage during daily, nightly and weekly builds.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins User Conference US West takes place in Santa Clara, CA on Sep 2-3, 2015.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stop by the Perfecto Mobile booth and share your story.&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://jenkins-ci.org/sites/default/files/images/cadet_0.jpg&quot; alt=&quot;image&quot; width=&quot;152&quot; height=&quot;182&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Carlo Cadet, Director of Product Marketing at Perfecto Mobile. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC U.S. West&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-03-1130&quot;&gt;&quot;Fast Feedback: Jenkins + Functional &amp;amp; Non Functional Mobile App Testing, Without pulling your Hair out!&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Register here for a JUC U.S. West, the last JUC of the year!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/04/wiki-and-issue-tracker-outage-over-the-weekend/</id>
<title>Wiki and issue tracker outage over the weekend</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/04/wiki-and-issue-tracker-outage-over-the-weekend/" />
<author>
<name>daniel-beck</name>
</author>
<category term='infrastructure'></category>
<category term='meta'></category>
<summary>
As you may have noticed, our wiki and issue tracker were unavailable from Thursday to Sunday last week. What happened?


We host parts of our infrastructure at the Open Source Lab at Oregon State (OSUOSL), including the databases for these two services. So far, there&#8217;s no post mortem by OSUOSL (they expect to post one later this week), so we need to piece together what we know.


The databases for the wiki and issue tracker became inaccessible around midnight/12 AM Thu/Fri night (all times UTC). Due to the large number and size of databases on that server, pulling from backups, restoring from...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you may have noticed, our wiki and issue tracker were unavailable from Thursday to Sunday last week. What happened?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We host parts of our infrastructure at the Open Source Lab at Oregon State (OSUOSL), including the databases for these two services. So far, there’s no post mortem by OSUOSL (they expect to post one later this week), so we need to piece together what we know.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The databases for the wiki and issue tracker became &lt;a href=&quot;https://twitter.com/osuosl/status/626903003203637248&quot;&gt;inaccessible around midnight/12 AM Thu/Fri night&lt;/a&gt; (all times UTC). Due to the large number and size of databases on that server, &lt;a href=&quot;https://twitter.com/osuosl/status/626946293663821824&quot;&gt;pulling from backups&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/osuosl/status/627027620845129729&quot;&gt;restoring from backup&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/osuosl/status/627237502420561920&quot;&gt;replaying the binlogs&lt;/a&gt; took them quite a while. During that time, we put up a maintenance screen on the wiki (and messed up the one for Jira, so there were connection timeouts instead).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The databases were back around 3 AM on Sunday. We disabled the maintenance screens around 6 PM later that day.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While this was a rather lengthy outage, it could have been much worse. We lost none of the data, after all. We thank the OSUOSL team for their efforts getting everything back up over the weekend!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/04/bay-area-jenkins-area-meet-up-kick-off-gathering-today/</id>
<title>Bay Area Jenkins Area Meet-up kick-off gathering today</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/04/bay-area-jenkins-area-meet-up-kick-off-gathering-today/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
A week ago we reported that Uday is looking at organizing a regular Jenkins meet-up in Silicon Valley. This has made a progress since then, and this evening we&#8217;ll get together to figure out logistics for the first meet-up:



Time

August 5th, Wednesday 6:30 PM - 7:30 PM

Location

Starbucks, 750 Castro St, Mountain View, CA 94041




The agenda is:




Determine the date for the first meet up


Speakers for the second slot. Kohsuke will be presenting first.


Future topics of interest for JAM


Sponsors / Volunteers


Ideas to make the JAM relevant and interesting for the extended community to participate and share their implementations


Q &amp; A




Uday and I will...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Fruit_preserves&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/7/7a/Welovejam_blenheim_apricot_jam.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A week ago &lt;a href=&quot;https://jenkins-ci.org/content/bay-area-jenkins-area-meet-looking-you&quot;&gt;we reported that Uday is looking at organizing a regular Jenkins meet-up in Silicon Valley&lt;/a&gt;. This has made a progress since then, and this evening we’ll get together to figure out logistics for the first meet-up:&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;Time&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;August 5th, Wednesday 6:30 PM - 7:30 PM&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;strong&gt;Location&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Starbucks, &lt;a href=&quot;https://www.google.com/maps/place/750+Castro+St,+Mountain+View,+CA+94041&quot;&gt;750 Castro St, Mountain View, CA 94041&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agenda is:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Determine the date for the first meet up&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speakers for the second slot. Kohsuke will be presenting first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Future topics of interest for JAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sponsors / Volunteers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ideas to make the JAM relevant and interesting for the extended community to participate and share their implementations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Q &amp;amp; A&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Uday and I will be there, and Uday told me that he heard from another guy who will join us. If you are around and is willing to come over, we’d love to see you. If you are interested, I’d also encourage you to join &lt;a href=&quot;https://lists.jenkins-ci.org/mailman/listinfo/jenkins-events&quot;&gt;the Jenkins events list&lt;/a&gt;, where a discussion is happening.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/08/03/just-a-month-left-until-juc-u-s-west/</id>
<title>Just a month left until JUC U.S. West</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-08-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/08/03/just-a-month-left-until-juc-u-s-west/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
There&#8217;s only a month left until JUC U.S. West on September 2-3! If you&#8217;re still on the fence, check out the recaps of JUC Europe talks recently posted to the CloudBees blog. These should give you an idea about the kinds of talks you can expect at a Jenkins User Conference:




How to Optimize Automated Testing with Everyone&#8217;s Favorite Butler


Configuration as Code - The Job DSL Plugin


From DevOps to NoOps




If you&#8217;re interested in the upcoming Jenkins UI overhaul, make sure to attend Gus and Tom&#8217;s talk about it. Don&#8217;t want to wait until JUC to learn more about this? Follow the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s only a month left until &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;JUC U.S. West on September 2-3&lt;/a&gt;! If you’re still on the fence, check out the recaps of JUC Europe talks recently posted to the CloudBees blog. These should give you an idea about the kinds of talks you can expect at a Jenkins User Conference:&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://blog.cloudbees.com/2015/07/juc-session-blog-series-andrew-phillips.html&quot;&gt;How to Optimize Automated Testing with Everyone’s Favorite Butler&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudbees.com/2015/07/juc-session-blog-series-daniel-spilker.html&quot;&gt;Configuration as Code - The Job DSL Plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudbees.com/2015/07/juc-session-blog-series-mario-cruz-juc.html&quot;&gt;From DevOps to NoOps&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;If you’re interested in the upcoming Jenkins UI overhaul, make sure to attend &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-02-1500&quot;&gt;Gus and Tom’s talk&lt;/a&gt; about it. Don’t want to wait until JUC to learn more about this? &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/Tiz-LSqCJmg/3CuYzuBXJpsJ&quot;&gt;Follow the discussion on the developers mailing list&lt;/a&gt; and contribute through early testing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This JUC will again have an &lt;em&gt;Ask The Experts&lt;/em&gt; booth with several Jenkins experts and developers available there throughout the event. If you want to discuss &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-west/01-01-1130&quot;&gt;Workflow&lt;/a&gt; with Jesse, or pitch your UI ideas to Gus, this is where you’ll be able to do that.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/07/30/juc-u-s-west-news-agenda-is-up/</id>
<title>JUC U.S. West News: Agenda is up</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/30/juc-u-s-west-news-agenda-is-up/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
It seems a bit unreal, but the last JUC agenda for 2015 is now online. Jenkins User Conference U.S. West is the last JUC of the year running from September 2-3 in Santa Clara, CA. So, if you haven&#8217;t attended JUC yet this year, this is your chance!


Register with a friend to take advantage of the community&#8217;s 2-for-1 deal and get two tickets for the price of one.


Which talk are you looking forward to most? Check out the agenda and tweet your choice to @jenkinsconf!...
</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://jenkins-ci.org/sites/default/files/images/butler-kk-gk_0.jpg&quot; alt=&quot;image&quot; width=&quot;250&quot; height=&quot;194&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It seems a bit unreal, but the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;last JUC agenda&lt;/a&gt; for 2015 is now online. &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Jenkins User Conference U.S. West&lt;/a&gt; is the last JUC of the year running from September 2-3 in Santa Clara, CA. So, if you haven’t attended JUC yet this year, &lt;a href=&quot;https://www.regonline.com/Register/Checkin.aspx?EventID=1697214&quot;&gt;&lt;strong&gt;this is your chance!&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.regonline.com/Register/Checkin.aspx?EventID=1697214&quot;&gt;Register&lt;/a&gt; with a friend to take advantage of the community’s 2-for-1 deal and get two tickets for the price of one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Which talk are you looking forward to most? Check out the agenda and tweet your choice to &lt;a href=&quot;https://twitter.com/jenkinsconf&quot;&gt;@jenkinsconf!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/07/29/juc-europe-slides-and-video-are-now-available-online/</id>
<title>JUC Europe slides and video are now available online</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/29/juc-europe-slides-and-video-are-now-available-online/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
Slides and video from JUC Europe are now available online!


If you made it to London to attend this year&#8217;s JUC Europe, I hope you enjoyed the conference, met plenty of community members and learned more about Jenkins. Now that the slides and video are up, you can revisit your favorite talks or "attend" the ones that you missed&#8230;&#8203;all at your leisure.


If you were unable to attend JUC Europe, well, now you can! The slides and video are here so you can "attend" any time you want. If JUC LIVE seems more appealing to you, there is one date left in...
</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://jenkins-ci.org/sites/default/files/images/london_0.jpg&quot; alt=&quot;image&quot; width=&quot;250&quot; height=&quot;165&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;Slides and video from JUC Europe&lt;/a&gt; are now available online!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you made it to London to attend this year’s JUC Europe, &lt;a href=&quot;https://flic.kr/p/uER3fe&quot;&gt;&lt;strong&gt;I hope you enjoyed the conference&lt;/strong&gt;&lt;/a&gt;, met plenty of community members and learned more about Jenkins. Now that the slides and video are up, you can revisit your &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/02-02-1130-cruz&quot;&gt;favorite talks&lt;/a&gt; or &quot;attend&quot; the ones that you missed…​all at your leisure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you were unable to attend JUC Europe, well, now you can! The slides and video are &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;here&lt;/a&gt; so you can &quot;attend&quot; any time you want. If JUC LIVE seems more appealing to you, there is &lt;strong&gt;one&lt;/strong&gt; date left in the 2015 Jenkins User Conference World Tour: &lt;strong&gt;JUC U.S. West is September 2-3 in Santa Clara, CA. &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Register here.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/07/28/reinforcements-for-the-subversion-plugin/</id>
<title>Reinforcements for the Subversion Plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/28/reinforcements-for-the-subversion-plugin/" />
<author>
<name>daniel-beck</name>
</author>
<category term='development'></category>
<category term='guest post'></category>
<category term='plugins'></category>
<summary>
This is a guest post by Manuel Recena Soto (aka recena).


Users of the plug-in know that it has undergone very important changes in the last two years.


Unfortunately, some of these changes resulted in regressions for some users that weren&#8217;t properly addressed in subsequent releases. Many users were therefore forced to keep using an older release of the plugin to keep their instances running.


To fix this difficult situation I&#8217;ve decided to dedicate my spare time to improving the plug-in and attempting to restore the stability that an essential plug-in like this requires.


In order to do so, me, my colleague Steven Christou...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;This is a guest post by Manuel Recena Soto (aka recena).&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Users of the plug-in know that it has undergone &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Subversion+Plugin#SubversionPlugin-ChangeLog&quot;&gt;very important changes&lt;/a&gt; in the last two years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, some of these changes resulted in regressions for some users that weren’t properly addressed in subsequent releases. Many users were therefore forced to keep using an older release of the plugin to keep their instances running.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To fix this difficult situation I’ve decided to dedicate my spare time to improving the plug-in and attempting to restore the stability that an essential plug-in like this requires.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to do so, &lt;a href=&quot;https://github.com/recena/&quot;&gt;me&lt;/a&gt;, my colleague &lt;a href=&quot;https://github.com/christ66&quot;&gt;Steven Christou&lt;/a&gt; and other members of the community have drawn up a plan.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the coming weeks we will be focusing our efforts on:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Going through the Jira tickets&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Checking whether they are duplicated&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Checking whether they are still relevant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Asking for more information from the people who reported them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Establishing their priority&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reviewing pull requests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Investigating bug reports and try to reproduce them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixing serious bugs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Refactoring the plugin to improve its maintainability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re planning to publish a new 2.5.x bugfix release once a fortnight. We are not considering the inclusion of new features or improvements. The priority now must be to obtain a stable and reliable plug-in, one that will allow us to take things up again in the future with greater security and peace of mind.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Interested in helping? Just send us a message!&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/07/25/bay-area-jenkins-area-meet-up-is-looking-for-you/</id>
<title>Bay Area Jenkins Area Meet-up is looking for you </title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/25/bay-area-jenkins-area-meet-up-is-looking-for-you/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='meetup'></category>
<summary>
Uday made a blog post yesterday that he is looking at organizing a regular Jenkins meet-up in the Silicon Valley Bay Area dubbed "Bay Area Jenkins Area Meetup (JAM)."


As a first step, he wants to have a kick-off meeting, to get more insights and opinions about what the topics could be and what people want to hear. I&#8217;m really looking forward to it as a means to build a local network, so I signed myself up as a speaker of the first meet-up.


If you are in the Peninsula, South Bay, East Bay, etc., please send some encouragements to him by...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Fruit_preserves&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/7/7a/Welovejam_blenheim_apricot_jam.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Uday made a blog post yesterday that he is looking at organizing a regular Jenkins meet-up in the Silicon Valley Bay Area dubbed &quot;Bay Area Jenkins Area Meetup (JAM).&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a first step, he wants to have a kick-off meeting, to get more insights and opinions about what the topics could be and what people want to hear. I’m really looking forward to it as a means to build a local network, so I signed myself up as a speaker of the first meet-up.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are in the Peninsula, South Bay, East Bay, etc., please send some encouragements to him by posting a comment, or better yet, come to the kick-off meeting.&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/07/24/juc-u-s-east-slides-and-video-are-now-available-online/</id>
<title>JUC U.S. East slides and video are now available online</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/24/juc-u-s-east-slides-and-video-are-now-available-online/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
Slides and video from JUC U.S. East are now available online!


If you attended the conference, THANK YOU, and I&#8217;m sure you had fun, learned a lot and met many people from the Jenkins community. Now you can revisit your favorite talks or "attend" the ones that you missed.


If you were unable to attend JUC U.S. East, you now have the slides and video so you can "attend" anyways! If you like what you see and would like to attend a JUC this year, there is ONE date left in the 2015 Jenkins User Conference World Tour: JUC U.S. West is...
</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://jenkins-ci.org/sites/default/files/images/dc_0.jpg&quot; alt=&quot;image&quot; width=&quot;200&quot; height=&quot;149&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;Slides and video from JUC U.S. East&lt;/a&gt; are now available online!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you attended the conference, &lt;strong&gt;THANK YOU&lt;/strong&gt;, and I’m sure you had fun, learned a lot and met many people from the Jenkins community. Now you can revisit your &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-02-1400-glick&quot;&gt;favorite talks&lt;/a&gt; or &quot;attend&quot; the ones that you missed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you were unable to attend JUC U.S. East, you now have the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;slides and video&lt;/a&gt; so you can &quot;attend&quot; anyways! If you like what you see and would like to attend a JUC this year, there is &lt;strong&gt;ONE&lt;/strong&gt; date left in the 2015 Jenkins User Conference World Tour: &lt;strong&gt;JUC U.S. West is September 2-3 in Santa Clara, CA. &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-west&quot;&gt;Register here.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/07/24/integrating-kubernetes-and-jenkins/</id>
<title>Integrating Kubernetes and Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/24/integrating-kubernetes-and-jenkins/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='plugins'></category>
<category term='video'></category>
<summary>
Kubernetes is an open-source project by Google that provides a platform for managing Docker containers as a cluster. In their own words:




Kubernetes is an open source orchestration system for Docker containers. It handles scheduling onto nodes in a compute cluster and actively manages workloads to ensure that their state matches the users declared intentions. Using the concepts of "labels" and "pods", it groups the containers which make up an application into logical units for easy management and discovery.




Kubernetes-related services by Google are the Google Container Engine, a Kubernetes-powered platform for hosting and managing Docker containers, and the Google Container Registry,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; is an open-source project by Google that provides a platform for managing Docker containers as a cluster. In their own words:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kubernetes is an open source orchestration system for Docker containers. It handles scheduling onto nodes in a compute cluster and actively manages workloads to ensure that their state matches the users declared intentions. Using the concepts of &quot;labels&quot; and &quot;pods&quot;, it groups the containers which make up an application into logical units for easy management and discovery.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kubernetes-related services by Google are the &lt;a href=&quot;https://cloud.google.com/container-engine/&quot;&gt;Google Container Engine&lt;/a&gt;, a Kubernetes-powered platform for hosting and managing Docker containers, and the &lt;a href=&quot;https://cloud.google.com/tools/container-registry/#overview&quot;&gt;Google Container Registry&lt;/a&gt;, a private Docker image registry.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several new Jenkins plugins allow you to make use of Kubernetes and these services:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Container+Registry+Auth+Plugin&quot;&gt;Google Cloud Registry Auth Plugin&lt;/a&gt; allows users to authenticate with the Google Cloud Registry so they can push/pull images. This allows you to use the Google Cloud Registry with existing Docker-related plugins, like &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Docker+build+step+plugin&quot;&gt;Docker build step plugin&lt;/a&gt; or &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/CloudBees+Docker+Custom+Build+Environment+Plugin&quot;&gt;CloudBees Docker Custom Build Environment Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Kubernetes+Plugin&quot;&gt;Kubernetes Plugin&lt;/a&gt; implements a cloud provider for Jenkins, and can create agents based on Docker images on-demand on your Kubernetes cluster or the Google Cloud Platform.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PFCSSiT-UUQ&amp;amp;index=21&amp;amp;list=PL69nYSiGNLP0Ljwa9J98xUd6UlM604Y-l&quot;&gt;Watch Kohsuke demoing Jenkins/Kubernetes integration at OSCON earlier this week.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For a more in-depth look at how you can use Kubernetes with Jenkins, check out these posts on the CloudBees blog by Tracy Kennedy:&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://blog.cloudbees.com/2015/07/orchestrating-deployments-with-jenkins.html&quot;&gt;Orchestrating deployments with Jenkins Workflow and Kubernetes&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudbees.com/2015/07/on-demand-jenkins-slaves-with.html&quot;&gt;On-demand Jenkins agents with Kubernetes and the Google Container Engine&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudbees.com/2015/07/clustering-jenkins-with-kubernetes-in.html&quot;&gt;Clustering Jenkins with Kubernetes in the Google Container Engine&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/07/23/office-hours-are-back/</id>
<title>Office hours are back</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/23/office-hours-are-back/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='meta'></category>
<category term='news'></category>
<summary>
After several months of inactivity, office hours, the bi-weekly meeting of Jenkins users and developers to learn more about Jenkins, are back.


I&#8217;ll host the first session next Wednesday at 11 am PDT. This session will be about Stapler, focusing on what Jenkins plugin authors need to know about it, e.g. request routing, form submission handling, or how Jelly/Groovy views work.


While this is going to be a developer-focused session, future session topics will also have Jenkins users as target audience.


For general information on office hours, and how to join, see the wiki....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After several months of inactivity, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;office hours&lt;/a&gt;, the bi-weekly meeting of Jenkins users and developers to learn more about Jenkins, are back.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll host the first session &lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20150729T11&amp;amp;p1=283&amp;amp;ah=1&quot;&gt;next Wednesday at 11 am PDT&lt;/a&gt;. This session will be about Stapler, focusing on what Jenkins plugin authors need to know about it, e.g. request routing, form submission handling, or how Jelly/Groovy views work.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While this is going to be a developer-focused session, future session topics will also have Jenkins users as target audience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For general information on office hours, and how to join, see the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;wiki&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/07/15/advancing-the-jenkins-gui-configuring-items-in-jenkins/</id>
<title>Advancing the Jenkins GUI: Configuring Items in Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/15/advancing-the-jenkins-gui-configuring-items-in-jenkins/" />
<author>
<name>gusreiber</name>
</author>
<category term='video'></category>
<category term='screencast'></category>
<category term='juc'></category>
<category term='core'></category>
<category term='releases'></category>
<category term='feedback'></category>
<category term='development'></category>
<category term='just for fun'></category>
<category term='jenkinsci'></category>
<summary>
https://youtu.be/1Qn4jEwAeGc
Above is the screencast associated with this blog post
If you have ever used Jenkins you are familiar with what I am about to described, wading your way through job configuration page, looking for the settings that are important, and, depending on your plugin use, wondering where all these other setting came from and what they do.


Depending on how long you have used Jenkins, your negative opinion of this experience may vary. If you are a long-time user, you might even view the configuration page with that same reassuring nostalgia seeing a Facebook post from your ugly room mate induces. ‘Yup,he...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://youtu.be/1Qn4jEwAeGc&quot; class=&quot;bare&quot;&gt;https://youtu.be/1Qn4jEwAeGc&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Above is the screencast associated with this blog post&lt;br&gt;
If you have ever used Jenkins you are familiar with what I am about to described, wading your way through job configuration page, looking for the settings that are important, and, depending on your plugin use, wondering where all these other setting came from and what they do.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Depending on how long you have used Jenkins, your negative opinion of this experience may vary. If you are a long-time user, you might even view the configuration page with that same reassuring nostalgia seeing a Facebook post from your ugly room mate induces. ‘Yup,he is still ugly and backwards, but we had some good times, back then.’ If you are a newer Jenkins user, it may well send you off to search the web for a viable alternative tool.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The good news is that CloudBees, in cooperation with the greater Jenkins community, is looking to make some long overdue progress sorting through this user interaction in a way that is both approachable to new users and amenable to existing users who have grown comfortable with a great tool and a ‘stalwart friend’ in a world of otherwise clunky world of IT tools. ( that really is the swiss army knife of build automation.)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you happen to have had the opportunity to have attended any of the recent Jenkins User Conferences in Washington, DC, or London, you may have seen Tom and my presentation, which served as our initial introduction of this effort to the Jenkins Community. In this article and the associated video, I will be focusing specifically on the Create and Configuration screens in Jenkins, discussing some of the larger proposed changes, providing some context for the changes and examining their possible repercussions on existing plugins and future plugin development.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;history-of-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#history-of-jenkins&quot; /&gt;History of Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For newer Jenkins users, I have found the following visual a helpful guide to understanding the history of Jenkins and how its graphical user interfaces has evolved:&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/sites/default/files/images/history-jenkins_590.jpg&quot; alt=&quot;Jenkins timeline: a long history&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first thing to notice here, is that Jenkins has been around for a long time and in a lot of ways is really fundamental to the art of creating software. Back in 2005, the then Hudson project was using pretty much the same cave chalk as everyone else. 6 years later, the code and community underwent its most substantial transformation to date, as Jenkins emerged as the dominant fork of the Hudson project. If you look closely, you will see the GUI reflected that transformation by….. changing the picture of the butler. In recent times, the interface has taken a few additional steps forward, most notably by moving to a responsive CSS driven layout from its table based origin, but the pace of these changes has been very much akin to the pace of evolution. Slow.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our next phase of graphic interface development, however, Tom and I are looking to be a little more directed in our efforts and push the GUI toward a blend of strategic and tactical advancements that will help Jenkins take advantage of some of the advances in web design and browser technologies that have happened over the last 10 years. Our first major push will be in the job creation and configuration tasks.&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;creating-and-configuring&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#creating-and-configuring&quot; /&gt;Creating and Configuring&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[image]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to a bit of a refresh of the look of these forms, this new effort focuses on the importance of dividing information and presentation into clear categories that ideally are meaningful to both new and veteran users of Jenkins alike.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In some cases, Jenkins has these categories already in the GUI, but misses the mark in clarification and emphasis. In other cases, additional categorizing concepts will need to be added. Compare the above screens to the existing screens.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[image]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[image]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first thing you are likely to notice when comparing these two sets of screens is that in the existing screens, there is very little in the way of visual markers segmenting the form input choices on either the item type selection screens (fig 4 vs 2) or the configuration pages (fig 5 vs 3). Adding each new plugin progressively aggravates the situation, and consequently, as your Jenkins installation grows in sophistication and robustness, the average users ability to find the fundamental configuration settings in the sea of ad-hoc options diminishes. While adding functionality typically adds some amount of additional complexity to a UI, by giving each configuration option a visually distinguishable space in the form, the challenge can be greatly diminished and the pattern of creating an ever growing scrolling of toilet paper list of form elements can be avoided.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For figures 2 and 4, you might also notice that I have chosen Jenkins instances that already have several plugins installed as the basis for my example screens. You might rightly argue that for a basic install, there are not a lot of item types to create, so categorizing them adds a needless layer of complexity. Fair enough. It is my belief, though, that our software can be smart enough to count the item types available for creation and count the number within each category and handle the categorization as necessary. Counting and sorting is something that computers do incredibly well and is not the sort of thing busy people need to be overly burdened with.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the code being intelligent about when to present grouping categories to the user, The screen interaction can be similarly intelligent in how it enables the user to selectively show and hide the categories of interest. The following screenshot shows the configuration page focused in on CVS a particular option configuration in the source code management section of the configuration page. It, in turn, has its own sub settings for additional modules and locations (see fig 6).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[image]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;…​and wait for it…​ …​for comparison, here is today’s CVS settings page…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[image]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Despite some serious indentation, the existing page offers significantly less clarity about which settings pertain specifically to CVS instead of other aspects of a Jenkins job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[image]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Identifying which settings go with which segment becomes all the more confusing when sub-sections can be re-ordered. To show you what I mean and fit the screen on a single printed page, I am needing to muck with the aspect ratio of today’s screen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The image on the left (fig 7) shows a 2 step build process, each with sub parameters.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are some fascinating looking red delete buttons in here, I hope I know exactly what part of the build step I am about to blow away…​. Did I mention these segments can be re-ordered? Care to guess which form inputs will move with which steps?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[image]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By contrast, the above screen shows the same 2 build steps with the same parameters. We still have our friend, Mr. Red Delete button, but now it is a good bit clearer who will get blown away.&lt;br&gt;
Also, it is considerably clearer which block will be reordered, should I choose to do so.&lt;/br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-about-plugins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-about-plugins&quot; /&gt;What about plugins?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are a long-time Jenkins user, you may have a guess as to why some of these changes have been slow in coming, and if you are a plugin developer, you definitely know. These input controls have a lot of extension points in them that allow plugins to influence the content of this configuration screen. As a result, how plugins will respond to even the most minor layout changes is somewhat of a mystery. Further, the GUI control elements that make up the form are available to plugin authors to embed as they see fit in their own GUI elements. As a consequence, we have some serious compatibility issues ahead. These challenges are not at all trivial.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Fortunately, however, I believe with some careful manipulation and diligent testing we can overcome these challenges. The first set of changes are likely to revolve around a file called “hudson-behavior.js”. This file does most of the Jenkins client-side UI magic. If there is data to be bound to a control, this is the file that is likely to handle it. The difficulty with this file stems from two factors, its age (it is written following Yahoo UI framework patterns which have since been abandoned by Yahoo and the rest of the industry), and a presumption that the page layout will be governed by a single giant HTML table (likely due to the table renaissance happening around the same time, thanks to the emergence of GWT). Regardless of this bit of history trivia, these two issues combine to make changes to the HTML DOM structure of any Jenkins page problematic. Methods such as “findFollowingTR” assume a very rigid parent-child element positioning based on page layout rather than on the logical relationship between the data elements. The good news here is that despite some of their unfortunate names, can be refactored to both find the relevant element based on today’s table structure as well as a future logical nesting of related elements. With that change in place, Jenkins will continue to function as it always has and a future configuration DOM structure can share the same infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second step here will be finding efficient ways to integrate more modern Javascript libraries, such as JQuery and Bootstrap into the Jenkins GUI. We will want these libraries to be easier and cleaner for plugin authors to access than PrototypeJS and Yahoo UI are today. Likely this will involve using a Browserify/Requirejs like pattern to control script inclusion in page to avoid naming conflicts, excessively file attachment and global space pollution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final step would then be to begin amending, replacing and augmenting the Jelly based form control set, and thus, transforming the look and behavior of the Jenkins UI. As always, Jenkins is an open community, and we at CloudBees view that as a cherished cornerstone of our own corporate culture. Thus, at every phase of this undertaking we are eager to solicit feedback from and encourage participation by you the members of the community. Feel free to comment directly on this article. Additionally, I am maintaining and active thread on the Jenkins Developer group (&lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/6BdWZt35dTQ&quot; class=&quot;bare&quot;&gt;https://groups.google.com/forum/#!topic/jenkinsci-dev/6BdWZt35dTQ&lt;/a&gt;). I am looking forward to hearing from you.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/07/14/juseppe-a-custom-update-site-for-jenkins/</id>
<title>Juseppe, a custom update site for Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/14/juseppe-a-custom-update-site-for-jenkins/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<summary>
This is a guest post by Kirill Merkushev at Yandex. I met him at JUC Europe where he showed me the project he was working on: Juseppe. It looked really interesting, so I asked him to write this guest post.


When you write your first custom Jenkins plugin for internal use, it&#8217;s easy enough to deploy it on one or maybe two Jenkins instances. You can save it on your local drive and upload the HPI file via the Jenkins Plugin Manager as needed. It&#8217;s easy to do this for a few releases. But as your experience grows, the number of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;This is a guest post by Kirill Merkushev at Yandex. I met him at JUC Europe where he showed me the project he was working on: Juseppe. It looked really interesting, so I asked him to write this guest post.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you write your first custom Jenkins plugin for internal use, it’s easy enough to deploy it on one or maybe two Jenkins instances. You can save it on your local drive and upload the HPI file via the Jenkins Plugin Manager as needed. It’s easy to do this for a few releases. But as your experience grows, the number of plugins and their releases grows as well. The plugins directory on your local drive soon looks like a garbage dump, and it’s difficult to find that most recent version of any plugin. And if you have a lot of Jenkins instances coordinating updates of your plugins may cause a lot of pain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A similar situation is when you contribute a much-needed patch to an existing plugin, but you don’t have the time to wait until your pull request is be merged and a new release is cut. Or you may need to patch a plugin in ways not suitable for distribution, and decide to effectively fork the plugin for use on your Jenkins instances. How are you going to do this?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A solution avoiding the problems from these situations is to set up your own update site to serve your private plugin builds. Juseppe allows you to do this quickly and easily.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;what-is-juseppe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-juseppe&quot; /&gt;What is Juseppe?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Juseppe&lt;/em&gt; is an acronym for &lt;em&gt;Jenkins Update Site Embedded for Plugin Publishing Easily&lt;/em&gt;. Juseppe can help you set up a Jenkins update site in just a few minutes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;features&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#features&quot; /&gt;Features&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Generates signed &lt;code&gt;update-center.json&lt;/code&gt; and &lt;code&gt;release-history.json&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Works with HPI files directly (stored in one folder), no need to set up a Maven repository&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watches for changes in the plugin folder and regenerates JSON files when changes are detected&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Serves generated files and plugin files with built-in Jetty web server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can be run in a &quot;generate-only&quot; mode when you want to use a different web server for these files.&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;how-can-i-get-juseppe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-can-i-get-juseppe&quot; /&gt;How can I get Juseppe?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It ships as a Docker container, or can be built from source. Visit &lt;a href=&quot;https://github.com/yandex-qatools/juseppe&quot;&gt;the GitHub project page&lt;/a&gt; to learn more. The complete user guide is available in &lt;a href=&quot;https://github.com/yandex-qatools/juseppe/wiki/Complete-Guide-of-own-update-center-using-Juseppe&quot;&gt;the GitHub project wiki&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/2015/07/09/jenkins-user-event-scandinavia-2015/</id>
<title>Jenkins User Event Scandinavia 2015</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-07-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/07/09/jenkins-user-event-scandinavia-2015/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<summary>
For the 4th consecutive year the Jenkins CI community is gathering in Scandinavia. JUES inspires both current as well as soon-to-be Jenkins users to network and harness inspiration from peers and experts on best practice and implementation of Continuous Integration, Continuous Delivery, and agile development with Jenkins.


As always we’ll precede the JUES conference with a Code Camp on the day before. The Code Camp is a full day community event where developers learn from fellow developers on coding and plugin enhancement, all delivered back to the community.


We welcome you and other leading Jenkins developers, QA, DevOps, and operations personnel to...
</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://jenkins-ci.org/sites/default/files/images/jues_0.png&quot; alt=&quot;image&quot; width=&quot;270&quot; height=&quot;181&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;For the 4th consecutive year the Jenkins CI community is gathering in Scandinavia.&lt;/em&gt; &lt;a href=&quot;https://archive.code-conf.com/jues15/&quot;&gt;JUES&lt;/a&gt; inspires both current as well as soon-to-be Jenkins users to network and harness inspiration from peers and experts on best practice and implementation of Continuous Integration, Continuous Delivery, and agile development with Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;As always we’ll precede the JUES conference with a &lt;a href=&quot;https://archive.code-conf.com/jues15/codecamp/&quot;&gt;Code Camp&lt;/a&gt; on the day before.&lt;/em&gt; The Code Camp is a full day community event where developers learn from fellow developers on coding and plugin enhancement, all delivered back to the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We welcome you and other leading Jenkins developers, QA, DevOps, and operations personnel to this years Scandinavian Jenkins CI festival hoping to continuously support the growth of the Jenkins Open Source community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://archive.code-conf.com/jues15/&quot;&gt;REGISTER FOR JUES HERE&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/06/22/new-wiki-url-requirement-for-plugins/</id>
<title>New Wiki URL Requirement for Plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-06-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/06/22/new-wiki-url-requirement-for-plugins/" />
<author>
<name>daniel-beck</name>
</author>
<category term='general'></category>
<category term='meta'></category>
<category term='plugins'></category>
<summary>
Let&#8217;s say you&#8217;re browsing the 'Available' tab in the Jenkins plugin manager for interesting-looking plugins. How do you learn more about them, preferably without installing them on your production instance? You click the plugin&#8217;s name, which usually links to the plugin&#8217;s wiki page, of course!


Unfortunately, it&#8217;s possible for plugins to be published without a wiki page, or any other documentation aside from what&#8217;s provided in the plugin itself. This is really unfortunate, as users rely on wiki pages and similar documentation to learn more about a plugin before installing or upgrading it, like its features, limitations, or recent changes. Additionally,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s say you’re browsing the &#39;Available&#39; tab in the Jenkins plugin manager for interesting-looking plugins. How do you learn more about them, preferably without installing them on your production instance? You click the plugin’s name, which usually links to the plugin’s wiki page, of course!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, it’s possible for plugins to be published without a wiki page, or any other documentation aside from what’s provided in the plugin itself. This is really unfortunate, as users rely on wiki pages and similar documentation to learn more about a plugin before installing or upgrading it, like its features, limitations, or recent changes. Additionally, plugin wiki pages have a special section at the top that provides an automatically generated technical overview of the plugin, such as dependencies to other plugins, the minimum compatible Jenkins version, a list of developers, and links to the source code repository and issue tracker component. Everyone learning about or using a plugin benefits from a plugin wiki page and luckily, almost all plugins have one!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To ensure that &lt;em&gt;every&lt;/em&gt; plugin has at least a basic wiki page with some documentation, we decided to only publish plugins in the Jenkins update center that have and link to a wiki page. To keep the impact to a minimum, we’re implementing this plan in several stages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first stage went live on June 1: All existing plugins that don’t have a (valid) wiki link got a wiki link &lt;a href=&quot;https://github.com/jenkinsci/backend-update-center2/blob/master/src/main/resources/wiki-overrides.properties&quot;&gt;assigned by the update center&lt;/a&gt; (a so-called &#39;override&#39;), either to an existing wiki page if there was one, or a generic &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+Documentation+Missing&quot;&gt;&quot;This plugin has no documentation&quot; wiki page&lt;/a&gt; otherwise. This ensures that no currently existing plugins get dropped from the update center at this point. Of course, &lt;em&gt;new&lt;/em&gt; plugins that don’t provide a wiki URL and don’t have an override URL will not show up at all.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second stage will be enabled later this year: We’re planning to remove all the overrides mentioned above. At this point, plugins may get removed from the update center if they still don’t specify a wiki URL. Of course this isn’t our goal, and we’ll try to work with plugin authors to prevent this from happening.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So what can you do? Check the &lt;a href=&quot;https://github.com/jenkinsci/backend-update-center2/blob/master/src/main/resources/wiki-overrides.properties&quot;&gt;current overrides list&lt;/a&gt; to see whether the plugins you care about are affected, and if so, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+Documentation+Missing#PluginDocumentationMissing-HowcanIhelp%3F&quot;&gt;see the landing page in the wiki&lt;/a&gt; to learn what you can do. If you have any questions about this process not covered by the wiki, ask us on the &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;Jenkins developers mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/06/16/juc-speaker-blog-series-martin-hobson-juc-u-s-east/</id>
<title>JUC Speaker Blog Series: Martin Hobson, JUC U.S. East</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-06-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/06/16/juc-speaker-blog-series-martin-hobson-juc-u-s-east/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<summary>
I’ve been using Jenkins for some time now as the build server for the various projects that are assigned to our four-person software development team, but recently I had exposure to how things were done in a much larger team, and I came away with a better understanding of the kinds of demands that are placed on a build pipeline in these environments. It was quite an education – while the CI pipelines that I administer in our small team might require a handful of virtual machines in our corporate cloud, the pipeline in this team supported over one hundred...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve been using Jenkins for some time now as the build server for the various projects that are assigned to our four-person software development team, but recently I had exposure to how things were done in a much larger team, and I came away with a better understanding of the kinds of demands that are placed on a build pipeline in these environments. It was quite an education – while the CI pipelines that I administer in our small team might require a handful of virtual machines in our corporate cloud, the pipeline in this team supported over one hundred developers and required several hundred VM instances at any given time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When operating at this scale, efficiency does become important, as the Amazon cloud charges add up and become significant at this level. Using some relatively simple techniques, I was able to gain insight into what actually happened in the more complex build jobs and learned just how these VM instances were utilized. These build jobs configured over a dozen virtual machines each, and understanding the startup and execution flows was critical to making changes and improving efficiencies. I will be discussing how to instrument and analyze these complex builds in my Lightning Talk: &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-02-1615-hobson&quot;&gt;&quot;Visualizing VM Provisioning with Jenkins and Google Charts”&lt;/a&gt; and hope to see you all there!&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://jenkins-ci.org/sites/default/files/images/01-02-1615-hobson_0.jpg&quot; alt=&quot;image&quot; width=&quot;152&quot; height=&quot;182&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Martin Hobson, Senior Software Developer at Agilex Technologies. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;JUC U.S. East&lt;/a&gt;, you can attend his lightning talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-02-1615-hobson&quot;&gt;&quot;Visualizing VM Provisioning with Jenkins and Google Charts&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;JUC IS HERE! JUC U.S. East will begin with registration at 7AM, Thursday June 18. The two day conference is sure to be a blast! If you have not registered, you can still get a ticket! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;Check out the agenda for JUC U.S. East here and find the link to register.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/06/15/juc-speaker-blog-series-stephan-hochdrfer-juc-europe/</id>
<title>JUC Speaker Blog Series: Stephan Hochdörfer, JUC Europe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-06-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/06/15/juc-speaker-blog-series-stephan-hochdrfer-juc-europe/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
I am very much looking forward to the Jenkins User Conference in London where I will present our insights on how to use Jenkins in a PHP related environment. Moving to Jenkins about 5 years ago bitExpert gained a lot of experience in running and managing a distributed Jenkins infrastructure. bitExpert builds custom applications for our clients which means that we have to deal with different project infrastructures, e.g. different PHP versions. We heavily rely on the build nodes concept of Jenkins which I will briefly outline in the session. Besides that I will give some in-depth insights on how...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am very much looking forward to the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;Jenkins User Conference in London&lt;/a&gt; where I will present our insights on how to use Jenkins in a PHP related environment. Moving to Jenkins about 5 years ago bitExpert gained a lot of experience in running and managing a distributed Jenkins infrastructure. bitExpert builds custom applications for our clients which means that we have to deal with different project infrastructures, e.g. different PHP versions. We heavily rely on the build nodes concept of Jenkins which I will briefly outline in the session. Besides that I will give some in-depth insights on how we use Jenkins on a daily basis for the &quot;traditional&quot; CI related tasks (e.g. linting code, checking code style, running tests) as well as how Jenkins is used to power our integration tests. Last but not least I will cover how Jenkins acts as a kind of backbone for our Satis server which allows us to host the metadata of our company’s private Composer packages. Throughout the talk I will point out which Jenkins plugins we use in the different contexts to give you a good starting point if you are new in the Jenkins ecosystem.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/bitExpert-logo_0.png&quot; alt=&quot;image&quot; width=&quot;220&quot; height=&quot;76&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Stephan Hochdoerfer, Head of Technology at bitExpert AG. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;JUC Europe&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/01-01-1130-hochdoerfer&quot;&gt;&quot;Jenkins for PHP Projects&quot;&lt;/a&gt; on Day 2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/06/09/juc-speaker-blog-series-damien-coraboeuf-juc-europe/</id>
<title>JUC Speaker Blog Series: Damien Coraboeuf, JUC Europe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-06-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/06/09/juc-speaker-blog-series-damien-coraboeuf-juc-europe/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
Scaling and maintenance of thousands of Jenkins jobs


How to avoid creating of a jungle of jobs when dealing with thousands of them?

In our organisation, we have one framework, which is used to develop products. Those products are themselves used to develop end user projects. Maintenance and support are needed at each level of delivery and we use branches for this. This creates hundreds of combinations.


Now, for each product or project version (or branch), we have a delivery pipeline. We start by compiling, testing, packaging, publishing. Then we deploy the application on the different supported platforms and go through different levels...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;scaling-and-maintenance-of-thousands-of-jenkins-jobs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#scaling-and-maintenance-of-thousands-of-jenkins-jobs&quot; /&gt;Scaling and maintenance of thousands of Jenkins jobs&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-to-avoid-creating-of-a-jungle-of-jobs-when-dealing-with-thousands-of-them&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-to-avoid-creating-of-a-jungle-of-jobs-when-dealing-with-thousands-of-them&quot; /&gt;How to avoid creating of a jungle of jobs when dealing with thousands of them?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In our organisation, we have one framework, which is used to develop products. Those products are themselves used to develop end user projects. Maintenance and support are needed at each level of delivery and we use branches for this. This creates hundreds of combinations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, for each product or project version (or branch), we have a delivery pipeline. We start by compiling, testing, packaging, publishing. Then we deploy the application on the different supported platforms and go through different levels of validation, until we’re ready for delivery. Aside from a few details and configuration elements, most of the pipelines are identical from one branch to the other, from one project to the other.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, one framework, some products, several projects, maintenance branches, complex pipelines… We end up having many many jobs to create, duplicate and maintain. Before even going into this direction, we saw this as a blocking issue - there was no way we could maintain manually thousands of jobs on a day to day basis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The solution we were looking for should have the following characteristics:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Self service - our goal being to delegate the job and branch administration in Jenkins to the projects, in order to reduce the support time&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Security - we didn’t want to open Jenkins to the projects at configuration level - not acceptable in our context&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simplicity - the solution should be simple enough to be manageable by people not knowledgeable about the core technologies of Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Extensibility - the solution must be flexible enough to allow extensions when needed&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When we thought about using the Job DSL plug-in, delegating the creation of the pipeline to the project teams was OK from a self service point of view, but was not secure and definitely not simple for people not knowing Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the end, we opted for a solution where:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A project team would edit a simple property file listing the characteristics of the current branch, like which type of platform is supported, which version of the &lt;em&gt;pipeline library&lt;/em&gt; to use, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upon commit of this shopping list, the complete branch pipeline is regenerated using the given version of the &lt;em&gt;pipeline library&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;em&gt;pipeline library&lt;/em&gt; code reads the “shopping list” property file and runs a Job DSL script to generate the branch pipeline according to those parameters&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By default, the pipeline library generates a classic pipeline, suitable for most needs. It is also possible to define and use extensions, like having additional jobs in the pipelines.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In case of new features or defects, we develop or branch a new version of the pipeline library and projects or branches can use it by changing the version of their shopping list file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A project gets injected into the system by having only a project seed being generated. From it, the authorised members can generate the branch seed and any branch pipeline at any time. Those seed jobs and the pipelines themselves can also be driven directly from the SCM using our plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project teams are now autonomous and can pilot their pipelines without requesting any support. They act in a secure and isolated way, and cannot compromise the shared environment. The “shopping list” file is simple and well documented. The system is not rigid and allows for extensions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This platform has been developed initially for a very specific framework and a set of projects which depend on it, but has been extended since to be able to support other stacks. It is structured in two different parts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The seed platform itself - generation of branch structures in Jenkins and trigger end points for being piloted from the SCM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The pipeline libraries, referenced from the shopping list files&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We still allow some small tools and applications to define directly their pipeline by providing a Job DSL script.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using the same principle, we can also pilot other tools in the ecosystem - like Artifactory or Ontrack.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll talk about this seed platform on June 24th, in the Jenkins User Conference in London.&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://jenkins-ci.org/sites/default/files/images/dcoraboeuf_0.preview.jpg&quot; alt=&quot;image&quot; width=&quot;150&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Damien Coraboeuf, Continuous Delivery Expert at Clear2Pay. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;JUC Europe&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/02-03-1515-coraboeuf&quot;&gt;&quot;Scaling of Jenkins Pipeline Creation and Maintenance&quot;&lt;/a&gt; on Day 2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&lt;/strong&gt;&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/06/08/juc-speaker-blog-series-will-soula-juc-u-s-east/</id>
<title>JUC Speaker Blog Series: Will Soula, JUC U.S. East</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-06-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/06/08/juc-speaker-blog-series-will-soula-juc-u-s-east/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
Chat Ops and Jenkins


I am very excited to be attending the Jenkins User Conference on the East Coast this year. This will be my third presentation at a JUC and fourth time to attend, but my first on the East Coast. I have learned about a lot of cool stuff in the past, which is why I started presenting, to tell people about the cool stuff we are doing at Drilling Info. One of the cooler things we have implemented in the last year is Chat Ops and our bot Sparky. It started as something neat to play with ("Oooo...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;chat-ops-and-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#chat-ops-and-jenkins&quot; /&gt;Chat Ops and Jenkins&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am very excited to be attending the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;Jenkins User Conference on the East Coast&lt;/a&gt; this year. This will be my third presentation at a JUC and fourth time to attend, but my first on the East Coast. I have learned about a lot of cool stuff in the past, which is why I started presenting, to tell people about the cool stuff we are doing at Drilling Info. One of the cooler things we have implemented in the last year is Chat Ops and our bot Sparky. It started as something neat to play with (&quot;Oooo lots of kittens&quot;) but quickly turned into something more serious.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ever get asked the same questions over and over? What jobs to run to deploy your code? What is the status of the build? These question and more can all be automated so you do not have to keep answering them. Furthermore, when you do get asked you can show them, and everyone else, how to get the information by issuing the proper commands in a chat room for everyone to see. With chat rooms functioning as the 21st century water coolers, putting the information in the middle of the conversation is a powerful teaching technique. You are not sending people to some out dated documentation on how to get their code deployed, nor are you showing them the steps today only to be forgotten tomorrow. Instead you can deploy your code and they see the exact steps needed to get their code deployed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even more impressive is the way ChatOps can bring your company together. Recently our CTO got a hipchat account so he could interact with Sparky. This gave me the idea that if we extend Sparky to deliver information useful to the other teams (Sales, Marketing, Finance, etc) then we would be able to get these wildly disparate teams in the same chat room together and hopefully they will talk and learn from each other. Where DevOps is the bringing together of Dev and Ops, ChatOps can be the bridge across the entire organization. Come see my presentation Day 1: Track 1 at 4:00 PM to learn how ChatOps can enrich your team, how Drilling Info is using it, and what our future plans entail for ChatOps.&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://jenkins-ci.org/sites/default/files/images/01-01-1600-soula_0.jpg&quot; alt=&quot;image&quot; width=&quot;152&quot; height=&quot;182&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Will Soula, Senior Configuration Management/Build Engineer at Drilling Info. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;JUC U.S. East&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-01-1600-soula&quot;&gt;&quot;Chat Ops and Jenkins&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/06/03/juc-speaker-blog-series-andrew-phillips-juc-u-s-east/</id>
<title>JUC Speaker Blog Series: Andrew Phillips, JUC U.S. East</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-06-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/06/03/juc-speaker-blog-series-andrew-phillips-juc-u-s-east/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
Automated Testing with Jenkins: At JUC East with Andrew Phillips


Next stop: Washington, DC! I’m looking forward to heading to JUC East in a couple weeks, which runs June 18-19. The Jenkins User Conference is the annual get-together for Jenkins customers, users, partners, developers and community members. It promises to be an exciting two days, and as an added bonus I get to catch up with Kohsuke Kawaguchi and Gene Kim!


I will be giving a talk about a topic that I think is a bit of an elephant in the room in the Continuous Delivery space: the critical importance of optimized...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;automated-testing-with-jenkins-at-juc-east-with-andrew-phillips&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automated-testing-with-jenkins-at-juc-east-with-andrew-phillips&quot; /&gt;Automated Testing with Jenkins: At JUC East with Andrew Phillips&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next stop: Washington, DC! I’m looking forward to heading to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;JUC East&lt;/a&gt; in a couple weeks, which runs June 18-19. &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;The Jenkins User Conference&lt;/a&gt; is the annual get-together for Jenkins customers, users, partners, developers and community members. It promises to be an exciting two days, and as an added bonus I get to catch up with Kohsuke Kawaguchi and Gene Kim!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I will be giving a talk about a topic that I think is a bit of an elephant in the room in the Continuous Delivery space: the critical importance of optimized Automated Testing. As you start to ship code faster, you’ll need numerous automated tests across many different tools, in many different jobs in your pipeline. But getting a grip on the results of all of your automated tests — and then figuring out whether your software is good enough to go live — becomes harder and harder as you speed up the delivery of your software.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll share tips on how naming conventions, partitioning of testware and mirroring the application’s structure in the test code help you best handle automated testing with Jenkins. I’ll also try to provide some insight into how to keep the setup manageable, as well as share practical experiences of managing large portfolios of automated tests. Finally, we’ll showcase some practices that help you manage all your test results and add aggregation, trend analysis and qualification capabilities to your Jenkins setup.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Join us at the event&lt;/a&gt;, or check the slides or recording (which we’ll post after the talk) to learn more. Looking forward to seeing you there!&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://jenkins-ci.org/sites/default/files/images/01-01-1130-phillips_0.jpg&quot; alt=&quot;image&quot; width=&quot;152&quot; height=&quot;182&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Andrew Phillips, at XebiaLabs. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;JUC U.S. East&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-01-1130-phillips&quot;&gt;&quot;How to Optimize Automated Testing with Everyone’s Favorite Butler&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/06/02/juc-speaker-blog-series-peter-vilim-juc-u-s-east/</id>
<title>JUC Speaker Blog Series: Peter Vilim, JUC U.S. East</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-06-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/06/02/juc-speaker-blog-series-peter-vilim-juc-u-s-east/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
In this talk I will be focusing on plugin development for Jenkins. I aim to capture some of the lessons that we have learned at Delphix and that I learned while I was in graduate school. At Delphix we have been large users of Jenkins for over four years which is most of the history of our startup. We currently run thousands of jobs per day. We have been quite happy with the experience and expect these numbers to grow significantly as our business scales beyond our current 300 head count.


The core concept of Delphix is Data as a Service....
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this talk I will be focusing on plugin development for Jenkins. I aim to capture some of the lessons that we have learned at Delphix and that I learned while I was in graduate school. At Delphix we have been large users of Jenkins for over four years which is most of the history of our startup. We currently run thousands of jobs per day. We have been quite happy with the experience and expect these numbers to grow significantly as our business scales beyond our current 300 head count.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The core concept of &lt;a href=&quot;https://www.delphix.com/&quot;&gt;Delphix&lt;/a&gt; is Data as a Service. Our software allows businesses to virtualize databases and data associated with their applications then provision these on demand to developers and others who need virtual copies of them. Our development for this software spans the entire stack. We have quite a few kernel developers, including the original team for the ZFS filesystem who work on developing the open source application, OpenZFS, which underpins our product. Further up the stack we have a large java application that interacts with ZFS to perform virtualization operations, provides user&lt;br&gt;
facing webservices, and interfaces with our internal Postgres metadata store which stores the state of our system. Finally above this we have a modern Javascript front end for user interaction. Our full software product ships as a virtual machine on a variety of hypervisors. As a result of these numerous components, end to end integration testing is very important to us. This integration testing is the primary use of Jenkins for us. Before any developer checks in code to either our operating system or application repository, it must undergo several hours of automated integration testing. We also have nightly runs which go for far longer and tests a much more extensive set of functionality. In addition, we use Jenkins for the build process of our software as well as final packaging for release. Because Jenkins serves as a hub for our development processes, having a well designed system is very important to us and saves us significant time.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Below are some of the key points I will be discussing at my talk. I hope you attend to learn more about the areas that I find very interesting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I’m planning to discuss the structure of a Jenkins plugin. I’ll also cover a few of the more advanced areas of plugins such as distributed builds that I see less frequently in plugins. In addition, I’ll briefly cover unit testing, which is something missing in many open source plugins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I’ll talk about some good patterns to use in plugins as well as some areas where a plugin is not a good idea. I’m planning to pull from my own personal experience developing plugins, the experience of other people at Delphix working with Jenkins, and our experience using other open source plugins to talk about what works and what doesn’t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I’ll give an overview of the current plugin development at Delphix. I’ll cover some of the lessons that we have learned along the way. We have also started to take a &quot;dogfooding&quot; approach to some of our development where we use plugins internally to help our test process and open source them since our customers find features used for testing our product to often be useful in their production environments. This has an added bonus of making it easier to justify our development time spent on making these plugins, since they are also features requested by our customers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I’ll discuss the trade-offs between using an already developed plugin or group of plugins, writing some scripts, and building your own plugin. Being able to figure out when to do which can lead to major time savings as well as a better user experience.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope you attend. Even if you have no immediate plans to write your own plugins, hopefully you’ll be able to learn about what makes plugins tick and how to better evaluate plugins when picking them for your own projects. Plugins were what originally got me excited about Jenkins and they allowed me to see its true potential as a build and test system. I hope to share some of that inspiration.&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://jenkins-ci.org/sites/default/files/images/01-01-1400-vilim_0.jpg&quot; alt=&quot;image&quot; width=&quot;152&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Peter Vilim, Member of Technical Staff at Delphix. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;JUC U.S. East&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-01-1400-vilim&quot;&gt;&quot;Providing a First Class User Experience with Jenkins Plugins&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&lt;/strong&gt;&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/06/01/juc-speaker-blog-series-nobuaki-ogawa-juc-europe/</id>
<title>JUC Speaker Blog Series: Nobuaki Ogawa, JUC Europe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-06-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/06/01/juc-speaker-blog-series-nobuaki-ogawa-juc-europe/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
On the 23rd and 24th June, I’ll attend Jenkins User Conference 2015 Europe in London. And I’ll present a lightning talk about Continuous Delivery with Jenkins.


Here is short overview of what I’d like to talk about there.


1. Continuous Build


My starting point was to get to know JenkinsCI. Our developers used JenkinsCI to make the Continuous Build of our software.
So, our developing environment was quite Jenkins friendly from the beginning.


2. Continuous Deploy


--- Virtual Machine ---


We had to have an environment where we could deploy our new build. As we are big fans of Microsoft, we decided to use Azure as our...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the 23rd and 24th June, I’ll attend &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;Jenkins User Conference 2015 Europe&lt;/a&gt; in London. And I’ll present a lightning talk about Continuous Delivery with Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is short overview of what I’d like to talk about there.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;1. Continuous Build&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My starting point was to get to know JenkinsCI. Our developers used JenkinsCI to make the Continuous Build of our software.&lt;br&gt;
So, our developing environment was quite Jenkins friendly from the beginning.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2. Continuous Deploy&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;--- Virtual Machine ---&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had to have an environment where we could deploy our new build. As we are big fans of Microsoft, we decided to use Azure as our environment to make Continuous Testing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How do we control it? We use &lt;a href=&quot;https://odehne.wordpress.com/2013/12/01/dealing-with-virtual-machines-in-windows-azure-using-powershell/&quot;&gt;Powershell&lt;/a&gt;, which can be executed with JenkinsCI.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;--- Product Deployment ---&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How did we achieve the Continuous Deploy? Actually, my boss, who is DirectSmile’s Yoda developed a very powerful tool called &lt;a href=&quot;https://odehne.wordpress.com/2012/03/26/continuous-deployment-of-directsmile-products/&quot;&gt;“DirectSmile Installation Service”&lt;/a&gt; to enable this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we integrated this tool within JenkinsCI, and now Jenkins can deploy DirectSmile products on any target server with just one-button-click!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3. Continuous Testing&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, we use JenkinsCI to make the Continuous Testing.&lt;br&gt;
How do we do that?&lt;br&gt;
We use &lt;a href=&quot;https://www.seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt; to make and run tests. So we can cover most features and we can execute it at anytime.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are doing it after every new version build, to obtain Continuous Delivery.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;4. Continuous Sharing&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I think it’s important to share all knowledge and experiences I have had with others, especially those whom have just started with Continuous Delivery.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Don’t worry, it is probably much easier than you think.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a part of this practice, I’d like to share all my knowledge and experiences with how easy it is to achieve Continuous Delivery with Jenkins at JUC 2015.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m really exciting to meet and talk about this there! See you at JUC 2015 in London!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;About Me&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My name is Nobuaki Ogawa, from Japan, and I currently work in Berlin, Germany for the software company &lt;a href=&quot;https://directsmile.com/&quot;&gt;DirectSmile&lt;/a&gt; as a DevOps QA Manager.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the very first time I used JenkinsCI, it helped me a lot. Almost all the work I did last year was mainly with Continuous Delivery with Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From Build to Deploy, Test, and even Maintenance and Monitoring, my Jenkins takes care of everything.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was super easy to achieve Continuous Delivery in the DirectSmile world with the help of JenkinsCI.&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://jenkins-ci.org/sites/default/files/images/02-03-1530-ogawa_0.jpg&quot; alt=&quot;image&quot; width=&quot;152&quot; height=&quot;182&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Nobuaki Ogawa, DevOps QA Manager at DirectSmile. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;JUC Europe&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/02-03-1530-ogawa&quot;&gt;&quot;Jenkins Made Easy&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? If you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/05/20/juc-speaker-blog-series-david-dang-juc-u-s-east/</id>
<title>JUC Speaker Blog Series:  David Dang, JUC U.S. East</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-05-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/05/20/juc-speaker-blog-series-david-dang-juc-u-s-east/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
I’ve implemented numerous test automation projects for clients, but recently I had a unique request. Jenkins plays a critical role.


The “digital channel” is an industry buzzword for many companies these days. The digital channel represents a company’s content that is delivered by websites and mobile devices. Companies want the same website to work across any channel in multiple browsers and different operating systems. They also want that same website to work across an explosion of mobile devices. Add the new generation of smart watches showing up and testing is becoming a huge challenge for IT departments. One big issue is...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve implemented numerous test automation projects for clients, but recently I had a unique request. Jenkins plays a critical role.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The “digital channel” is an industry buzzword for many companies these days. The digital channel represents a company’s content that is delivered by websites and mobile devices. Companies want the same website to work across any channel in multiple browsers and different operating systems. They also want that same website to work across an explosion of mobile devices. Add the new generation of smart watches showing up and testing is becoming a huge challenge for IT departments. One big issue is there is too much duplication of testing efforts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a perfect world, you would create a core set of test automation scripts that work across all digital channels. A client recently requested that my team and I create this perfect-world scenario, and we are doing just that. Jenkins pulls it all together by managing the execution and reporting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join me for my talk to learn how I’m using Jenkins, Selenium, TestNG, and Perfecto Mobile to solve the digital channel testing challenges for one client.&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://jenkins-ci.org/sites/default/files/images/01-02-1030-dang_0.jpg&quot; alt=&quot;image&quot; width=&quot;149&quot; height=&quot;180&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by David Dang, VP of Automation Solutions at Zenergy Technologies. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;JUC U.S. East&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-02-1030-dang&quot;&gt;&quot;Integrating Mobile Automation with Jenkins: A Case Study Using Perfecto Mobile with Jenkins&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? Early bird pricing has been extended! Also, if you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/05/18/juc-speaker-blog-series-andrew-bayer-juc-europe/</id>
<title>JUC Speaker Blog Series: Andrew Bayer, JUC Europe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-05-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/05/18/juc-speaker-blog-series-andrew-bayer-juc-europe/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='meta'></category>
<category term='jenkinsci'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
In the fall of 2011, the very first Jenkins User Conference was held in San Francisco. Over 250 people showed up. It was, to be completely honest, a bit shocking to me - that little project I’d gotten involved with less than three years earlier was big enough, interesting enough, important enough for 250 people to travel from around the world to spend a day talking about it? That’s an amazing feeling, and it was an amazing day. Since then, there’ve been three more JUCs in the Bay Area, three in Israel and two in Europe, with more talks on...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the fall of 2011, the very first Jenkins User Conference was held in San Francisco. Over 250 people showed up. It was, to be completely honest, a bit shocking to me - that little project I’d gotten involved with less than three years earlier was big enough, interesting enough, important enough for 250 people to travel from around the world to spend a day talking about it? That’s an amazing feeling, and it was an amazing day. Since then, there’ve been three more JUCs in the Bay Area, three in Israel and two in Europe, with more talks on more Jenkins subjects and an ever-increasing number of attendees. This year, there are another four scheduled - three of them for two days each this time! Find out more about the first two, JUC US East and JUC Europe, below!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not only are there enough worthy talks to merit a full day a few times a year - now there are enough to merit two days! At JUC US East 2015 outside Washington, DC on June 18 and 19, you can see talks on the Workflow plugin for Jenkins, test automation, mobile testing, plugin development, and a few talks on new and fascinating ways people are using Jenkins - even driving big data workflows! And then, just a few days later, on June 23 and 24 in London, there’s JUC Europe 2015, with talks covering things like the fantastic Job DSL plugin, reproducible build environments, Jenkins and Docker together, and my personal favorite, the 2015 edition of my Seven Habits of Highly Effective Jenkins Users talk.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Whether you’re interested in the latest innovations in continuous integration and delivery, or you’re a Jenkins plugin developer wanting to learn how to make your plugins more mature and useful, or you’re a Jenkins administrator trying to understand how to provide your users with a great platform for their builds and testing, or even if you’ve just heard about CI/CD and you want to find out more, the Jenkins User Conferences are a great opportunity to see all those things and meet with other Jenkins users and developers. I’m excited to attend my fifth JUC in London, and I hope to see you there!&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://jenkins-ci.org/sites/default/files/images/smallerme.jpeg&quot; alt=&quot;image&quot; width=&quot;150&quot; height=&quot;188&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Andrew Bayer, build and tools architect at Cloudera and longtime Jenkins contributor. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;JUC Europe&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/01-01-1030-bayer&quot;&gt;&quot;Seven Habits of Highly Effective Jenkins Users&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? Early bird pricing ends May 15. Also, if you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/05/14/juc-speaker-blog-series-lorelei-mccollum-juc-u-s-east/</id>
<title>JUC Speaker Blog Series: Lorelei McCollum, JUC U.S. East</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-05-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/05/14/juc-speaker-blog-series-lorelei-mccollum-juc-u-s-east/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
Have you heard Jenkins mentioned, but haven&#8217;t really done much with it? Are you at JUC because you want to learn more? Has your company been pushing you to use Jenkins or to adapt a more agile build/test process using a Continuous Delivery/Continuous Integration method?


Jenkins 101 is going to give you an introduction to Jenkins and get you started in the right direction. Many sessions may be too in-depth, too specialized, or do a deep dive too fast, and while that is good for the more intermediate Jenkins user, the beginner can get lost fast and lose interest. My session...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; height=&quot;128&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Have you heard Jenkins mentioned, but haven’t really done much with it? Are you at JUC because you want to learn more? Has your company been pushing you to use Jenkins or to adapt a more agile build/test process using a Continuous Delivery/Continuous Integration method?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins 101 is going to give you an introduction to Jenkins and get you started in the right direction. Many sessions may be too in-depth, too specialized, or do a deep dive too fast, and while that is good for the more intermediate Jenkins user, the beginner can get lost fast and lose interest. My session will go through the basics of Jenkins, so anyone without prior knowledge can get up and running in just a short amount of time. We will cover building/configuring jobs, design of pipelines, security of your Jenkins controller, fun groovy scripts and useful plugins to get you started. Whether you are a beginner or an advanced Jenkins user, you can always learn from how others are using Jenkins. Attend this session early on in your JUC lineup, so that you get the most out of the conference!&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://jenkins-ci.org/sites/default/files/images/01-02-1600-McCollum_0.png&quot; alt=&quot;image&quot; width=&quot;149&quot; height=&quot;180&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Lorelei McCollum, Software Engineer at IBM. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;JUC U.S. East&lt;/a&gt;, you can attend her talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-02-1500-mccollum&quot;&gt;&quot;Jenkins 101&quot;&lt;/a&gt; on Day 1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? Early bird pricing ends May 15. Also, if you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; height=&quot;579&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/05/07/juc-speaker-blog-series-denis-chernilevskiy-juc-europe/</id>
<title>JUC Speaker Blog Series: Denis Chernilevskiy, JUC Europe</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-05-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/05/07/juc-speaker-blog-series-denis-chernilevskiy-juc-europe/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<summary>
Jenkins is a great tool for automation of all kinds of processes in the software development cycle. Falling back to the year 2008 I remember myself creating my first job and the feeling of enlightenment flowing through my veins :) Then it was just one script running on just one agent (node) and it was enough for that particular task. But years have passed, software systems have become more complicated and terms like «cloud», «distributed environment», «CI/CD» are not a discovery for anyone nowadays. But how can these things be connected and used by Jenkins? The detailed answer for this...
</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://jenkins-ci.org/sites/default/files/images/Jenkins_Butler_0.png&quot; alt=&quot;image&quot; width=&quot;114&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is a great tool for automation of all kinds of processes in the software development cycle. Falling back to the year 2008 I remember myself creating my first job and the feeling of enlightenment flowing through my veins :) Then it was just one script running on just one agent (node) and it was enough for that particular task. But years have passed, software systems have become more complicated and terms like «cloud», «distributed environment», «CI/CD» are not a discovery for anyone nowadays. But how can these things be connected and used by Jenkins? The detailed answer for this question will be revealed in my presentation of &quot;compound-cloud&quot; plugin at &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;JUC Europe 2015&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before I got to Yandex, the QA’s automation concept was the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The job takes 1 free agent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The job installs the system under test and tests themselves to this node&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The job runs tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The job cleans-up and returns the agent back to the pool&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I started working for Yandex I understood that the concept of one single agent for a job is not a solution for our tasks because of one particular reason - the system under test was not able to work on a single node… This system is a Yandex MediaAd platform and it requires at least 4 separate nodes to be run on. Better - 8 nodes. Optimal - 40 nodes :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thinking about the problem, we thought we would get closer to the solution by simply using a single Jenkins agent as a launchpad for tests and for some tools which will then get some more nodes from the cloud (we already had OpenStack ready) and deploy the system inside them. Thank God we haven’t implemented this solution :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve been stopped by the following reasons:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We are lazy and want to write as little code as possible :)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There’s a JClouds plugin that can work with OpenStack. Why don’t we use it? &#39;Cause it provisions only 1 agent per job. But it has provisioning algorithms implemented already, and we don’t want to reimplement them…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If we create cloud instances with a separate tool, then we have to manage them separately and can’t get profit of using Jenkins’ agent management, which is also implemented already…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;if we do so, we also lose Jenkins’ agent features like running a script on the agent, get some reports or statistics and so on&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We would also lose visibility: how many agents we have, how many are busy, how many left til we get to the cloud quota limit? We could go to OpenStack panel then, but it’s totally inconvenient…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a result of this reasoning, the idea emerged! «We should provide an ability to either attach several agents to a job, or to allow a agent to consist of several nodes». The second way seemed to give more order in agents management and it was stated to be a final solution for our problem. We called this concept a «compound-agent». And then we coded…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s how the compound-cloud plugin was born. It allows us to get such compound-agents from any cloud plugin installed to Jenkins. Of course there’s also a possibility to form a compound agent from single agents already attached to Jenkins, but it’s not the true way for hardcore IT guys ;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course there are lots of details on how we use this concept in a real life for our purposes (and I will surely describe the main parts of them in my speech), but here’s a short list of common use-cases:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We configure a set of labels via the JClouds plugin. Each label represents 1 agent template, like «small_ubuntu_server» or «large_win_server».&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We then configure a compound-agent label via compound-сloud plugin. Each label is a set of single cloud labels. As a result we have a label like «Small test env» consisting of &quot;1x large WinServer + 3x small Ubuntu».&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We assign roles to each single node in a compound label, to be able to distinguish them, so the job can run a script on a particular node inside a compound-agent for example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We assign a label to a job, like it’s done for a JClouds label, for example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the job starts, a compound-agent provisions from the cloud using the corresponding compound label.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We run a deployment tool on a ROOT role node of a compound-agent. It then deploys the system under test to other nodes inside this compound-agent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We run tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We don’t bother with creating/cleaning/stopping/deleting agents. It’s done by Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We get profit :)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The core feature is that we’ve reused all the provisioning and management mechanisms already implemented in Jenkins and cloud plugins. We just run our jobs and don’t care about the distributed infrastructure!&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://jenkins-ci.org/sites/default/files/images/Denis-Chernilevskiy_0.jpg&quot; alt=&quot;image&quot; width=&quot;150&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is by Denis Chernilevskiy, the head of QA/DevOps Services at Yandex. If you have your ticket to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;JUC Europe&lt;/a&gt;, you can attend his talk &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/02-02-1600-chernilevskiy&quot;&gt;&quot;Multi-Node Environment as a Jenkins Agent (Compound-Agent)&quot;&lt;/a&gt; on Day 2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Still need your ticket to JUC? Early bird pricing ends May 15. Also, if you register with a friend you can get 2 tickets for the price of 1! &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;Register here for a JUC near you.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Thank you to our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/sponsors&quot;&gt;sponsors&lt;/a&gt; for the 2015 Jenkins User Conference World Tour:&lt;/strong&gt;&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://jenkins-ci.org/sites/default/files/images/sponsors-06032015-02_0.png&quot; alt=&quot;image&quot; width=&quot;598&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/04/24/jira-migration-this-weekend/</id>
<title>JIRA migration this weekend</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-04-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/04/24/jira-migration-this-weekend/" />
<author>
<name>kohsuke</name>
</author>
<category term='infrastructure'></category>
<category term='news'></category>
<summary>
In continuing my infra upgrade work, this weekend I&#8217;ll be migrating JIRA to another server.


This will make upgrade more manageable and testable. The service will be disrupted for a few hours. Check out our @jenkinsci on Twitter for up-to-the-minute status.


Once the migration is done, the next step is to upgrade them....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In continuing &lt;a href=&quot;https://jenkins-ci.org/content/confluence-migration-weekend&quot;&gt;my infra upgrade work&lt;/a&gt;, this weekend I’ll be migrating JIRA to another server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will make upgrade more manageable and testable. The service will be disrupted for a few hours. Check out our &lt;a href=&quot;https://twitter.com/jenkinsci/&quot;&gt;@jenkinsci on Twitter&lt;/a&gt; for up-to-the-minute status.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once the migration is done, the next step is to upgrade them.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/04/22/jenkins-user-conference-agenda-news/</id>
<title>Jenkins User Conference - Agenda News</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-04-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/04/22/jenkins-user-conference-agenda-news/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
I have some exciting news&#8201;&#8212;&#8201;The agendas have been posted for the Jenkins User Conferences (JUC) to be held at U.S. East (Alexandria, VA) and Europe (London). Take a look here to learn more about the talks, speakers and schedules.


As always, there is a great lineup of presenters ready to share their Jenkins stories: Peter Vilim will be presenting “Proving a First Class User Experience with Jenkins” at the U.S. East JUC, and Sander Kieft’s talk is called “Automating a Big Data Platform with Jenkins” at JUC Europe. Learn more about all 2015 JUC speakers and talks here. Explore the pages...
</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://jenkins-ci.org/sites/default/files/images/newjuc2_1.png&quot; alt=&quot;image&quot; width=&quot;153&quot; height=&quot;166&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have some exciting news — The agendas have been posted for the Jenkins User Conferences (JUC) to be held at &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/us-east&quot;&gt;U.S. East (Alexandria, VA)&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/europe&quot;&gt;Europe (London)&lt;/a&gt;. Take a look &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;here&lt;/a&gt; to learn more about the talks, speakers and schedules.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As always, there is a great lineup of presenters ready to share their Jenkins stories: Peter Vilim will be presenting &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-01-1400-vilim&quot;&gt;“Proving a First Class User Experience with Jenkins”&lt;/a&gt; at the U.S. East JUC, and Sander Kieft’s talk is called &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/02-01-1500-kieft.html&quot;&gt;“Automating a Big Data Platform with Jenkins”&lt;/a&gt; at JUC Europe. Learn more about all 2015 JUC speakers and talks &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;here&lt;/a&gt;. Explore the pages and see the who/what/where of all JUC 2015 locations!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will see some familiar names and talks as well: Andrew Bayer will be presenting his very popular talk called &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/europe/01-01-1030-bayer&quot;&gt;“Seven Habits of Highly Effective Jenkins Users”&lt;/a&gt; at JUC Europe. Will Soula is returning this year to JUC U.S. East to “chat” about &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-01-1600-soula&quot;&gt;“Chat Ops and Jenkins.”&lt;/a&gt; Lorelei McCollum is also back with two talks at JUC U.S. East called &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-02-1500-mccollum&quot;&gt;“Jenkins 101”&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/abstracts/us-east/01-02-1600-mccollum&quot;&gt;“Getting Groovy with Jenkins.”&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, you will notice a few differences in the JUC agendas. JUC is now a two-day conference in the U.S. East, Europe and U.S. West locations! Also, each session is assigned a category according to its content: Continuous Delivery, Best Practices, Operations, Plugins, Case Studies/War Stories and more. This will help you decide which talks to attend. You will also notice that several talks, especially in JUC Europe, reflect the industry’s growing interest in big data and Docker.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agendas are still being finalized for JUC Israel and JUC U.S. West. If you are interested in speaking at either of these locations, &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;you can still send in your talk proposals.&lt;/a&gt; The U.S. West deadline is May 3 and the Israel deadline is May 15.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;JUC&lt;/a&gt; is such a great opportunity for the community to come together and network face-to-face. You can meet &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;, creator of the Jenkins project, &lt;a href=&quot;https://twitter.com/realgenekim&quot;&gt;Gene Kim&lt;/a&gt;, author of &lt;a href=&quot;https://www.amazon.com/The-Phoenix-Project-Helping-Business/dp/0988262592&quot;&gt;The Phoenix Project&lt;/a&gt; and DevOps expert, but you will also have the opportunity to meet Jenkins users, just like you, from all over the world. And this year, with the Jenkins project at &lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/svg/total-jenkins.svg?mkt_tok=3RkMMJWWfF9wsRokvKrNZKXonjHpfsX%2B7ekkX7Hr08Yy0EZ5VunJEUWy3IYFTdQ%2FcOedCQkZHblFnVwASa2lV7oNr6QP&quot;&gt;well over 100K active installations&lt;/a&gt;, JUC as a whole will be the largest gathering of Jenkins users ever.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Early bird pricing for JUC U.S. East and Europe ends May 1, so &lt;strong&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/#&quot;&gt;REGISTER NOW&lt;/a&gt;&lt;/strong&gt; to take advantage of the lower pricing.&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/04/13/juc-world-tour-2015-keynote-speaker-news-and-early-bird-tickets/</id>
<title>JUC World Tour 2015 - Keynote Speaker News and Early Bird Tickets</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-04-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/04/13/juc-world-tour-2015-keynote-speaker-news-and-early-bird-tickets/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
The 2015 JUC World Tour dates are rapidly approaching. Since the community has grown so tremendously since last year, the JUC in each city will be the largest gathering of Jenkins users in that region.


Kohsuke will, as always, be the opening keynote speaker at each JUC. But, with the conference going from one to two days, I am happy to announce that Gene Kim will be another keynote on the second day! He is the author of The Phoenix Project and a thought leader in DevOps.


To have these two experts in one place will provide a great opportunity to talk...
</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://jenkins-ci.org/sites/default/files/images/The-Phoenix-Project-border_2.png&quot; alt=&quot;image&quot; width=&quot;99&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 2015 JUC World Tour dates are rapidly approaching. Since the community has grown so tremendously since last year, the JUC in each city will be the largest gathering of Jenkins users in that region.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; will, as always, be the opening keynote speaker at each JUC. But, with the conference going from one to two days, I am happy to announce that &lt;a href=&quot;http://www.realgenekim.me/&quot;&gt;Gene Kim&lt;/a&gt; will be another keynote on the second day! He is the author of &lt;a href=&quot;https://www.amazon.com/Phoenix-Project-DevOps-Helping-Business/dp/0988262592/ref=tmm_hrd_swatch_0?_encoding=UTF8&amp;amp;sr=8-1&amp;amp;qid=1428523232&quot;&gt;The Phoenix Project&lt;/a&gt; and a thought leader in DevOps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To have these two experts in one place will provide a great opportunity to talk about Jenkins as the foundation of continuous delivery and DevOps practices.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another exciting announcement: the 2015 Jenkins World Tour will run alongside the CD Summit conferences for both days (at the U.S. East, Europe and U.S. West locations only). Attendees of either conference can attend any of the talks and presentations at both events. Learn more about what &lt;a href=&quot;https://www.cloudbees.com/cdsummit&quot;&gt;CD Summit 2014&lt;/a&gt; was like to get an idea for &lt;a href=&quot;https://www.cloudbees.com/cdsummit-2015/&quot;&gt;this year’s event.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Registration for all 2015 JUC locations is open. Early bird pricing ends May 1!&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;strong&gt;&lt;a href=&quot;https://www.regonline.com/register/checkin.aspx?EventId=1698436&amp;amp;MethodId=0&amp;amp;EventSessionId=&amp;amp;startnewreg=1&quot;&gt;East Coast US: June 18-19&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.regonline.com/Register/Checkin.aspx?EventID=1698435&quot;&gt;Europe: June 23-24&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-israel-tlv-david-inter-continental-july-16-2015-tickets-16393557572&quot;&gt;Israel: July 16&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.regonline.com/Register/Checkin.aspx?EventID=1697214&quot;&gt;West Coast US: September 2-3&lt;/a&gt;&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;&lt;strong&gt;The Call for Papers for JUC is still open for Israel and U.S. West. Submit your own proposal or convince your favorite speaker/Jenkins user to submit one if speaking is not your thing!&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://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;East Coast US: June 18-19&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;Israel: July 16&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/04/06/good-bye-java6/</id>
<title>Good bye Java6</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-04-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/04/06/good-bye-java6/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='feedback'></category>
<summary>
+  +


About two years ago, we bumped our runtime JRE requirement from Java5 to Java6. And so the time has come once again for us to finally move on to Java7. Because of all the new language features, many of us the developers really wanted to move right on to Java8, but after much discussion we settled to move to Java7 first and then to Java8.


So here is the plan:




Starting Jenkins 1.608, we start advertising that we will be moving on to Java7, which is why you are reading this.


Starting Jenkins 1.610 (2 weeks from now), we will ship...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/6_(number)&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/U%2B2678_DejaVu_Sans.svg/200px-U%2B2678_DejaVu_Sans.svg.png&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;About two years ago, we bumped our runtime JRE requirement &lt;a href=&quot;https://github.com/jenkinsci/jenkins/commit/3431a7cba&quot;&gt;from Java5 to Java6&lt;/a&gt;. And so the time has come once again for us to finally move on to Java7. Because of all the new language features, &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/sw_WepGw0Pk&quot;&gt;many of us the developers really wanted to move right on to Java8&lt;/a&gt;, but after much discussion we settled to move to Java7 first and then to Java8.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So here is the plan:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Starting Jenkins 1.608, we start advertising that we will be moving on to Java7, which is why you are reading this.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Starting Jenkins 1.610 (2 weeks from now), we will ship so-called 51.0 class files that will only load on Java7+. This gives some more warnings to those who don’t read our blog.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Unless we hear uproar from users, starting around 1.614 (6 weeks from now), core developers will start linking directly to new Java7 APIs. &lt;a href=&quot;https://jenkins-ci.org/content/thinking-about-moving-servlet-30&quot;&gt;We will move on to servlet 3.0 at this time as well&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;The current 1.596 line of LTS will remain compatible with Java6, and most likely the next LTS line will also remain compatible with Java6. So LTS users have additional 3 months before upgrading to Java7.&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java7 has more NIO improvements that allow us to do some file I/O in more portable manner. Similarly, servlet 3.0 will help us build more interactive UI.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Your Jenkins controller and all the build agents need to be running on Java7+. Similarly, those who are using the Maven2 job type must also run Maven with Java7+. However, this does not prevent you from using Jenkins to build your applications that are targeted to earlier versions of Java. According to our research, most platforms people run Jenkins on has been already shipping Java7 for quite some time now. But if you have a good reason why we shouldn’t force everyone to Java7, please let us know ASAP.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To put this into context, &lt;a href=&quot;https://www.java.com/en/download/faq/java_7.xml&quot;&gt;Oracle will not release updates to Java7 past April 2015&lt;/a&gt;. We have always recommended users to run the latest general release according to Oracle, which is currently Java8. As I said, I suspect we will be requiring Java8 pretty soon. So if you are still running Java6, you should definitely upgrade to Java8.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/04/06/confluence-migration-this-weekend/</id>
<title>Confluence migration this weekend</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-04-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/04/06/confluence-migration-this-weekend/" />
<author>
<name>kohsuke</name>
</author>
<category term='infrastructure'></category>
<category term='news'></category>
<summary>
+  +


For the past few weeks, I&#8217;ve burnt a lot of midnight oil to get Confluence containerized. The goal is to make Confluence upgrade more manageable and testable. In the process, I&#8217;ve not only containerized Confluence, but also containerized some other services, including mock LDAP server, to be able to test the copy of the production Confluence dataset against newer versions of Confluence before upgrading production.


The infra team is currently targeting this weekend to migrate our current Confluence instance to this new container, and use the opportunity to move the service to a bigger system. Currently JIRA and Confluence...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Structure_relocation&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/GMC_U-Haul_truck_front_1.JPG/320px-GMC_U-Haul_truck_front_1.JPG&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the past few weeks, I’ve burnt a lot of midnight oil to &lt;a href=&quot;https://github.com/jenkins-infra/confluence&quot;&gt;get Confluence containerized&lt;/a&gt;. The goal is to make Confluence upgrade more manageable and testable. In the process, I’ve not only containerized Confluence, but also containerized &lt;a href=&quot;https://github.com/jenkins-infra/confluence-cache&quot;&gt;some other services&lt;/a&gt;, including &lt;a href=&quot;https://github.com/jenkins-infra/mock-ldap&quot;&gt;mock LDAP server&lt;/a&gt;, to be able to test the copy of the production Confluence dataset against newer versions of Confluence before upgrading production.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The infra team is currently &lt;a href=&quot;https://lists.jenkins-ci.org/pipermail/jenkins-infra/2015-April/000292.html&quot;&gt;targeting this weekend&lt;/a&gt; to migrate our current Confluence instance to this new container, and use the opportunity to move the service to a bigger system. Currently JIRA and Confluence has to live within 2.5GB RAM from the same host, and it’s really stretching both services. The new box has 4GB of RAM, and we are splitting JIRA and Confluence to two different servers. So there’s a lot of head room.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So please expect some Wiki outage over the next weekend.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As always, our sincere thank you to &lt;a href=&quot;https://osuosl.org/&quot;&gt;Oregon State University Open Source Lab&lt;/a&gt; for generously hosting our servers. Please donate to them to show your support. Similarly, thank you &lt;a href=&quot;https://atlassian.com/&quot;&gt;Atlassian&lt;/a&gt; for generously providing the license for running Confluence.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If this goes well, JIRA will follow suit.&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/2015/03/25/registration-for-juc-2015-is-open/</id>
<title>Registration for JUC 2015 is Open!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-03-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/03/25/registration-for-juc-2015-is-open/" />
<author>
<name>hinman</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<category term='juc'></category>
<summary>
It&#8217;s that time of the year again: 2015 Jenkins User Conference Registration is OPEN for all cities. This year, we are making some changes to JUC — JUC will be a two-day event in three out of the four cities across the globe. You will get opportunities to network with other users and developers in the community, learn more about how other people are using Jenkins and attacking broader continuous delivery problem. As always, we love to meet &amp; talk to you to learn what you are doing with Jenkins. To get the sense of how JUC is like, take...
</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://pbs.twimg.com/media/Bqbz9JQIIAA9gKG.jpg&quot; alt=&quot;image&quot; width=&quot;300&quot; height=&quot;225&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s that time of the year again: &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;2015 Jenkins User Conference Registration is OPEN for all cities.&lt;/a&gt; This year, we are making some changes to JUC — JUC will be a two-day event in three out of the four cities across the globe. You will get opportunities to network with other users and developers in the community, learn more about how other people are using Jenkins and attacking broader continuous delivery problem. As always, we love to meet &amp;amp; talk to you to learn what you are doing with Jenkins. To get the sense of how JUC is like, take a look at our past JUC reports like &lt;a href=&quot;https://jenkins-ci.org/content/juc-berlin-summary&quot;&gt;this&lt;/a&gt; and &lt;a href=&quot;https://jenkins-ci.org/content/juc-boston-what-day&quot;&gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Early Bird pricing for JUC tickets is available until May 1.&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;&lt;a href=&quot;https://www.regonline.com/register/checkin.aspx?EventId=1698436&amp;amp;MethodId=0&amp;amp;EventSessionId=&amp;amp;startnewreg=1&quot;&gt;East Coast US: June 18-19&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.regonline.com/Register/Checkin.aspx?EventID=1698435&quot;&gt;Europe: June 23-24&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-israel-tlv-david-inter-continental-july-16-2015-tickets-16393557572&quot;&gt;Israel: July 16&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.regonline.com/Register/Checkin.aspx?EventID=1697214&quot;&gt;West Coast US: September 2-3&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can learn a lot more information &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2015/&quot;&gt;here&lt;/a&gt; about the 2015 Jenkins User Conference World Tour. As always, we are tweaking JUC to make it better, based on feedback. I’ll post about those in coming months. Make sure to follow or tweet at &lt;a href=&quot;https://twitter.com/jenkinsconf&quot;&gt;@jenkinsconf&lt;/a&gt; to stay up to date on JUC news or to share which JUC you will be attending!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See you there!&lt;/p&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/03/17/juc-2015-call-for-paper-deadlines-approaching/</id>
<title>JUC 2015 Call for Paper Deadlines Approaching!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-03-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/03/17/juc-2015-call-for-paper-deadlines-approaching/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
+  +


The deadlines to speak at a 2015 Jenkins User Conference are fast approaching. Don’t miss out on this great opportunity to share your Jenkins tips, tricks, stories, and know-how with the community! Submit your proposal by the below deadlines to have your talk considered by a panel of Jenkins experts:


Please note: The deadline to submit a speaking proposal for East Coast US (DC) and Europe (London) is SUNDAY, MARCH 22, 2015. That is only FIVE days away!


2015 JUC Cities &amp; Call for Papers Deadlines




East Coast US: Deadline to Submit - March 22, 2015


London: Deadline to Submit - March...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/JUC-banners-Papers-938px.jpg&quot; alt=&quot;image&quot; width=&quot;590&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The deadlines to speak at a 2015 Jenkins User Conference are fast approaching. Don’t miss out on this great opportunity to share your Jenkins tips, tricks, stories, and know-how with the community! &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;Submit your proposal&lt;/a&gt; by the below deadlines to have your talk considered by a panel of Jenkins experts:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Please note: The deadline to submit a speaking proposal for East Coast US (DC) and Europe (London) is SUNDAY, MARCH 22, 2015. That is only FIVE days away!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;2015 JUC Cities &amp;amp; Call for Papers Deadlines&lt;/a&gt;&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;East Coast US: Deadline to Submit - March 22, 2015&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;London: Deadline to Submit - March 22, 2015&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;West Coast US (Bay Area): Deadline to Submit - May 3, 2015&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Israel: Deadline to Submit - May 15, 2015&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not interested in speaking? Contribute to the community in another way: nominate or refer a speaker you would like to hear from at JUC! Contact &lt;a href=&quot;mailto:alytong13@gmail.com&quot;&gt;alytong13@gmail.com&lt;/a&gt; or simply &lt;a href=&quot;https://www.cloudbees.com/2015-juc-and-cd-summit-world-tour-sponsorships&quot;&gt;become a sponsor&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/03/06/google-apps-sso-no-longer-supported-in-jenkins-openid-plugin/</id>
<title>Google Apps SSO no longer supported in Jenkins OpenID plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-03-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/03/06/google-apps-sso-no-longer-supported-in-jenkins-openid-plugin/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='guest post'></category>
<category term='plugins'></category>
<summary>
This is a guest post from Owen Mehegan (aka autojack)






In 2014 Google announced that they will be shutting down their OpenID 2.0 authentication endpoint and replacing it with Google+ Sign-in, a library built on top of OpenID Connect. The old Google endpoint will shut down on April 20th, 2015! Accordingly, if you are using the Jenkins OpenID plugin to authenticate users with the ‘Google Apps SSO’ feature (typically when Google hosts your personal or corporate email), you need to upgrade. Ryan Campbell took the initiative to develop the new Google Login plugin which implements the Google+ Sign-in functionality. This is...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;This is a guest post from Owen Mehegan (aka autojack)&lt;/em&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commons.wikimedia.org/wiki/Sunset&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/9/90/Sunset_Marina.JPG/320px-Sunset_Marina.JPG&quot; alt=&quot;image&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2014 Google announced that they will be shutting down their OpenID 2.0 authentication endpoint and replacing it with Google+ Sign-in, a library built on top of OpenID Connect. &lt;strong&gt;The old Google endpoint will shut down on April 20th, 2015!&lt;/strong&gt; Accordingly, if you are using the Jenkins OpenID plugin to authenticate users with the ‘Google Apps SSO’ feature (typically when Google hosts your personal or corporate email), you need to upgrade. Ryan Campbell took the initiative to develop the new Google Login plugin which implements the Google+ Sign-in functionality. This is the recommended solution going forward. Follow the steps &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Login+Plugin&quot;&gt;here&lt;/a&gt; to configure it for your site. &lt;strong&gt;Note that you DON’T need to have a Google+ social network account/profile. Any Google account can be used.&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you find yourself locked out of your Jenkins system after the old endpoint is shut down you will need to follow the steps &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Disable+security&quot;&gt;here&lt;/a&gt; to disable Jenkins security temporarily. Then you can connect without authentication and switch to the Google Login plugin. You will probably want to uninstall the old OpenID plugin at that point as well.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;References:&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://developers.google.com/identity/protocols/OpenID2Migration#shutdown-timetable&quot;&gt;Shutdown announcement from Google&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/23431&quot;&gt;JENKINS-23431, bug tracking this fix&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/OpenID+Plugin&quot;&gt;Old OpenID plugin&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Google+Login+Plugin&quot;&gt;New Google Login plugin&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/03/03/jenkins-user-conference-save-the-date/</id>
<title>Jenkins User Conference – Save the Date</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-03-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/03/03/jenkins-user-conference-save-the-date/" />
<author>
<name>alyssat</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='juc'></category>
<summary>
We have some exciting news to share with you! We have finalized most of the dates and locations for the 2015 Jenkins User Conference (JUC) World Tour.


Save the date(s):




US East (Washington DC): June 18-19


Europe (London): June 23-24


Israel: July 16 (ETA)


US West (Santa Clara): September 2-3




The big news? The JUC agenda has been expanded this year to cover two days! That means you get twice as many opportunities to learn how others are using Jenkins and to network with other Jenkins users.


CALL FOR PAPERS IS OPEN FOR ALL JUC CONFERENCES


We need JUC speakers! The Call for Papers is open now and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have some exciting news to share with you! We have finalized most of the dates and locations for the 2015 Jenkins User Conference (JUC) World Tour.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Save the date(s):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;US East (Washington DC): June 18-19&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Europe (London): June 23-24&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Israel: July 16 (ETA)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;US West (Santa Clara): September 2-3&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The big news? The JUC agenda has been expanded this year to cover two days! That means you get twice as many opportunities to learn how others are using Jenkins and to network with other Jenkins users.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;&lt;strong&gt;CALL FOR PAPERS IS OPEN FOR ALL JUC CONFERENCES&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We need JUC speakers! &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;&lt;strong&gt;The Call for Papers is open now and you can apply here.&lt;/strong&gt;&lt;/a&gt; This is an opportunity for YOU to give back to the community by sharing your Jenkins knowledge and success. Jenkins speakers contribute significantly to the overall JUC experience.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In return for speaking, you will receive free admission to the conference and fame/fortune within the Jenkins community. OK, we can’t guarantee the latter, but we &lt;em&gt;can&lt;/em&gt; guarantee the former! &lt;strong&gt;Hurry and apply now, because&lt;/strong&gt; &lt;strong&gt;the Call for Papers deadline for US East and Europe expires on March 22, 2015.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not interested in speaking? Another way to contribute to the community is by letting us know who you want to hear from. Nominate or refer that amazing speaker and we’ll do the rest. Contact &lt;a href=&quot;mailto:alytong13@gmail.com&quot;&gt;alytong13@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/2015-juc-and-cd-summit-world-tour-sponsorships&quot;&gt;&lt;strong&gt;JUC SPONSORSHIPS&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, be a JUC sponsor. Any organization can do this – whether a vendor that sells into the Jenkins ecosystem or a company that has received value from Jenkins and wants to give back to the community. &lt;strong&gt;&lt;a href=&quot;https://www.cloudbees.com/2015-juc-and-cd-summit-world-tour-sponsorships&quot;&gt;You can find out more here.&lt;/a&gt;&lt;/strong&gt; (NOTE: JUC is not a moneymaking venture for the community – so sponsorships do make a difference.)&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/02/25/100k-celebration-podcast/</id>
<title>100K Celebration Podcast</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-02-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/02/25/100k-celebration-podcast/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<summary>
As a part of the Jenkins 100K celebration, Dean Yu, Andrew Bayer, R. Tyler Croy, Chris Orr, and myself got together late Tuesday evening to go over the history of the project, how big the community was back then, how we grow, where we are now, and maybe a bit about future.


We got carried away and the recording became longer than we all planned. But it has some nice sound bites, back stage stories, and stuff even some of us didn&#8217;t know about! I hope you&#8217;ll enjoy it.
The MP3 file is here, or you can use your favorite podcast app...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a part of &lt;a href=&quot;https://jenkins-ci.org/content/jenkins-celebration-day-february-26&quot;&gt;the Jenkins 100K celebration&lt;/a&gt;, Dean Yu, Andrew Bayer, R. Tyler Croy, Chris Orr, and myself got together late Tuesday evening to go over the history of the project, how big the community was back then, how we grow, where we are now, and maybe a bit about future.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We got carried away and the recording became longer than we all planned. But it has some nice sound bites, back stage stories, and stuff even some of us didn’t know about! I hope you’ll enjoy it.&lt;br&gt;
&lt;a href=&quot;https://get.jenkins.io/podcast/100k.mp3&quot;&gt;The MP3 file is here&lt;/a&gt;, or you can use your favorite podcast app and subscribe to &lt;a href=&quot;https://jenkins-ci.org/podcast&quot; class=&quot;bare&quot;&gt;https://jenkins-ci.org/podcast&lt;/a&gt;.&lt;br /&gt;
&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/02/24/100k-celebration-podcast-recording/</id>
<title>100K Celebration Podcast Recording</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-02-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/02/24/100k-celebration-podcast-recording/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='interview'></category>
<category term='just for fun'></category>
<category term='meetup'></category>
<category term='screencast'></category>
<summary>
In preparation for Jenkins 100K celebration, I&#8217;m going to record a one-time podcast with Dean Yu, Andrew Bayer, and R. Tyler Croy.


My current plan is to go over the history of the project, how big the community was back then, how we grow, where we are now, and maybe a bit about future.


But if you have any other suggestions/questions that you&#8217;d like us to discuss, you have 3 or 4 more hours to send in that suggestion! Your feedback would help us make a better recording, so please don&#8217;t hesitate to tell us....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In preparation for &lt;a href=&quot;https://jenkins-ci.org/content/jenkins-celebration-day-february-26&quot;&gt;Jenkins 100K celebration&lt;/a&gt;, I’m going to record a one-time podcast with Dean Yu, Andrew Bayer, and R. Tyler Croy.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My current plan is to go over the history of the project, how big the community was back then, how we grow, where we are now, and maybe a bit about future.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But if you have any other suggestions/questions that you’d like us to discuss, you have 3 or 4 more hours to send in that suggestion! Your feedback would help us make a better recording, so please don’t hesitate to tell us.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/02/19/jenkins-100k-celebration-pictures/</id>
<title>Jenkins 100K celebration pictures</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-02-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/02/19/jenkins-100k-celebration-pictures/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<summary>
In preparation of the celebration of 100K installations, 1000 plugins, and 10 years of Jenkins, we&#8217;ve got these images created.


I hope folks can use these images to mark the occasion! The full size pictures are here....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In preparation of the celebration of 100K installations, 1000 plugins, and 10 years of Jenkins, we’ve got these images created.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope folks can use these images to mark the occasion! &lt;a href=&quot;https://www.flickr.com/photos/131462214@N04/sets/72157650510081118/&quot;&gt;The full size pictures are here&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins100k_1.jpeg&quot; alt=&quot;image&quot; width=&quot;379&quot; height=&quot;479&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/02/09/jenkins-celebration-day-is-february-26/</id>
<title>Jenkins Celebration Day is February 26</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-02-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/02/09/jenkins-celebration-day-is-february-26/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='news'></category>
<summary>
Congratulations! The Jenkins project officially went over the 100K active users mark sometime in January. As of January 31, we were at 102,992. YOU are one of the 100K active users!


As discussed on a couple recent project meetings, we have designated February 26 as Jenkins Celebration Day.
To make some noise, here is what we are doing starting NOW:




Write a blog about anything related to Jenkins. Post your blog and Tweet out a link to it. Include the hashtag #Jenkins100K in your post.


On February 26, we will hold a raffle and pick four names at random. The grand prize winner will...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations! The Jenkins project officially went over the 100K active users mark sometime in January. As of January 31, &lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/svg/total-jenkins.svg&quot;&gt;we were at 102,992&lt;/a&gt;. YOU are one of the 100K active users!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As discussed on &lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins/2015/&quot;&gt;a couple recent project meetings&lt;/a&gt;, we have designated &lt;strong&gt;February 26&lt;/strong&gt; as Jenkins Celebration Day.&lt;br&gt;
To make some noise, here is what we are doing starting NOW:&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Write a blog about anything related to Jenkins. Post your blog and Tweet out a link to it. Include the hashtag &lt;strong&gt;#Jenkins100K&lt;/strong&gt; in your post.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;On February 26, we will hold a raffle and pick four names at random. The grand prize winner will get a &lt;a href=&quot;https://jenkins-ci.org/content/jenkins-figure-available-shapeways&quot;&gt;3D Jenkins Butler model&lt;/a&gt;. Five others will get their pick of Jenkins swag (up to $20) from &lt;a href=&quot;https://www.cafepress.com/jenkinsci&quot;&gt;the Jenkins online store&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;other-ways-to-celebrate&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#other-ways-to-celebrate&quot; /&gt;OTHER WAYS TO CELEBRATE&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are a number of other things planned and we want YOU to be involved. This blog post is the central place to come for all things related to the celebration.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recording – Jenkins Governance Board&lt;/strong&gt;&lt;br&gt;
Dean, Tyler, Andrew and I will get together this month and record some thoughts about the Jenkins project. We will share that recording with you from this page on February 26.&lt;br /&gt;
&lt;/br&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins-100k-profile_4.jpg&quot;&gt;Twitter Badge&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
For those of us on social media that want to proudly celebrate our community, we will have a special badge that you can use for your profile image on Twitter or any of the other social media forums. Feel free to use the badge as long as you want – but let’s get as many of us using it as possible between now and February 27.&lt;br /&gt;
&lt;/br&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://jenkins-ci.org/content/jenkins-100k-celebration-pictures&quot;&gt;Social Media Images&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CloudBees is donating a series of images that we can all push out on social media (whatever platform(s) you use).&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Pick your favorite(s) and push them out on Twitter, Facebook, G+&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Certificate&lt;/strong&gt; (available on this blog post soon)&lt;br&gt;
Download your very own “I am part of the Jenkins 100K” certificate. Print it out and proudly display it on the wall of your cube or office.&lt;br /&gt;
&lt;/br&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Visibility&lt;/strong&gt;&lt;br&gt;
The Community will also issue a press release on February 26 announcing our milestone news.&lt;br /&gt;
&lt;/br&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sign the “card”&lt;/strong&gt;&lt;br&gt;
Consider this blog a Congratulations card to the entire community. Share your thoughts in a comment on this blog about anything Jenkins-related that you wish!&lt;br /&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a big milestone for the Community and one you should be proud to be part of! Let’s make some noise…&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/li&gt;&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/01/27/office-hours-tomorrow-workflow-security-model-and-plugin-compatibility/</id>
<title>Office Hours tomorrow: workflow security model &amp; plugin compatibility</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-01-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/01/27/office-hours-tomorrow-workflow-security-model-and-plugin-compatibility/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='plugins'></category>
<category term='screencast'></category>
<category term='video'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
In tomorrow&#8217;s Jenkins office hours, Jesse Glick will talk about two topics in the workflow plugin that he has been asked about:




Security model: script security, permissions


Plugin compatibility: SimpleBuildStep and friends, custom steps, etc.




The session should be interesting to anyone using workflow or thinking about using workflow. Jesse is one of the top contributors in the community, so it&#8217;d be definitely worth your time!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/events/c4eagqodepqojlrv7glhc1ctg48&quot;&gt;In tomorrow’s Jenkins office hours&lt;/a&gt;, Jesse Glick will talk about two topics in the workflow plugin that he has been asked about:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Security model: script security, permissions&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Plugin compatibility: SimpleBuildStep and friends, custom steps, etc.&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The session should be interesting to anyone using workflow or thinking about using workflow. Jesse is one of the top contributors in the community, so it’d be definitely worth your time!&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2015/01/27/2015-jenkins-user-conferences-call-for-papers/</id>
<title>2015 Jenkins User Conferences - Call for Papers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2015-01-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2015/01/27/2015-jenkins-user-conferences-call-for-papers/" />
<author>
<name>alyssat</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='juc'></category>
<summary>
+ 


The Jenkins User Conference 2015 is seeking submissions that reflect the latest innovations in Jenkins usage. This is your chance to educate, share and inspire the community with stories of how you&#8217;ve used Jenkins to continuously build that amazing project or how you developed that popular plugin that everyone is using.


If you&#8217;re gamed, here are some suggestions to get your creative juice going:




Scaling Jenkins within the enterprise


Jenkins as the orchestrator for continuous delivery


Plug-in development


Jenkins techniques that solve testing/building problems in specific application areas: mobile, enterprise/web/cloud and UI testing


War stories that speak to a problem you faced, the Jenkins solution...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Ballot_box&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/9/99/Cardboard_ballot_box_-_Smithsonian.jpg&quot; alt=&quot;image&quot; width=&quot;200&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins User Conference 2015 is &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;seeking submissions&lt;/a&gt; that reflect the latest innovations in Jenkins usage. This is your chance to educate, share and inspire the community with stories of how you’ve used Jenkins to continuously build that amazing project or how you developed that popular plugin that everyone is using.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re gamed, here are some suggestions to get your creative juice going:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Scaling Jenkins within the enterprise&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins as the orchestrator for continuous delivery&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plug-in development&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins techniques that solve testing/building problems in specific application areas: mobile, enterprise/web/cloud and UI testing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;War stories that speak to a problem you faced, the Jenkins solution you implemented to solve it and the results you realized&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins best practices, tips and tricks&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins in the cloud - if you or your company is currently using Jenkins in the cloud we’d love to hear your story&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Beyond Java (Jenkins with PHP, Ruby, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are upping the ante at this year’s JUCs. We are moving from a 1 day conference to a 2 days conference for SF and London - that’s 18 additional cutting edge sessions to be learned.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-call-papers&quot;&gt;&lt;strong&gt;SUBMISSION DEADLINE IS MARCH 8, 2015!&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s also a wide variety of event sponsorship opportunities available. There are offerings from Gold to Silver packages, exhibitor packages in our world-class expo hall, speaking sessions, free passes, and many branding opportunities. For inquiries, pls contact &lt;a href=&quot;mailto:juc-sponsorship@cloudbees.com&quot;&gt;juc-sponsorship@cloudbees.com&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to receiving your amazing proposals!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/12/17/breakingbuilds/</id>
<title>#BreakingBuilds</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-12-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/12/17/breakingbuilds/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='news'></category>
<summary>
A lot of us has grown fond of our loyal butler Mr.Jenkins over time, which was created by Frontside and chosen as a result of a logo contest. In the true open-source style, the logo has since evolved into many different derivative works, such as a plugin, a 3D model, and a bobble head.


Our friends at CloudBees are running a #BreakingBuilds social media contest through Jan 5th to have some fun with Mr.Jenkins. Read Sacha Labourey&#8217;s blog post, where he draws parallels between what a butler does and what continuous delivery can do.


I especially agree with him on this point:




I...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A lot of us has grown fond of our loyal butler Mr.Jenkins over time, which was created by &lt;a href=&quot;https://frontside.io/&quot;&gt;Frontside&lt;/a&gt; and chosen as &lt;a href=&quot;https://jenkins-ci.org/content/the-polls-are-open-for-the-jenkins-logo-contest&quot;&gt;a result of a logo contest&lt;/a&gt;. In the true open-source style, the logo has since evolved into many different derivative works, such as &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Emotional+Jenkins+Plugin&quot;&gt;a plugin&lt;/a&gt;, &lt;a href=&quot;https://jenkins-ci.org/content/jenkins-figure-available-shapeways&quot;&gt;a 3D model&lt;/a&gt;, and &lt;a href=&quot;https://jenkins-ci.org/content/behind-scenes-jenkins-user-conference-palo-alto&quot;&gt;a bobble head&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our friends at CloudBees are running a &lt;a href=&quot;https://twitter.com/search?q=%23BreakingBuilds&quot;&gt;#BreakingBuilds&lt;/a&gt; social media contest through Jan 5th to have some fun with Mr.Jenkins. &lt;a href=&quot;https://ow.ly/FbZDb&quot;&gt;Read Sacha Labourey’s blog post&lt;/a&gt;, where he draws parallels between what a butler does and what continuous delivery can do.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I especially agree with him on this point:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I always loved the idea of using a butler to represent what Jenkins is about, as it projects all of the qualities that define continuous delivery: it is built to be proactive, it will help you fix problems before they happen, it orchestrates your entire pipeline to production without you having to worry about the sophisticated underlying sequence of steps and, if things go wrong Jenkins uses his fingerprint database to trace back the source of the issue. Full service. As your right arm, Jenkins is the reliable and trustworthy guy you want on your team!&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://ow.ly/FdEBD&quot;&gt;Check out the contest rules&lt;/a&gt; and participate. Let’s raise the visibility of Jenkins and have some fun in the process!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://ow.ly/FbZDb&quot;&gt;Read Sacha’s blog&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://ow.ly/FdEBD&quot;&gt;Learn more about the contest and how to win Jenkins prizes&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://ow.ly/FeOOU&quot;&gt;Go directly to the #BreakingBuilds images&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&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/2014/12/03/workflow-plugin-is-1-0/</id>
<title>Workflow plugin is 1.0</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-12-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/12/03/workflow-plugin-is-1-0/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='plugins'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
Jenkins started with a notion of jobs and builds at heart. One script is one job, and as you repeatedly execute jobs, it creates builds as records. As the use case of Jenkins gets more sophisticated, people started combining jobs to orchestrate ever more complex activities.


A number of plugins have been developed to enable all sorts of different ways to compose jobs, and many are used quite successfully in production. But this resulted in a certain degree of complexity for users to figure out how to assemble these plugins.


So we felt the need to develop a single unified solution that...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins started with a notion of jobs and builds at heart. One script is one job, and as you repeatedly execute jobs, it creates builds as records. As the use case of Jenkins gets more sophisticated, people started combining jobs to orchestrate ever more complex activities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A number of plugins have been developed to enable all sorts of different ways to compose jobs, and many are used quite successfully in production. But this resulted in a certain degree of complexity for users to figure out how to assemble these plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we felt the need to develop a single unified solution that subsumes all these different ways to orchestrate activities that may span across multiple build agents, code repositories, etc. Various inputs from users as well as other plugin developers played a key role.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The result of this is &lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin&quot;&gt;the workflow plugin&lt;/a&gt;, which is what a number of us, including Jesse Glick an myself, are focused on in the past few months.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The plugin approaches the problem by defining a DSL for you to describe an execution of a job. Various convenient primitives are available, such as executing shell scripts, checking out the source code, obtaining an executor or a build workspace, etc. All sorts of classic existing plugins contribute their functionalities into this DSL, such as recording test results, fingerprints, or calling into other existing jobs. This allows you to leverage higher-level functionalities and report comprehension capability into a workflow. Similarly, you can leverage the ability of Groovy, the host language of workflow DSL, to define control flows, abstractions, and reuse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A key feature of a workflow execution is that it’s suspendable. That is, while the workflow is running your script, you can shut down Jenkins or lose a connectivity to a agent. When it comes back, Jenkins will still remember what it was doing, and your workflow script resumes execution as if it was never interrupted. A technique known as the &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Continuation-passing_style&quot;&gt;continuation-passing style&lt;/a&gt;&quot; execution plays a key role in achieving this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m very happy to report that the workflow plugin is finally 1.0. This version runs on the latest 1.580-based LTS. and &lt;a href=&quot;https://github.com/jenkinsci/workflow-aggregator-plugin/tree/master/demo&quot;&gt;we created a docker image for you to play with&lt;/a&gt; too. There’s also &lt;a href=&quot;https://www.cloudbees.com/event/topic/workflow-jenkins-0&quot;&gt;a JUC presentation&lt;/a&gt; that explains this. We are working toward 1.0 release within this year, and in the meantime, the syntax is stable enough to allow you to start designing workflows today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve been hearing a lot of good feedbacks and enthusiasm for this new effort. Please let us know what you think.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/10/20/mobile-app-for-jenkins-user-conference-bay-area/</id>
<title>Mobile App for Jenkins User Conference Bay Area</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-10-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/10/20/mobile-app-for-jenkins-user-conference-bay-area/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='juc'></category>
<summary>
Jenkins User Conference in Bay Area is this Thursday, and one of the new things this year is the mobile app.


+  +


There&#8217;s an Android version as well as an iPhone version. I&#8217;ve installed it locally, and it&#8217;s very handy for checking the agenda, get more info about speakers and sponsors....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins User Conference in Bay Area is this Thursday, and one of the new things this year is the mobile app.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://doubledutch.me/download/jenkins-user-conference&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://dl.doubledutch.me/images/downloadiphone.png&quot; alt=&quot;image&quot; width=&quot;253&quot; height=&quot;532&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s an Android version as well as an iPhone version. I’ve installed it locally, and it’s very handy for checking the agenda, get more info about speakers and sponsors.&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/10/20/freebsd-project-use-of-jenkins-for-os-testing/</id>
<title>FreeBSD project use of Jenkins for OS testing</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-10-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/10/20/freebsd-project-use-of-jenkins-for-os-testing/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='guest post'></category>
<summary>
This is a guest post by Craig Rodrigues



The FreeBSD project produces a modern operating system derived from BSD Unix.


In the past 6 months, we have set up Jenkins at https://jenkins.freebsd.org/, to continuously build FreeBSD as developers add new code to the project. This has helped us identify and fix build breaks very quickly.


We have gone even farther by integrating Jenkins, Kyua,
and Bhyve.
Kyua is a testing framework for infrastructure software.
Bhyve is the native hypervisor that comes with FreeBSD (similar to KVM on Linux).


We use the Build Flow plugin in this example Build flow	 to do the following:




Build the FreeBSD kernel and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a guest post by Craig Rodrigues&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.freebsd.org&quot;&gt;FreeBSD project&lt;/a&gt; produces a modern operating system derived from &lt;a href=&quot;https://en.wikipedia.org/wiki/Berkeley_Software_Distribution&quot;&gt;BSD Unix&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the past 6 months, we have set up Jenkins at &lt;a href=&quot;https://jenkins.freebsd.org/&quot; class=&quot;bare&quot;&gt;https://jenkins.freebsd.org/&lt;/a&gt;, to continuously build FreeBSD as developers add new code to the project. This has helped us identify and fix build breaks very quickly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have gone even farther by integrating Jenkins, &lt;a href=&quot;https://github.com/jmmv/kyua#readme&quot;&gt;Kyua&lt;/a&gt;,
and &lt;a href=&quot;http://bhyve.org/&quot;&gt;Bhyve&lt;/a&gt;.
&lt;a href=&quot;https://github.com/jmmv/kyua#readme&quot;&gt;Kyua&lt;/a&gt; is a testing framework for infrastructure software.
&lt;a href=&quot;http://bhyve.org/&quot;&gt;Bhyve&lt;/a&gt; is the native hypervisor that comes with FreeBSD (similar to KVM on Linux).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We use the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Build+Flow+Plugin&quot;&gt;Build Flow plugin&lt;/a&gt; in this &lt;a href=&quot;https://ci.freebsd.org/job/FreeBSD-head-amd64-build/&quot;&gt;example Build flow&lt;/a&gt;	 to do the following:&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;Build the FreeBSD kernel and userland on amd64 whenever someone checks in new code to &lt;a href=&quot;https://svn.freebsd.org&quot; class=&quot;bare&quot;&gt;https://svn.freebsd.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a bootable FreeBSD disk image with &lt;a href=&quot;https://www.freebsd.org/cgi/man.cgi?query=makefs&quot;&gt;makefs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boot the image under bhyve&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run these commands inside the bhyve VM:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;    cd /usr/tests; kyua test; kyua report-junit --output=test-output.xml&lt;/pre&gt;
&lt;/div&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;Shut down the bhyve VM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Imports test-output.xml into Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Produces a &lt;a href=&quot;https://ci.freebsd.org/job/FreeBSD-head-amd64-test/3069/testReport/&quot;&gt;full native test report in Jenkins&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The results of this work were presented at the &lt;a href=&quot;https://bafug.org&quot;&gt;Bay Area FreeBSD Users Group&lt;/a&gt;
in &lt;a href=&quot;https://www.slideshare.net/CraigRodrigues1/kyua-jenkins&quot;&gt;this presentation&lt;/a&gt; in October 2014.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has been very easy to set up and use under FreeBSD.   We hope that by using
Jenkins to run OS-level unit tests, we will be able to improve the quality of FreeBSD.
For further information, please feel free to contact us at &lt;a href=&quot;mailto:freebsd-testing@FreeBSD.org&quot;&gt;freebsd-testing@FreeBSD.org&lt;/a&gt; .&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/10/15/cve-2014-3566-poodle-impact-on-jenkins/</id>
<title>CVE-2014-3566 &quot;poodle&quot; impact on Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-10-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/10/15/cve-2014-3566-poodle-impact-on-jenkins/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<summary>
Another day, another SSL vulnerability! Google has announced a vulnerability in SSL v3, and if you are using the "Winstone" servlet container built into Jenkins, and if you are using the HTTPS connector with the --httpsPort option (it is off by default), then you are vulnerable to this problem.


I&#8217;ve just issued a security advisory on this. If you haven&#8217;t already subscribed to the Jenkins security advisory mailing list, this is a great opportunity to do so.


The advisory includes the target delivery vehicles for the fix and how you can address the problem in the mean time. Inside corporate intranet, where...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Poodle&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Freddie_%288467901543%29.jpg/160px-Freddie_%288467901543%29.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another day, another SSL vulnerability! Google has &lt;a href=&quot;https://poodle.io/&quot;&gt;announced a vulnerability in SSL v3&lt;/a&gt;, and if you are using the &quot;Winstone&quot; servlet container built into Jenkins, and if you are using the HTTPS connector with the &lt;code&gt;--httpsPort&lt;/code&gt; option (it is off by default), then you are vulnerable to this problem.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve just issued &lt;a href=&quot;https://www.jenkins.io/security/advisory/2014-10-15/&quot;&gt;a security advisory&lt;/a&gt; on this. If you haven’t already subscribed to &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Security+Advisories&quot;&gt;the Jenkins security advisory mailing list&lt;/a&gt;, this is a great opportunity to do so.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The advisory includes the target delivery vehicles for the fix and how you can address the problem in the mean time. Inside corporate intranet, where Jenkins is typically used, I suppose there’s a degree of trust among participants to make this less of a problem. But if you run an internet facing Jenkins, be sure to deploy the fix.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(And as I write this, I’ve fixed all the &lt;code&gt;https://*.jenkins-ci.org&lt;/code&gt; servers to disable SSLv3, so we are covered there)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/10/06/gradle-fy-your-jenkins-plugin-project/</id>
<title>Gradle-fy your Jenkins Plugin Project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-10-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/10/06/gradle-fy-your-jenkins-plugin-project/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<category term='plugins'></category>
<summary>
(This is a guest post from Daniel Spilker)


Jenkins supports building plugins using Gradle for a while now. Last week a new version of the Gradle JPI plugin has been released to iron out some issues.


The Gradle JPI plugin enables a 100% groovy plugin development environment with Groovy as primary programming language, Spock for writing tests and Gradle as build system. Have a look at the Job DSL plugin for an example.


An existing Maven build can be converted to Gradle by using the build.gradle template from the Gradle JPI plugin&#8217;s README. For instance, the POM from the Gradle plugin translates to...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(This is a guest post from &lt;a href=&quot;https://web.archive.org/web/20180520134954/http://www.daniel-spilker.com/&quot;&gt;Daniel Spilker&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins supports building plugins using &lt;a href=&quot;https://www.gradle.org/&quot;&gt;Gradle&lt;/a&gt; for a while now. Last week a new version of the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gradle+JPI+Plugin&quot;&gt;Gradle JPI plugin&lt;/a&gt; has been released to iron out some &lt;a href=&quot;https://github.com/jenkinsci/gradle-jpi-plugin/blob/0.6.0/CHANGELOG.md&quot;&gt;issues&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Gradle JPI plugin enables a 100% groovy plugin development environment with Groovy as primary programming language, &lt;a href=&quot;https://code.google.com/p/spock/&quot;&gt;Spock&lt;/a&gt; for writing tests and Gradle as build system. Have a look at the &lt;a href=&quot;https://github.com/jenkinsci/job-dsl-plugin&quot;&gt;Job DSL plugin&lt;/a&gt; for an example.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;An existing Maven build can be converted to Gradle by using the build.gradle template from the Gradle JPI plugin’s &lt;a href=&quot;https://github.com/jenkinsci/gradle-jpi-plugin/blob/master/README.md&quot;&gt;README&lt;/a&gt;. For instance, the &lt;a href=&quot;https://github.com/jenkinsci/gradle-plugin/blob/763256601be20c30d238179c1ed3965011d6dfd5/pom.xml&quot;&gt;POM&lt;/a&gt; from the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gradle+Plugin&quot;&gt;Gradle plugin&lt;/a&gt; translates to this build.gradle file:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;buildscript {
    repositories {
        mavenCentral()
        maven {
            url &#39;https://repo.jenkins-ci.org/releases/&#39;
        }
    }
    dependencies {
        classpath &#39;org.jenkins-ci.tools:gradle-jpi-plugin:0.6.0&#39;
    }
}

apply plugin: &#39;jpi&#39;

group = &#39;org.jenkins-ci.plugins&#39;
version = &#39;1.25-SNAPSHOT&#39;

jenkinsPlugin {
    coreVersion = &#39;1.480&#39;
    displayName = &#39;Jenkins Gradle plugin&#39;
    url = &#39;https://wiki.jenkins.io/display/JENKINS/Gradle+Plugin&#39;
    gitHubUrl = &#39;https://github.com/jenkinsci/gradle-plugin&#39;

    developers {
        developer {
            id &#39;gbois&#39;
            name &#39;Gregory Boissinot&#39;
            timezone &#39;+1&#39;
        }
    }
}

dependencies {
    compile &#39;org.jenkins-ci.lib:dry-run-lib:0.1&#39;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Usage of the Gradle JPI plugin is similar to working with the Maven HPI plugin. Use &lt;code&gt;gradle jpi&lt;/code&gt; to build the plugin file. &lt;code&gt;gradle check&lt;/code&gt; runs the tests, &lt;code&gt;gradle install&lt;/code&gt; copies the plugin into the local Maven repository, &lt;code&gt;gradle uploadArchives&lt;/code&gt; deploys the plugin to the Jenkins Maven repository and &lt;code&gt;gradle server&lt;/code&gt; starts a Jenkins development server with the plugin installed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is recommended to use Gradle 1.8 because that is the version used to build and test the Gradle JPI plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the next release it is planned to do some maintenance like fixing code style issues and adding tests. After that more issues need to be addressed to bring the plugin on par with the Maven HPI plugin, most notably fixing the test dependencies (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/17129&quot;&gt;JENKINS-17129&lt;/a&gt;) and publishing the plugin’s JAR (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/25007&quot;&gt;JENKINS-25007&lt;/a&gt;). Updating Gradle to 2.x and getting the plugin on the &lt;a href=&quot;https://plugins.gradle.org/&quot;&gt;Gradle plugin portal&lt;/a&gt; is also on the wishlist.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/09/25/cve-2014-6271-impact-on-jenkins/</id>
<title>CVE-2014-6271 impact on Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-09-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/09/25/cve-2014-6271-impact-on-jenkins/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<summary>
+ Restrictive_Sign-Stop-Security_Check.svg/240px-Singapore_Road_Signs-Restrictive_Sign-Stop-_Security_Check.svg.png" alt="image"> +


I suspect many of you have been impacted by CVE-2014-6271 (aka "shellshock" bash vulnerability.) We had our share of updates to do for various *.jenkins-ci.org servers.


Java application servers in general (including one that ships in Jenkins) do not fork off processes like Apache does to serve requests, so the kind of CGI attacks you see on Apache does not apply. We are currently unaware of any vulnerabilities in Jenkins related to CVE-2014-6271, and no plan to issue a patch for that.


That said, we did come up with one possible way attackers can exploit vulnerable bash through Jenkins,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Road_signs_in_Singapore&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Singapore_Road_Signs_-&amp;lt;em&amp;gt;Restrictive_Sign&amp;lt;/em&amp;gt;-&amp;lt;em&amp;gt;Stop&amp;lt;/em&amp;gt;-&amp;lt;em&amp;gt;Security_Check.svg/240px-Singapore_Road_Signs&amp;lt;/em&amp;gt;-&amp;lt;em&amp;gt;Restrictive_Sign&amp;lt;/em&amp;gt;-&amp;lt;em&amp;gt;Stop&amp;lt;/em&amp;gt;-_Security_Check.svg.png&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I suspect many of you have been impacted by &lt;a href=&quot;https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-6271&quot;&gt;CVE-2014-6271&lt;/a&gt; (aka &quot;shellshock&quot; bash vulnerability.) We had our share of updates to do for various *.jenkins-ci.org servers.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Java application servers in general (including one that ships in Jenkins) do not fork off processes like Apache does to serve requests, so the kind of CGI attacks you see on Apache does not apply. We are currently unaware of any vulnerabilities in Jenkins related to CVE-2014-6271, and no plan to issue a patch for that.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That said, we did come up with one possible way attackers can exploit vulnerable bash through Jenkins, that you might want to be aware of.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When a build is parameterized, parameters are passed to the processes Jenkins launch as environment variables. So if you have a shell step (which uses &lt;code&gt;bash&lt;/code&gt; by default), and if Eve only has a BUILD permission but not CONFIGURE permission, then Eve can exploit this vulnerability by carefully crafting parameter values, and have the bash runs arbitrary processes on the agent that run the build.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In most such scenarios, Eve would have to be an authenticated user on Jenkins. Jenkins also leaves the record of who triggered what build with what parameters, so there’s an audit trail. But if your Jenkins fits this description, hopefully this serves as one more reason to update your bash.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, to get notified of future security advisories from Jenkins, see &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Security+Advisories&quot;&gt;this Wiki page&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/09/24/more-jenkins-related-continuous-delivery-events-in-chicago-washington-dc-and-san-francisco/</id>
<title>More Jenkins-related continuous delivery events in Chicago, Washington DC, and San Francisco</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-09-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/09/24/more-jenkins-related-continuous-delivery-events-in-chicago-washington-dc-and-san-francisco/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
+ 


The usual suspects, such as CloudBees, XebiaLabs, SOASTA, PuppetLabs, et al are doing a Jenkins-themed continuous delivery event series called "cdSummit." The event is free, has a nice mix of user/vendor talks, and has an appeal to managers and team leads who are working on and struggling with continuous delivery and automation.


I&#8217;ve spoken in the past events, and I enjoyed the high-level pitches from various speakers.
The last two events at Paris and London filled up completely, so I suspect others have liked them, too.


If you live near Chicago, Washington DC, or San Francisco, check out the date and see...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Circus&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/CircusTent02.jpg/320px-CircusTent02.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The usual suspects, such as CloudBees, XebiaLabs, SOASTA, PuppetLabs, et al are &lt;a href=&quot;https://www.cloudbees.com/cdsummit/&quot;&gt;doing a Jenkins-themed continuous delivery event series&lt;/a&gt; called &quot;cdSummit.&quot; The event is free, has a nice mix of user/vendor talks, and has an appeal to managers and team leads who are working on and struggling with continuous delivery and automation.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve spoken in the past events, and I enjoyed the high-level pitches from various speakers.&lt;br&gt;
The last two events at Paris and London filled up completely, so I suspect others have liked them, too.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you live near Chicago, Washington DC, or San Francisco, check out the date and see if you can make it. &lt;a href=&quot;https://www.cloudbees.com/cdsummit/&quot;&gt;RSVP is from here&lt;/a&gt;. If you do, be sure to pick up Jenkins stickers and pin badges!&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/09/24/jenkins-in-javaone-2014/</id>
<title>Jenkins in JavaOne 2014</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-09-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/09/24/jenkins-in-javaone-2014/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='javaone'></category>
<summary>
There&#8217;ll be several talks that touch Jenkins. The first is from me and Jesse called Next Step in Automation: Elastic Build Environment [CON3387] Monday 12:30pm.


Then later Tuesday, there&#8217;s Building a Continuous Delivery Pipeline with Gradle and Jenkins [CON11237] from Benjamin Muschko of Gradleware.


Thursday has several Jenkins talks. One is The Deploy Factory: Open Source Tools for Java Deployment [CON1880] from Bruno Souza (aka the Java Man from Brazil) and Edson Yanaga. In this same time slot, guys from eBay are doing Platform Upgrades as a Service [CON5685], which discusses how they rely on automation to make platform upgrades painless. Then...
</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://jenkins-ci.org/sites/default/files/images/JavaOne.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’ll be several talks that touch Jenkins. The first is from me and Jesse called &lt;a href=&quot;https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=3387&quot;&gt;Next Step in Automation: Elastic Build Environment [CON3387&lt;/a&gt;] Monday 12:30pm.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then later Tuesday, there’s &lt;a href=&quot;https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=11237&quot;&gt;Building a Continuous Delivery Pipeline with Gradle and Jenkins [CON11237&lt;/a&gt;] from Benjamin Muschko of Gradleware.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thursday has several Jenkins talks. One is &lt;a href=&quot;https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=1880&quot;&gt;The Deploy Factory: Open Source Tools for Java Deployment [CON1880&lt;/a&gt;] from Bruno Souza (aka the Java Man from Brazil) and Edson Yanaga. In this same time slot, guys from eBay are doing &lt;a href=&quot;https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=5685&quot;&gt;Platform Upgrades as a Service [CON5685&lt;/a&gt;], which discusses how they rely on automation to make platform upgrades painless. Then &lt;a href=&quot;https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=1844&quot;&gt;Mastering Continuous Delivery and DevOps [CON1844&lt;/a&gt;] from Michael Huttermann.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.oracle.com/javaone/exhibit.html&quot;&gt;the exhibit area&lt;/a&gt;, the Jenkins project doesn’t have its own booth (JavaOne is too expensive for that), but I’ll be at &lt;a href=&quot;https://www.oracle.com/us/assets/javaone-14-hilton-exhibits-2023244.pdf&quot;&gt;the CloudBees booth&lt;/a&gt;, so is Jesse Glick. Find us at the booth for any Jenkins questions or impromptu hacking session, which would really help us as we get distracted from the booth duties that way. Or just drop by to get stickers, pin badges, and other handouts to take for your colleagues.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And finally, &lt;a href=&quot;https://oracleus.activeevents.com/2014/connect/sessionDetail.ww?SESSION_ID=2939&quot;&gt;Script Bowl 2014: The Battle Rages On [CON2939&lt;/a&gt;] gets an honorable mention because &lt;a href=&quot;https://twitter.com/agentdero&quot;&gt;our own Tyler Croy&lt;/a&gt; is representing JRuby against other scripting languages, including my favorite Groovy. Hmm, who should I root for…​&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/09/17/jenkins-workflow-summit-rsvp/</id>
<title>Jenkins Workflow Summit RSVP</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-09-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/09/17/jenkins-workflow-summit-rsvp/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
As was discussed some time ago, the workflow summit is being organized, and it&#8217;s open for RSVP.


Due to the overwhelming demand, I&#8217;ve increased the capacity this time to 50, but this is an unconference where everyone needs to participate, which means we really cannot have too many people without changing the dynamics of the event.


So please make sure you are willing to participate, as in not just listening and watching, but actually willing to speak. We expect you to bring something to the table — opinions, experiences, rants, presentations, feedbacks, etc. If you don&#8217;t please let others take the seat,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/#!msg/jenkinsci-dev/qY387kOQlW8/vaBxacXYhGwJ&quot;&gt;As was discussed some time ago&lt;/a&gt;, the workflow summit is being organized, and it’s open for RSVP.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Due to the overwhelming demand, I’ve increased the capacity this time to 50, but this is an unconference where everyone needs to participate, which means we really cannot have too many people without changing the dynamics of the event.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So please make sure you are willing to participate, as in not just listening and watching, but actually willing to speak. We expect you to bring something to the table — opinions, experiences, rants, presentations, feedbacks, etc. If you don’t please let others take the seat, and rest assured we will give a presentation about workflow in &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+User+Conference+US+West+%28San+Francisco%29+Oct+23%2C+2014+-+Agenda&quot;&gt;JUC Bay Area&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you understand the criteria, &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/203777932/&quot;&gt;please RSVP is from here&lt;/a&gt;.&lt;br /&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/2014/09/02/jenkins-user-meet-up-in-paris/</id>
<title>Jenkins User Meet-up in Paris</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-09-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/09/02/jenkins-user-meet-up-in-paris/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
+  +


My apologies for the last minute announcement, but there will be a Jenkins user meet-up in Paris on Sep 10th 7:00pm, which is just next week. The event is hosted by Zenika. You&#8217;ll hear from Gregory Boissinot and Adrien Lecharpentier about plugin development, and I&#8217;ll be talking about workflow.


It&#8217;s been a while we do a meet-up in Paris. Looking forward to seeing as many of you as possible. The event is free, but please RSVP so that we know what to expect....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://fr.wikipedia.org/wiki/Paris&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/Paris_Night.jpg/640px-Paris_Night.jpg&quot; alt=&quot;image&quot; width=&quot;590&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My apologies for the last minute announcement, but there will be a &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/203261692/&quot;&gt;Jenkins user meet-up in Paris on Sep 10th 7:00pm&lt;/a&gt;, which is just next week. The event is hosted by Zenika. You’ll hear from &lt;a href=&quot;https://twitter.com/gboissinot&quot;&gt;Gregory Boissinot&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/alecharp&quot;&gt;Adrien Lecharpentier&lt;/a&gt; about plugin development, and I’ll be talking about workflow.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been a while we do a meet-up in Paris. Looking forward to seeing as many of you as possible. The event is free, but &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/203261692/&quot;&gt;please RSVP&lt;/a&gt; so that we know what to expect.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/08/28/workflow-plugin-code-walk-through/</id>
<title>Workflow plugin code walk-through</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-08-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/08/28/workflow-plugin-code-walk-through/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='meetup'></category>
<category term='plugins'></category>
<category term='screencast'></category>
<category term='tutorial'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
Jesse and I will walk through the source code of the workflow plugin, highlights key abstractions and extension points, and discuss how they are put together.


If you are interested in developing or retrofitting plugins to work with workflows, I think you&#8217;ll find this session interesting.


The event will be on Google Hangout tomorrow. The time of the day is the same as usual office hours....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jesse and I will walk through the source code of &lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin&quot;&gt;the workflow plugin&lt;/a&gt;, highlights key abstractions and extension points, and discuss how they are put together.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested in developing or retrofitting plugins to work with workflows, I think you’ll find this session interesting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The event will be on &lt;a href=&quot;https://plus.google.com/events/cojjhg4kkpffkbpakj723fdht9k&quot;&gt;Google Hangout&lt;/a&gt; tomorrow. The time of the day is the same as usual &lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Workflow+walk-through&amp;amp;iso=20140829T11&amp;amp;p1=224&amp;amp;ah=1&amp;amp;sort=1&quot;&gt;office hours&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/08/28/juc-sf-2014-is-here/</id>
<title>JUC SF 2014 is Here!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-08-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/08/28/juc-sf-2014-is-here/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='juc'></category>
<summary>
JUC SF on October 23, 2014 is shaping up to be bigger and better this year.


Here’s what we have in store for you!


Three Tracks


We’ve received a record high of 40 stellar proposals this year. To accommodate the many community proposals, we’ve decide to add a third track to the
agenda. JUC SF sessions are now available for you to view. We have speakers from Google,
Target, Gap, Cloudera, Ebay, Chicago Drilling Company, and much more. Register now for early bird price.
The early bird price is only good until September 21, 2014.




Live Stream


If you can’t attend the conference in person, Track 1 sessions...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/event/juc/2014/san-francisco&quot;&gt;JUC SF&lt;/a&gt; on October 23, 2014 is shaping up to be bigger and better this year.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s what we have in store for you!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;three-tracks&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#three-tracks&quot; /&gt;Three Tracks&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve received a record high of 40 stellar proposals this year. To accommodate the many community proposals, we’ve decide to add a third track to the&lt;br&gt;
agenda. &lt;a href=&quot;https://www.cloudbees.com/event/juc/2014/san-francisco&quot;&gt;JUC SF sessions&lt;/a&gt; are now available for you to view. We have speakers from Google,&lt;br&gt;
Target, Gap, Cloudera, Ebay, Chicago Drilling Company, and much more. &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-us-west-san-francisco-oct-23-2014-tickets-10558684309&quot;&gt;Register now&lt;/a&gt; for early bird price.&lt;br&gt;
The early bird price is only good until September 21, 2014.&lt;br /&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;live-stream&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#live-stream&quot; /&gt;Live Stream&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you can’t attend the conference in person, &lt;a href=&quot;https://www.cloudbees.com/event/juc/2014/san-francisco&quot;&gt;Track 1&lt;/a&gt; sessions will be available via live&lt;br&gt;
stream, it’s all free. Brought to you by CloudBees. Registration for JUC SF live stream is &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-us-west-san-francisco-live-stream-tickets-12240011203&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;get-drunk-on-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#get-drunk-on-code&quot; /&gt;Get Drunk on Code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Have a beer while learning how to write Jenkins plugin. Steve Christou, Jenkins support engineer will lead this lecture from 3:30pm to 6:00pm. He will&lt;br&gt;
teach everything from how to get started, to techniques like writing a new &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+CLI&quot;&gt;CLI Command&lt;/a&gt;, to writing your own builder.&lt;br /&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;ask-the-experts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#ask-the-experts&quot; /&gt;Ask the Experts&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Meet the Jenkins creator, committers, support engineers, and developers. We have dedicated time slot(s) for our attendees to get 1 on 1 access to our&lt;br&gt;
experts. Exact time is TBD. Ask them anything from plugins, configuration, technical support, to bug fixes.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our current list of experts are:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+
Andrew Bayer&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
Gareth Bowles&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
Steve Christou&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
Jesse Glick&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
Kohsuke Kawaguchi&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
Dean Yu&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Want to join our panel of experts? Contact Alyssa Tong &lt;a href=&quot;mailto:aly13@gmail.com&quot;&gt;aly13@gmail.com&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;exhibit-mixer&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#exhibit-mixer&quot; /&gt;Exhibit Mixer&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sixteen technology &lt;a href=&quot;https://www.cloudbees.com/event/juc/2014/san-francisco&quot;&gt;sponsors&lt;/a&gt; will be showcasing their newest technologies during&lt;br&gt;
the exhibition hour from 2:25 – 3:30pm. Grab a beer, visit with sponsors and see how they are using Jenkins.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is just a taste of what you’ll see at JUC SF. We look forward to seeing you there!!&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&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;/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/2014/08/12/official-jenkins-lts-docker-image/</id>
<title>Official Jenkins LTS docker image</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-08-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/08/12/official-jenkins-lts-docker-image/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='lts'></category>
<category term='docker'></category>
<summary>
(This is a guest post from Michael Neale)



Recently at the Docker Conference (DockerCon) the Docker Hub was announced.


The hub (which includes their image building and storage service) also provides some "official" images (sometimes they call them repositories - they are really just sets of images).


So after talking with all sorts of people we decided to create an official Jenkins image - which is hosted by the docker hub simply as "jenkins".


So when you run "docker pull jenkins" - it will be grabbing this image. This is based on the current LTS (and will be kept up to date with the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(This is a guest post from &lt;a href=&quot;https://twitter.com/michaelneale&quot;&gt;Michael Neale&lt;/a&gt;)&lt;br /&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently at the Docker Conference (DockerCon) the &lt;a href=&quot;https://hub.docker.com&quot;&gt;Docker Hub&lt;/a&gt; was announced.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The hub (which includes their image building and storage service) also provides some &quot;official&quot; &lt;a href=&quot;https://registry.hub.docker.com/&quot;&gt;images&lt;/a&gt; (sometimes they call them repositories - they are really just sets of images).&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So after talking with all sorts of people we decided to create an official &lt;a href=&quot;https://registry.hub.docker.com/_/jenkins/&quot;&gt;Jenkins image&lt;/a&gt; - which is hosted by the docker hub simply as &quot;jenkins&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So when you run &quot;docker pull jenkins&quot; - it will be grabbing this image. This is based on the current LTS (and will be kept up to date with the LTS) - but does not include the weekly releases (yet). Having a jenkins image that is fairly basic (it includes enough to run some basic builds, as well as jenkins itself) built on the LTS, on the latest LTS of Ubuntu seemed quite convenient - and easy to maintain using the official Ubuntu/Debian packaging of Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Docker is a great way to try and use server based systems - it brings all the dependencies needed and the images actually are portable (ie anywhere docker runs you can run docker images). There are official images for many popular server platforms (redis, mysql, all the linux distros and so on) so it seemed crazy to not include Jenkins along with this list.&lt;br&gt;
&quot;docker run -p 8080:8080 jenkins&quot; is all you need to get going with LTS Jenkins now.&lt;br&gt;
You can also use &quot;docker run jenkins:1.554&quot; to get the latest of that lineage of LTS releases, or pick a specific one: &quot;docker run jenkins:1.554.3&quot; if you like. Leaving off a version assumes the latest. Check the &lt;a href=&quot;https://registry.hub.docker.com/_/jenkins/tags/manage/&quot;&gt;tags&lt;/a&gt; page to see what is available.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can read more and see how you &lt;a href=&quot;https://registry.hub.docker.com/_/jenkins/&quot;&gt;can use it here.&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There has been some questions and discussions on how to make use of Jenkins with the docker hub for creating new and interesting docker image based workflows for deployment.&lt;br&gt;
In fact, Jenkins featured in one of the first slides of the first keynote of docker con:&lt;br&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-qAC-f6ceVho/U5rfqpzj3VI/AAAAAAAAC8w/Ta4pzEhm-8A/s1600/Screen+Shot+2014-06-13+at+8.34.10+pm.png&quot; alt=&quot;image&quot; /&gt;&lt;br&gt;
To make this dream a reality some additional &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/DockerHub+Plugin&quot;&gt;plugins&lt;/a&gt; had to be created - but this leaves the possibility of working with the docker hub (builds, stores images) and Jenkins (workflow, testing, deployment) to build out some kind of a continuous pipeline for handling docker based apps. I attempted to describe this more &lt;a href=&quot;https://developer-blog.cloudbees.com/2014/07/announcing-dockerhub-jenkins-plugin.html&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This image is maintained in this github &lt;a href=&quot;https://github.com/cloudbees/jenkins-ci.org-docker&quot;&gt;repo&lt;/a&gt; and the official images are build by the &lt;a href=&quot;https://github.com/docker/stackbrew&quot;&gt;&quot;stackbrew&quot; system&lt;/a&gt;. (We may move this repo to the jenkinsci github group shortly so keep an eye out).&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It will be interesting to watch this grow and change.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/p&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/2014/08/12/jenkins-user-meet-up-in-london/</id>
<title>Jenkins User Meet-up in London</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-08-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/08/12/jenkins-user-meet-up-in-london/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
+  +


As I was alluding to earlier, I was hoping to have a meetup of Jenkins users in London for a while. I&#8217;m happy to report that the agenda is final and RSVP is open! The date is September 8th.


I&#8217;ll talk about my recent chef/puppet integration work in Jenkins. Sven from Perforce will talk about how to leverage Perforce features from Jenkins, and then James Nord will talk about workflow. It will be a worthy 2 hours.


If the line up of talks will not be enough to sway you, you should also know that I will bring some Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/London&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Black_London_Cab.jpg/320px-Black_London_Cab.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-ci.org/content/jenkins-user-meet-london&quot;&gt;As I was alluding to earlier&lt;/a&gt;, I was hoping to have a meetup of Jenkins users in London for a while. I’m happy to report that &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/198004202/&quot;&gt;the agenda is final and RSVP is open&lt;/a&gt;! The date is September 8th.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll talk about my recent chef/puppet integration work in Jenkins. Sven from Perforce will talk about how to leverage Perforce features from Jenkins, and then James Nord will talk about workflow. It will be a worthy 2 hours.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the line up of talks will not be enough to sway you, you should also know that I will bring some Jenkins giveaways!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m not sure how many people to expect, but there’s a cap at 80 people, so if you are thinking about coming, &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/198004202/&quot;&gt;be sure to RSVP&lt;/a&gt;. Looking forward to seeing many of you there!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, if you are in London, the usual suspects (CloudBees, PuppetLabs, XebiaLabs, MidVision, SOASTA, et al) are doing &lt;a href=&quot;https://www.eventbrite.com/e/how-to-accelerate-innovation-with-continuous-delivery-london-tickets-12229265061&quot;&gt;a free event titled &quot;How To Accelerate Innovation with Continuous Delivery&quot;&lt;/a&gt; that you might also be interested in.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/08/11/user-interface-refresh/</id>
<title>User Interface Refresh</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-08-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/08/11/user-interface-refresh/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='guest post'></category>
<category term='news'></category>
<summary>
This is a guest post from Tom Fennelly



Over the last number of weeks we&#8217;ve been trying to "refresh" the Jenkins UI, modernizing the look and feel a bit. This has been a real community effort, with collaboration from lots of people, both in terms of implementation and in terms of providing honest/critical feedback. Lots of people deserve credit but, in particular, a big thanks to Kevin Burke and Daniel Beck.


You&#8217;re probably familiar with how the Jenkins UI currently looks, but for the sake of comparison I think it&#8217;s worth showing a screenshot of the current/old UI alongside a screenshot of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a guest post from &lt;a href=&quot;https://github.com/tfennelly&quot;&gt;Tom Fennelly&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the last number of weeks we’ve been trying to &quot;refresh&quot; the Jenkins UI, modernizing the look and feel a bit. This has been a real community effort, with collaboration from lots of people, both in terms of implementation and in terms of providing honest/critical feedback. Lots of people deserve credit but, in particular, a big thanks to &lt;a href=&quot;https://github.com/kevinburke&quot;&gt;Kevin Burke&lt;/a&gt; and &lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;Daniel Beck&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’re probably familiar with how the Jenkins UI currently looks, but for the sake of comparison I think it’s worth showing a screenshot of the current/old UI alongside a screenshot of the new UI.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-ci.org/sites/default/files/images/current.png&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/current.preview.png&quot; alt=&quot;image&quot; width=&quot;500&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Current / Old Look &amp;amp; Feel&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-ci.org/sites/default/files/images/new.png&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/new.preview.png&quot; alt=&quot;image&quot; width=&quot;500&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;New Look &amp;amp; Feel&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Among other things, you’ll see:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A new responsive layout based on &amp;lt;div&amp;gt; elements (as opposed to &amp;lt;table&amp;gt; elements). Try resizing the screen or viewing on a smaller device. More to come on this though, we hope.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updated default font from Verdana to Helvetica.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nicer form elements and nicer buttons.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Smoother side panels e.g. Build Executors, Build Queues and Build History panes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Smoother project views with more modern tabs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You might already be seeing these changes if you’re using the latest and greatest code from Jenkins. If not, you should see them in the next LTS release.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve been trying to make these changes without breaking existing features and plugins and, so far, we think we’ve been successful but if you spot anything you think we might have had a negative effect on, then &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;please log a JIRA&lt;/a&gt; and we’ll try to address it.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One thing we’ve &quot;sort of&quot; played with too is cleaning up of the Job Config page - breaking into sections and making it easier to navigate etc. This is a big change and something we’ve been shying away from because of the effect it will have on plugins and form submission. That said, I think we’ll need to bite the bullet and tackle this sooner or later because it’s a big usability issue.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&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/2014/07/30/geek-choice-awards-2014/</id>
<title>Geek Choice Awards 2014</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/30/geek-choice-awards-2014/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<summary>
RebelLabs started annual Geek Choice Awards, and Jenkins was one of the 10 winners. See the page they talk about Jenkins.


My favorite part is, to quote, "Jenkins has an almost laughably dominant position in the CI server segment", and "With 70% of the CI market on lockdown and showing an increasing rate of plugin development, Jenkins is undoubtably the most popular way to go with CI servers."





If you want to read more about it and other 9 technologies that won, they have produced a beautifully formatted PDF for you to read....
</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://wiki.jenkins.io/download/attachments/58000204/Geek-Choice-Awards-CI-Server-300x300-black.png?version=1&amp;amp;modificationDate=1406550449057&quot; alt=&quot;image&quot; width=&quot;100&quot; height=&quot;100&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;RebelLabs started annual &lt;a href=&quot;https://zeroturnaround.com/rebellabs/10-kick-ass-technologies-modern-developers-love/12/&quot;&gt;Geek Choice Awards&lt;/a&gt;, and Jenkins was one of the 10 winners. See &lt;a href=&quot;https://zeroturnaround.com/rebellabs/10-kick-ass-technologies-modern-developers-love/6/&quot;&gt;the page they talk about Jenkins&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My favorite part is, to quote, &quot;Jenkins has an almost laughably dominant position in the CI server segment&quot;, and &quot;With 70% of the CI market on lockdown and showing an increasing rate of plugin development, Jenkins is undoubtably the most popular way to go with CI servers.&quot;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://zeroturnaround.com/wp-content/uploads/2014/07/continuous-integration-server.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to read more about it and other 9 technologies that won, &lt;a href=&quot;https://pages.zeroturnaround.com/Kickass-Technologies.html&quot;&gt;they have produced a beautifully formatted PDF&lt;/a&gt; for you to read.&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/07/28/jenkins-figure-is-available-in-shapeways/</id>
<title>Jenkins figure is available in shapeways </title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/28/jenkins-figure-is-available-in-shapeways/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<summary>
Some time ago, we&#8217;ve built Jenkins bobble head figures. This was such a huge hit that everywhere I go, I get asked about them. The only problem was that it cannot be individually ordered, and we didn&#8217;t have enough cycles to individually sell and ship them for those who wanted them.


So I decided to have the 3D model of Mr.Jenkins built, which would allow anyone to print them via 3D printer. I commissioned akiki, a 3D model designer, to turn our beloved butler into a fully-digital color-printable figure. He was even kind enough to discount the price with the understanding...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some time ago, we’ve built &lt;a href=&quot;https://jenkins-ci.org/content/behind-scenes-jenkins-user-conference-palo-alto&quot;&gt;Jenkins bobble head figures&lt;/a&gt;. This was such a huge hit that everywhere I go, I get asked about them. The only problem was that it cannot be individually ordered, and we didn’t have enough cycles to individually sell and ship them for those who wanted them.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So I decided to have the 3D model of Mr.Jenkins built, which would allow anyone to print them via 3D printer. I commissioned &lt;a href=&quot;https://www.fast-d.com/search/engineers/2798&quot;&gt;akiki&lt;/a&gt;, a 3D model designer, to turn our beloved butler into a fully-digital color-printable figure. He was even kind enough to discount the price with the understanding that this is for an open-source project.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The result was IMHO excellent, and when I finally came back to my house yesterday from a two-weeks trip, I found it delivered to my house:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://images1.sw-cdn.net/model/picture/625x465_2183445_3844009_1406574114.jpg&quot; alt=&quot;image&quot; width=&quot;312&quot; height=&quot;232&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the red bow tie, a napkin, a blue suit, and his signature beard, it is instantly recognizable as Mr.Jenkins. He’s mounted on top of a red base, and is quite stable. I think the Japanese sensibility of the designer is really showing! Note that &lt;a href=&quot;https://www.shapeways.com/materials/full-color-sandstone&quot;&gt;the material&lt;/a&gt; has a rough surface and it is not very strong, but that’s what you trade to get full color.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.shapeways.com/model/2183445/mr-jenkins.html?modelId=2183445&amp;amp;materialId=26&quot;&gt;I’ve put it up on Shapeways so that you can order it yourself&lt;/a&gt;. The figure is about 2.5in/6cm tall. The price includes a bit of markup toward recovering the cost of the design. My goal is to sell 25 of them, which will roughly break it even. Any excess, if it ever happens, will be donated back to the project.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Likewise, once I hit that goal, I will make the original data publicly available under CC-BY-SA, so that other people can modify the data or even print it on their own 3D printers.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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/2014/07/18/juc-israel-report/</id>
<title>JUC Israel report</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/18/juc-israel-report/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='juc'></category>
<summary>
This year marks the 3rd annual Jenkins User Conference in Israel. While the timing of the event turned out to be less than ideal for reasons beyond our control, that didn&#8217;t stop 400 Jenkins users from showing up at the "explosive" event at a seaside hotel near Tel Aviv.


Shlomi Ben-Haim kicked off the conference by reporting that JUC Israel just keeps getting bigger, and that we sold out 2 weeks earlier and the team had to turn down people who really wanted to come in. The degree of adoption of Jenkins is amazing in this part of the world, and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year marks the 3rd annual Jenkins User Conference in Israel. While the timing of the event turned out to be less than ideal for reasons beyond our control, that didn’t stop 400 Jenkins users from showing up at the &quot;explosive&quot; event at a seaside hotel near Tel Aviv.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/shlomibenhaim&quot;&gt;Shlomi Ben-Haim&lt;/a&gt; kicked off the conference by reporting that JUC Israel just keeps getting bigger, and that we sold out 2 weeks earlier and the team had to turn down people who really wanted to come in. The degree of adoption of Jenkins is amazing in this part of the world, and we might have to find a bigger venue next year to accommodate everyone who wants to come.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/14497395798&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5562/14497395798_52a7c92866_n.jpg&quot; alt=&quot;IMG_9716&quot; width=&quot;320&quot; height=&quot;213&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It turns out most of the talks were in Hebrew, so it was difficult for me to really understand what’s going on, but the talks ranged from highly technical ones like how to provision Jenkins from configuration management (the server as well as jobs), all the way to more culture focused one like how to deploy CD practice in an organization. Companies large and small were well represented, and I met with a number of folks who actively contribute to the community.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were a lot of hall way conversations, and those of us at the booth had busy time.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks everyone who came, thanks JFrog for being on the ground for the event (and congratulations for the new round of funding) and CloudBees for hosting the event. Please let us know if there are things we can do better, and see you again next year!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/14680851721&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3903/14680851721_fd36aac023_n.jpg&quot; alt=&quot;IMG_9777&quot; width=&quot;320&quot; height=&quot;213&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/07/09/planned-changes-in-jenkins-user-conference-contact-information-collection/</id>
<title>Planned changes in Jenkins User Conference contact information collection</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/09/planned-changes-in-jenkins-user-conference-contact-information-collection/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='juc'></category>
<summary>
+  +


One of the challenges of running Jenkins User Conferences is to balance the interest of attendees and the interest of sponsors. Sponsors would like to know more about attendees, but attendees are often weary of getting contacted. Our past few JUCs have been run by making it opt-in to have the contact information passed to sponsors, but the ratio of people who opt-in is too low. So we started thinking about adjusting this.


So our current plan is to reduce the amount of data we collect and pass on, but to make this automatic for every attendee. Specifically, we&#8217;d...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Nineteen_Eighty-Four&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/Ingsoc_logo_from_1984.svg/330px-Ingsoc_logo_from_1984.svg.png&quot; alt=&quot;image&quot; width=&quot;160&quot; height=&quot;160&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the challenges of running Jenkins User Conferences is to balance the interest of attendees and the interest of sponsors. Sponsors would like to know more about attendees, but attendees are often weary of getting contacted. Our past few JUCs have been run by making it opt-in to have the contact information passed to sponsors, but the ratio of people who opt-in is too low. So we started thinking about adjusting this.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So our current plan is to reduce the amount of data we collect and pass on, but to make this automatic for every attendee. Specifically, we’d limit the data only to name, company, e-mail, and city/state/country you are from. But no phone number, no street address, etc. We discussed this in &lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins/2014/jenkins.2014-07-09-18.02.html&quot;&gt;the last project meeting&lt;/a&gt;, and people generally seem to think this is reasonable. That said, this is a sensitive issue, so we wanted more people to be aware.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By the way, &lt;a href=&quot;https://www.cloudbees.com/forms/jenkins-user-conference-call-papers.cb&quot;&gt;the call for papers to JUC Bay Area&lt;/a&gt; is about to close in a few days. If you are interested in giving a talk (and that’s often the best way to get feedback and take credit on your work), please make sure to submit it this week.&lt;br /&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/2014/07/08/workflow-plugin-tutorial-writing-a-step-impl/</id>
<title>Workflow plugin tutorial: writing a Step impl</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/08/workflow-plugin-tutorial-writing-a-step-impl/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='plugins'></category>
<category term='screencast'></category>
<category term='video'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
The other day I was explaining how to implement a new workflow primitive to Vivek Pandey, and I captured it as a recording.


The recording goes over how to implement the Step extension point, which is the workflow equivalent of BuildStep extension point. If you are interested in jumping on the workflow plugin hacking, this might be useful (and don&#8217;t forget to get in touch with us so that we can help you!)...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The other day I was explaining how to implement a new workflow primitive to &lt;a href=&quot;https://github.com/vivek&quot;&gt;Vivek Pandey&lt;/a&gt;, and I captured it as a recording.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The recording goes over how to implement the &lt;code&gt;Step&lt;/code&gt; extension point, which is the workflow equivalent of &lt;code&gt;BuildStep&lt;/code&gt; extension point. If you are interested in jumping on the workflow plugin hacking, this might be useful (and don’t forget to get in touch with us so that we can help you!)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.thatvideogameblog.com/wp-content/uploads/2012/11/Link-Dangerous-to-Go-Alone.jpg&quot; alt=&quot;image&quot; width=&quot;310&quot; height=&quot;206&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/07/03/pictures-from-juc-and-cdsummit/</id>
<title>Pictures from JUC and cdSummit</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/03/pictures-from-juc-and-cdsummit/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
I&#8217;ve uploaded pictures I&#8217;ve taken during JUC Boston and JUC Berlin.


JUC Berlin pictures starts with pre-conference beer garden meet-up. See Vincent Latombe gives a talk about Literate plugin. I really appreciated his coming to this despite the fact that the event was only a few days before his wedding:





In JUC Boston pictures, you can see some nice Jenkins lighting effect, as well as my fellow colleague Corey Phelan using World Cup to lure attendees into a booth:








Pictures from the cdSummits are also available here and here.


If you have taken pictures, please share with us as your comment here so that...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve uploaded pictures I’ve taken during JUC Boston and JUC Berlin.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/sets/72157645016261249/&quot;&gt;JUC Berlin pictures&lt;/a&gt; starts with pre-conference beer garden meet-up. See &lt;a href=&quot;https://github.com/vlatombe&quot;&gt;Vincent Latombe&lt;/a&gt; gives a talk about &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Literate+Plugin&quot;&gt;Literate plugin&lt;/a&gt;. I really appreciated his coming to this despite the fact that the event was only a few days before his wedding:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/14512095456&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5577/14512095456_7d592d5f9b_n.jpg&quot; alt=&quot;image&quot; width=&quot;320&quot; height=&quot;213&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/sets/72157645015219907/&quot;&gt;JUC Boston pictures&lt;/a&gt;, you can see some nice Jenkins lighting effect, as well as my fellow colleague Corey Phelan using World Cup to lure attendees into a booth:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/14555175333&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2908/14555175333_48aa816387_n.jpg&quot; alt=&quot;IMG_8721&quot; width=&quot;213&quot; height=&quot;320&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/14535019775&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2939/14535019775_60e691c1dc_n.jpg&quot; alt=&quot;IMG_8745&quot; width=&quot;320&quot; height=&quot;213&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pictures from &lt;a href=&quot;https://www.cloudbees.com/cdsummit/&quot;&gt;the cdSummits&lt;/a&gt; are also available &lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/sets/72157645015519967/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/sets/72157645015398517/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have taken pictures, please share with us as your comment here so that others can see them.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/07/03/juc-berlin-summary/</id>
<title>JUC Berlin summary</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/03/juc-berlin-summary/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
After a very successful JUC Boston we headed over to Berlin for JUC Berlin. I&#8217;ve heard the attendance number was comparable to that of JUC Boston, with close to 400 people registered and 350+ people who came.


The event kicked off at a pre-conference beer garden meetup, except it turned out that the venue was closed on that day and we had to make an emergency switch to another nearby place, and missed some people during that fiasco. My apologies for that.


But the level of the talks during the day more than made up for my failing. They covered everything from...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/14555329583&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3875/14555329583_c464879a8d_m.jpg&quot; alt=&quot;IMG_9194&quot; width=&quot;240&quot; height=&quot;160&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a very successful &lt;a href=&quot;https://jenkins-ci.org/content/juc-boston-what-day&quot;&gt;JUC Boston&lt;/a&gt; we headed over to Berlin for JUC Berlin. I’ve heard the attendance number was comparable to that of JUC Boston, with close to 400 people registered and 350+ people who came.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The event kicked off at &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/189413622/&quot;&gt;a pre-conference beer garden meetup&lt;/a&gt;, except it turned out that the venue was closed on that day and we had to make an emergency switch to another nearby place, and missed some people during that fiasco. My apologies for that.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But the level of the talks during the day more than made up for my failing. They covered everything from large user use cases from BMW to Android builds, continuous delivery to Docker, then of course workflow!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the key attractions of events like this is actually meeting people you interact with. There are &lt;a href=&quot;https://twitter.com/fr3dg&quot;&gt;all&lt;/a&gt; the &lt;a href=&quot;https://github.com/kutzi&quot;&gt;usual&lt;/a&gt; &lt;a href=&quot;https://github.com/orrc&quot;&gt;suspects&lt;/a&gt; of the &lt;a href=&quot;https://github.com/vlatombe&quot;&gt;community&lt;/a&gt;, including &lt;a href=&quot;https://github.com/daniel-beck&quot;&gt;some who I’ve met for the first time&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin/sessions&quot;&gt;Most of the slides are up&lt;/a&gt;, and I believe the video recordings will be uploaded shortly, if you missed the event.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/07/03/jenkins-user-event-and-code-camp-2014-copenhagen/</id>
<title>Jenkins User Event &amp; Code Camp 2014, Copenhagen</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/03/jenkins-user-event-and-code-camp-2014-copenhagen/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<category term='meetup'></category>
<summary>
This is a guest post from Adam Henriques.



On August 22nd Jenkins CI enthusiasts will gather in Copenhagen, Denmark for the 3rd consecutive year for a day of networking and knowledge sharing. Over the past two years the event has grown and this year we are expecting a record number of participants representing Jenkins CI experts, enthusiasts, and users from all over the world.


The Jenkins CI User Event Copenhagen has become cynosure for the Scandinavian Jenkins community to come together and share new ideas, network, and harness inspiration from peers. The program offers invited as well as contributed speaks, tech talks,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a guest post from Adam Henriques.&lt;br /&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On August 22nd Jenkins CI enthusiasts will gather in Copenhagen, Denmark for the 3rd consecutive year for a day of networking and knowledge sharing. Over the past two years the event has grown and this year we are expecting a record number of participants representing Jenkins CI experts, enthusiasts, and users from all over the world.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.praqma.com/events/jcicph14&quot;&gt;The Jenkins CI User Event Copenhagen&lt;/a&gt; has become cynosure for the Scandinavian Jenkins community to come together and share new ideas, network, and harness inspiration from peers. The program offers invited as well as contributed speaks, tech talks, case stories, and facilitated Open Space discussions on best practice and application of continuous integration and agile development with Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-jenkins-ci-code-camp-2014&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-jenkins-ci-code-camp-2014&quot; /&gt;The Jenkins CI Code Camp 2014&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins CI User Event will be kicked off by &lt;a href=&quot;https://www.praqma.com/events/jcicodecamp14&quot;&gt;The Jenkins CI Code Camp&lt;/a&gt; on August 21st, the day before the User Event. Featuring Jenkins frontrunners, this full day community driven event has become very popular, where Jenkins peers band together to contribute content back to the community. The intended audience is both experienced Jenkins developers and developers who are looking to get started with Jenkins plugin development.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more information please visit the &lt;a href=&quot;https://www.praqma.com/events/jcicph14&quot;&gt;Jenkins CI User Event 2014, Copenhagen website&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.praqma.com/sites/default/files/img/DSC_0045_scaled.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&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;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/07/03/jenkins-office-hours-dotci/</id>
<title>Jenkins Office Hours: dotCi</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/03/jenkins-office-hours-dotci/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='plugins'></category>
<category term='screencast'></category>
<category term='video'></category>
<summary>
Surya walked us through the dotCI source code yesterday, and a bunch of ideas about how to reuse pieces are discussed. The recording is on YouTube, and my notes are here....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Surya walked us through &lt;a href=&quot;https://github.com/jenkinsci/dotCI&quot;&gt;the dotCI source code&lt;/a&gt; yesterday, and a bunch of ideas about how to reuse pieces are discussed. The recording is on YouTube, and &lt;a href=&quot;https://docs.google.com/document/d/1zXYOz9Zy-CLu2t8PgqIU0jMO8890PRNjPEAvlrx-HW8/edit#&quot;&gt;my notes are here&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/07/01/jenkins-user-meet-up-in-london/</id>
<title>Jenkins User Meet-up in London?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/01/jenkins-user-meet-up-in-london/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
I&#8217;ll be visiting London in early September, and if possible I&#8217;d love to organize some get together of Jenkins users/devs. I wonder if anyone is interested in hosting the event?


I think it just needs to fit 20 or so people, so all we need is a single conference room somewhere in London. If you think you might be able to help, please drop us a note at the events list....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/London&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/London_Big_Ben_Phone_box.jpg/179px-London_Big_Ben_Phone_box.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll be visiting London in early September, and if possible I’d love to organize some get together of Jenkins users/devs. I wonder if anyone is interested in hosting the event?&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I think it just needs to fit 20 or so people, so all we need is a single conference room somewhere in London. If you think you might be able to help, please drop us a note at &lt;a href=&quot;https://lists.jenkins-ci.org/pipermail/jenkins-events/&quot;&gt;the events list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/07/01/jenkins-office-hours-dotci/</id>
<title>Jenkins Office Hours: dotCi</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-07-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/07/01/jenkins-office-hours-dotci/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='plugins'></category>
<summary>
Tomorrow in Jenkins office hours, Surya Gaddipati will be going over DotCi, a package of features that integrates Jenkins closely with GitHub, configuration via .ci.yml file in source tree, built-in Docker support and MongoDB backend.


I think there&#8217;s a number of interesting pieces here that could be split into individual plugins for reuse, and possible alignment with existing efforts like Script Security plugin or Literate plugin.


To record the show, this event will be in a different hangout from the usual one, but the time is the same. Looking forward to seeing you!...
</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://upload.wikimedia.org/wikipedia/commons/f/fe/Hangouts_Icon.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Tomorrow in Jenkins office hours, Surya Gaddipati will be going over &lt;a href=&quot;https://github.com/jenkinsci/dotci&quot;&gt;DotCi&lt;/a&gt;, a package of features that integrates Jenkins closely with GitHub, configuration via .ci.yml file in source tree, built-in Docker support and MongoDB backend.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I think there’s a number of interesting pieces here that could be split into individual plugins for reuse, and possible alignment with existing efforts like &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Script+Security+Plugin&quot;&gt;Script Security plugin&lt;/a&gt; or &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Literate+Plugin&quot;&gt;Literate plugin&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To record the show, &lt;a href=&quot;https://plus.google.com/events/cmatf87mb6cfo090e063l10709g&quot;&gt;this event will be in a different hangout from the usual one&lt;/a&gt;, but &lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20140702T11&amp;amp;p1=224&amp;amp;ah=1&amp;amp;sort=1&quot;&gt;the time is the same&lt;/a&gt;. Looking forward to seeing you!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/20/juc-boston-what-a-day/</id>
<title>JUC Boston, what a day!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/20/juc-boston-what-a-day/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
+  +


We kicked off this year&#8217;s Jenkins User Conference world tour in Boston this Wednesday. The event was well-attended with more than 450 people registered and 400+ people showed up. So big thank you for everyone who came!


Workflow plugin that Jesse presented was a big hit and lit up twittersphere, and while I was only able to listen to parts of sessions as people had questions and comments for me, ones that I&#8217;ve seen were great. Alyssa told me that the sponsors were happy too, which is also important to keep events like this going.


Perhaps the biggest hit of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/BostonVC/status/479338642331426816&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://pbs.twimg.com/media/Bqbz9JQIIAA9gKG.jpg&quot; alt=&quot;image&quot; width=&quot;300&quot; height=&quot;225&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We kicked off this year’s Jenkins User Conference world tour in Boston this Wednesday. The event was well-attended with more than 450 people registered and 400+ people showed up. So big thank you for everyone who came!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/workflow-plugin&quot;&gt;Workflow plugin&lt;/a&gt; that Jesse presented was a big hit and &lt;a href=&quot;https://twitter.com/search?q=%23jenkinsconf&amp;amp;src=typd&quot;&gt;lit up twittersphere&lt;/a&gt;, and while I was only able to listen to parts of sessions as people had questions and comments for me, ones that I’ve seen were great. &lt;a href=&quot;https://jenkins-ci.org/content/jenkins-user-conference-completely-full&quot;&gt;Alyssa&lt;/a&gt; told me that the sponsors were happy too, which is also important to keep events like this going.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Perhaps the biggest hit of all was &lt;a href=&quot;https://jenkins-ci.org/content/get-drunk-code-juc-boston&quot;&gt;the &quot;get drunk on the code show&lt;/a&gt; by Steven Christou. When I got in, he packed 30 or so people in the room learning how to write a simple Jenkins plugin, and all the beer bottles were long gone!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the &quot;fun&quot; activities we did during the event was a trivia quiz. I’m happy to announce the winners here — Tamara from IBM and Prabhu from Staples. Congrats for your Amazon gift cards!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the show, I’ve heard from several people that they’d love to see more regular local meet-ups. &lt;a href=&quot;https://twitter.com/duncanmak&quot;&gt;Duncan&lt;/a&gt; had shown interest in organizing, and &lt;a href=&quot;https://twitter.com/tyvole&quot;&gt;Jesse&lt;/a&gt; is a Bostonian, so please encourage them to get one going&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/19/juc-europe-sneak-peak-integrated-pipelines/</id>
<title>JUC Europe Sneak Peak: Integrated Pipelines</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/19/juc-europe-sneak-peak-integrated-pipelines/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
This is a guest post from Markos Rendell, a Senior Manager at Accenture.


+  +


I am very much looking forward to the Jenkins User Conference in Berlin next week which I will be attending with a three other members of my team. We are all very passionate about automation, infrastructure-as-code, configuration management and of course… Jenkins.
My team and I specialize in implementing continuous delivery for large scale transformation deliveries. We work with a wide range of technologies from open source, packaged products, through to software-as-a-service. We work with physical infrastructure, private cloud, public cloud and platforms-as-a-service, but there is one...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;This is a guest post from Markos Rendell, a Senior Manager at Accenture.&lt;/em&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin/sessions#MarkRendell&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/juc/juc2014/berlin/Mark-Rendell.jpg&quot; alt=&quot;image&quot; width=&quot;200&quot; height=&quot;200&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am very much looking forward to the Jenkins User Conference in Berlin next week which I will be attending with a three other members of my team. We are all very passionate about automation, infrastructure-as-code, configuration management and of course… Jenkins.&lt;br&gt;
My team and I specialize in implementing continuous delivery for large scale transformation deliveries. We work with a wide range of technologies from open source, packaged products, through to software-as-a-service. We work with physical infrastructure, private cloud, public cloud and platforms-as-a-service, but there is one almost uniquely common factor… using Jenkins.&lt;br&gt;
At the conference I will be expecting to exchange views with others using Jenkins at similar scale and am particularly interested in &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin/sessions#JosefFuchshuber&quot;&gt;sessions&lt;/a&gt; covering using Jenkins with Docker and making Jenkins &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin/sessions#HarpreetSingh&quot;&gt;more resilient&lt;/a&gt;.&lt;br&gt;
I am also looking forward to presenting &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin/sessions#MarkRendell&quot;&gt;this lightening talk&lt;/a&gt; where I will be demoing ways in which we’ve extended Jenkins to implement complex integrated pipelines for large-scale software implementations. &lt;a href=&quot;https://markosrendell.wordpress.com/2014/05/28/reducing-continuous-delivery-impedance-part-2-solution-complexity/&quot;&gt;See here&lt;/a&gt; for a sneak preview.&lt;/br&gt;
&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/16/get-together-at-beer-garden-for-juc-berlin/</id>
<title>Get together at beer garden for JUC Berlin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/16/get-together-at-beer-garden-for-juc-berlin/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
Beer_garden_sign-Germany-.jpg/160px--Beer_garden_sign-Germany-.jpg" alt="image">


There&#8217;ll be a number of active community people in the event, so let&#8217;s take advantages of that and meet up. And there&#8217;s no better place to do it than a beer garden in summer!


If you are coming to JUC Berlin, I&#8217;ve just set up an RSVP page for a beer garden get together the day before, and another dinner afterward.


Looking forward to seeing you!...
</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://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/-&amp;lt;em&amp;gt;Beer_garden_sign&amp;lt;/em&amp;gt;-&amp;lt;em&amp;gt;Germany&amp;lt;/em&amp;gt;-.jpg/160px--&amp;lt;em&amp;gt;Beer_garden_sign&amp;lt;/em&amp;gt;-&amp;lt;em&amp;gt;Germany&amp;lt;/em&amp;gt;-.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’ll be a number of active community people in the event, so let’s take advantages of that and meet up. And there’s no better place to do it than a beer garden in summer!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are coming to &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin&quot;&gt;JUC Berlin&lt;/a&gt;, I’ve just set up &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/189413622/&quot;&gt;an RSVP page for a beer garden get together the day before&lt;/a&gt;, and &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/189405872/&quot;&gt;another dinner afterward&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to seeing you!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/11/juc-speaker-sneakpeak-a-build-ecosystem-for-loosely-compiled-code/</id>
<title>JUC speaker sneakpeak: A build ecosystem for loosely compiled code</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/11/juc-speaker-sneakpeak-a-build-ecosystem-for-loosely-compiled-code/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
+  +


We&#8217;re getting excited about the Boston and Berlin JUC&#8217;s in the next two weeks! Here&#8217;s a preview of Forest Handford&#8217;s upcoming JUC-US East Lightning Talk on June 18&#8230;&#8203;
When MEDITECH migrated to Subversion from a home-grown first generation version control system we needed a way to get the code compiled and sent to the running server. We selected Jenkins as our build server, with the hope of eventually using it for CI.
A MEDITECH application consists of hundreds of source files. Each source file translates to an object code file that the interpreter executes. This is one of the last...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston/speakers#ForestHandford&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/Forest_Handford_0.preview.jpg&quot; alt=&quot;image&quot; width=&quot;240&quot; height=&quot;320&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;We’re getting excited about the Boston and Berlin JUC’s in the next two weeks! Here’s a preview of Forest Handford’s upcoming JUC-US East Lightning Talk on June 18…​&lt;/em&gt;&lt;br&gt;
When &lt;a href=&quot;https://home.meditech.com/en/d/home/&quot;&gt;MEDITECH&lt;/a&gt; migrated to Subversion from a home-grown first generation version control system we needed a way to get the code compiled and sent to the running server. We selected Jenkins as our build server, with the hope of eventually using it for CI.&lt;br&gt;
A MEDITECH application consists of hundreds of source files. Each source file translates to an object code file that the interpreter executes. This is one of the last major projects I worked on prior to leaving MEDITECH to work at Carbonite. In my Lightning Talk, &quot;A Build Eco-System for Loosely Compiled Code,&quot; I’ll discuss the toughest challenges my team had in getting Jenkins to work as our build server and how we eventually overcame them.&lt;br&gt;
Staff from both &lt;a href=&quot;https://www.carbonite.com&quot;&gt;Carbonite&lt;/a&gt; and MEDITECH will be in attendance. Both companies are hiring!&lt;br&gt;
&lt;em&gt;You’ll find more great talks in the full &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston&quot;&gt;JUC-US East&lt;/a&gt; agenda and the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin&quot;&gt;JUC-Europe&lt;/a&gt; agenda.&lt;/em&gt;&lt;/br&gt;
&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/10/two-weeks-till-jenkins-user-conference-berlin/</id>
<title>Two Weeks Till Jenkins User Conference Berlin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/10/two-weeks-till-jenkins-user-conference-berlin/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<category term='juc'></category>
<summary>
Following right on the heels of our US-East Jenkins User Conference in Boston, we have JUC Europe in Berlin on June 25. Like the East Coast conference, the Berlin one is almost full, so sign up while you can.
Our venue in Berlin is KOSMOS, a building with a fascinating history. The building was inaugurated as a cinema in 1961. With 1001 seats, it was the largest, most modern and most popular film theatre in the former GDR and has since been extensively modernized in line with the requirements of historically listed buildings.
We have an excellent line-up of speakers filling up...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Following right on the heels of our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston&quot;&gt;US-East Jenkins User Conference in Boston&lt;/a&gt;, we have JUC Europe in Berlin on June 25. Like the East Coast conference, the Berlin one is almost full, so &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-europe-berlin-june-25-2014-tickets-10557974185&quot;&gt;sign up while you can.&lt;/a&gt;&lt;br&gt;
Our venue in Berlin is &lt;a href=&quot;https://eng.kosmos-berlin.de&quot;&gt;KOSMOS&lt;/a&gt;, a building with &lt;a href=&quot;https://eng.kosmos-berlin.de/ueber-uns&quot;&gt;a fascinating history&lt;/a&gt;. The building was inaugurated as a cinema in 1961. With 1001 seats, it was the largest, most modern and most popular film theatre in the former GDR and has since been extensively modernized in line with the requirements of historically listed buildings.&lt;br&gt;
We have &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin&quot;&gt;an excellent line-up of speakers&lt;/a&gt; filling up two conference tracks.&lt;br&gt;
Once again, we have some fabulous sponsors to thank. Without them, there would be no JUC.&lt;br&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/JUC-Berlin-Sponsors.png&quot; alt=&quot;image&quot; /&gt;&lt;br&gt;
This year we’ve introduced a new Community sponsorship level, which allows non-corporate groups like JUGSs to help support the conference as well. (Drop a note to juc-oc-ext AT cloudbees DOT com if your group is interested).&lt;br&gt;
We are very grateful to all of our sponsors – thank you! Hopefully see everyone at JUC.&lt;br&gt;
PS – if you are coming to Berlin for JUC, check out the &lt;a href=&quot;https://www.cloudbees.com/cdsummit/berlin&quot;&gt;CD Summit on June 24&lt;/a&gt; at the same venue. There’s also &lt;a href=&quot;https://www.cloudbees.com/cdsummit/nyc&quot;&gt;one on June 19 in NYC&lt;/a&gt;. The summit will focus on how continuous integration with Jenkins streamlines processes and automates testing and deployment, providing the foundation you need for continuous delivery.&lt;/br&gt;
&lt;/br&gt;&lt;/br&gt;&lt;/span&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/09/thinking-about-moving-on-to-servlet-3-0/</id>
<title>Thinking about moving on to Servlet 3.0</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/09/thinking-about-moving-on-to-servlet-3-0/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='feedback'></category>
<summary>
+  +


One of the current efforts under way in the dev list is driven by Tom Fennelly et al, who is working on introducing a series of small ball improvements to the user interface in Jenkins. If this is something you are interested in (and who aren&#8217;t?), you should see Kevin Burke&#8217;s manifest that sets out the plan of attack, and This mega thread on the dev list for the discussion.


There are numerous sub-conversations born out of this, and one of them is the minimum required servlet spec version for Jenkins.


Jenkins devs are thinking about ways to update page...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Subaru_Legacy&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Subaru_Legacy_V_Kombi_rear_20100402.jpg/320px-Subaru_Legacy_V_Kombi_rear_20100402.jpg&quot; alt=&quot;image&quot; width=&quot;240&quot; height=&quot;156&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the current efforts under way in the dev list is driven by &lt;a href=&quot;https://github.com/tfennelly&quot;&gt;Tom Fennelly&lt;/a&gt; et al, who is working on introducing a series of small ball improvements to the user interface in Jenkins. If this is something you are interested in (and who aren’t?), you should see &lt;a href=&quot;https://gist.github.com/kevinburke/9d4f127a7005eaa9d970&quot;&gt;Kevin Burke’s manifest&lt;/a&gt; that sets out the plan of attack, and &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/zDaX4yiWLLw&quot;&gt;This mega thread on the dev list&lt;/a&gt; for the discussion.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are numerous sub-conversations born out of this, and one of them is the minimum required servlet spec version for Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins devs are thinking about ways to update page contents post load, for example so that the list view will keep updating as stuff happens. &lt;a href=&quot;https://en.wikipedia.org/wiki/Websocket&quot;&gt;WebSocket&lt;/a&gt; was discussed as an option, and then &lt;a href=&quot;https://en.wikipedia.org/wiki/Server-sent_events&quot;&gt;server-side events&lt;/a&gt;, which seems to be the current favorite.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To use any of those async HTTP features, we need servlet 3.0. Unfortunately, if we are to do it, Jenkins will not run on earlier versions of the container. There’s no graceful fallback that works with servlet 2.5 containers due to the way servlet 3.0 is written.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So I looked into &lt;a href=&quot;https://docs.google.com/spreadsheets/d/14YzFgKBB6BvbRU_1OjChC3efECWPs77TEGTU09t3KGw/edit#gid=873989456&quot;&gt;the impact of this change to the users&lt;/a&gt;.&lt;br&gt;
It turns out that the most users run Jenkins through &lt;code&gt;java -jar jenkins.war&lt;/code&gt;, which are already running servlet 3.0 compatible Winstone 2.x (based on Jetty 8.) And people running newer version of Jenkins tends to run newer version of containers. When I look at people who are running &amp;gt;=1.509 and later, 70% of them run on servlet 3 compatible container. The number for &amp;gt;=1.532 is 84%, then for &amp;gt;=1.554 it’s 94%.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I look at which container is dragging us down as of &amp;gt;= 1.554, you see that there’s a sizable Tomcat6 deployments (2.5%). If we start requiring Servlet 3.0 these people will be in a nasty surprise. Then there’s about 1.8% who claims to be running on Winstone 0.9.10, which is really puzzling, but I’m assuming these people are getting OEM-ed Jenkins of a sort (multiple large companies are known to do this), so these people will likely be able to update to Winstone 2.x automatically by virtue of getting a new jenkins.war from their upstream. So all in all I’d say if we start requiring servlet 3.0 today, there’ll be about 3% user base who will be impacted.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is a trial balloon to see the community reaction to this idea. If you have reasons to argue against us moving to servlet 3.0, we’d like to hear from you — &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/23378&quot;&gt;please share your thoughts on our issue tracker&lt;/a&gt;!&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/06/other-events-for-juc-visitors-cd-seminar/</id>
<title>Other events for JUC visitors: CD seminar</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/06/other-events-for-juc-visitors-cd-seminar/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
+  +


If you will be on the US East Coast or in Berlin for JUC, some of the JUC sponsors are organizing separate events called Continuous Delivery Seminar, which might be of interest to you. These events focus more on higher-level business value questions as well as vendor solutions that are difficult in community-focused JUC.




New York City on June 19, the day after JUC US East — headlined by Forrester Research analyst Kurt Bittner


Berlin on June 24, the day before JUC Europe — headlined by Jan Hagen, author of Confronting Mistakes: Lessons from the Aviation Industry when Dealing with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Circus&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/CircusTent02.jpg/320px-CircusTent02.jpg&quot; alt=&quot;image&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you will be on the US East Coast or in Berlin for JUC, some of the JUC sponsors are organizing separate events called &lt;a href=&quot;https://www.cloudbees.com/cdsummit&quot;&gt;Continuous Delivery Seminar&lt;/a&gt;, which might be of interest to you. These events focus more on higher-level business value questions as well as vendor solutions that are difficult in community-focused JUC.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/cdsummit/nyc&quot;&gt;New York City on June 19&lt;/a&gt;, the day after JUC US East — headlined by Forrester Research analyst Kurt Bittner&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/cdsummit/berlin&quot;&gt;Berlin on June 24&lt;/a&gt;, the day before JUC Europe — headlined by Jan Hagen, author of &lt;em&gt;Confronting Mistakes: Lessons from the Aviation Industry when Dealing with Errors&lt;/em&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Read more about the events &lt;a href=&quot;https://blog.cloudbees.com/2014/06/cd-summit-learn-from-continuous.html&quot;&gt;here&lt;/a&gt;. The events are free and I’ve heard that there’ll be some souveniors. I’m one of the speakers, and I’ll be talking about Jenkins, as always!&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/05/get-drunk-on-the-code-in-juc-boston/</id>
<title>Get drunk on the code in JUC-Boston</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/05/get-drunk-on-the-code-in-juc-boston/" />
<author>
<name>christ66</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='jenkinsci'></category>
<category term='juc'></category>
<summary>
Let me start by introducing myself, my name is Steven Christou. Many of you might know me on IRC as schristou, my github id as christ66, or my twitter handle @schristou88. In Jenkins, I am currently working on some significant improvements to the subversion-plugin, along with various random bug fixes. I am also the current maintainer of Cobertura, an open source code coverage tool for java. Prior to working on Jenkins, I was working on Hudson at the Eclipse Foundation.


While working on Jenkins, I usually get requests (usually in IRC) about where to start when writing a plugin. Some examples...
</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://jenkins-ci.org/sites/default/files/images/christou.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let me start by introducing myself, my name is Steven Christou. Many of you might know me on IRC as schristou, my github id as &lt;a href=&quot;https://github.com/christ66&quot;&gt;christ66&lt;/a&gt;, or my twitter handle &lt;a href=&quot;https://twitter.com/schristou88&quot;&gt;@schristou88&lt;/a&gt;. In Jenkins, I am currently working on some significant improvements to the subversion-plugin, along with various random bug fixes. I am also the current maintainer of &lt;a href=&quot;https://cobertura.github.io/cobertura&quot;&gt;Cobertura&lt;/a&gt;, an open source code coverage tool for java. Prior to working on Jenkins, I was working on Hudson at the Eclipse Foundation.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While working on Jenkins, I usually get requests (usually in IRC) about where to start when writing a plugin. Some examples are &quot;Where do I start?&quot; or &quot;Do you have any examples?&quot;. Well at &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston&quot;&gt;JUC Boston&lt;/a&gt;, I will be hosting a small lecture called Get Drunk on the Code! I will be giving the lecture in the rooms &quot;Back Bay&quot; (1 &amp;amp; 2) where people will be able to sit down, drink a beer, and learn how to write a Jenkins plugin! I will be teaching people everything from how to get started, to some advanced techniques like writing a new &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+CLI&quot;&gt;CLI Command&lt;/a&gt;, and writing your own builder. I forgot to mention that I will be handing out beer while this is happening!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This session will be happening after the exhibit break from 3:30pm to 6:00pm. It will be two hours where I will be walking around, and helping users if they encounter any issues while the session is happening. So grab your laptop, a beer and get drunk on the code! Don’t get too drunk, but if you do at least you can improve the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beer+Plugin&quot;&gt;beer plugin&lt;/a&gt;!&quot;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/03/jenkins-won-sdtimes-100-2014/</id>
<title>Jenkins won SDTimes 100, 2014</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/03/jenkins-won-sdtimes-100-2014/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<summary>
Jenkins won SDTimes 100, 2014





For the 5th year in a row, Jenkins project won SDTimes 100, 2014 this year under DevOps and SCM categories, along with other open-source projects like Chef, Docker, Git, LLVM, and Puppet.


I&#8217;d like to take this opportunity to once again thank the community for keeing us going strong. There&#8217;s !topic/jenkinsci-dev/qrG7bAnZSHQ">a lot of !topic/jenkinsci-dev/zDaX4yiWLLw">interesting efforts going on in the project, as always, so expect more stuff to come out from us in the coming days!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins won SDTimes 100, 2014&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.sdtimes.com/images/sdt100/2014SDT100_logo_120x123.gif&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the 5th year in a row, Jenkins project won &lt;a href=&quot;https://sdtimes.com/content/article.aspx?ArticleID=71295&amp;amp;page=4&quot;&gt;SDTimes 100, 2014&lt;/a&gt; this year under DevOps and SCM categories, along with other open-source projects like Chef, Docker, Git, LLVM, and Puppet.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d like to take this opportunity to once again thank the community for keeing us going strong. There’s &lt;a href=&quot;https://groups.google.com/forum/&amp;lt;mark&amp;gt;!topic/jenkinsci-dev/qrG7bAnZSHQ&quot;&gt;a lot&lt;/a&gt; of &lt;a href=&quot;https://groups.google.com/forum/&amp;lt;/mark&amp;gt;!topic/jenkinsci-dev/zDaX4yiWLLw&quot;&gt;interesting&lt;/a&gt; efforts &lt;a href=&quot;https://groups.google.com/forum/#!topic/jenkinsci-dev/l5vrC8BqVJQ&quot;&gt;going on&lt;/a&gt; in &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness&quot;&gt;the project&lt;/a&gt;, as always, so expect more stuff to come out from us in the coming days!&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/06/03/jenkins-user-conference-boston-is-around-the-corner/</id>
<title>Jenkins User Conference Boston is around the corner!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-06-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/06/03/jenkins-user-conference-boston-is-around-the-corner/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
Only a few weeks until our Jenkins User Conference US East kicks off in Boston on June 18. Right now more than 300 people have registered and we’ve had to release more tickets! If you will be anywhere near New England on June 18, sign up fast so you don’t miss the fun.


+  +


This year marks the butler’s first conference tour to New England. He has chosen the fabulous Seaport hotel on the waterfront for a venue — a hotel that&#8217;s far better than what I usually stay in :-). You can even take a water taxi to see...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Only a few weeks until &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston&quot;&gt;our Jenkins User Conference US East&lt;/a&gt; kicks off in Boston on June 18. Right now more than 300 people have registered and we’ve had to &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-us-east-boston-june-18-2014-tickets-10558652213&quot;&gt;release more tickets&lt;/a&gt;! If you will be anywhere near New England on June 18, &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-us-east-boston-june-18-2014-tickets-10558652213&quot;&gt;sign up fast so you don’t miss the fun&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-ci.org/content/jenkins-user-conference-2013-palo-alto-wrap&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/blogger_importer/s1600/2014-0625-22-Butler-Fun.jpg&quot; alt=&quot;image&quot; width=&quot;240&quot; height=&quot;180&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year marks the butler’s first conference tour to &lt;a href=&quot;https://en.wikipedia.org/wiki/New_England&quot;&gt;New England&lt;/a&gt;. He has chosen &lt;a href=&quot;https://www.seaportboston.com/&quot;&gt;the fabulous Seaport hotel&lt;/a&gt; on the waterfront for a venue — a hotel that’s far better than what I usually stay in :-). You can even take a water taxi to &lt;a href=&quot;https://en.wikivoyage.org/wiki/Boston&quot;&gt;see the sites&lt;/a&gt; or get to and from the airport. For airport transfers, you can also just hop on &lt;a href=&quot;https://www.mbta.com/schedules_and_maps/subway/lines/?route=SILVER&quot;&gt;the silver line bus&lt;/a&gt; and arrive across the street from the hotel (the stop is called &quot;&lt;a href=&quot;https://www.mbta.com/schedules_and_maps/subway/lines/stations/?stopId=25092&amp;amp;lat=42.349098&amp;amp;lng=-71.04206&quot;&gt;World Trade Center Station&lt;/a&gt;&quot;.)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year we have &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston&quot;&gt;an incredible line-up of speakers&lt;/a&gt;. Attendees will be well fed, caffeinated, and even pickled if they choose…​ the afternoon break will feature BEvERages. And everyone gets this year’s Jenkins World Tour t-shirt.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nothing about conference-throwing is cheap, so we’d like to take a moment to thank our generous JUC US East sponsors. It speaks so well for the JUC community that so many companies have stepped up to support Jenkins and produce a first-class conference. So here is the shout-out for them:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/JUC-boston-sponsors.preview.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;&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/2014/05/30/adopt-a-plugin/</id>
<title>Adopt a plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-05-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/05/30/adopt-a-plugin/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='jobs'></category>
<category term='plugins'></category>
<summary>
Today on IRC, I was asked how someone new to the project can get started working on Jenkins, when s/he has no particular preference or pet-peeve.


This is a good question for which the project should have a canned answer ready, so here is one approach — adopt a plugin!


Often, a Jenkins plugin gets developed by someone to scratch his own itch. That person shares the plugin with the community, and since it does everything he needs, he moves on to work on something else. Then another person starts using that plugin, comes up with an idea for improvement, implements that,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Adopt_a_Highway&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Adopt_a_highway_crop.jpg/231px-Adopt_a_highway_crop.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today on IRC, I was asked how someone new to the project can get started working on Jenkins, when s/he has no particular preference or pet-peeve.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a good question for which the project should have a canned answer ready, so here is one approach — adopt a plugin!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Often, a Jenkins plugin gets developed by someone to scratch his own itch. That person shares the plugin with the community, and since it does everything he needs, he moves on to work on something else. Then another person starts using that plugin, comes up with an idea for improvement, implements that, and then moves on. Given that we have more than 900 plugins today, there are a plenty of plugins that are currently co-maintained by the community, which could really use a focused loving caregiver.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So why don’t you adopt a plugin? You can pick up one of those plugins and act as a maintainer. You’ll hear appreciation from people who are using that plugin, and most plugins are small and simple enough even for people new to Jenkins. Above all, working on plugins don’t require much communication with existing developers and implicit processes, which is often difficult for new people to find out.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s how you can find a plugin to adopt. You can look at &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pending+Pull+Requests&quot;&gt;repositories that have most pending pull requests&lt;/a&gt;. Plugins with lots of pull requests likely could use some help, so check if anyone is actively working on it and talk to him, or if you don’t see much activities from a single person, just go ahead and adopt the plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/svg/svgs.html&quot;&gt;Usage statistics&lt;/a&gt; has &lt;code&gt;top-plugins500.svg&lt;/code&gt; (this is for &lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/svg/201404-top-plugins500.svg&quot;&gt;the last month&lt;/a&gt;). Open that in Firefox, which lets you zoom in. Scroll all the way to the right, and you see popular plugins. Compare that with &lt;a href=&quot;https://github.com/jenkinsci/&quot;&gt;our GitHub repositories&lt;/a&gt;, and you can find popular plugins that aren’t getting enough love.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://issues.jenkins.io/browse/JENKINS#selectedTab=com.atlassian.jira.plugin.system.project%3Acomponents-panel&quot;&gt;Issue tracker&lt;/a&gt; is also a good place to look for a plugin in need of help. Every plugin has a separate component, so look at bugs and RFEs filed against those, especially with lots of votes. Fix a bug is great, but even just helping with the triage process would be highly appreciated.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Try adopting a plugin for a while, and when you get the hang of it, let &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;the dev list know&lt;/a&gt;. Update &lt;code&gt;pom.xml&lt;/code&gt; to have your name listed as a maintainer. Come &lt;a href=&quot;https://jenkins-ci.org/content/chat&quot;&gt;join IRC&lt;/a&gt;. That way, we know who you are and how to reach you.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See, it’s really not that hard. And there’s something really satisfying in making things a little better and seeing happy users. Anyway, looking forward to working with you!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/05/27/acceptance-test-project-progress-report/</id>
<title>Acceptance test project progress report</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-05-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/05/27/acceptance-test-project-progress-report/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='news'></category>
<category term='tutorial'></category>
<category term='lts'></category>
<category term='video'></category>
<summary>
Over the past 30 days or so, the acceptance test project has made a great progress.


This project consists of a reusable harness that can be used by plugin developers and users to write functional test cases. These tests can be run against Jenkins instances that are deployed in all sorts of different ways, and can interact with complex real fixtures. These tests can be also run with specific version of Jenkins core and a combination of plugins.


The number of tests have steadily increased to above 300. Several of those are by Michael Prankl, where he tests the LDAP plugin with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past 30 days or so, &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness/&quot;&gt;the acceptance test project&lt;/a&gt; has made a great progress.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This project consists of a reusable harness that can be used by plugin developers and users to write functional test cases. These tests can be run against Jenkins instances that are deployed in &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness/blob/master/docs/CONTROLLER.md&quot;&gt;all sorts of different ways&lt;/a&gt;, and can interact with &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness/blob/master/docs/FIXTURES.md&quot;&gt;complex real fixtures&lt;/a&gt;. These tests can be also run with specific version of Jenkins core and a combination of plugins.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The number of tests have &lt;a href=&quot;https://jenkins.ci.cloudbees.com/job/core/job/acceptance-test-harness/&quot;&gt;steadily increased to above 300&lt;/a&gt;. Several of those are by &lt;a href=&quot;https://github.com/eidottermihi&quot;&gt;Michael Prankl&lt;/a&gt;, where he tests &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness/blob/master/src/test/java/plugins/LdapPluginTest.java&quot;&gt;the LDAP plugin with the real OpenLDAP server instance&lt;/a&gt; that runs inside Docker — a kind of test that just wasn’t possible before can be now easily written.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness/graphs/contributors&quot;&gt;More than a dozen people&lt;/a&gt; have contributed. &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness/commits/master&quot;&gt;A dozen changes are going in every single day&lt;/a&gt;, and more are coming — for example, Stephen is working on modularizing this harness and adding new pieces that allow people to do scalability and load testing. That’ll be a part of this effort soon.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are one of the large scale users who are interested in automating some of your Jenkins acceptance testing, please &lt;a href=&quot;https://groups.google.com/g/jenkinsci-dev&quot;&gt;drop us a note at the DEV list&lt;/a&gt; so that we can work together. You can also watch the recording of our last &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;office hours&lt;/a&gt; where I demoed how you’d develop a test on top of this:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I think we all agree that this is an important effort/ Looking forward to joining the efforts with more people in the community!&lt;br /&gt;
&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/2014/05/19/jenkins-office-hour-tutorial-on-writing-an-acceptance-test/</id>
<title>Jenkins Office Hour: Tutorial on writing an acceptance test</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-05-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/05/19/jenkins-office-hour-tutorial-on-writing-an-acceptance-test/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='screencast'></category>
<category term='tutorial'></category>
<summary>
This week I&#8217;m going to do an office hour on how to write an acceptance test in Jenkins acceptance test harness. The event is on Wednesday 11am PT.


This new Selenium-based test harness is full of page objects and other abstractions that let you write blackbox integration tests on Jenkins and its plugins, as well as how they behave under various environments.


Unlike our regular office hours, the event is done through Hangout on air. But I do want at least several people to join Hangout interactively, not just watch the event in a read-only mode.


To join the event interactively (as opposed...
</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://wiki.jenkins.io/download/attachments/57181939/hangout.png?version=1&amp;amp;modificationDate=1361998218000&quot; alt=&quot;image&quot; width=&quot;200&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week I’m going to do an office hour on how to write an acceptance test in &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness&quot;&gt;Jenkins acceptance test harness&lt;/a&gt;. The event is on &lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20140519T11&amp;amp;p1=283&amp;amp;ah=1&quot;&gt;Wednesday 11am PT&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This new Selenium-based test harness is full of page objects and other abstractions that let you write blackbox integration tests on Jenkins and its plugins, as well as how they behave under various environments.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unlike our regular office hours, &lt;a href=&quot;https://plus.google.com/u/0/events/cpr7lhq3d544rj5uqid4rin3deg&quot;&gt;the event is done through Hangout on air&lt;/a&gt;. But I do want at least several people to join Hangout interactively, not just watch the event in a read-only mode.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To join the event interactively (as opposed to read-only), I think you need to &lt;a href=&quot;https://plus.google.com/hangouts/_/hoaevent/AP36tYeeXozAE_RiZWtTfX-O-sEtxJ3qhu4Asnfy7tZOZf3hs3jX1Q&quot;&gt;come here&lt;/a&gt; (but since Hangout URL can change, please check back on this post right before the office hour begins, so that I can post an up-to-date URL.)&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/05/08/another-big-thank-you-to-rackspace/</id>
<title>Another big thank you to Rackspace</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-05-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/05/08/another-big-thank-you-to-rackspace/" />
<author>
<name>kohsuke</name>
</author>
<category term='infrastructure'></category>
<category term='links'></category>
<category term='meta'></category>
<category term='news'></category>
<summary>
As the Jenkins project grows, the need for our infrastructure has been growing. Our Jenkins-on-Jenkins needs more build agents, we need more servers to run our infrastructure services.


And it was once again Rackspace who stepped up to the plate; they have kindly donated us more cloud servers. I also use Rackspace for one of my personal servers, and when I went back to their admin console this time, I noticed that they&#8217;ve added a lot more services to their offering.





I am setting up these boxes as I write this. A huge thank you for Rackspace for their support of this...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the Jenkins project grows, &lt;a href=&quot;https://jenkins-ci.org/content/come-join-infra-team&quot;&gt;the need for our infrastructure has been growing&lt;/a&gt;. &lt;a href=&quot;https://ci.jenkins.io/&quot;&gt;Our Jenkins-on-Jenkins&lt;/a&gt; needs more build agents, we need more servers to run our infrastructure services.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And it was &lt;a href=&quot;https://jenkins-ci.org/content/big-thanks-rackspace&quot;&gt;once again&lt;/a&gt; Rackspace who stepped up to the plate; they have kindly donated us more &lt;a href=&quot;https://www.rackspace.com/cloud/servers/&quot;&gt;cloud servers&lt;/a&gt;. I also use Rackspace for one of my personal servers, and when I went back to their admin console this time, I noticed that they’ve added &lt;a href=&quot;https://www.rackspace.com/cloud/&quot;&gt;a lot more services&lt;/a&gt; to their offering.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/rackspace.jpg&quot; alt=&quot;image&quot; width=&quot;200&quot; height=&quot;200&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am setting up these boxes as I write this. A huge thank you for Rackspace for their support of this project. And if you are interested in using Rackspace cloud servers as elastic build agents, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/JClouds+Plugin&quot;&gt;jclouds plugin&lt;/a&gt; is your friend.&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/04/24/juc-agenda-posted/</id>
<title>JUC agenda posted</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-04-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/04/24/juc-agenda-posted/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='juc'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
+  +


Agenda is posted for Jenkins User Conference Boston and Berlin.


For Boston, my favorite would be the workflow in Jenkins talk that will cover the new workflow job type Jesse and I are working on. As of this writing it is still very much a work in progress, but that talk is our way of putting a stake on the ground that we WILL have something we can talk about by then. There&#8217;s also some talks that describes how they&#8217;ve put together pieces (including Jenkins) to create a broad automation, such as Distributed Scrum Development with Jenkins, Vagrant, Fabric...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Kevin_Allen_(author)&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/4/49/The_Hidden_Agenda_3D.png/181px-The_Hidden_Agenda_3D.png&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Agenda is posted for Jenkins User Conference &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston&quot;&gt;Boston&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin&quot;&gt;Berlin&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For Boston, my favorite would be the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston/sessions#JesseGlick&quot;&gt;workflow in Jenkins&lt;/a&gt; talk that will cover the new workflow job type Jesse and I are working on. As of this writing it is still very much a work in progress, but that talk is our way of putting a stake on the ground that we WILL have something we can talk about by then. There’s also some talks that describes how they’ve put together pieces (including Jenkins) to create a broad automation, such as &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston/sessions#HoiTsang&quot;&gt;Distributed Scrum Development with Jenkins, Vagrant, Fabric and Selenium&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/boston/sessions#JimCrossley&quot;&gt;Moving Existing Enterprise Systems to Continuous Integration and Deployment with Jenkins&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For Berlin, it turns out that we have steller line up of the speakers far beyond my expectation. You have a number of key community contributors/developers like &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin/speakers#ChristopherOrr&quot;&gt;Christopher Orr&lt;/a&gt; talking about &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin/sessions#ChristopherOrr&quot;&gt;how he does mobile build/test/deploy&lt;/a&gt;, or &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin/speakers#VincentLatombe&quot;&gt;Vincent&lt;/a&gt; talking about &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Literate+Plugin&quot;&gt;literate plugin&lt;/a&gt;. I’m also looking forward to the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/berlin/sessions#JulienPivotto&quot;&gt;Puppetizing Jenkins Pipelines&lt;/a&gt; from Julien Pivotto, which (if I understand correctly) is about deploying Jenkins and its jobs through Puppet — That is something I notice many people are very interested in nowadays.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All of them are looking forward to meeting you and hearing your thoughts and feedbacks, and I’m sure this is going to be a great learning/networking opportunities.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-boston-ma-june-18-2014-tickets-10558652213&quot;&gt;Registration for Boston is here&lt;/a&gt;, and &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-berlin-germany-june-25-2014-tickets-10557974185&quot;&gt;registration for Berlin is here&lt;/a&gt;. Seats are starting to fill up now, so don’t procrastinate too much!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/04/18/come-join-the-infra-team/</id>
<title>Come join the infra team!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-04-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/04/18/come-join-the-infra-team/" />
<author>
<name>kohsuke</name>
</author>
<category term='infrastructure'></category>
<category term='news'></category>
<summary>
We are looking for volunteers to join the small infra team here at the Jenkins project. We are the butlers of the butler that get Mr.Jenkins going.


We&#8217;ve been managing our servers through puppet, and have been slowly folding pieces one at a time to puppet, but there&#8217;s still a lot of snowflake services that need proper operationalization.


So to fix them up, PuppetLabs folks generously agreed to help us get going with a deployment of Puppet Enterprise. Tyler has managed to arrange a "rapid deployment" engagement. To kick start the effort, an instructor would come for one week (April 28th-May 2nd)...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://puppetlabs.com/&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://i.stack.imgur.com/RZN4l.jpg&quot; alt=&quot;image&quot; width=&quot;100&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are looking for volunteers to join the small infra team here at the Jenkins project. We are the butlers of the butler that get Mr.Jenkins going.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve been &lt;a href=&quot;https://github.com/jenkins-infra/jenkins-infra&quot;&gt;managing our servers through puppet&lt;/a&gt;, and have been slowly folding pieces one at a time to puppet, but there’s still a lot of snowflake services that need proper operationalization.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So to fix them up, &lt;a href=&quot;https://puppetlabs.com/&quot;&gt;PuppetLabs&lt;/a&gt; folks generously agreed to help us get going with a deployment of Puppet Enterprise. Tyler has managed to arrange a &quot;rapid deployment&quot; engagement. To kick start the effort, an instructor would come for one week (April 28th-May 2nd) to bring us up to speed on modern Puppet. we’ll then spend some time on our own to puppt-ize more, and deploy Puppet Enterprise.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The end goal is to ensure sustainability of our infrastructure, in case of unexpected server loss.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we are about to get this effort going, we think this is a good time to solicit a few more volunteers. We are looking for someone who could join this two week engagement in San Francisco, and keep their involvement beyond that. This is a part time volunteer work, and you’d get some visibility and exposure to the inner guts of open-source projects, not to mention the satisfaction of getting thanked for your work.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested, please &lt;a href=&quot;https://jenkins-ci.org/content/mailing-lists&quot;&gt;drop us a note at the infra list&lt;/a&gt;.&lt;br /&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/04/16/active-directory-plugin-improvements/</id>
<title>Active Directory plugin improvements</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-04-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/04/16/active-directory-plugin-improvements/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='plugins'></category>
<summary>
+  +


One of the few plugins that I still personally maintain is Active Directory plugin. In the past few months, I&#8217;ve been making steady improvements in this plugin, thanks to various inputs and bug reports given to me from the ClodBees customers.


One of the recent fixes was to get the "remember me" feature finally working for Active Directory. This requires a relatively new Jenkins 1.556, but it eliminates the need to having to constantly type the password in.


Then I&#8217;ve rebumped the version of COM4J, which was causing a thread leak when Jenkins runs on Windows. If you are running...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Active_Directory&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Active-directory.svg/170px-Active-directory.svg.png&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the few plugins that I still personally maintain is &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Active+Directory+plugin&quot;&gt;Active Directory plugin&lt;/a&gt;. In the past few months, I’ve been making steady improvements in this plugin, thanks to various inputs and bug reports given to me from the ClodBees customers.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the recent fixes was to get &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/9258&quot;&gt;the &quot;remember me&quot; feature&lt;/a&gt; finally working for Active Directory. This requires a relatively new Jenkins 1.556, but it eliminates the need to having to constantly type the password in.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then I’ve rebumped the version of &lt;a href=&quot;https://github.com/kohsuke/com4j&quot;&gt;COM4J&lt;/a&gt;, which was &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/16429&quot;&gt;causing a thread leak&lt;/a&gt; when Jenkins runs on Windows. If you are running a Windows deployment with lots of active users, this probably would have contributed to the instability of Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And then lastly, a small but crucial improvement was made to the way we search group membership, so that we can avoid recursively searching AD. This should result in a significant speed improvement when you are logging into Jenkins through AD.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latest version of the plugin as of writing is 1.37. I hope you’ll have a chance to update the plugin soon.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/04/15/upcoming-jenkins-office-hours-acceptance-test-harness/</id>
<title>Upcoming Jenkins Office Hours: Acceptance Test Harness</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-04-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/04/15/upcoming-jenkins-office-hours-acceptance-test-harness/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
One of the new efforts in Jenkins this year is the acceptance test harness for Jenkins.


We will be doing the Jenkins office hours next week to go over this and sync up and coordinate between people in the community that are trying to work on this.


It&#8217;ll be April 23rd 11am PT (see what this time is in your time zone) on Google Hangout at https://jenkins-ci.org/hangout. If you are interested in hacking Jenkins or if you are a large user of Jenkins who have acceptance tests, we are looking forward to seeing you there.


For those of you who haven&#8217;t looked, this...
</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://clsdf.com/wp-content/uploads/2011/06/tumblr_lkzltkxTmF1qersu1.gif&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the new efforts in Jenkins this year is &lt;a href=&quot;https://github.com/jenkinsci/acceptance-test-harness&quot;&gt;the acceptance test harness&lt;/a&gt; for Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We will be doing the Jenkins office hours next week to go over this and sync up and coordinate between people in the community that are trying to work on this.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’ll be &lt;strong&gt;April 23rd 11am PT&lt;/strong&gt; (&lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Governance+Meeting&amp;amp;iso=20140423T11&amp;amp;p1=224&amp;amp;ah=1&amp;amp;sort=1&quot;&gt;see what this time is in your time zone&lt;/a&gt;) on Google Hangout at &lt;a href=&quot;https://jenkins-ci.org/hangout&quot; class=&quot;bare&quot;&gt;https://jenkins-ci.org/hangout&lt;/a&gt;. If you are interested in hacking Jenkins or if you are a large user of Jenkins who have acceptance tests, we are looking forward to seeing you there.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For those of you who haven’t looked, this test harness allows you to write blackbox tests of Jenkins and its plugins. It was originally used to test LTS releases, but over the time, it acquired a number of features, such as …​:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker support for launching complex fixtures to test Jenkins with.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Pluggability to launch Jenkins under test (JUT) in many different environments&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Pluggability to provision Jenkins and agents from EC2 to test large deployments&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Choice of cucumber or JUnit to write test scripts&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are working on porting over existing test cases, but we’d like to work with users to move their acceptance tests on top of this same harness. The idea is to pool those test cases in the community so that we can test Jenkins and its plugins as we develop them. For this to work, we want tests to have lots of metadata (such as what plugins it touches), and for the harness to have sufficient modularity that different people can run the same scenario against different deployments, including existing instance.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/04/11/jenkins-1-532-3-lts-is-released/</id>
<title>Jenkins 1.532.3 LTS is released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-04-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/04/11/jenkins-1-532-3-lts-is-released/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='releases'></category>
<category term='lts'></category>
<summary>
The final LTS release of the 1.532.x line is out today. You can download it from the usual location. Changelog is here.


Starting with the next 1.554.x LTS, the release model will switch to the train model, where we commit to dates and get whatever we can ship by that date.


You can see the scheduled dates in our event calendar. Backporting window for 1.554.1 is almost closing, so if you want to have your favorite issues nominated for it, please see the process in the Wiki and hurry!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The final LTS release of the 1.532.x line is out today. You can download it from &lt;a href=&quot;http://mirrors.jenkins-ci.org/&quot;&gt;the usual location&lt;/a&gt;. Changelog is &lt;a href=&quot;https://jenkins-ci.org/changelog-stable&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting with the next 1.554.x LTS, the release model will &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/LTS+Release+Line&quot;&gt;switch to the train model&lt;/a&gt;, where we commit to dates and get whatever we can ship by that date.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can see &lt;a href=&quot;https://jenkins-ci.org/content/event-calendar&quot;&gt;the scheduled dates in our event calendar&lt;/a&gt;. Backporting window for 1.554.1 is almost closing, so if you want to have your favorite issues nominated for it, please see &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/LTS+Release+Line&quot;&gt;the process&lt;/a&gt; in the Wiki and hurry!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/04/11/infoq-ci-survey-2014/</id>
<title>InfoQ CI survey 2014</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-04-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/04/11/infoq-ci-survey-2014/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<summary>
InfoQ has been running a CI server survey for more than a month now, and here is the current result:


+  +


Jenkins has gotten more than 70% of the votes, once again proving the wide adoption among developers. If you are one of those who picked Cruise Control into the "considering" section, I&#8217;d encourage you to look around a bit more.


You can still vote from their website or leave comments if you want.


By the way, the design of two axes make no sense to me; for example, I&#8217;d order the adoption axis to "considering &#8594; migrating to &#8594; using now...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;InfoQ has been &lt;a href=&quot;https://www.infoq.com/research/ci-server&quot;&gt;running a CI server survey&lt;/a&gt; for more than a month now, and here is the current result:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.infoq.com/research/ci-server&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/infoq.preview.png&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has gotten more than 70% of the votes, once again proving the wide adoption among developers. If you are one of those who picked Cruise Control into the &quot;considering&quot; section, I’d encourage you to look around a bit more.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can still &lt;a href=&quot;https://www.infoq.com/research/ci-server&quot;&gt;vote from their website or leave comments if you want&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By the way, the design of two axes make no sense to me; for example, I’d order the adoption axis to &quot;considering → migrating to → using now → moving away from&quot;, and the circle seems to imply two axes are somehow interchangeable, when it should probably be just in a checkerboard to indicate those are independent axes.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/04/09/more-scalable-slaves/</id>
<title>More scalable agents</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-04-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/04/09/more-scalable-slaves/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='news'></category>
<summary>
+  +


Nio


NIO-based Java Web Start (JNLP) agent handling is coming to 1.560. This will help you run a large number of JNLP agents more efficiently. A connected JNLP agent used to occupy one thread on the controller, but now it occupies none. Combined with the earlier change that eliminated threads from idle executors, now you can connect thousands of agents.


All you have to do is to use the latest agent.jar from Jenkins 1.560. No other changes are necessary on users' part.


A bulk of this is implemented in remoting 2.38, and a good part of it was implemented about a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Nio&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Nikko_Toshogu_Nio_M3043.jpg/160px-Nikko_Toshogu_Nio_M3043.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nio&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/New_I/O&quot;&gt;NIO&lt;/a&gt;-based &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Distributed+builds#Distributedbuilds-LaunchslaveagentviaJavaWebStart&quot;&gt;Java Web Start (JNLP) agent handling&lt;/a&gt; is coming to 1.560. This will help you run a large number of JNLP agents more efficiently. A connected JNLP agent used to occupy one thread on the controller, but now it occupies none. Combined with the earlier change that eliminated threads from idle executors, now you can connect thousands of agents.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All you have to do is to use the latest &lt;code&gt;agent.jar&lt;/code&gt; from Jenkins 1.560. No other changes are necessary on users&#39; part.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A bulk of this is implemented in &lt;a href=&quot;https://github.com/jenkinsci/remoting&quot;&gt;remoting 2.38&lt;/a&gt;, and a good part of it was implemented about a year ago on the airplane on the way to Europe.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We plan to make CLI connections take advantages of this too, which helps those who use that a lot. That’s not in 1.560, but hopefully it’ll be in the near future. This change also paves a way for multi-participant bus-topology communication, which I think would be an useful building block for &lt;a href=&quot;https://github.com/jenkinsci/master-to-master-api-plugin/&quot;&gt;the work-in-progress controller-to-controller API&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/04/04/maven-job-type-performance-improvements-in-maven-plugin-2-2/</id>
<title>Maven job type performance improvements in Maven plugin 2.2</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-04-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/04/04/maven-job-type-performance-improvements-in-maven-plugin-2-2/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='plugins'></category>
<category term='releases'></category>
<summary>
+ 


I recently had an opportunity to visit a big Jenkins user on site, and one of the things they&#8217;ve told me is that building projects in the Maven job type is substantially slower than doing the same with the freestyle project type.


This is partly expected, because this job type does more for you. For example, it automatically archives your build artifacts, fingerprints all the relevant information, and so on. These are good things, and naturally, it cost time.


But the slow down they are seeing was substantial, and this is a complaint I&#8217;ve heard from others as well. So I...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Grumman_F-14_Tomcat&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/US_Navy_040925-N-0295M-030_An_F-14D_Tomcat_conducts_a_high_speed_flyby_during_the_tactical_air_power_demonstration_at_the_2004_Naval_Air_Station_Oceana_Air_Show.jpg/300px-thumbnail.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I recently had an opportunity to visit a big Jenkins user on site, and one of the things they’ve told me is that building projects in the Maven job type is substantially slower than doing the same with the freestyle project type.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is partly expected, because this job type does more for you. For example, it automatically archives your build artifacts, fingerprints all the relevant information, and so on. These are good things, and naturally, it cost time.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But the slow down they are seeing was substantial, and this is a complaint I’ve heard from others as well. So I started looking into it.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With a help of &lt;a href=&quot;https://linux.die.net/man/8/tc&quot;&gt;artificial delay&lt;/a&gt; induced to my network interface and several custom scripts to probe into the running processes, I was able to understand what was going on and make some good improvements.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, in Maven plugin 2.0, we’ve made a change in the way we archive artifacts from Maven. Previously, the artifacts were copied between the controller and the Maven JVM, and for a reason I’ll mention later, this was very slow, especially in a network that has a large latency. With Maven plugin 2.0 and onward, artifacts are archived between the controller and the agent JVM.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The second problem that I discovered was that the spy program we put inside Maven is causing excessive amount of unnecessary classloading. Some classes have static initializers that too eagerly refer to other classes, which in turn brings in other classes, and so on. Despite &lt;a href=&quot;https://jenkins-ci.org/content/faster-slave-classloading&quot;&gt;the jar file caching that we do&lt;/a&gt;, these classloading still sometimes requires precious roundtrips to the controller, which costs in the order of 10s of ms. I was able to make various changes in Jenkins core to cut this down, and these fixes will land in Jenkins 1.559 (ETA is April 14th.) The classloading overhead is independent of the size of your Maven build, so this improvement is more for people who have lots of small Maven builds, like &lt;a href=&quot;https://ci.jenkins.io/&quot;&gt;Jenkins building Jenkins plugins&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, on to the biggest fruit of this investigation I was able to discover and fix. Imagine the Maven JVM has a lot of data to send to the controller, say you are archiving test reports or code coverage report. A good implementation would send these data as fast as possible to the controller, paying respect to the limit of flow control to avoid overwhelming the controller.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It turns out that the way we set up this communication channel was far from optimal. Instead of having the Maven JVM push data with flow control, we were relying on the controller to pull data. That is, controller has to send out a request to the agent to fetch the next batch of data (8KB), then once it receives that data, it sends out another request to fetch the next batch of data, and so on. If your network latency is 10ms, this scheme only lets us send 500KB/sec, even if you have a gigabit ethernet. No wonder it was so slow!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This fix is in Maven plugin 2.2. See &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/22354&quot;&gt;JENKINS-22354&lt;/a&gt; if you want to know more about the actual diffs and such.&lt;br&gt;
Unfortunately, none of these are available for those who are on 1.532.x LTS, but &lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins/2014/jenkins.2014-04-02-18.02.html&quot;&gt;the next 1.554.1 LTS&lt;/a&gt; will be able to run the newer Maven 2.2 plugin. So the help is on the way!&lt;br /&gt;
&lt;/br&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;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/04/01/your-java-web-start-slaves-will-be-always-clean/</id>
<title>Your Java Web Start slaves will be always clean</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-04-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/04/01/your-java-web-start-slaves-will-be-always-clean/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<summary>
+  +


If you have agents that connect through Java Web Start (such as agents installed as Windows services), we have a good news for you.


In case of a connection loss, this type of agents has been designed to automatically attempt to reconnect to the controller. This makes sense because you want these agents to remain online all the time, even if your janitor trips over the ethernet cable. Unfortunately, it also means that over the time, these agents accumulate gunk, such as mutated static states, any left-over threads or memory leaks, or native libraries that are loaded into JVM.


To...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Mr._Clean&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/en/thumb/7/73/Mr._Clean_logo.png/200px-Mr._Clean_logo.png&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have agents that connect through &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Distributed+builds#Distributedbuilds-LaunchslaveagentviaJavaWebStart&quot;&gt;Java Web Start&lt;/a&gt; (such as &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+as+a+Windows+service#InstallingJenkinsasaWindowsservice-InstallSlaveasaWindowsservice%28require.NET2.0framework%29&quot;&gt;agents installed as Windows services&lt;/a&gt;), we have a good news for you.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In case of a connection loss, this type of agents has been designed to automatically attempt to reconnect to the controller. This makes sense because you want these agents to remain online all the time, even if your janitor trips over the ethernet cable. Unfortunately, it also means that over the time, these agents accumulate gunk, such as mutated static states, any left-over threads or memory leaks, or &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/20913&quot;&gt;native libraries that are loaded into JVM&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To prevent that, a better approach is to &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/19055&quot;&gt;restart the agent JVM (JENKINS-19055)&lt;/a&gt; and have the new JVM reconnect, instead of having the same JVM reconnect. That would ensure that the agent always stays clean. I’ve planned to make this change for a while now, and I’m happy to report that this change is finally landing to the upcoming 1.559.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Restarting JVM is easy on Unix, where I could just &lt;a href=&quot;https://man7.org/linux/man-pages/man3/exec.3.html&quot;&gt;exec(3)&lt;/a&gt; to itself. We’ve been doing this for ages on controllers, for example when you update a plugin and tell Jenkins to restart.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The hard part is to do this for Windows, where the most of the time was spent. I had to improve &lt;a href=&quot;https://github.com/kohsuke/winsw&quot;&gt;windows service wrapper&lt;/a&gt; to support self-restarting services, which turned out to be trickier because Windows service control manager doesn’t provide &quot;restart&quot; as an atomic operation. It also kills not just the service process itself but all the processes in the group. So I had to double-fork the service wrapper into a separate process group just to restart a service from within itself.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In any case, the end result is that if &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+as+a+Windows+service#InstallingJenkinsasaWindowsservice-InstallSlaveasaWindowsservice%28require.NET2.0framework%29&quot;&gt;you have installed a service through GUI&lt;/a&gt;, be it on Windows, Unix, or OS X, agents will restart themselves every time it gets disconnected from the controller.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve also taken the opportunity to make &lt;code&gt;jenkins-slave.exe&lt;/code&gt; on the agent self-updating. Every time it connects to the controller, it gets the latest version from the controller.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have installed Web Start agents as services, make sure to update the local copy of &lt;code&gt;agent.jar&lt;/code&gt; on these agents to 2.37 or later. This &quot;restart on reconnect&quot; feature only kicks in when you are running this very recent version of &lt;code&gt;agent.jar&lt;/code&gt;. And yes, we realize it’d be nice for &lt;code&gt;agent.jar&lt;/code&gt; to update itself, which is tracked as &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/22454&quot;&gt;JENKINS-22454&lt;/a&gt;. But that’s a work for another day.&lt;br /&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/2014/03/21/call-for-sponsors-2014-jenkins-user-conferences/</id>
<title>Call for Sponsors: 2014 Jenkins User Conferences</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-03-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/03/21/call-for-sponsors-2014-jenkins-user-conferences/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<category term='juc'></category>
<summary>
Jenkins User Conference (JUC) season is upon us! It&#8217;s a busy year for the Butler&#8201;&#8212;&#8201;he&#8217;s hosting conferences all over and looking for sponsors to help:




Boston&#8201;&#8212;&#8201;June 18


Berlin&#8201;&#8212;&#8201;June 25


Herzelia, Israel&#8201;&#8212;&#8201;July 16


Bay Area (California)&#8201;&#8212;&#8201;October (date TBD)




Mr. Jenkins and the JUC Organizing Committee want to invite you and your company to sponsor a JUC this year. Show your support for the Jenkins community and help keep costs low for attendees*. The funds go to are put to good use: conferences are two full tracks. Lunch, light breakfast, coffee and a coveted Jenkins t-shirt are also included.


Sponsors get all sorts of thanks from the Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://wiki.jenkins.io/download/attachments/2916393/headshot.png?version=1&amp;amp;modificationDate=1302753947000&quot; alt=&quot;headshot&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins User Conference (JUC) season is upon us! It’s a busy year for the Butler — he’s hosting conferences all over and looking for sponsors to help:&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.eventbrite.com/e/jenkins-user-conference-boston-ma-june-17-2014-tickets-10558652213&quot;&gt;Boston — June 18&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Berlin — June 25&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Herzelia, Israel — July 16&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bay Area (California) — October (date TBD)&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;Mr. Jenkins and the JUC Organizing Committee want to invite you and your company to sponsor a JUC this year.&lt;/strong&gt; Show your support for the Jenkins community and help keep costs low for attendees*. The funds go to are put to good use: conferences are two full tracks. Lunch, light breakfast, coffee and a coveted Jenkins t-shirt are also included.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sponsors get all sorts of thanks from the Jenkins community:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Your logo on the conference t-shirt and all other conference communication (emails, website, signage, etc.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A blog featuring sponsors&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Free passes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Silver and Gold sponsors get a table to talk to folks and hand out swag&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gold sponsors get either a speaking slot, happy hour sponsorship or a dedicated room for demos&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And more, but most especially, you get to support JenkinsCI. &amp;lt;/ul&amp;gt; Just &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014/sponsorships&quot;&gt;let us know if you’re interested&lt;/a&gt; to get the details. We’d love to have you join us. Friendly reminder: We are looking for speakers for all four cities. Call for Papers ends March 30 for Boston, Berlin and Israel. &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014&quot;&gt;Submit your abstract now&lt;/a&gt; and come share your expertise with the Jenkins community. We hope to see you at a JUC this year! &lt;i&gt;Lisa, Alyssa and the JUC Organizing Committee &lt;/i&gt; *PS - &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-boston-ma-june-17-2014-tickets-10558652213&quot;&gt;Registration just opened for Boston&lt;/a&gt; and early-bird tickets are only $59.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/03/19/jenkins-user-conferences-this-year/</id>
<title>Jenkins User Conferences This Year</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-03-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/03/19/jenkins-user-conferences-this-year/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
Over the past three years, the Jenkins User Conference is held annually in the Bay Area with a few events in different locations around the world. The Jenkins User Conference has established a reputation as a focal point for the Jenkins community to come together to share new ideas and best practices. Each year we have experienced the growth and expansion within the Jenkins community. This year we are taking this platform to other regions of the world, offering regional gatherings of Jenkins users and developers.


At the moment, we are working on the following JUCs and events for 2014:




JUC Boston...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past three years, the Jenkins User Conference is held annually in the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-palo-alto-abstracts.cb#FlorianLier&quot;&gt;Bay Area&lt;/a&gt; with a few events in different locations around the world. The Jenkins User Conference has established a reputation as a focal point for the Jenkins community to come together to share new ideas and best practices. Each year we have experienced the growth and expansion within the Jenkins community. This year we are taking this platform to other regions of the world, offering regional gatherings of Jenkins users and developers.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the moment, we are working on the following JUCs and events for 2014:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/content/jenkins-user-conference-boston.cb&quot;&gt;JUC Boston&lt;/a&gt; - June 18&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;JUC Berlin - June 25&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;JUC Israel - July 16&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;JUC San Francisco Bay Area - October (TBD)&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;JUC Australia/New Zealand - November/Dec (TBD)&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Events&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Copenhagen - September&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Brazil - November/December (TBD)&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are a few different ways to get involved:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Register Now to Attend: &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-user-conference-boston-ma-june-17-2014-tickets-10558652213&quot;&gt;JUC Boston&lt;/a&gt;. Registration pages for other JUCs/events are coming soon. Please check back &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014&quot;&gt;here&lt;/a&gt; often.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/company/events/juc&quot;&gt;Be a Sponsor&lt;/a&gt;: There are a few ways to become a sponsor.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Submit a &lt;a href=&quot;https://www.cloudbees.com/forms/jenkins-user-conference-call-papers.cb&quot;&gt;Talk Proposal&lt;/a&gt;: deadline is March 30&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Submit a great idea for t-shirt design in the comment box below or email &lt;a href=&quot;mailto:atong@cloudbees.com&quot;&gt;atong@cloudbees.com&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Submit ideas for swag in the comment box below or email &lt;a href=&quot;mailto:atong@cloudbees.com&quot;&gt;atong@cloudbees.com&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Be part of the JUC committee: contact &lt;a href=&quot;mailto:atong@cloudbees.com&quot;&gt;atong@cloudbees.com&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Learn more:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc-2014&quot;&gt;Jenkins User Conferences&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/jenkins-ci/jenkins-newsletter.cb&quot;&gt;Sign up&lt;/a&gt; and stay up to date with the latest &lt;a href=&quot;https://www.cloudbees.com/jenkins/jenkins-ci/jenkins-newsletter.cb&quot;&gt;Jenkins newsletter&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to seeing you at a local JUC near you! :o)&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2014/01/25/jenkins-at-fosdem-2014/</id>
<title>Jenkins at FOSDEM 2014</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2014-01-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2014/01/25/jenkins-at-fosdem-2014/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
FOSDEM is probably the biggest open-source developers' conference in Europe.


This year will be the 3rd year for us to be present in FOSDEM. There will be a bunch of community people, handing out flyers and stickers, showing Jenkins, and generally be available to talk to people! This year, we&#8217;ll bring some Jenkins T-shirts to sell, and hopefully some bobble heads as well. So please be sure to drop by.


And if you are already involved in the Jenkins project and willing to help us man the booth, that&#8217;d be awesome! Looking forward to seeing you!...
</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://jenkins-ci.org/sites/default/files/images/fosdem.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/FOSDEM&quot;&gt;FOSDEM&lt;/a&gt; is probably the biggest open-source developers&#39; conference in Europe.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year will be the 3rd year for us to be present in FOSDEM. There will be &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/FOSDEM&quot;&gt;a bunch of community people&lt;/a&gt;, handing out flyers and stickers, showing Jenkins, and generally be available to talk to people! This year, we’ll bring some Jenkins T-shirts to sell, and hopefully some bobble heads as well. So please be sure to drop by.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And if you are already involved in the Jenkins project and willing to help us man the booth, that’d be awesome! Looking forward to seeing you!&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/12/05/jenkins-sao-paulo-meetup-this-weekend/</id>
<title>Jenkins Sao Paulo Meetup this weekend</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-12-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/12/05/jenkins-sao-paulo-meetup-this-weekend/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
I&#8217;m going to visit Sao Paulo once again this weekend to attend the second annual Jenkins users meet-up. It&#8217;s a whole day free event Saturday full of Jenkins goodness.


You&#8217;ll hear from a number of active Jenkins folks, and I&#8217;ll be presenting about what CloudBees (where I currently work) has contributed to the Jenkins project, including recent new OSS plugins and some services. I&#8217;m also stuffing my suitcase with lots of giveaways, including Jenkins stickers and popular Jenkins bobble heads. I don&#8217;t intend to bring anything back to the U.S.







The morning half of the event is a cross-atlantic hackathon between Brazil...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m going to visit Sao Paulo once again this weekend to attend &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/133598002/&quot;&gt;the second annual Jenkins users meet-up&lt;/a&gt;. It’s a whole day free event Saturday full of Jenkins goodness.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll hear from a number of active Jenkins folks, and I’ll be presenting about what CloudBees (where I currently work) has contributed to the Jenkins project, including recent new OSS plugins and some services. I’m also stuffing my suitcase with lots of giveaways, including Jenkins stickers and &lt;a href=&quot;https://jenkins-ci.org/content/behind-scenes-jenkins-user-conference-palo-alto&quot;&gt;popular Jenkins bobble heads&lt;/a&gt;. I don’t intend to bring anything back to the U.S.&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://farm3.staticflickr.com/2878/9725573715_fa056b6652_n.jpg&quot; alt=&quot;Bobble head&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The morning half of the event is a cross-atlantic hackathon between Brazil and Copenhagen. you can check what’s being planned on &lt;a href=&quot;https://trello.com/b/1U1mRKhG/jenkins-user-event-sp-13&quot;&gt;the western side of the ocean&lt;/a&gt; and &lt;a href=&quot;https://www.eventbrite.com/e/jenkins-ci-hackaton-the-sao-paulo-connection-registration-9552811717&quot;&gt;the eastern side of the ocean&lt;/a&gt;. The afternoon half is a series of presentations. Please &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/133598002/&quot;&gt;come join us&lt;/a&gt;. I’m really looking forward to seeing you!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll be in Sao Paulo for the whole Sunday and Monday as well. If you are interested in talking to me, please feel free to &lt;a href=&quot;https://kohsuke.org/about/&quot;&gt;drop me a note&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/12/04/jenkins-user-conference-2013-palo-alto-wrap-up/</id>
<title>Jenkins User Conference 2013 Palo Alto Wrap-up</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-12-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/12/04/jenkins-user-conference-2013-palo-alto-wrap-up/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<category term='juc'></category>
<summary>
It&#8217;s been a month now, but I realized that I&#8217;ve never posted a wrap-up post of JUC 2013. So in the spirit of "better later than, never", here it goes.


First of all, I wanted to thank everyone who came. More than 400 of you came, and another 600 signed up for live streaming of events (and I know some people watched those live streams past midnight in their local time zone!). I did my part in signing bobble heads and answering questions, and I was able to finally put faces to some of the people who I actively interact in...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been a month now, but I realized that I’ve never posted a wrap-up post of JUC 2013. So in the spirit of &quot;better later than, never&quot;, here it goes.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First of all, I wanted to thank everyone who came. More than 400 of you came, and another 600 signed up for live streaming of events (and I know some people watched those live streams past midnight in their local time zone!). I did my part in &lt;a href=&quot;https://bobbickel.blogspot.com/2013/10/kk-jenkins-and-triumph-of-technology.html&quot;&gt;signing bobble heads&lt;/a&gt; and answering questions, and I was able to finally put faces to some of the people who I actively interact in the community but never met before.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I tried to &lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/sets/72157637144035034/&quot;&gt;take as many pictures as I can&lt;/a&gt;, and &lt;a href=&quot;https://www.facebook.com/media/set/?set=a.700790069940324.1073741828.150316981654305&amp;amp;type=3&quot;&gt;Lisa and Alyssa had posted their pictures as well&lt;/a&gt;. If you have your pictures, please share it with us! My favorite is Jenkins cupcake:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/10585620064/in/set-72157637144035034&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5484/10585620064_e43c2dd6a1_n.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-palo-alto-abstracts.cb&quot;&gt;the slides are video recordings are available online&lt;/a&gt; if you couldn’t join us.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alyssa said she’s got a lot of feedbacks from folks, and &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Meeting+Agenda&quot;&gt;she’s already planning for the next year&lt;/a&gt; — if you are interested in sharing your thoughts on how to better do this next year, we’ve put it up for the next week’s Jenkins project meeting agenda to talk about how to do it.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, everything in the San Francisco Bay Area is incredibly costly, and events like this was really only made possible by generous sponsors, and we really want to make them happy so that they can help us make this event happen next year as well. So I thought the least I can do is to give them a spotlight and talk about who they are and what they do:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#&quot; /&gt;+&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Platinum Sponsor&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#-2&quot; /&gt;+&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;&lt;strong&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/CloudBees-web.png&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;CloudBees is the lead organizer for JUC and offers Jenkins in whatever&lt;br&gt;
form you wish to use it - on-premises or in the cloud. Check out the many&lt;br&gt;
resources available on the CloudBees website for Jenkins fans - whether&lt;br&gt;
you use open source Jenkins, &lt;a href=&quot;https://www.cloudbees.com/jenkins/enterprise&quot;&gt;Jenkins Enterprise by CloudBees&lt;/a&gt; or &lt;a href=&quot;https://www.cloudbees.com/dev.cb&quot;&gt;Jenkins in the cloud&lt;/a&gt;.&lt;/br&gt;
&lt;/br&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#-3&quot; /&gt;+&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt; &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;-4&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#-4&quot; /&gt;+&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Gold Sponsors&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;https://www.appvance.com/&quot;&gt;&lt;strong&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/appvance%202.png&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Appvance delivers technology and services to prove and improve&lt;br&gt;
performance, security and scalability of websites, apps and mobile apps.&lt;br&gt;
The largest brands in the world choose Appvance, from Pepsi to Best Buy&lt;br&gt;
to Bell Alliant. &lt;a href=&quot;https://www.appvance.com/&quot;&gt;Learn more&lt;/a&gt;.https://www.appvance.com/[]&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://www.bds.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/BDS%20Logo.jpg&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Have questions on SDLC tools or agile process (especially Jenkins&lt;br&gt;
Enterprise, CI or CD)? Leverage our 25 years of expertise for assistance&lt;br&gt;
with CloudBees, Xebia Labs, Sonatype, JFrog, Atlassian, SVN, Git,&lt;br&gt;
Rational, Microsoft TFS and many more. Visit &lt;a href=&quot;https://www.bds.com/&quot;&gt;www.BDS.com&lt;/a&gt; to learn more..&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://www.brightroll.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/BrightRoll_Logo_noslogan_High_Res.png&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the largest independent video advertising platform, BrightRoll powers&lt;br&gt;
digital video advertising for the world’s largest brands. Jenkins has&lt;br&gt;
become a core piece of our productivity tech stack here at BrightRoll,&lt;br&gt;
and its importance is increasing. During the time that we’ve used it&lt;br&gt;
we’ve seen a huge benefit to participating in the Jenkins community,&lt;br&gt;
getting support from core contributors and plugin authors, and we try to&lt;br&gt;
contribute back whenever we can. &lt;a href=&quot;https://www.brightroll.com/&quot;&gt;www.brightroll.com&lt;/a&gt;&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://www.jfrog.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/JFrogIcon.png&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins User Conference is the only place you can actually feel the&lt;br&gt;
Jenkins community and understand that being part of it is not just a&lt;br&gt;
commitment, it is a privilege we are honored to share. Learn more about&lt;br&gt;
&lt;a href=&quot;https://www.jfrog.com/&quot;&gt;JFrog&lt;/a&gt;, our &lt;a href=&quot;https://www.jfrog.com/home/v_artifactory_opensource_overview&quot;&gt;Artifactory&lt;/a&gt; Binary Repository solution, and our new &lt;a href=&quot;https://bintray.com/&quot;&gt;Bintray&lt;/a&gt; social platform for sharing, publishing and managing binaries.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://web.archive.org/web/20140106081207/http://lmitsoftware.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/gerritforge-logo.png&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;LMIT Software is now GerritForge, the leader in Agile coaching and&lt;br&gt;
Development Management. We are active contributors of Jenkins (see &lt;a href=&quot;https://jenkins-ci.mobi/&quot;&gt;https://jenkins-ci.mobi&lt;/a&gt;) and &lt;a href=&quot;https://gerrithub.io/&quot;&gt;Gerrit Code Review&lt;/a&gt; and we can enable their adoption and integration into the Enterprise Continuous Delivery chain.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://newrelic.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/NewRelic-logo_small.jpg&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;New Relic is a SaaS application performance management solution that&lt;br&gt;
provides end-to-end, real time visibility into the operations of network&lt;br&gt;
connected applications wherever they run – across browsers, mobile&lt;br&gt;
devices and servers. Sign up for a FREE account at&lt;br&gt;
&lt;a href=&quot;https://newrelic.com/cloudbees&quot;&gt;newrelic.com/cloudbees&lt;/a&gt;.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;https://xebialabs.com/&quot;&gt;&lt;strong&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/Xebia-Logo.png&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With  CloudBees &lt;a href=&quot;https://www.cloudbees.com/dev.cb&quot;&gt;DEV@cloud&lt;/a&gt; (Jenkins in the cloud) or &lt;a href=&quot;https://www.cloudbees.com/jenkins/enterprise&quot;&gt;Jenkins Enterprise by CloudBees,&lt;/a&gt; you can instantly connect to &lt;a href=&quot;https://www.xebialabs.com/deployit&quot;&gt;XebiaLabs Deployit&lt;/a&gt; (a fully automated deployment solution) and immediately begin reaping &lt;br&gt;
the benefits of delivering continuously. Missed Andrew Phillips&#39; JUC presentation, Preparing for Enterprise Continuous Delivery: 5 Critical Steps? &lt;a href=&quot;https://www.slideshare.net/xebialabs/jenkins-user-conference-27508869&quot;&gt;View the slides here&lt;/a&gt;.&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://zeroturnaround.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/Zeroturnaround1.jpg&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ZeroTurnaround help software eat the world faster. Rapidly develop&lt;br&gt;
applications with &lt;a href=&quot;https://zeroturnaround.com/software/jrebel/?src=jucpaloalto2013&quot;&gt;JRebel&lt;/a&gt; and continuously deliver them with &lt;a href=&quot;https://zeroturnaround.com/software/liverebel/?src=jucpaloalto2013&quot;&gt;LiveRebel&lt;/a&gt;.&lt;br /&gt;
&lt;/br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;-5&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#-5&quot; /&gt;+&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt; &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;-6&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#-6&quot; /&gt;+&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Silver Sponsors&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://www.appdynamics.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/AD_cl_H_RGB.png&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://confreaks.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/Confreaks.png&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://www.liferay.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/LIFERAY_COLOR_LARGE_BACKGROUND_WHITE.png&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.blogger.com/null&quot; class=&quot;bare&quot;&gt;https://www.blogger.com/null&lt;/a&gt;https://www.soasta.com/[&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/SOASTA_ProfilePic_LinkedIn.jpg&quot; alt=&quot;image&quot; /&gt;]&lt;/span&gt;&lt;/strong&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;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/11/25/summary-report-git-repository-disruption-incident-of-nov-10th/</id>
<title>Summary Report: Git Repository Disruption Incident of Nov 10th</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-11-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/11/25/summary-report-git-repository-disruption-incident-of-nov-10th/" />
<author>
<name>kohsuke</name>
</author>
<category term='infrastructure'></category>
<category term='news'></category>
<summary>
As reported in various places, there was an incident in early November where commits in our Git repositories have become misplaced temporarily by accident. By the mid next week we were able to resurrect all the commits and things are back to normal now.


As there are many confusions and misunderstandings in people&#8217;s commentary, we wrote this post to clarify what exactly happened and what we are doing to prevent this.


Timeline


In the early morning of Nov 10th 2013, one of the 680 Jenkins developers had mistakenly launched Gerrit with a partially misconfigured Gerrit replication plugin, while pointing Gerrit to his local...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As &lt;a href=&quot;https://news.ycombinator.com/item?id=6713742&quot;&gt;reported&lt;/a&gt; in &lt;a href=&quot;https://www.reddit.com/r/programming/comments/1qefox/jenkins_developers_accidentally_do_git_push_force/&quot;&gt;various places&lt;/a&gt;, there was an incident in early November where commits in our Git repositories have become misplaced temporarily by accident. By the mid next week we were able to resurrect all the commits and things are back to normal now.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As there are many confusions and misunderstandings in people’s commentary, we wrote this post to clarify what exactly happened and what we are doing to prevent this.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;timeline&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#timeline&quot; /&gt;Timeline&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the early morning of Nov 10th 2013, one of the 680 Jenkins developers had mistakenly launched &lt;a href=&quot;https://code.google.com/p/gerrit/&quot;&gt;Gerrit&lt;/a&gt; with a partially misconfigured &lt;a href=&quot;https://gerrit-documentation.googlecode.com/svn/Documentation/2.3/config-replication.html&quot;&gt;Gerrit replication plugin&lt;/a&gt;, while pointing Gerrit to his local directory that contains 186 Git repositories cloned from &lt;a href=&quot;https://github.com/jenkinsci/&quot;&gt;the Github Jenkins organization&lt;/a&gt;. These repositories were checked out about 2 months ago and weren’t kept up to date. Gerrit replication plugin had then tried to “replicate” his local repositories back to GitHub, which it considers mirrors, by doing the equivalent of “&lt;a href=&quot;https://www.kernel.org/pub/software/scm/git/docs/git-push.html&quot;&gt;git push --force&lt;/a&gt;” instead of regular push. Unfortunately, Gerrit replication plugin defaults to a forced push, which is the opposite of what Git normally does. The replication also happens automatically, which is why this mistake has impacted so many repositories in such a short time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a result, these repositories have their branch heads rewound to point to older commits, and in effect the newer commits were misplaced after the bad git-push.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When we say commits were &quot;misplaced&quot;, this is an interesting limbo state that’s worth an explanation for people who don’t use Git. A Git commit is identified by its SHA1 hash, and these objects will never get overwritten. So the misplaced commits are actually very much on the server intact. What was gone was the pointer that associates a human-readable branch name (such as &quot;rc&quot;) to the latest commit on the branch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By Nov 10th 12:54pm GMT, multiple developers had &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/-myjRIPcVwU/qOAqXGaRioIJ&quot;&gt;noticed this&lt;/a&gt;, and within several hours, we &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/-myjRIPcVwU/t4nkXONp8qgJ&quot;&gt;figured out&lt;/a&gt; what happened. From Gerrit log files and with the help of GitHub technical support, he was able to figure out all the affected repositories, and later &lt;a href=&quot;https://github.com/jenkinsci/backend-git-pushf-finder&quot;&gt;an independent script&lt;/a&gt; was written to &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/Lj_mPb7jMmo/qf_pdQVBHZUJ&quot;&gt;verify the accuracy&lt;/a&gt; of this list.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of the Jenkins developers were closely following this development, and were able to restore branches to point to correct commits by simply pushing their up-to-date local workspaces back into the official repositories. Git makes it very easy to do this, and most of the popular plugins affected were restored in this manner within 24 hours.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the same time, we needed to systematically restore all the affected repositories, to make sure that we have not lost anything. For this, we contacted GitHub and asked for their help, and they were &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/-myjRIPcVwU/6JVpAwau37AJ&quot;&gt;able to mostly restore branch heads&lt;/a&gt; to their correct positions. We have also independently developed a script to find out exactly what commits branch heads should be pointing to, based on the &lt;a href=&quot;https://developer.github.com/v3/activity/events/&quot;&gt;GitHub events API&lt;/a&gt; that exposes the activities to Git repositories. This script &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/Lj_mPb7jMmo/3N7AVQQed70J&quot;&gt;found a dozen or so branches&lt;/a&gt; that fell through the cracks of GitHub support, and we have &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/Lj_mPb7jMmo/1f9Bs2TILEQJ&quot;&gt;manually restored those&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;mitigation-in-the-future&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mitigation-in-the-future&quot; /&gt;Mitigation in the future&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The level of support we got from GitHub and our ability to independently verify lost commits and subsequently restore them made us feel good about GitHub, and we have gained confidence in our ability to recover from future incidents.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That said, what happened was a serious disruption, and it’s clear we’d better prepare ourselves both to reduce the chance of accidents like this and increase the ability to recover. To that end, we hope GitHub would expose a configuration option to disable forced ref updates. They &lt;a href=&quot;https://enterprise.github.com/help/articles/disable-force-pushes&quot;&gt;already do this&lt;/a&gt; on GitHub Enterprise after all. Dariusz &lt;a href=&quot;https://groups.google.com/d/msg/jenkinsci-dev/dD-sumd81pU/usnd7M77JvUJ&quot;&gt;pointed out&lt;/a&gt; that CollabNet takes this one step further and offers &lt;a href=&quot;https://blogs.collab.net/git/protect-git-history&quot;&gt;ability to track deleted branches, tags, and forced updates&lt;/a&gt;. Something like that would have made the recovery a lot easier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are going to make two improvements to our process so that we can recover from this kind of problems more easily in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Firstly, we’ll develop a script that continuously records the ref update events across the GitHub Jenkins organization. This will accurately track which branch/tag is created/updated/deleted by who. In case of an incident like this one, we can use this log to roll back the problematic push more systematically.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Secondly, we’ll allow people to control access to individual Git repositories, as opposed to give them all or nothing access to the entire array of plugin repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins developers decided to continue the current open commit policy despite the incident to preserve &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Document#GovernanceDocument-OurPhilosophy&quot;&gt;our culture&lt;/a&gt;, which helped us navigate through this incident without a single argument nor flame war.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;faq&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#faq&quot; /&gt;FAQ&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;does-everyone-in-the-organization-have-full-commit-privileges-to-all-the-repositories&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#does-everyone-in-the-organization-have-full-commit-privileges-to-all-the-repositories&quot; /&gt;Does everyone in the organization have full commit privileges to all the repositories?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yes, with some exceptions. To encourage co-maintenance of plugins by different people, and to reduce the overhead of adding and removing people from our 1100+ repositories, we use one team that gives access to most repositories, and put committers in this team.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;i-prevent-forced-push-in-my-git-repositories-im-safe-from-this-trouble-right&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#i-prevent-forced-push-in-my-git-repositories-im-safe-from-this-trouble-right&quot; /&gt;I prevent forced push in my Git repositories. I’m safe from this trouble, right?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No, unfortunately something like this &lt;a href=&quot;https://bugs.eclipse.org/bugs/show_bug.cgi?id=361707&quot;&gt;can still happen to you&lt;/a&gt;, as you can also accidentally delete branches. If you want to learn from our mistakes, you should definitely enable server-side &lt;a href=&quot;https://www.kernel.org/pub/software/scm/git/docs/git-reflog.html&quot;&gt;reflog&lt;/a&gt;, to track ref updating activities. “git config core.logAllRefUpdates true” on the server will enable this.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cant-you-just-have-people-with-up-to-date-copy-push-their-repos-and-fix-it&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cant-you-just-have-people-with-up-to-date-copy-push-their-repos-and-fix-it&quot; /&gt;Can’t you just have people with up-to-date copy push their repos and fix it?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is indeed how some of the repositories got fixed right away, where some individuals are clearly in charge and are known to have the up-to-date local repositories. But this by itself was not sufficient for an incident of this magnitude. Some repositories are co-maintained by multiple people, and none of them are certain if he/she was the last one to push a change. Many plugin developers just scratch their own itch and do not closely monitor the Jenkins dev list. We needed to systematically ensure that all the commits are intact across all the branches in all the affected repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cant-you-just-roll-back-the-problematic-change&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cant-you-just-roll-back-the-problematic-change&quot; /&gt;Can’t you just roll back the problematic change?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most mistakes in Git can be rolled back, but unfortunately ref update is the one operation in Git that’s not version controlled. As such Git has no general-purpose command to roll back arbitrary push operation. The closest equivalent is reflog, which offers the audit trail that Git offers for resolving those cases. But that requires direct access on the server, which is not available on GitHub. But yes, this problem would not have happened if we were hosting our own Git repositories, or using Subversion for example.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/11/20/juc-call-for-volunteers-to-join-the-organizing-committee-and-venues/</id>
<title>JUC: Call for Volunteers to Join the Organizing Committee (and Venues!)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-11-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/11/20/juc-call-for-volunteers-to-join-the-organizing-committee-and-venues/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='juc'></category>
<summary>
This is a guest post from Alyssa Tong, who drives JUC organizations around the world.



If you missed JUC Palo Alto on Oct 23, 2013 the videos are now available.


We are off to planning JUC 2014. It is hard to believe this will be the 4th annual JUC in the Bay Area. The growth in the Jenkins community since the first JUC is astounding.


Every year we are in search of a larger venue to accommodate the larger crowd. For 2014, the challenge of finding a venue for a capacity of 500+ attendees at a low cost will prove even more daunting....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a guest post from Alyssa Tong, who drives JUC organizations around the world.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you missed JUC Palo Alto on Oct 23, 2013 the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-palo-alto-abstracts.cb&quot;&gt;videos are now available&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are off to planning JUC 2014. It is hard to believe this will be the 4th annual JUC in the Bay Area. The growth in the Jenkins community since the first JUC is astounding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every year we are in search of a larger venue to accommodate the larger crowd. For 2014, the challenge of finding a venue for a capacity of 500+ attendees at a low cost will prove even more daunting. We would love to hear your suggestions for low cost venues (in the Bay Area) so that we may continue to keep entry cost low while providing convenience and the highest level of Jenkins education to attendees. Please send suggestion(s) to &lt;a href=&quot;mailto:events@lists.jenkins-ci.org&quot;&gt;events@lists.jenkins-ci.org&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are proud to launch the call for volunteers to join the JUC organizing committee (OC). If you are interested in shaping the 4th edition of this great event, please send email to &lt;a href=&quot;mailto:events@lists.jenkins-ci.org&quot;&gt;events@lists.jenkins-ci.org&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We encourage you to share this blog within your network in case other people
would be interested in joining the JUC OC or have ideas for a great JUC 2014 location.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/11/17/dkim-and-spf-deployed/</id>
<title>DKIM and SPF deployed</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-11-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/11/17/dkim-and-spf-deployed/" />
<author>
<name>kohsuke</name>
</author>
<category term='infrastructure'></category>
<category term='mailing list'></category>
<summary>
In the hope of streamlining account creation e-mail delivery and mailing list moderations, I have deployed SPF and DKIM over the weekend for e-mails coming out of @jenkins-ci.org, which includes account applications, Confluence, and JIRA.


I&#8217;ve also used this opportunity to switch back the sender of JIRA notifications to noreply@jenkins-ci.org. It was originally this way, then changed to jenkinsci-no-reply@googlegroups.com when someone complained (on what ground I do not remember any more.)


To the degree that I have tested the setup, it is working correctly, but if you notice anything strange, please let me know....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the hope of streamlining account creation e-mail delivery and mailing list moderations, I have deployed &lt;a href=&quot;https://en.wikipedia.org/wiki/Sender_Policy_Framework&quot;&gt;SPF&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail&quot;&gt;DKIM&lt;/a&gt; over the weekend for e-mails coming out of &lt;code&gt;@jenkins-ci.org&lt;/code&gt;, which includes account applications, Confluence, and JIRA.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve also used this opportunity to switch back the sender of JIRA notifications to &lt;code&gt;noreply@jenkins-ci.org&lt;/code&gt;. It was originally this way, then changed to &lt;code&gt;jenkinsci-no-reply@googlegroups.com&lt;/code&gt; when someone complained (on what ground I do not remember any more.)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To the degree that I have tested the setup, it is working correctly, but if you notice anything strange, please let me know.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/11/08/jenkins-scalability-summit-recap/</id>
<title>Jenkins Scalability Summit Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-11-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/11/08/jenkins-scalability-summit-recap/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
+  +


The day after Jenkins User Conference, we held a smaller meet-up of serious large-scale Jenkins users dubbed as "Jenkins Scalability Summit".


In this Open Space Technology style event, we went over war stories from users. Just to show the degree of seriousness, some of those people run 1500+ agents, and others run Jenkins in HA configuration with a data center fail over! We then picked various topics in the afternoon and discussed what people would like to see to make Jenkins scale further. Slides and raw notes from this meeting is available here.


The event allowed me to rethink and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Scale_(anatomy)&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Lepidoptera_wing.jpg/220px-Lepidoptera_wing.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The day after &lt;a href=&quot;https://jenkins-ci.org/content/jenkins-user-conference-completely-full&quot;&gt;Jenkins User Conference&lt;/a&gt;, we held a smaller meet-up of serious large-scale Jenkins users dubbed as &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/126595572/&quot;&gt;&quot;Jenkins Scalability Summit&quot;&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this &lt;a href=&quot;https://en.wikipedia.org/wiki/Open_Space_Technology&quot;&gt;Open Space Technology&lt;/a&gt; style event, we went over war stories from users. Just to show the degree of seriousness, some of those people run 1500+ agents, and others run Jenkins in HA configuration with a data center fail over! We then picked various topics in the afternoon and discussed what people would like to see to make Jenkins scale further. Slides and raw notes from this meeting is &lt;a href=&quot;https://bit.ly/jss13&quot;&gt;available here&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The event allowed me to rethink and revisit what I thought we should do in coming days in the area of scalability.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The event was far more popular than we anticipated originally, and we had to turn down many folks. So I’m going to do a webinar to go over what we did, and what we talked about. If you are interested in this area, and want to see what’s being considered and provide your thoughts, please join us on &lt;a href=&quot;https://www.cloudbees.com/webinars/jenkins-scalability-summit-recap.cb&quot;&gt;Nov 19th 10am PT&lt;/a&gt;.&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/2013/10/18/jenkins-user-conference-is-completely-full/</id>
<title>Jenkins User Conference is completely full!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-10-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/10/18/jenkins-user-conference-is-completely-full/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
(This is a guest post by Alyssa Tong, the lead coordinator of Jenkins User Conference)


Our 3rd annual Jenkins User Conference in the Bay Area being held next Wednesday in Palo Alto is booked fully to the capacity and we couldn’t be more excited for this event! It’s going to be an amazing day of learning, talking to technology experts, networking with other Jenkins users, seeing cool demos and finding out how you can contribute to the Jenkins open source projects.


This event is being held at the Oshman Jewish Community Center and registration begins at 8am. There will be breakfast and...
</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://jenkins-ci.org/sites/default/files/images/alyssa.jpg&quot; alt=&quot;image&quot; width=&quot;150&quot; height=&quot;150&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(This is a guest post by Alyssa Tong, the lead coordinator of Jenkins User Conference)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-palo-alto.cb&quot;&gt;3rd annual Jenkins User Conference in the Bay Area&lt;/a&gt; being held next Wednesday in Palo Alto is booked fully to the capacity and we couldn’t be more excited for this event! It’s going to be an amazing day of learning, talking to technology experts, networking with other Jenkins users, seeing cool demos and finding out how you can contribute to the Jenkins open source projects.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This event is being held at the &lt;a href=&quot;https://www.paloaltojcc.org/&quot;&gt;Oshman Jewish Community Center&lt;/a&gt; and registration begins at 8am. There will be breakfast and plenty of coffee to get you caffeinated. Welcoming announcement will begin sharply at 9am and the keynote address follows shortly after. We’re so excited to have &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-palo-alto.cb&quot;&gt;thirteen sponsors&lt;/a&gt; investing in and supporting the Jenkins community in this continuous integration space.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;New this year, there will be BoF sessions so be sure to sign up for your preferred discussion at check-in. Or suggest a topic by leaving your suggestion in the comments section below. Let us know what Jenkins topic(s) is near and dear to your heart.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For those who missed out on purchasing your ticket or are unable to attend, we are happy to offer the &lt;a href=&quot;https://www.eventbrite.com/event/8328596055&quot;&gt;live stream&lt;/a&gt; of Track 1. You can choose to watch the entire track or just specific session(s). Either way don’t forget to chat and tweet. We will also tweet live from the conference so you can follow along that way as well. Follow @jenkinsconf for the latest updates.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you to everyone for making this sold-out event possible.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Can’t wait to see everyone on Wednesday!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;— Alyssa&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;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/10/09/meet-the-community-in-juc/</id>
<title>&quot;Meet the community&quot; in JUC</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-10-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/10/09/meet-the-community-in-juc/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
(This is a guest post from Owen B. Mehegan aka autojack)





The Jenkins User Conference - Palo Alto is coming up on October 23rd! The schedule for talks is full, but we&#8217;ve been looking for a way to give other members of the Jenkins community some visibility. There are many people who have contributed to the project in various ways, whether it&#8217;s contributing to core, developing plugins, writing documentation or just helping new users.


If this sounds like you, we&#8217;re interested in giving you 10-15 minutes to talk to the rest of the conference attendees! The format is currently undefined and may...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(This is a guest post from Owen B. Mehegan aka autojack)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://commons.wikimedia.org/wiki/Category:Minced_meat&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Minced_beef_meat_cow_cattle_shadow.png/320px-Minced_beef_meat_cow_cattle_shadow.png&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins User Conference - Palo Alto is coming up on October 23rd! The schedule for talks is full, but we’ve been looking for a way to give other members of the Jenkins community some visibility. There are many people who have contributed to the project in various ways, whether it’s contributing to core, developing plugins, writing documentation or just helping new users.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If this sounds like you, we’re interested in giving you 10-15 minutes to talk to the rest of the conference attendees! The format is currently undefined and may be left up to you. You could do a Q&amp;amp;A, talk about features you’ve worked on and why they were important to you, or just offer some &quot;pro tips&quot; that you’ve developed based on your experience. The main point is to help put faces to some of the names in the community, and also help encourage others to contribute themselves! We’re thinking of having these sessions during lunch and the exhibit hour (&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-palo-alto.cb&quot;&gt;see here for the schedule&lt;/a&gt;).&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in this, or know someone else who might be that I could contact, please let me (owen at nerdnetworks dot org) know! If we can get some critical mass around it then we’ll go ahead.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks!&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/2013/10/09/jenkins-at-netflix-juc-speaker-interview/</id>
<title>Jenkins at Netflix / JUC speaker interview</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-10-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/10/09/jenkins-at-netflix-juc-speaker-interview/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<category term='interview'></category>
<category term='juc'></category>
<summary>
(This is a guest post from Gareth Bowles, a Senior Software Engineer at Netflix.)





Jenkins has been a central part of the Netflix build and deploy infrastructure for several years now, and we&#8217;ve been attending and speaking at JUC since it started in 2011. It&#8217;s a great opportunity to meet people who are as passionate about build, test and deployment automation as we are - although as Kohsuke said last year, having all those folks in one place could be dangerous if there&#8217;s an earthquake !


CloudBees and the JUC Organizing Committee have put another great program together this year. We&#8217;ll be...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(This is a guest post from Gareth Bowles, a Senior Software Engineer at Netflix.)&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.cloudbees.com/sites/default/files/juc/juc2013/Palo-Alto-Gareth-Bowles.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has been a central part of the Netflix build and deploy infrastructure for several years now, and we’ve been attending and speaking at JUC since it started in 2011. It’s a great opportunity to meet people who are as passionate about build, test and deployment automation as we are - although as Kohsuke said last year, having all those folks in one place could be dangerous if there’s an earthquake !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;CloudBees and the JUC Organizing Committee have put another great program together this year. We’ll be doing two talks. Justin Ryan and Curt Patrick will present &quot;Configuration as Code: Adoption of the Job DSL Plugin at Netflix&quot;, describing how we’re shifting our users from manual job configuration via the UI, to defining their jobs as Groovy code using the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Job+DSL+Plugin&quot;&gt;Job DSL plugin&lt;/a&gt;. Justin and Curt will describe how Netflix development teams can now create and maintain complex sets of jobs for their projects with the bare minimum of coding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my lightning talk &quot;Managing Jenkins with Jenkins&quot;, I’ll go over how we use Jenkins&#39; system Groovy scripts to maintain and monitor our Jenkins controllers at a scale that couldn’t be achieved with manual processes, and without the overhead of writing custom plugins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As usual, there will be a whole crew of Netflix engineers at JUC this year. If you’re interested in working on build and deployment at Netflix scale, find one of us (we’ll all be wearing Netflix gear) to learn more - we’re hiring !&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.eventbrite.com/event/6367028955&quot;&gt;Register for JUC - October 23 in Palo Alto&lt;/a&gt;. If you can’t make it in person, &lt;a href=&quot;https://www.eventbrite.com/event/8328596055&quot;&gt;register to watch the live stream!&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/09/23/literate-builds-wtf/</id>
<title>Literate builds, WTF?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-09-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/09/23/literate-builds-wtf/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='plugins'></category>
<category term='javaone'></category>
<summary>
(This is a guest post by Stephen Connolly)


Every developer, at some stage, will be handed a project to maintain that somebody else was responsible for. If you are lucky, the developer will not have left the organization yet and you get a brief Knowledge Transfer as the developer packs up their desk before heading on to their new job. If you are unlucky, you don&#8217;t even get given the details of where the source code is hiding.


Now begins the detective work, as you try to figure out how to build and release the project, set up Jenkins jobs to build...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(This is a guest post by Stephen Connolly)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Every developer, at some stage, will be handed a project to maintain that somebody else was responsible for. If you are lucky, the developer will not have left the organization yet and you get a brief Knowledge Transfer as the developer packs up their desk before heading on to their new job. If you are unlucky, you don’t even get given the details of where the source code is hiding.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now begins the detective work, as you try to figure out how to build and release the project, set up Jenkins jobs to build the project and run the tests…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It doesn’t have to be this way, you know!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What if I told you there was a file sitting at the top level that told you exactly how to build the project and do the important things? You’d be interested, wouldn’t you?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I tell you it’s the README file? “But that’s all lies. Nobody keeps that up to date. Argh!!!”&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But what if Jenkins reads the README file and uses it for the build definition? Now you not only have a CI system ensuring that the build definition is correct, but you have less work to do setting up the job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What if, because the build definition is now in Source Control, you can have Jenkins create jobs for each branch with ease? The joy of cheap branches that modern source control systems such as GIT and Mercurial give us, no longer comes with the pain of having to create Jenkins jobs for each branch (and more pain having to remember to tidy up when the branch is gone.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That is the promise delivered by the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Literate+Plugin&quot;&gt;Literate plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-does-it-work&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-does-it-work&quot; /&gt;How does it work?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First of all, because Jenkins will be looking at all your branches, you need a way to tell Jenkins which branches it makes sense to try and build. For example, if your project lives on GitHub, you are unlikely to want the &lt;code&gt;gh-pages&lt;/code&gt; branch to be treated like a branch of your actual code, and there are going to be branches that have a README file, but not one that Jenkins understands, so we will want to ignore them too.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You tell Jenkins that a branch is one to build by putting a marker file in the root of the branch. By default the marker file is called &lt;code&gt;.cloudbees.md&lt;/code&gt;. If the marker file is present and empty, then the literate job type will assume the build instructions are in &lt;code&gt;README.md&lt;/code&gt;. If the marker file is present and has build instructions, then the literate job type will just use those instructions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In order to make it easy to provide the instructions, there is rather minimal formatting requirements for a literate description of a project’s build commands.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The minimal description is just a section with the word &lt;code&gt;build&lt;/code&gt; and a verbatim code block in that section. Here is the obligatory minimal “hello world” project description:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;# Build

    echo hello world&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;or if you don’t like indenting you could use the GitHub style triple-back-tick&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;# Build

```
echo hello world
```&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Part of what makes this a &lt;a href=&quot;https://en.wikipedia.org/wiki/Literate_programming&quot;&gt;literate style&lt;/a&gt; of build description is that you can freely intersperse the description of what and why the commands do with the actual commands, e.g.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;# Build

We will greet the world with our great literate project description

    echo -n &quot;Hello&quot;

Now that we have announced our intention to greet some people, we need to qualify exactly who we are greeting

    echo &quot; world&quot;

That was just perfect. Time for a cup of tea&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first section heading containing the word &lt;code&gt;build&lt;/code&gt; identifies the section that is assumed to be the build instructions. (The keyword that is searched for is configurable, but not yet exposed in the literate plugin’s UI). The following is also a valid &lt;code&gt;README.md&lt;/code&gt; for printing hello world:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;Our super hello world project
=============================

This is a project to say hello to the world

How to build
------------

You can build this project by running the following command:

    echo hello world

Credits
-------

This project would not have been possible without the existence of Assam loose leaf tea.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now this is all very well, but what about if you need different instructions for building on Windows versus on Linux, and for that matter how does Jenkins know where we should build this project. Plus Mr Joe Random needs to know what he needs to install on his machine to build it for himself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first section containing the word &lt;code&gt;environment&lt;/code&gt; identifies the section that contains the details of the environments to run the build on.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;Hello world project
===================

This is a simple hello world literate project

Environment requirements
------------------------

The project is built and tested by Jenkins on the following build environments, so it is known that the build instructions work on the following environments:

* `windows`
* `linux`

How to build
------------

The build instructions are platform dependent:

* On `windows`:

        echo &quot;hello world&quot;

* On `linux`:

        echo hello\ world&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When Jenkins sees bullet points in the &lt;code&gt;environment&lt;/code&gt; section it assumes each bullet point corresponds to an environment to run the build on. Each environment is specified by at least one code snippet which helps define the requirements of the environment. By default Jenkins will look for tool installers with the same name as the labels. If it cannot find any matching tool installers it assumes that the labels are Jenkins agent node labels. (The strategy is pluggable, but not yet exposed in the UI of literate builds)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you have multiple environments on which to build and test, you have two choices on your build instructions. You can either:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Have one and only one set of commands that work on all environments; or&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Have bullet points that cover all the specified environments.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So for example, if you are building on the following environments:&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;windows&lt;/code&gt;, &lt;code&gt;java-1.6&lt;/code&gt;, &lt;code&gt;ant-1.7&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;windows&lt;/code&gt;, &lt;code&gt;java-1.6&lt;/code&gt;, &lt;code&gt;ant-1.8&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;windows&lt;/code&gt;, &lt;code&gt;java-1.7&lt;/code&gt;, &lt;code&gt;ant-1.8&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;linux&lt;/code&gt;, &lt;code&gt;java-1.7&lt;/code&gt;, &lt;code&gt;ant-1.7&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;linux&lt;/code&gt;, &lt;code&gt;java-1.7&lt;/code&gt;, &lt;code&gt;ant-1.8&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;You need to have bullet points in your &lt;code&gt;build&lt;/code&gt; section that can match each of those options, but as long as there is a match for every option you are ok. So for example:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;ANT version finder
==================

Finding out the version of ANT on various platforms

Environments
------------

Nesting bullet points multiplies out the options

* `windows`
    * `java-1.6`
        * `ant-1.6`
        * `ant-1.7`
    * `java-1.7`, `ant-1.8`
* `linux`, `java-1.7`
    * `ant-1.7`
    * `ant-1.8`

Build
-----

The first match with the highest number of matches wins, so we want windows to get special treatment:

* `windows`

        call ant.bat -version

* `java-1.7`

        ant -version

We could have picked `linux` for the above if we wanted, but this matching will have the same effect and better illustrates how matching works.&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That is a mostly complete detail of how the &lt;code&gt;build&lt;/code&gt; and &lt;code&gt;environment&lt;/code&gt; sections work. In general everything except verbatim code blocks and bullet points with code snippets get ignored.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are other sections that the literate project type allows for, these are called “task” sections. We haven’t written the code to support them yet, but the idea is that these will work a bit like basic build promotions with the promoted builds plugin. There will be a UI in Jenkins that lets you kick off any of the task sections that you define as being valid for the job type, in pretty much exactly the same was as the promoted builds plugin works.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After that, everything else in the &lt;code&gt;README.md&lt;/code&gt; is ignored.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-do-i-get-the-test-results-into-jenkins&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-get-the-test-results-into-jenkins&quot; /&gt;How do I get the test results into Jenkins?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is not just about build and test. A lot of the utility in Jenkins comes from the additional reporting plugins that are available for Jenkins. (The build step ones are less relevant with literate style projects because you want to give people consuming the content instructions they can also follow)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So there is additional metadata about your project that you want to give to Jenkins. We put that metadata into a folder called &lt;code&gt;.jenkins&lt;/code&gt; in the root of your source control.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are two levels of integration that a Publisher/Notifier can have with the literate project type. The first level is a basic XML description of the plugin configuration. If you have ever looked at the &lt;code&gt;config.xml&lt;/code&gt; of a Jenkins job, you will be familiar with this format.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If we have a Maven project and we want to collect the Unit test results in Jenkins we might have a &lt;code&gt;README.md&lt;/code&gt; like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;Maven project with tests
========================

Environments
------------

* `java-1.7`, `maven-3.0.5`

Build
-----

```
mvn clean verify
```&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And then we create a &lt;code&gt;.jenkins/hudson.tasks.junit.JUnitResultArchiver.xml&lt;/code&gt; file with the following:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;&amp;lt;hudson.tasks.junit.JUnitResultArchiver&amp;gt;
  &amp;lt;testResults&amp;gt;**/target/surefire-reports/*.xml, **/target/failsafe-reports/*.xml&amp;lt;/testResults&amp;gt;
  &amp;lt;keepLongStdio&amp;gt;true&amp;lt;/keepLongStdio&amp;gt;
  &amp;lt;testDataPublishers/&amp;gt;
&amp;lt;/hudson.tasks.junit.JUnitResultArchiver&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The literate plugin adds an Action to all Free-style projects that allows exporting these XML configuration snippets in a &lt;code&gt;.zip&lt;/code&gt; file for unpacking into your project’s source control. Each publisher/notifier has its own file, so it should be easy to mix and match configuration across different projects and enable/disable specific publishers just by adding/removing each publisher’s file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The XML itself can be a bit ugly, so there is a second level integration, where a Publisher/Notifier plugin can implement its own DSL. The literate plugin ships with two such DSLs. One for archiving artifacts and the other for JUnit test results. So the above XML file could be replaced by a &lt;code&gt;.jenkins/junit.lst&lt;/code&gt; file with the following contents&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;**/target/surefire-reports/*.xml
**/target/failsafe-reports/*.xml&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;not-everything-makes-sense-in-source-control-though&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#not-everything-makes-sense-in-source-control-though&quot; /&gt;Not everything makes sense in source control though…​&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are always going to be things that you need to configure in Jenkins. So for example there may be some sources of branches that you don’t trust. A good example would be pull requests on GitHub. We have a concept of branch properties in the literate project type that will allow defining what exactly a trusted branch source should be allowed do and what an untrusted branch source should be allowed do. It does not make sense for that information to be embedded within the untrusted branch itself.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Similarly coordination between different Jenkins projects is something that does not make sense in source control. The names of those Jenkins projects (and even their existence) is not knowable from source control. It does not make sense to keep that information in source control.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Information about how to map the description of the build environment in the &lt;code&gt;README.md&lt;/code&gt; file to the build environments available to Jenkins does not make sense in source control because your Jenkins node configuration details may change over time.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In other words, literate projects do not remove the need to configure things in Jenkins. They do however remove a lot of the need, and especially the need to tweak the exact build commands and the location of where build results should be picked up from.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;whats-not-done-yet&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#whats-not-done-yet&quot; /&gt;What’s not done yet?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here is a list of some things I want to see for literate builds:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A literate build step so that people can use some of the literate magic in their free-style projects while they migrate them to literate-style&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for literate task promotion flows (I think Kohsuke has signed up to help deliver this)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exposing the configuration points such as the marker file name (a global config option as well as per-project override) and the keywords to search for in the &lt;code&gt;README.md&lt;/code&gt; (this is mostly UI work)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding in some support for other markup languages (I’d really like to see AsciiDoc formatted README parsing, e.g. &lt;code&gt;README.asc&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Branch properties for untrusted builds (to do things like restrict the build execution to one explicit environment, put an elastic build timeout in place, wrap the shell commands in a chroot jail, etc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Branch properties for build secrets (So that the &lt;code&gt;production&lt;/code&gt; and &lt;code&gt;staging&lt;/code&gt; branches can get the keys to deploy into their respective environments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Collapsing the intermediate level in the UI when there is only one build environment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Eliminating the double SCM checkout when the backing SCM supports the &lt;code&gt;SCMFileSystem&lt;/code&gt; API so that builds work even faster&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reusing the GIT repository cache when using GIT branch sources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some nicer integration with GitHub (I have most of this done, but I think it would be irresponsible to release this without having the Untrusted branch properties implemented as otherwise Pull Requests could become a vector for abuse)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finishing the support for Subversion credentials migration from the legacy credentials storage mechanism to the new Credentials plugin storage mechanism (not strictly literate project related, but Subversion is still a popular SCM and until this gets done we cannot release a version of the Subversion plugin with literate project support)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding nice DSLs for all the Publishers and Notifiers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding SCM support to all the SCM plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adding branch property support for the Build Wrapper / Build Environment / Job Property plugins where that makes sense.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Having said all that, the core functionality works right now for GIT/Subversion/Mercurial on Jenkins 1.509+, and it is only by playing with this functionality that you can see how this could change the way you use Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;how-do-i-try-this-out-myself&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-do-i-try-this-out-myself&quot; /&gt;How do I try this out myself&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week Kohsuke set up a new “Experimental” update center in Jenkins OSS. The reason for this new update center is that we have a lot of (potentially disruptive) changes to many plugins and if we started cutting releases, users may get annoyed if they end up upgrading to these plugins until they have all been better tested.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The “Experimental” update center includes plugins that have &lt;code&gt;alpha&lt;/code&gt; or &lt;code&gt;beta&lt;/code&gt; in their version number, while the other update centers now exclude those plugin versions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So if you want to play with these plugins you need to change your Jenkins instance’s update center URI to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;https://updates.jenkins-ci.org/experimental/update-center.json&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would recommend that you use a test Jenkins instance for playing with.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(WARNING: shameless plug) You could also just fire up a Jenkins in the cloud using CloudBee’s DEV@cloud service and follow &lt;a href=&quot;https://developer-blog.cloudbees.com/2013/09/how-to-try-literate-builds-on-devcloud.html&quot;&gt;these handy instructions&lt;/a&gt; to enable access to the experimental plugins:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 10 best bug reports on literate builds before the Jenkins User Conference next month will receive a prise from CloudBees, Inc. I was able to get a commitment that the prise would be at least a T-shirt. I am hoping to get some more swag added to the prize pool. CloudBees employees or relatives of CloudBees employees are not eligible for the bug report prise!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/09/16/continuous-information-jenkins-newsletter-vol-5/</id>
<title>Continuous Information - Jenkins Newsletter vol. 5</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-09-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/09/16/continuous-information-jenkins-newsletter-vol-5/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<summary>
The latest edition of Continuous Information is out for your reading pleasure.
Highlights:




Health Check-up for Jenkins: Kohsuke’s Tips on Keeping Jenkins Happy


Jenkins continues to take over the world, with more than 65,000 active installations and more than 800 plugins


Events: Jenkins User Conference – 10/23 in Palo Alto, CA (use discount code BEE-JUC); Jenkins Scalability Summit 10/24; and more


Jenkins made the SD Times 2013 Top 100!


What’s new in Jenkins? The hottest new Jenkins improvements…


How to build your own Jenkins Traffic Light




Read the whole newsletter, and then sign up to receive it directly when it comes out.
PS - We love contributions to Continuous...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://pages.cloudbees.com/index.php/email/emailWebview?mkt_tok=3RkMMJWWfF9wsRonvanBZKXonjHpfsX%2B4%2B0uT%2Frn28M3109ad%2BrmPBy82IoIWp8na%2BqWCgseOrQ8kFQLV9C%2BRs0Vq6c%3D&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://pages.cloudbees.com/rs/cloudbees/images/CBMasthead.jpg&quot; alt=&quot;image&quot; width=&quot;576&quot; height=&quot;152&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latest edition of Continuous Information is out for your reading pleasure.&lt;br&gt;
Highlights:&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Health Check-up for Jenkins: Kohsuke’s Tips on Keeping Jenkins Happy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins continues to take over the world, with more than 65,000 active installations and more than 800 plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Events: Jenkins User Conference – 10/23 in Palo Alto, CA (use discount code BEE-JUC); Jenkins Scalability Summit 10/24; and more&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins made the SD Times 2013 Top 100!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What’s new in Jenkins? The hottest new Jenkins improvements…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to build your own Jenkins Traffic Light&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://pages.cloudbees.com/index.php/email/emailWebview?mkt_tok=3RkMMJWWfF9wsRonvanBZKXonjHpfsX%2B4%2B0uT%2Frn28M3109ad%2BrmPBy82IoIWp8na%2BqWCgseOrQ8kFQLV9C%2BRs0Vq6c%3D&quot;&gt;Read the whole newsletter&lt;/a&gt;, and then &lt;a href=&quot;https://www.cloudbees.com/jenkins/jenkins-ci/jenkins-newsletter.cb&quot;&gt;sign up to receive it directly when it comes out&lt;/a&gt;.&lt;br&gt;
PS - We love contributions to Continuous Information, so if you have a Jenkins tip, trick, or plugin you’d like to feature, please &lt;a href=&quot;mailto:continuous-information@cloudbees.com&quot;&gt;email us&lt;/a&gt;.&lt;/br&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/09/11/behind-the-scenes-of-the-jenkins-user-conference-palo-alto/</id>
<title>Behind the Scenes of the Jenkins User Conference Palo Alto!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-09-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/09/11/behind-the-scenes-of-the-jenkins-user-conference-palo-alto/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='juc'></category>
<summary>
The Jenkins User Conference (JUC) Palo Alto is less than two months away!
The organizing committee, 13 sponsors and 16 speakers have been hard at work coordinating a fun and educational day for the Jenkins community on October 23. Check out the agenda and see for yourself! Speakers are traveling from around the globe to take part in this conference, including a number of usual suspects. Dedicated Jenkins experts are coming in from London, Israel, Estonia, Sweden, Taiwan, Boston, Seattle, Texas and, of course, the local Bay Area.


New this year, we’ll live stream an entire track, courtesy of our Silver sponsor,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Jenkins User Conference (JUC) Palo Alto is less than two months away!&lt;br&gt;
The organizing committee, 13 sponsors and 16 speakers have been hard at work coordinating a fun and educational day for the Jenkins community on October 23. Check out the &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-palo-alto.cb&quot;&gt;agenda&lt;/a&gt; and see for yourself! Speakers are traveling from around the globe to take part in this conference, including a number of usual suspects. Dedicated Jenkins experts are coming in from London, Israel, Estonia, Sweden, Taiwan, Boston, Seattle, Texas and, of course, the local Bay Area.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;New this year, we’ll live stream an entire track, courtesy of our Silver sponsor, &lt;a href=&quot;https://confreaks.com/&quot;&gt;Confreaks&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In keeping with tradition, every year we create a one-of-a-kind Jenkins t-shirt for JUC attendees. This year we are sticking with the ever-popular landmark of Palo Alto, Stanford University. And we are going bright…hope you like (Jenkins) red!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/9725574061/&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm6.staticflickr.com/5322/9725574061_d41998193e_n.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are always on the look out for unique and creative ideas for Jenkins t-shirt designs. If you have a cool design in mind please send it to &lt;code&gt;events@lists.jenkins-ci.org&lt;/code&gt;. You may just see the Jenkins community wearing your design at next year’s conference.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also check out the great Jenkins collectible that &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;, the Platinum sponsor, is giving out at the CloudBees table (I heard he looks even better in person). Quantity is limited so be sure to pick one up at the CloudBees table. You might have to sing, dance, bark or just complete a survey in exchange for the Jenkins bobble head. Most importantly, don’t forget to have Kohsuke sign it to make it official.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/9725573715/&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm3.staticflickr.com/2878/9725573715_fa056b6652_n.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;JUC isn’t complete without some good BEvERages. Gold sponsor &lt;a href=&quot;https://www.bds.com&quot;&gt;Black Diamond Software&lt;/a&gt; is ponying up a keg of beer after the conference. Leave us a comment (below) about what kind of beer strikes your fancy and it might just be there.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve read this entire blog and have not yet registered to &lt;a href=&quot;https://www.eventbrite.com/event/6367028955&quot;&gt;attend&lt;/a&gt;, here’s additional incentive for you. Use discount code &lt;strong&gt;BEE-JUC&lt;/strong&gt; to get early bird pricing, that’s a $26 saving off the current price of $80. Discount expires October 4, 2013.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As JUC Conference Chair, I am always looking for ways to improve JUC. Leave your comments below on ways we can make this ‘Your’ conference.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to seeing you at JUC on October 23.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alyssa Tong&lt;br&gt;
JUC Conference Chair&lt;/br&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;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/09/09/loader-io-plugin-developer-interview/</id>
<title>Loader.io plugin developer interview</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-09-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/09/09/loader-io-plugin-developer-interview/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='guest post'></category>
<category term='interview'></category>
<category term='plugins'></category>
<summary>
This is a guest post by Mike Rowan, VP R&amp;D at SendGrid.






Q: Tell us a bit about what your service and plugin do. Who is it for? What are the highlights of your plugin?


A: Loader.io is a simple-to-use cloud-based load testing service. The service is designed for developers and people who need to ensure applications are performing as they should. It allows developers to perform large-scale load tests on demand, which lets them understand the scalability and performance of their applications. We realize Jenkins is the preferred build service for a lot of our users, and we know providing a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a guest post by &lt;a href=&quot;https://twitter.com/mikerowan&quot;&gt;Mike Rowan&lt;/a&gt;, VP R&amp;amp;D at SendGrid.&lt;br /&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/loaderio.png&quot; alt=&quot;image&quot; width=&quot;150&quot; height=&quot;150&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Q: Tell us a bit about what your service and plugin do. Who is it for? What are the highlights of your plugin?&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A: &lt;a href=&quot;https://loader.io&quot;&gt;Loader.io&lt;/a&gt; is a simple-to-use cloud-based load testing service. The service is designed for developers and people who need to ensure applications are performing as they should. It allows developers to perform large-scale load tests on demand, which lets them understand the scalability and performance of their applications. We realize Jenkins is the preferred build service for a lot of our users, and we know providing a way for them to implement, measure and improve application performance during the continuous build cycle is important. So we wrote a Jenkins plugin that allows load testing to be brought into the continuous build and deployment process with ease.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+
Q: Did you have to convince your boss/lawyers to open-source your plugin? What was the pitch?*&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A: No, at SendGrid our focus is always to help make developers’ lives easier, and when we can, we like to provide tools that they can hack on. Since the Jenkins platform is itself an open source project, following the same model to provide our plugin made perfect sense. In addition, we encourage others to build on our work, help improve it and ultimately make it better for everyone using it.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+
Q: How did you learn how to write a plugin?&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A: We use the Jenkins platform ourselves, and we leverage a number of the plugins available. Having access to these and the Jenkins documentation gave us a great head start. It was an easy decision to write the Jenkins plugin for loader.io, and the Jenkins community provided both detailed instructions as well as support when we needed it.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+
Q: Any gotchas in the experience of developing a plugin that you want to share?&lt;br&gt;
*&lt;/br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A: The overall process of developing the plugin was straightforward and simple, but we did run into some scope creep in the middle of the dev process. We found that since the platform was so easy to write for, it made us keep adding more and more features. Usually this is good, but in the case of our project, we wanted to provide the most value as quickly as possible. So we scaled back, focused on solid execution for the most important features, and are already preparing to launch a new version with the things we reserved for post v1 availability.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+
Q: What is the reaction from users so far?&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A: The users we’ve spoken with love the plugin. In addition we’ve already gotten great feedback from some community members on “nice to have’s” in the plugin, some of which we’re already working on.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+
Q: What tips do you share to those who are interested in writing plugins?&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A: If you have a service that provides value in the build, deployment and post deployment process, then you should be writing a Jenkins plugin. Two things are important for anyone writing a plugin: 1) be sure the plugin you’re writing is going to provide true value (if you need it yourself this is a good sign), and 2) make sure you understand the scope of the project and deliver core features and value first, then focus on some extra things. Providing a valuable plugin sooner than later will help you identify all the right additional features to include, especially when collecting live community feedback.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of the things we focused on early in the process were to identify the core features, and more importantly to make it very easy for users of Jenkins to install, use and interpret the loader.io plugin and results. We wanted to allow users to leverage our plugin for multiple environments and builds with system and global credentials. To do this, we decided to make use of the Credentials plugin (&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Credentials+Plugin&quot; class=&quot;bare&quot;&gt;https://wiki.jenkins.io/display/JENKINS/Credentials+Plugin&lt;/a&gt;), which is a heavily-adopted plugin that provides a standardized API for plugins to store and retrieve credentials. This plugin allows our users to add and use different credentials in one single Jenkins environment. In addition, we created a new re-run feature which, when used with continuous build and testing, provides a deep view into the performance of an application over time. Finally, we wanted to bring the same UI experience users have in our environment into Jenkins, which we did by preserving the load test report model and making it function the same in the Jenkins UI. Doing this makes it easy for users to have consistency between the UIs and more easily understand the results regardless of where they’re viewing them.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s very easy to write a Jenkins plugin - I hope these insights will encourage you to write your own.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;ps - We’d love your feedback too. Check out our newly-released &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/loaderio&quot;&gt;Jenkins plugin&lt;/a&gt; for loader.io and let us know what you think.&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/09/05/extreme-feedback-lamp-switch-gear-style/</id>
<title>Extreme Feedback Lamp, Switch Gear style</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-09-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/09/05/extreme-feedback-lamp-switch-gear-style/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='guest post'></category>
<category term='news'></category>
<summary>
This is a guest post by Aske Olsson


Extreme feedback is an incredibly powerful way to drive quality and accelerate your developer fast feedback loop.


Having eXtreme Feedback Devices (XFDs) hooked up to your Jenkins jobs gives everyone on your team instant insight into the current software state. At customer after customer we&#8217;ve seen extreme feedback devices drive significant incremental productivity gains, so about a year ago we started talking about taking the concept mainstream and making it easily available to any development team. So, as a small side-project, we&#8217;ve decided to scratch our own itch and developed an easy-to-deploy, Linux-based, laser-cut,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a guest post by &lt;a href=&quot;https://twitter.com/dvaske&quot;&gt;Aske Olsson&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Extreme feedback is an incredibly powerful way to drive quality and accelerate your developer fast feedback loop.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Having eXtreme Feedback Devices (XFDs) hooked up to your Jenkins jobs gives everyone on your team instant insight into the current software state. At customer after customer we’ve seen extreme feedback devices drive significant incremental productivity gains, so about a year ago we started talking about taking the concept mainstream and making it easily available to any development team. So, as a small side-project, we’ve decided to scratch our own itch and developed an easy-to-deploy, Linux-based, laser-cut, extreme feedback device, specifically designed for Jenkins. It infers a feeling of urgency when the build is broken, and a better sense of a achievement once the problem is fixed. Just connect the XFD to your network, install the &quot;extreme feedback plugin&quot; on your Jenkins server and configure which jobs to feedback extremely.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the Jenkins Code Camp in Copenhagen today (with Kohsuke) we’ve made the lamp speak the name of the developer who broke the build :), improved the plugin’s UI in Jenkins, and gotten the lamp’s display to list all the developers who contributed to the last change. Of course you can contribute too, just fork the repositories at &lt;a href=&quot;https://github.com/switchgears/extremefeedbacklamp&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://github.com/switchgears/extreme-feedback-plugin&quot;&gt;here&lt;/a&gt; and create a pull request.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in trying out extreme feedback in your own team you can order &lt;a href=&quot;https://web.archive.org/web/20180826231109/https://gitgear.com/xfd/&quot;&gt;your own XFD lamp&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/9680919806/&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3665/9680919806_6bbe719e99_z.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&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/2013/08/01/2-version-control-plugins-in-beta-testing-before-a-major-release/</id>
<title>2 version control plugins in beta testing before a major release</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-08-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/08/01/2-version-control-plugins-in-beta-testing-before-a-major-release/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='releases'></category>
<category term='jenkinsci'></category>
<summary>
Git plugin and TFS plugin are calling for interested parties to try out their 2.0 beta binaries before they get released.


Git plugin 2.0 contains a major refactoring and UI simplifications, and TFS plugin contains a rewritten polling logic that does not require a workspace.


If you think you&#8217;d benefit from these changes, please head to their respective beta testing page and try out the new bits, while we can still change them....
</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://upload.wikimedia.org/wikipedia/commons/4/49/Testing22222.jpg&quot; alt=&quot;image&quot; width=&quot;150&quot; height=&quot;160&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Git+plugin+2.0+beta+testing&quot;&gt;Git plugin&lt;/a&gt; and &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/TFS+plugin+2.0+beta+testing&quot;&gt;TFS plugin&lt;/a&gt; are calling for interested parties to try out their 2.0 beta binaries before they get released.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Git plugin 2.0 contains a major refactoring and UI simplifications, and TFS plugin contains a rewritten polling logic that does not require a workspace.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you think you’d benefit from these changes, please head to their respective beta testing page and try out the new bits, while we can still change them.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/07/31/jenkins-user-conference-palo-alto-2013/</id>
<title>Jenkins User Conference Palo Alto 2013</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-07-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/07/31/jenkins-user-conference-palo-alto-2013/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
Jenkins User Conference is back to California again!


Just like the last two years, this full day event packs talks from Jenkins developers and users, and it would be a great opportunity for Jenkins users to get to know each other and share their experiences.


The agenda is already posted, covering everything from robotics to mobile developments, effective management of Jenkins instances to branching techniques. I&#8217;m personally looking forward to a number of talks from serious large-scale users, and JUC Israel was of any indication, it&#8217;d be a great opportunity to get feedback from people.


This year, we are moving the event to...
</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://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Palo_Alto%2C_CA_welcome_sign.JPG/180px-Palo_Alto%2C_CA_welcome_sign.JPG&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins User Conference is back to California again!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just like the last two years, this full day event packs talks from Jenkins developers and users, and it would be a great opportunity for Jenkins users to get to know each other and share their experiences.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-palo-alto.cb&quot;&gt;The agenda is already posted&lt;/a&gt;, covering everything from robotics to mobile developments, effective management of Jenkins instances to branching techniques. I’m personally looking forward to a number of talks from serious large-scale users, and &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-israel.cb&quot;&gt;JUC Israel&lt;/a&gt; was of any indication, it’d be a great opportunity to get feedback from people.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, we are moving the event to a weekday (Oct 23rd) to see if it helps or hurts the attendance. Similarly, the event is now in Palo Alto, as opposed to San Francisco. The site also happens to be a former Sun Microsystems headquarter, a place of some nostalgic value to me.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am also very happy to see a number of active community members &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-palo-alto.cb&quot;&gt;signing up their employers to sponsor the event&lt;/a&gt;. These will help us manage the cost of the event.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So really, all that’s needed is YOU! &lt;a href=&quot;https://www.eventbrite.com/event/6367028955&quot;&gt;Please register for the event&lt;/a&gt; (I believe the early bird price stays until this Friday), and looking forward to seeing you.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/07/24/jenkins-user-event-in-copenhagen-on-september-6/</id>
<title>Jenkins User Event in Copenhagen on September 6</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-07-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/07/24/jenkins-user-event-in-copenhagen-on-september-6/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='juc'></category>
<summary>
Seize the opportunity to join the Jenkins community!
Just like last year, the Scandinavian Jenkins Conference will be in Copenhagen, Denmark, hosted by Praqma and sponsored by CloudBees, Sony, Switch::Gears, and PRQA. The open source community will gather on September 6th for a full day of networking and knowledge sharing at The Department of Computer Science at The University of Copenhagen.

Based on last year&#8217;s success, Jenkins developers, architects, business managers, etc. from all over the world will gather to exchange experiences and promote the open source platform. As a special feature the conference will include an opening keynote from Jenkins founder...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Seize the opportunity to join the Jenkins community!&lt;br&gt;
Just like last year, the &lt;a href=&quot;https://www.praqma.com/tags/jenkins-ci-user-event-2013&quot;&gt;Scandinavian Jenkins Conference&lt;/a&gt; will be in Copenhagen, Denmark, hosted by Praqma and sponsored by CloudBees, Sony, Switch::Gears, and PRQA. The open source community will gather on September 6th for a full day of networking and knowledge sharing at The Department of Computer Science at The University of Copenhagen.&lt;br&gt;
&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://dikutal.dk/sites/default/files/diku-2006-06-02.jpg&quot; alt=&quot;Conference Site&quot; width=&quot;400&quot; /&gt;&lt;br&gt;
Based on last year’s success, Jenkins developers, architects, business managers, etc. from all over the world will gather to exchange experiences and promote the open source platform. As a special feature the conference will include an opening keynote from Jenkins founder &lt;a href=&quot;https://www.cloudbees.com/company-team.cb#KohsukeKawaguchi&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; as well as other industry pioneers, who will take the podium to present findings within the latest technology, best practice, hand-on experiences, etc.&lt;br&gt;
To get updates on the conference &lt;a href=&quot;https://www.praqma.com/stories/jci13blog&quot;&gt;follow the JCI13Blog&lt;/a&gt; where you can view the latest news on venue and speakers.&lt;br /&gt;
&lt;/br&gt;&lt;/br&gt;&lt;/span&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/07/24/faster-slave-classloading/</id>
<title>Faster agent classloading</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-07-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/07/24/faster-slave-classloading/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<summary>
+ 


Jenkins comes with the remoting library that it uses to communicate between a controller and agents. This is a pretty awesome library, I think, which served us well.


One of the things this remoting layer does it to transfer the Java byte code on demand from the controller to agents on demand. This approach helps us keep agent deployment simple, as you don&#8217;t have to keep the controller and all the agents in sync, but it also made the agent start-up slower, because none of the byte code loaded to agents are kept around. It was all forgotten once the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Chloride&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Calcium_chloride_CaCl2.jpg/320px-Calcium_chloride_CaCl2.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins comes with &lt;a href=&quot;https://github.com/jenkinsci/remoting&quot;&gt;the remoting library&lt;/a&gt; that it uses to communicate between a controller and agents. This is a pretty awesome library, I think, which served us well.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the things this remoting layer does it to transfer the Java byte code on demand from the controller to agents on demand. This approach helps us keep agent deployment simple, as you don’t have to keep the controller and all the agents in sync, but it also made the agent start-up slower, because none of the byte code loaded to agents are kept around. It was all forgotten once the agent gets disconnected.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When agents are static and stays online for hours, this wasn’t a problem at all. But as more and more agents become elastic (think EC2 or CloudBees DEV@cloud), This delay is becoming more and more noticeable. A similar issue happens when the Maven project type, which uses the same remoting library to talk to the running Maven build.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another related performance bottleneck is the round-trip latency. When your agent is far away from a controller, every classloading would incur a network round-trip, and it can add up quickly. This is because Java classloading abstraction is funamentally chatty.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jesse and I &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/15120&quot;&gt;started seriously thinking about this problem&lt;/a&gt; last year, and we’ve &lt;a href=&quot;https://github.com/jenkinsci/remoting/pull/10&quot;&gt;kept a branch going&lt;/a&gt; to address this problem.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After several trans-atlantic hacking during flights, we were finally able to release this in 1.519.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starting this version, the remoting layer uses a local jar file cache to store jar files that were downloaded from the controller. This pretty much eliminated the need to send class files over the wire.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition, the controller will analyze class files as a agent request them and &quot;push down&quot; information about how related other classes should be loaded by the agent. This speculative &quot;prefetching&quot; saves the agent from making an expensive network round trip to the controller.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://jenkins-ci.361315.n4.nabble.com/Efficient-class-jar-prefetching-in-remoting-td4665943.html&quot;&gt;my benchmark using Maven builds, the prefetching cut the # of roundtrips to about half&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you do a lot of Maven builds, or if you have elastic agents, we highly encourage you to upgrade.&lt;br /&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;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/07/11/jenkins-user-conference-israel-summary/</id>
<title>Jenkins User Conference Israel Summary</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-07-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/07/11/jenkins-user-conference-israel-summary/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
Jenkins User Conference in Israel was held this year on a different venue than the last year, because we have grown! I believe Shlomi Ben-Haim of JFrog said in his opening speech that the attendance has grown more than 50%, despite the ticket price increase.


This year, the event was held at a former Kibbutz turned into an event facility. This was rather fit for Jenkins for both emphasizes the community. The auditorium was big, the sky was bright &amp; clear, and it was a wonderful day. JFrog folks even made a few Jenkins drapes (that I eventually brought back with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-israel.cb&quot;&gt;Jenkins User Conference in Israel&lt;/a&gt; was held this year on a different venue than the last year, because we have grown! I believe Shlomi Ben-Haim of JFrog said in his opening speech that the attendance has grown more than 50%, despite the ticket price increase.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, the event was held at a former Kibbutz turned into an event facility. This was rather fit for Jenkins for both emphasizes the community. The auditorium was big, the sky was bright &amp;amp; clear, and it was a wonderful day. JFrog folks even made a few Jenkins drapes (that I eventually brought back with me, so expect to see them)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/12508267@N00/sets/72157634590095116/&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm4.staticflickr.com/3792/9260327854_40e0e95e48_n.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me, talks like one from Haggai are more interesting, as it shows me how Jenkins works in a domain that I’m not familiar with (in this case, .NET). And if you are Jenkins users, there are all sorts of talks, ranging from talks on CLI/XML interface of Jenkins (stuff for those who are writing tools and scripts that interface with Jenkins) to how someone managed user interface automation testing with Jenkins. Another talk that I got hooked was a talk from &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-israel-abstracts.cb#YardenaMeymann&quot;&gt;Yardena Meymann&lt;/a&gt; about the review board Jenkins plugin that she wrote that lets you test out code change under the review, much the same way &lt;a href=&quot;https://buildhive.cloudbees.com/&quot;&gt;BuildHive&lt;/a&gt; or &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Github+pull+request+builder+plugin&quot;&gt;GitHub pull request builder plugin&lt;/a&gt; does it for GitHub pull requests, but for Subversion. I also liked the 45 minutes format better, which helps cut the fat and take people straight to the point.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Outside talks, Israeli people kept me busy! They cornered me on multiple occasions and we had a lot of interesting conversations, so much so that I missed about half the talks! I just wish we had coordinated this upfront so that I could have visited them while I was there. This also made me wonder what if we designate one corner of the site and did a series of birds-of-feather around specific topics. This led me to try &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/126595572/&quot;&gt;Jenkins Scalability Summit&lt;/a&gt; in the upcoming JUC Palo Alto.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc2013/juc2013-israel.cb&quot;&gt;All the slides and videos are available&lt;/a&gt;, if you want to take a look --- be forewarned that some of them are in Hebrew.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you aren’t in Israel but like the concept of JUC, looking forward to seeing you in the upcoming &lt;a href=&quot;https://www.eventbrite.com/event/6367028955&quot;&gt;Jenkins User Conference in Palo Alto&lt;/a&gt; this October.&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/2013/07/01/office-hours-this-week-git-plugin-refactoring/</id>
<title>Office hours this week: Git plugin refactoring</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-07-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/07/01/office-hours-this-week-git-plugin-refactoring/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='plugins'></category>
<summary>
This Wednesday&#8217;s Jenkins office hours is all about the Git plugin refactoring that&#8217;s going on.







Git plugin is one of the most popular plugins out there, and it&#8217;s been around for quite some time. Combine that with the fact that there are so many different ways to use Git, it was inevitable that Git plugin became quite a capable but complex plugin over time. It has more than a dozen options and switches, and it was becoming harder to use and harder to maintain.


As early as 2010, some of us have already been saying that we should refactor this plugin, but...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This Wednesday’s &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;Jenkins office hours&lt;/a&gt; is all about the Git plugin refactoring that’s going on.&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://git-scm.com/images/logos/2color-lightbg@2x.png&quot; alt=&quot;2color lightbg@2x&quot; width=&quot;250&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Git+Plugin&quot;&gt;Git plugin&lt;/a&gt; is one of the most popular plugins out there, and it’s been around for quite some time. Combine that with the fact that there are so many different ways to use Git, it was inevitable that Git plugin became quite a capable but complex plugin over time. It has more than a dozen options and switches, and it was becoming harder to use and harder to maintain.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As early as 2010, some of us have already been saying that we should refactor this plugin, but none of us have managed. The good news is, I finally started tackling this problem last month while I was in London, and I’ve made a steadily progress since then and I’m ready for a wider review.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So we’ll spend this Wednesday going over the changes. I’ll show you how the new version looks, what changes are made internally, and what it’ll enable us in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the Git plugin is important to you, and you want to see what’s cooking, please join us in &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;the office hours&lt;/a&gt; on Google Hangout.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to seeing you!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/06/21/reducing-the-of-threads-in-jenkins-ssh-slaves/</id>
<title>Reducing the # of threads in Jenkins: SSH agents</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-06-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/06/21/reducing-the-of-threads-in-jenkins-ssh-slaves/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='news'></category>
<category term='plugins'></category>
<category term='releases'></category>
<summary>
As the usage of Jenkins expands, we started seeing users who run multiple 100s of agents on one controller, and thus it became a lot more important for us to scale well to even larger number of agents.


While I was looking at the thread dump of a large system, I started noticing that there are a large number of threads lying around pumping InputStream and writing to another OutputStream. On Linux, each thread occupies 2MB just for its stack size, so if we can eliminate some of them, it&#8217;d be a good saving.


So this morning, I tackled one source of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the usage of Jenkins expands, we started seeing users who run multiple 100s of agents on one controller, and thus it became a lot more important for us to scale well to even larger number of agents.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While I was looking at the thread dump of a large system, I started noticing that there are a large number of threads lying around pumping &lt;code&gt;InputStream&lt;/code&gt; and writing to another &lt;code&gt;OutputStream&lt;/code&gt;. On Linux, each thread occupies 2MB just for its stack size, so if we can eliminate some of them, it’d be a good saving.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So this morning, I tackled one source of such waste.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins has &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/SSH+Slaves+plugin&quot;&gt;the ability to launch agent on a remote server via SSH&lt;/a&gt; for the longest time, and to simplify this, we’ve been using a &lt;a href=&quot;https://github.com/jenkinsci/trilead-ssh2&quot;&gt;pure-Java implementation of SSH client&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To cut the long story short, I was able to eliminate two pump threads per every SSH connection. Furthermore, when it runs on the upcoming Jenkins 1.521, it’ll save one more thread per every SSH connection. So if you have 100 agents connected through SSH, this alone saves up 600MB of memory. That’s pretty good for a few hours work!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you run a lot of agents, be sure to pick up version 0.27 of &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/SSH+Slaves+plugin&quot;&gt;the SSH agents plugin&lt;/a&gt; to take advantages of this!&lt;br /&gt;
&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/2013/05/22/jenkins-user-conference-israel-coming-june-6/</id>
<title>Jenkins User Conference Israel - Coming June 6</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-05-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/05/22/jenkins-user-conference-israel-coming-june-6/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<category term='juc'></category>
<summary>
Your favorite Butler will visit Israel on June 6 for the Jenkins User Conference Israel. More than 200 people have already registered to hobnob with other Jenkins users and eat like kings.


The agenda is up here. You&#8217;ll find a great list of speakers from Israel, Europe and the US to compliment a plethora of treats. There will be an ice cream break, fruits break, beer break and special chef lunch. And everyone gets a limited-edition JUC Israel t-shirt, designed by the t-shirt-design gurus at JFrog.


Featured speakers:


Kohsuke Kawaguchi, the creator of Jenkins (formerly, Hudson) and elite architect at CloudBees, will deliver...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Your favorite Butler will visit Israel on June 6 for the Jenkins User Conference Israel. More than 200 people have already registered to hobnob with other Jenkins users and eat like kings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agenda is up &lt;a href=&quot;https://jenkins-uc-israel-2013.eventbrite.com/&quot;&gt;here&lt;/a&gt;. You’ll find a great list of speakers from Israel, Europe and the US to compliment a plethora of treats. There will be an ice cream break, fruits break, beer break and special chef lunch. And everyone gets a limited-edition JUC Israel t-shirt, designed by the t-shirt-design gurus at JFrog.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Featured speakers:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/company-team.cb#KohsukeKawaguchi&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;, the creator of Jenkins (formerly, Hudson) and elite architect at CloudBees, will deliver a keynote about the current state and the future roadmap of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.gradleware.com/team#hans-dockter&quot;&gt;Hans Dockter&lt;/a&gt;, the creator of Gradle and the founder of Gradleware will speak about next generation build tool to CI server integration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://plus.google.com/102229966399548252687/about&quot;&gt;Fred Simon&lt;/a&gt;, JFrog’s co-founder and Chef architect will share JFrog’s vision of the future of continuous integration in the cloud.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;**&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/imagecache/bio_photo/bio-photos/kkawaguchi.jpg&quot; alt=&quot;Kohsuke Kawaguchi&quot; width=&quot;100&quot; /&gt; &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://lh3.googleusercontent.com/-Onq1wUMrLx0/TihBLrSg0bI/AAAAAAAAAKM/X_vQ00DqVXk/s286/hans.jpg&quot; alt=&quot;Hans Dockter&quot; width=&quot;100&quot; /&gt; &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://lh6.googleusercontent.com/-bOfn5DKlIpg/T2Srk0H4isI/AAAAAAAAKAY/K8s7nrrKy70/s190/MeFromYaelAdarSmall.JPG&quot; alt=&quot;Fred Simon&quot; width=&quot;100&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many thanks to lead sponsors &lt;a href=&quot;https://www.jfrog.com&quot;&gt;JFrog&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;, who have put a lot of time and energy into organizing the conference. Thanks also to sponsors &lt;a href=&quot;https://web.archive.org/web/20130704040525/https://www.gigaspaces.com/cloudify-open-paas-stack&quot;&gt;Cloudify&lt;/a&gt; and &lt;a href=&quot;https://www.whitesourcesoftware.com&quot;&gt;White Source&lt;/a&gt; for showing their support for Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://jenkins-uc-israel-2013.eventbrite.com/&quot;&gt;Register here.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Can’t make it to Israel? Here are more Jenkins events:&lt;/em&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://www.eventbrite.co.uk/event/6205220983&quot;&gt;Moving to Continuous Delivery in the Enterprise&lt;/a&gt; — June 10, London&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/116074032/&quot;&gt;Jenkins Meetup&lt;/a&gt; — June 15, Munich&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.praqma.com/events/jciusrcph13&quot;&gt;Jenkins User Event&lt;/a&gt; — September 6, Copenhagen&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc/juc-2013.cb&quot;&gt;Jenkins User Conference&lt;/a&gt; — October 23, Palo Alto, CA&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&amp;lt;/i&amp;gt;&lt;/p&gt;
&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/05/17/continuous-information-jenkins-newsletter-vol-4/</id>
<title>Continuous Information - Jenkins Newsletter vol. 4 </title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-05-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/05/17/continuous-information-jenkins-newsletter-vol-4/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='links'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<summary>
Volume 4 of Continuous Information came out last night. It contains insights and highlights from founder Kohsuke, the latest growth stats, upcoming event info, Jenkins resources, and more.
Highlights:




Jenkins has nearly 20,000 more active installations than it had last June, up from 43,500 to more than 61,000


Nearly 100 plugins have been added since late last Fall when we did the last Jenkins survey. Now there are more than 730 plugins


Bay Area JUC (Oct 23), JUC Israel (Jun 6) and several other Jenkins events around the world have open registration


Latest, greatest Jenkins improvements include a new LTS based on 1.509, more context...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://pages.cloudbees.com/rs/cloudbees/images/CBMasthead.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://pages.cloudbees.com/rs/cloudbees/images/CBMasthead.jpg&quot; alt=&quot;image&quot; width=&quot;576&quot; height=&quot;152&quot; /&gt;&lt;/span&gt;&lt;br&gt;
Volume 4 of Continuous Information came out last night. It contains insights and highlights from founder Kohsuke, the latest growth stats, upcoming event info, Jenkins resources, and more.&lt;br&gt;
Highlights:&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Jenkins has nearly 20,000 more active installations than it had last June, up from 43,500 to more than 61,000&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nearly 100 plugins have been added since late last Fall when we did the last Jenkins survey. Now there are more than 730 plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bay Area JUC (Oct 23), JUC Israel (Jun 6) and several other Jenkins events around the world have open registration&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Latest, greatest Jenkins improvements include a new LTS based on 1.509, more context menu improvements, and controller/agent data transfer performance improvement&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There’s also a Security advisory out recommending upgrade to at least 1.502&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A plethora of Jenkins and Continuous Delivery resources&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://pages.cloudbees.com/index.php/email/emailWebview?mkt_tok=3RkMMJWWfF9wsRow5%2FmYJoDpwmWGd5mht7VzDtPj1OY6hBomJr6JK1TtuMFUGpsqOOqSDhcUEZVk0w%3D%3D&quot;&gt;View the full newsletter&lt;/a&gt;, and then &lt;a href=&quot;https://www.cloudbees.com/jenkins/jenkins-ci/jenkins-newsletter.cb&quot;&gt;sign up to receive it yourself&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And if you have content to feature in a future newsletter, please &lt;a href=&quot;mailto:continuous-information@cloudbees.com&quot;&gt;email us&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/br&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/05/06/giving-back-to-the-community-3-ways-to-keep-jenkins-growing/</id>
<title>Giving Back to the Community:  3 Ways to Keep Jenkins Growing</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-05-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/05/06/giving-back-to-the-community-3-ways-to-keep-jenkins-growing/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='feedback'></category>
<summary>
With more than 600 plugins, Jenkins has a vibrant community and we&#8217;re dependent on YOU to keep it that way. Here are 3 ways you can give back to the community to ensure that everyone benefits and Jenkins keeps growing&#8230;&#8203;


Giving it back to the community #1: vendor+community=win


Jenkins is becoming ubiquitous enough that tool vendors and service providers often find their users asking them to provide Jenkins plugins. The challenge for these companies is that they don’t necessarily possess the necessary Jenkins expertise to do one.


Here at the Jenkins project, what we are trying to do is to work with these...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With more than 600 plugins, Jenkins has a vibrant community and we’re dependent on YOU to keep it that way. Here are 3 ways you can give back to the community to ensure that everyone benefits and Jenkins keeps growing…​&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;giving-it-back-to-the-community-1-vendorcommunitywin&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#giving-it-back-to-the-community-1-vendorcommunitywin&quot; /&gt;Giving it back to the community #1: vendor+community=win&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins is becoming ubiquitous enough that tool vendors and service providers often find their users asking them to provide Jenkins plugins. The challenge for these companies is that they don’t necessarily possess the necessary Jenkins expertise to do one.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here at the Jenkins project, what we are trying to do is to work with these people to deliver a plugin. It gets the job done a whole lot more quickly if the vendor brings in their expertise on their tool/services and we bring in our expertise on Jenkins plugin development.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, we recently worked with &lt;a href=&quot;https://www.soasta.com/press-releases/soasta-and-cloudbees-partner-to-deliver-first-jenkins-plugin-for-continuous-integration-on-mobile-platforms/&quot;&gt;SOASTA&lt;/a&gt; to help them open-source the plugin they developed in house, then help them add a whole bunch of new functionalities. By open-sourcing a plugin in the Jenkins project, vendors win as the community helps fix bugs and improve plugins. The Jenkins project wins by building relationship with vendors. And finally the users win by having more integrations.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So the next time you ask your vendor to provide a Jenkins integration, please tell them to drop us a note, and we are happy to talk.&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;giving-it-back-to-the-community-2-scratch-your-itch-and-take-credit&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#giving-it-back-to-the-community-2-scratch-your-itch-and-take-credit&quot; /&gt;Giving it back to the community #2: scratch your itch and take credit&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are working for a company and hacking some Jenkins plugins for your team, then you should definitely consider contributing those changes back. Let’s take &lt;a href=&quot;https://developer.sonymobile.com/2012/11/22/sony-contributes-to-jenkins-software-tool/&quot;&gt;Robert and Tomas&lt;/a&gt; for example, who contributed a number of significant plugins from Sony Mobile.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+
The company wins, because it shows off their technical excellence. Plus the flexibility to let engineers work on these OSS projects helps them retain and attract high-caliber developers. It also lets the community shoulder some of the burdens of maintaining plugins.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
You win, because now you have more things to show to future employers. After all, &lt;a href=&quot;https://code.dblock.org/github-is-your-new-resume&quot;&gt;GitHub is your new resume&lt;/a&gt;! And when you aren’t sure how to go about implementing a feature or fixing a bug, open-sourcing your plugin lets us jump in and get you unstuck.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
The community wins, thanks to your new awesome plugin.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
Besides all of those pragmatic reasons, when you share something with others and they tell you how much it helped them, even if it’s just one or two people, it’s a deeply moving experience.&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It just has so many advantages, it’s a no brainer!&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;giving-it-back-to-the-community-3-contribute-by-proxy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#giving-it-back-to-the-community-3-contribute-by-proxy&quot; /&gt;Giving it back to the community #3: contribute by proxy&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are working for a company, wanting to see particular features/integrations in Jenkins but don’t have time to do it yourself, there’s yet another way, and that’s to contribute by proxy.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The idea is that you contract with those who already know how to develop Jenkins plugins, and you have them produce/improve Jenkins plugins in open-source. &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Praqma&quot;&gt;Praqma&lt;/a&gt; is a great example of one such company. They are well connected in the community, with lots of experience under their belts, and your company takes the credit for the work. There are also a number of individuals who can do this for you.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why give it away something for free when you paid for it, you might ask. That’s because the code sitting in house rots when it’s not maintained by anybody. In contrast, when the rest of the world can hack on your code, you get occasional random bug fixes by strangers (the worst case), and sometimes it gets its own life (the best case.)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If this way of giving back suits you better, feel free to send an e-mail to &lt;a href=&quot;https://jenkins.361315.n4.nabble.com/Jenkins-dev-f387835.html&quot;&gt;the dev list&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;/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;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/04/30/registration-and-call-for-papers-open-for-juc-palo-alto/</id>
<title>Registration &amp; Call for Papers Open for JUC Palo Alto</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-04-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/04/30/registration-and-call-for-papers-open-for-juc-palo-alto/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<category term='juc'></category>
<summary>
This year, the West Coast Jenkins User Conference will be in Palo Alto rather than San Francisco. If you&#8217;re nearby&#8201;&#8212;&#8201;or even if you&#8217;re not&#8201;&#8212;&#8201;join Kohsuke and other fellow developers for a solid day of Jenkins.




The Date: Wednesday, October 23, 2013


The Venue: Palo Alto Jewish Community Center


Details


Register




The Call for Papers is open until June 9 (scroll to bottom of page for form). JUC will be much better with your involvement, so please submit your abstracts and share your Jenkins knowledge with the community.


image::https://www.cloudbees.com/sites/default/files/Kohsuke-Kawaguchi-Opening-San-Fran-Thumbnail.png [Kohsuke Kawaguchi – Keynote Address, JUC San Francisco,link=https://www.youtube.com/watch?v=HXEbFfAeymw?rel=0?autoplay=1&amp;rel=1&amp;modestbranding=1&amp;showsearch=0]


A very special thanks to our JUC Palo Alto sponsors, who...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, the West Coast Jenkins User Conference will be in Palo Alto rather than San Francisco. If you’re nearby — or even if you’re not — join Kohsuke and other fellow developers for a solid day of Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Date: Wednesday, October 23, 2013&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Venue: &lt;a href=&quot;https://www.paloaltojcc.org/&quot;&gt;Palo Alto Jewish Community Center&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins/juc/juc-2013.cb&quot;&gt;Details&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.eventbrite.com/event/6367028955&quot;&gt;Register&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 &lt;a href=&quot;https://www.cloudbees.com/jenkins/juc/juc-2013.cb&quot;&gt;Call for Papers&lt;/a&gt; is open until June 9 (scroll to bottom of page for form). JUC will be much better with your involvement, so please submit your abstracts and share your Jenkins knowledge with the community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;image::https://www.cloudbees.com/sites/default/files/Kohsuke-Kawaguchi-Opening-San-Fran-Thumbnail.png [Kohsuke Kawaguchi – Keynote Address, JUC San Francisco,link=https://www.youtube.com/watch?v=HXEbFfAeymw?rel=0?autoplay=1&amp;amp;rel=1&amp;amp;modestbranding=1&amp;amp;showsearch=0]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A very special thanks to our JUC Palo Alto sponsors, who will make sure you are fed, caffeinated, clothed (in this year’s collectible Jenkins tshirt), and generally well cared for at the conference: &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt;, &lt;a href=&quot;https://www.jfrog.com&quot;&gt;JFrog&lt;/a&gt;, &lt;a href=&quot;https://www.xebialabs.com&quot;&gt;XebiaLabs&lt;/a&gt;, &lt;a href=&quot;https://www.appvance.com&quot;&gt;appvance&lt;/a&gt;, &lt;a href=&quot;https://www.zeroturnaround.com&quot;&gt;ZeroTurnaround&lt;/a&gt;, &lt;a href=&quot;https://web.archive.org/web/20140106081207/http://lmitsoftware.com&quot;&gt;LMIT Software&lt;/a&gt;, &lt;a href=&quot;https://www.blackdiamond.com&quot;&gt;Black Diamond Software&lt;/a&gt;, &lt;a href=&quot;https://www.newrelic.com&quot;&gt;New Relic&lt;/a&gt;, &lt;a href=&quot;https://www.liferay.com&quot;&gt;Liferay&lt;/a&gt;, &lt;a href=&quot;https://www.appdynamics.com&quot;&gt;AppDynamics&lt;/a&gt;, and &lt;a href=&quot;https://www.soasta.com&quot;&gt;SOASTA&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Two other differences this year — the conference is not timed to coincide with JavaOne, and it falls on a Wednesday rather than a Sunday. We thought we’d try these changes and are interested to know if they work better for everyone.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agenda won’t be populated until after the Call for Papers closes and talks are selected. But you can check out previous JUC agendas, slides, and video:&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.cloudbees.com/jenkins-user-conference-2012-san-francisco-abstracts.cb&quot;&gt;2012 JUC San Francisco&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2011-session-abstracts.cb&quot;&gt;Inaugural JUC San Francisco - 2011&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;If JUC Palo Alto is not convenient for you, there’s also a &lt;a href=&quot;https://jenkins-uc-israel-2013.eventbrite.com/&quot;&gt;JUC coming up in Herzelia, Israel on June 6&lt;/a&gt; and a &lt;a href=&quot;https://www.praqma.com/events/jciusrcph13&quot;&gt;Jenkins event planned for Copenhagen, Denmark&lt;/a&gt; on September 6.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hope you can join us at JUC!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/04/25/munich-hackathon/</id>
<title>Munich Hackathon</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-04-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/04/25/munich-hackathon/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
It&#8217;s been a while we had a hackathon in Germany. Let&#8217;s get together, get some coding done, and get to know fellow Jenkins developers! The date is June 15th Saturday.


TNG Technology Consulting, where Stefan Wolf (dependency graph viewer plugin, etc) works, will be hosting us (thanks!)


We&#8217;ll try to arrange some themes or agenda, based on who&#8217;s coming and how many of us will be there. For example,




If there are many people who have never done a plugin development, we can do a plugin development tutorial.


If we see a concentration of devs in a specific area of Jenkins (say mobile), we...
</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://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Munchen_collage.jpg/300px-Munchen_collage.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been a while we had a hackathon in Germany. Let’s get together, get some coding done, and get to know fellow Jenkins developers! The date is June 15th Saturday.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;TNG Technology Consulting, where &lt;a href=&quot;https://github.com/wolfs&quot;&gt;Stefan Wolf&lt;/a&gt; (dependency graph viewer plugin, etc) works, will be hosting us (thanks!)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll try to arrange some themes or agenda, based on who’s coming and how many of us will be there. For example,&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If there are many people who have never done a plugin development, we can do a plugin development tutorial.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;If we see a concentration of devs in a specific area of Jenkins (say mobile), we can try some focused development in a specific area.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;If you have things you need from the core to do what you want, this is the chance to get that implemented on the spot!&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;If you want to see a certain development happen in Jenkins but don’t know how, please make a pitch to us in the form of presentations (short or long) would be welcome&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, assuming there’s interest, we’ll head out somewhere for a dinner afterward.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested in coming, &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/116074032/&quot;&gt;please RSVP at meetup.com&lt;/a&gt; so that we can prepare accordingly.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/04/19/neuroscientists-embrace-continuous-integration-served-by-jenkins/</id>
<title>Neuroscientists embrace continuous integration served by Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-04-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/04/19/neuroscientists-embrace-continuous-integration-served-by-jenkins/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<category term='cia'></category>
<summary>
_
Guest post by Yury V. Zaytsev and Abigail Morrison. To download the PDF file of the journal article mentioned below, click here!_





As recently exemplified by several reports on this blog, automation tools such as continuous integration servers, that help to defuse the exploding complexity of software under the ever-increasing pressure to deliver, are steadily gaining well-deserved mindshare in the industry.


However, it is not just developers of enterprise software who need solutions to the complexity problem. Scientists are arguably even worse off: most of them are not trained as software engineers, yet, in the last decades, creating custom software has become...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;_&lt;br&gt;
Guest post by Yury V. Zaytsev and Abigail Morrison. To download the PDF file of the journal article mentioned below, &lt;a href=&quot;https://www.frontiersin.org/Neuroinformatics/10.3389/fninf.2012.00031/abstract&quot;&gt;click here&lt;/a&gt;!_&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Gray739.png/250px-Gray739.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As recently exemplified by several reports on this blog, automation tools such as continuous integration servers, that help to defuse the exploding complexity of software under the ever-increasing pressure to deliver, are steadily gaining well-deserved mindshare in the industry.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, it is not just developers of enterprise software who need solutions to the complexity problem. Scientists are arguably even worse off: most of them are not trained as software engineers, yet, in the last decades, creating custom software has become an integral part of virtually any research activity, be it data analysis, simulation or experiments. Frequently, there is a great emphasis on numerical accuracy and reproducibility of results, which requires extensive testing. As a coup de grâce, most publicly funded research projects are running on tight budgets, excluding the possibility of hiring professional contractors to outsource required software development work.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enter Jenkins the Butler!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back in 2011, Yury V. Zaytsev, a doctoral candidate now working at Jülich Research Center, Germany was supported by a Google Summer of Code stipend to design a continuous integration infrastructure for &lt;a href=&quot;http://www.nest-initiative.org&quot;&gt;NEST&lt;/a&gt;, a spiking neuronal network simulator for neuroscientific research released under the GPL license. An overwhelmingly positive experience with this new setup motivated him to write up &lt;a href=&quot;https://www.frontiersin.org/Neuroinformatics/10.3389/fninf.2012.00031/abstract&quot;&gt;a case study&lt;/a&gt;, which was recently published in &quot;Frontiers in Neuroinformatics&quot;, an open access scientific journal.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;The new CI system boosts our productivity, because it helps us find and fix breakages very quickly, even when they only occur for obscure combinations of configuration options. Automated integration testing is a major breakthrough for NEST, as it ensures that developing new features does not come at the cost of reliability or accuracy&quot; - said Markus Diesmann, director of the Institute of Neuroscience and Medicine (INM-6) at the Jülich Research Center, Germany and NEST Initiative board member.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We hope that through a peer-reviewed publication in a prominent scientific journal we will be able to reach the scientific community more efficiently, as compared to the materials targeting professional software developers. However, we likewise believe that our case study might be of interest to the readers of this blog, especially those who are still only considering implementing continuous integration.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lastly, we would like to thank all developers and users of Jenkins whose contributions throughout the years made it the versatile and robust continuous integration server it is today!&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;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/03/12/coming-to-gdc-join-us-for-a-jenkins-drink-up-at-21st-amendment/</id>
<title>Coming to GDC? Join us for a Jenkins Drink-Up at 21st Amendment</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-03-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/03/12/coming-to-gdc-join-us-for-a-jenkins-drink-up-at-21st-amendment/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
If you are coming to Game Developers Conference in the week of 25th, or if you are local to San Francisco bay area, come join us to the small drink up in the evening of 26th at 21st amendment.


If you are coming, please RSVP so that we know how many to expect, and we can stay connected....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Twenty-first_Amendment_to_the_United_States_Constitution&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/1/15/21st_Amendment_Pg1of1_AC.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are coming to &lt;a href=&quot;https://www.gdconf.com/&quot;&gt;Game Developers Conference&lt;/a&gt; in the week of 25th, or if you are local to San Francisco bay area, come join us to the small drink up in the evening of 26th at &lt;a href=&quot;https://21st-amendment.com/&quot;&gt;21st amendment&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are coming, &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/108919962/&quot;&gt;please RSVP&lt;/a&gt; so that we know how many to expect, and we can stay connected.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/02/15/jenkins-ci-the-origins-of-butlers-build-masters-and-bowties/</id>
<title>Jenkins CI: The Origins of Butlers, Build Masters and Bowties</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-02-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/02/15/jenkins-ci-the-origins-of-butlers-build-masters-and-bowties/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='interview'></category>
<category term='just for fun'></category>
<summary>
The folks at Rebel Labs picked Jenkins as the last installation of their technical report series. It is a beautifully crafted 50 page PDF that covers the overview of the technology. You get to see a bit of details about how ZeroTurnaround uses Jenkins, and it contains a section where I get interviewed by them.


Also, while they failed to mention this in the document, you can use JRebel when developing Jenkins plugins and it&#8217;ll reduce the # of times you need to restart the VM. To the extent that you use it to develop open-source Jenkins plugins, you can apply...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://zeroturnaround.com/rebellabs/devs/jenkins-ci-the-origins-of-butlers-build-masters-and-bowties/&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://zeroturnaround.com/wp-content/uploads/2013/02/JENKINS-CI-Cover.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The folks at &lt;a href=&quot;https://zeroturnaround.com/rebellabs/&quot;&gt;Rebel Labs&lt;/a&gt; picked Jenkins as the last installation of their technical report series. It is a beautifully crafted 50 page PDF that covers the overview of the technology. You get to see a bit of details about how ZeroTurnaround uses Jenkins, and it contains a section where I get interviewed by them.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, while they failed to mention this in the document, you can &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Developing+with+JRebel&quot;&gt;use JRebel when developing Jenkins plugins&lt;/a&gt; and it’ll reduce the # of times you need to restart the VM. To the extent that you use it to develop open-source Jenkins plugins, you can &lt;a href=&quot;https://zeroturnaround.com/software/jrebel/buy/&quot;&gt;apply for a free OSS license&lt;/a&gt;, too.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If that sounds interesting enough, you can &lt;a href=&quot;https://zeroturnaround.com/rebellabs/devs/jenkins-ci-the-origins-of-butlers-build-masters-and-bowties/&quot;&gt;get your copy now&lt;/a&gt;. Be forewarned that a registration is required.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/01/30/jenkins-hits-1-500/</id>
<title>Jenkins hits 1.500</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-01-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/01/30/jenkins-hits-1-500/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='news'></category>
<category term='releases'></category>
<summary>
The last week the Jenkins project has reached a miletone release — Version 1.500. That&#8217;s no 1.5 nor 1.5.0. That&#8217;s the 501st release since its inception, counting all the way up from 1.0, 1.1 to 1.500.


We&#8217;ll be celebrating this release in the upcoming FOSDEM conference in Brussels, but I wanted to thank everyone for making this great community possible by participating and using it.


Despite all the distances we&#8217;ve thus far come, there are still a lot of work to be done, both in the core and plugins, so we look forward to keep on keeping on in the coming years.


So...
</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://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Toasting_Champagne.jpg/171px-Toasting_Champagne.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The last week the Jenkins project has reached a miletone release — &lt;a href=&quot;https://jenkins-ci.org/changelog&quot;&gt;Version 1.500&lt;/a&gt;. That’s no 1.5 nor 1.5.0. That’s the 501st release since its inception, counting all the way up from 1.0, 1.1 to 1.500.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll be celebrating this release in &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/FOSDEM&quot;&gt;the upcoming FOSDEM conference&lt;/a&gt; in Brussels, but I wanted to thank everyone for making this great community possible by participating and using it.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Despite &lt;a href=&quot;https://jenkins-ci.org/changelog-old.html&quot;&gt;all&lt;/a&gt; &lt;a href=&quot;https://jenkins-ci.org/why&quot;&gt;the&lt;/a&gt; &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Meeting+Agenda&quot;&gt;distances&lt;/a&gt; we’ve thus far come, there are &lt;a href=&quot;https://www.slideshare.net/kohsuke/jenkins-user-conference-2012-san-francisco&quot;&gt;still a lot of work&lt;/a&gt; to be done, both in the core and plugins, so we look forward to keep on keeping on in the coming years.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So here is to the next 500 release!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2013/01/26/report-jenkins-meet-up-seoul/</id>
<title>Report: Jenkins meet-up Seoul</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-01-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/01/26/report-jenkins-meet-up-seoul/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
People in far eastern countries use languages that are quite different from English, and live in a time zone that&#8217;s largely incompatible from the U.S./Europe time. So naturally these folks tend to keep things to themselves.


That&#8217;s why I&#8217;ve been wanting to do a meet-up in Seoul for some time, yet I didn&#8217;t know anyone there to get one going. That changed in Jenkins User Conference in San Francisco last year. I pitched this to someone who worked for Samsung, and he introduced me to folks in Seoul, and the ball started rolling from there.


The meet-up was held Friday, at Samsung...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;People in far eastern countries use languages that are quite different from English, and live in a time zone that’s largely incompatible from the U.S./Europe time. So naturally these folks tend to keep things to themselves.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That’s why I’ve been wanting to do a meet-up in Seoul for some time, yet I didn’t know anyone there to get one going. That changed in Jenkins User Conference in San Francisco last year. I pitched this to someone who worked for Samsung, and he introduced me to folks in Seoul, and the ball started rolling from there.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The meet-up was held Friday, at Samsung headquarter in &lt;a href=&quot;https://www.youtube.com/watch?v=9bZkp7q19f0&amp;amp;list=PLEC422D53B7588DC7&amp;amp;index=10&quot;&gt;Gangnam&lt;/a&gt;, Seoul.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Samsung_headquarters.jpg/320px-Samsung_headquarters.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I kicked off the meet-up with a short presentation on why I think local communities are important, especially in Korea. Jang Seung-heui from Samsung then talked about Groovy scripting in Jenkins, and how it helps him manage a large installation of Jenkins (the slides and the talk were in Korean, so this is my guess based on the occasional English words that appeared in slides.) Junho Yoon from NHN talked about his simple update site plugin to show how he helps teams run their own Jenkins instances. I’ve done another presentation showing various Jenkins plugins for workflow-ish things.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/photos/12778372/199147742/&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photos4.meetupstatic.com/photos/event/1/e/3/e/600_199147742.jpeg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I wasn’t sure how many people would actually come, since I really didn’t have any reach in the Korean software developer community. But somehow the words must have spread, as I counted more than 50 people in the room.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com//jenkinsmeetup/photos/12778372/#199147122&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photos1.meetupstatic.com/photos/event/1/b/d/2/600_199147122.jpeg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately, due to the rules in the building, I wasn’t allowed to record the talks. So no videos from this meet-up — if you missed this one, you’d have to come to the next one!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the meet-up, a dozen of us headed to the busy night scene in Gangnam. There were so many people that we had to form a line to get to the street!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Eventually we found ourselves in a German-style pub. I say German &quot;style&quot; because everything from beer to foods were Korean, except the name of the pub and the wall paper.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/photos/12778372/199147742/#199148172&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photos1.meetupstatic.com/photos/event/1/f/e/c/600_199148172.jpeg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve pitched my hope that we keep it going, and that there’ll be the next meet-up. Judging from &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/90236092/&quot;&gt;the feedbacks on the meetup.com&lt;/a&gt; and Twitter, I’m optimistic:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;@https://twitter.com/kyunamjo[kyunamjo] @https://twitter.com/kohsukekawa[kohsukekawa] Kohsuke, please push him constantly to put his effort to settle a local community for Jenkins. He wishes to do that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;— 김상희 SangHee Kim (@sangheestyle) &lt;a href=&quot;https://twitter.com/sangheestyle/status/294811635904827392&quot;&gt;January 25, 2013&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The book Junho is holding contains some chapters about Jenkins that he wrote:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/photos/12778372/199147742/#199149092&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photos3.meetupstatic.com/photos/event/2/3/8/4/600_199149092.jpeg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After drink-up, Junho kidnapped me into a coffee shop and showed me a lot more that he has done for NHN that I presumably cannot talk about in public. I’ve encouraged him to try to split the generic parts from company specific parts and open-source the former, so we’ll see. By the time I headed back to hotel, it was past midnight.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I wanted to thank folks from Samsung for making this possible.&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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/2013/01/09/2012-jenkins-survey-results-are-in/</id>
<title>2012 Jenkins Survey results are in</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2013-01-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2013/01/09/2012-jenkins-survey-results-are-in/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<summary>
The Jenkins survey we’ve been running since the Jenkins User Conference in San Francisco has concluded. All in all we counted 721 responses --- thanks everyone for voicing their thoughts!


Naturally, it took a while to tally that many responses, but thanks to Lisa, we now have the result in time for the holiday.


As you can see in our installation tracking, Jenkins installation base has grown 66% since the last year, so I was naturally very curious if this has affected the area of focus for us the developers.


However, when compared to the result from the last year, the first thing...
</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://rhetoricalcommons.org/OSAAC/sites/default/files/images/survey.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://jenkins-ci.org/node/403&quot;&gt;Jenkins survey&lt;/a&gt; we’ve been running since &lt;a href=&quot;https://jenkins-ci.org/content/come-join-jenkins-user-conference-san-francisco-september-30th&quot;&gt;the Jenkins User Conference in San Francisco&lt;/a&gt; has concluded. All in all we counted 721 responses --- thanks everyone for voicing their thoughts!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Naturally, it took a while to tally that many responses, but thanks to &lt;a href=&quot;https://twitter.com/ProductPrincipl&quot;&gt;Lisa&lt;/a&gt;, we &lt;a href=&quot;https://www.cloudbees.com/jenkins/jenkins-ci/2012-survey.cb&quot;&gt;now have the result&lt;/a&gt; in time for the holiday.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you can see in &lt;a href=&quot;https://stats.jenkins-ci.org/jenkins-stats/svg/total-jenkins.svg&quot;&gt;our installation tracking&lt;/a&gt;, Jenkins installation base has grown 66% since the last year, so I was naturally very curious if this has affected the area of focus for us the developers.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, when &lt;a href=&quot;https://pages.cloudbees.com/Jenkins_Survey_2011_JenkinsSurveyDownloadPage.html&quot;&gt;compared to the result from the last year&lt;/a&gt;, the first thing I notice is the consistency in many metrics. For example, about 83% of people considers Jenkins mission critical this year, and the last year it was 82%. The distribution between beginner/intermediate/expert users are also quite similar.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But this year, we asked a number of questions that we didn’t ask the last year. One of them is the version control systems that people use. Here, we get 61% Subversion, 50% Git, and everything else is within 10%. So clearly we need to start shipping Git plugin pre-bundled!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another interesting question that we asked is the languages people use. There’s a surprising number of C/C++ projects on Jenkins (and good number of Ruby, PHP, Python, and C#!), which made me feel that we need to hear more from those users about the kind of tool integrations we need to be providing.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One more gem is that whopping 11% of the respondents said they have written and contributed plugins to the community (that’s 82 people!), and another 9% of the respondents said they wrote one but just not sharing it because it doesn’t make sense (7%), or they couldn’t (2%). That’s about 1 in every 5 respondents writing some plugins, which is amazing, if you ask me.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another big part of the survey was asking respondents what are important in Jenkins --- is it documentation, quality, UI, etc? But I guess I shouldn’t spoil your fun of actually &lt;a href=&quot;https://www.cloudbees.com/jenkins/jenkins-ci/2012-survey.cb&quot;&gt;looking at the result&lt;/a&gt;, so please go take a look yourself! Also, if you want to tally the numbers yourself, here’s the anonymized raw data.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll hopefully do a separate post on the efforts we are taking to answer those points raised in the survey in coming days.&lt;br /&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;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/12/25/jenkins-meet-up/</id>
<title>한국에서의 첫번째 Jenkins meet-up!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-12-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/12/25/jenkins-meet-up/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
">


우리는 2013년 1월25일 저녁에 Jenkins meet-up을 삼성전자와 함께 준비하고 있습니다.
Meet-up은 서초사옥에서 진행될 예정이며 추후 변경될 수 있습니다.
발표자는 일본 커뮤니티에서 활동중인 Cactuman과 삼성이고 Groovy script를 이용한 job 일괄설정
에 대해서 발표할 예정입니다.


Jenkins를 설치한 통계를 통해 저희도 한국에 많은 사용자가 있다는것을 알고 있었습니다.
지금까지는 메인 Jenkins community에서 컨택하는데 실패했었지만 이번에 그런 상황이 해결된것에 너무 흥분됩니다.


이번 meet-up에 참가할 의사가 있으면 meetup.com 에 회답해 주시면 됩니다.
참가비는 없으며 우리는 Jenkins,plugin 들과 함께한 경험들(간단한 주제를 포함)을 한국의 Jenkins user와
공유 할 더 많은 발표자를 찾고 있습니다.


여러분의 많은 참가를 기대합니다.



We are organizing a Jenkins meet-up in Seoul in the evening of Jan 25th 2013, thanks to the help of folks...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Seoul&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/c/cb/Changdeokgung-Injeongjeon.jpg/220px-Changdeokgung-Injeongjeon.jpg&quot; alt=&quot;&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/span&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;우리는 2013년 1월25일 저녁에 Jenkins meet-up을 삼성전자와 함께 준비하고 있습니다.
Meet-up은 서초사옥에서 진행될 예정이며 추후 변경될 수 있습니다.
발표자는 일본 커뮤니티에서 활동중인 Cactuman과 삼성이고 Groovy script를 이용한 job 일괄설정
에 대해서 발표할 예정입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins를 설치한 통계를 통해 저희도 한국에 많은 사용자가 있다는것을 알고 있었습니다.
지금까지는 메인 Jenkins community에서 컨택하는데 실패했었지만 이번에 그런 상황이 해결된것에 너무 흥분됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;이번 meet-up에 참가할 의사가 있으면 &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/90236092/&quot;&gt;meetup.com&lt;/a&gt; 에 회답해 주시면 됩니다.
참가비는 없으며 우리는 Jenkins,plugin 들과 함께한 경험들(간단한 주제를 포함)을 한국의 Jenkins user와
공유 할 더 많은 발표자를 찾고 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;여러분의 많은 참가를 기대합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are organizing a Jenkins meet-up in Seoul in the evening of Jan 25th 2013, thanks to the help of folks at Samsung. The meeting will be in the evening, at the location to be determined. I am presenting in person, as well as Cactusman, one of the key community people in Japan. Seung-Heui Jang from Samsung would be presenting about job batch processing by Groovy scripts.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;According to the installation statistics, we know there are significant user base in Korea, but so far the main Jenkins community has failed to establish contacts with them. I’m really excited that I can finally fix this situation!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are interested in coming, please RSVP at &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/90236092/&quot;&gt;meetup.com&lt;/a&gt;. The event will be free. We are still looking for a few more speakers (including lightning talks), so please share your experiences with Jenkins, plugins you’ve been working on, and so forth with the rest of the Korean Jenkins people.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking forward to seeing many of you!&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/12/20/jenkins-keynote-at-fosdem-2013/</id>
<title>Jenkins keynote at FOSDEM 2013</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-12-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/12/20/jenkins-keynote-at-fosdem-2013/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
Earlier this year we participated in FOSDEM 2012 in Brussels, Belgium. Overall the event was a major success and we&#8217;re very happy we were able to take part in it!


For FOSDEM 2013, we&#8217;ll be back in Brussels and participating in a major way. The first day of FOSDEM (February 2, 2013) will be the 2nd birthday for the Jenkins project, and seems appropriate that project founder Kohsuke Kawaguchi will be giving a keynote session titled: "How we made the Jenkins community"


Here&#8217;s an excerpt from Kohsuke&#8217;s talk proposal:




Jenkins project has an interesting history. It started from scratch on my spare time,...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://fosdem.org/2013&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/fosdem-2013.png&quot; alt=&quot;fosdem 2013&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Earlier this year we participated in &lt;a href=&quot;https://www.jenkins.io/blog/2012/02/21/fosdem-2012-recap/&quot;&gt;FOSDEM 2012&lt;/a&gt; in Brussels, Belgium. Overall the event was a major success and we’re very happy we were able to take part in it!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For FOSDEM 2013, we’ll be back in Brussels and participating in a major way. The first day of FOSDEM (February 2, 2013) will be the &lt;strong&gt;2nd&lt;/strong&gt; birthday for the Jenkins project, and seems appropriate that project founder &lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; will be giving a &lt;strong&gt;keynote session&lt;/strong&gt; titled: &quot;&lt;strong&gt;&lt;a href=&quot;https://fosdem.org/2013/schedule/event/keynote_vibrant_developer_community/&quot;&gt;How we made the Jenkins community&lt;/a&gt;&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s an excerpt from Kohsuke’s talk proposal:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins project has an interesting history. It started from scratch on my spare time, and grow over time to boast 600+ open-source plugins developed by 300+ contributors from all around the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are several key ingredients, both technical and social, that enabled this model, and I think those ingredients are useful to other projects. In this talk, I’ll discuss how Jenkins project and the community works, what these ingredients are, why they help you attract more developers into your projects, and why it matters.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can read more about &lt;a href=&quot;https://fosdem.org/2013/schedule/event/keynote_vibrant_developer_community/&quot;&gt;Kohsuke’s keynote here&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to the keynote, I (&lt;a href=&quot;https://github.com/rtyler&quot;&gt;R. Tyler Croy&lt;/a&gt;), and a number of members of the Jenkins, Cucumber and Selenium communities are hosting the first ever &lt;strong&gt;&lt;a href=&quot;https://lists.fosdem.org/pipermail/fosdem/2012-November/001665.html&quot;&gt;Testing and Automation devroom&lt;/a&gt;&lt;/strong&gt; at FOSDEM.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in submitting a talk proposal for the dev room the deadline is 23:59 UTC on December 21st 2012! The Call for Proposals can be &lt;a href=&quot;https://gist.github.com/4107243&quot;&gt;found here&lt;/a&gt;, and the proposal submission form can can be &lt;a href=&quot;https://docs.google.com/spreadsheet/viewform?formkey=dG9LM2lOY1J5VzFiZTZXWUcxRXhqY1E6MQ&quot;&gt;found here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are very likely going to have a table in the hall again this year, but the FOSDEM committee hasn’t yet confirmed whether or not we will have a table.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regardless, a &lt;strong&gt;lot&lt;/strong&gt; of Jenkins community members will be at FOSDEM in February in addition to hundreds of other open source contributors and users from around the world.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in participating and/or meeting up with the Jenkins crowd, there’s details coming together on &lt;strong&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/FOSDEM&quot;&gt;the FOSDEM wiki page&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We hope to see you there!&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/12/19/los-altos-hackathon-this-friday/</id>
<title>Los Altos Hackathon This Friday</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-12-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/12/19/los-altos-hackathon-this-friday/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='meetup'></category>
<summary>
What better way to end the year than to come join a little Jenkins hackathon this Friday afternoon with Kohsuke (the core developer), Max Spring (Jenkow plugin), and hopefully other Jenkins hackers?


We&#8217;ll do this at CloudBees Los Altos office, starting around Friday 1pm.
View CloudBees Los Altos office in a larger map


Our plan is to primarily hack on the Jenkow plugin, but if you have other projects you&#8217;d like to hack on, that&#8217;d be welcome. Or if you&#8217;ve been interested in getting started on writing a plugin but haven&#8217;t had a chance to, this is a great time to do this,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What better way to end the year than to come join a little Jenkins hackathon this Friday afternoon with Kohsuke (the core developer), Max Spring (&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkow+Plugin&quot;&gt;Jenkow plugin&lt;/a&gt;), and hopefully other Jenkins hackers?&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll do this at &lt;a href=&quot;https://maps.google.com/maps/ms?msid=204997319446652334724.0004d13cfa1eb16f65a99&amp;amp;msa=0&amp;amp;ll=37.377281,-122.113874&amp;amp;spn=0.007656,0.00478&quot;&gt;CloudBees Los Altos office&lt;/a&gt;, starting around Friday 1pm.&lt;br&gt;
&lt;span class=&quot;small&quot;&gt;View &lt;a href=&quot;https://maps.google.com/maps/ms?msid=204997319446652334724.0004d13cfa1eb16f65a99&amp;amp;msa=0&amp;amp;ie=UTF8&amp;amp;ll=37.377281,-122.113874&amp;amp;spn=0.007656,0.00478&amp;amp;t=h&amp;amp;source=embed&quot;&gt;CloudBees Los Altos office&lt;/a&gt; in a larger map&lt;/span&gt;&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our plan is to primarily hack on the Jenkow plugin, but if you have other projects you’d like to hack on, that’d be welcome. Or if you’ve been interested in getting started on writing a plugin but haven’t had a chance to, this is a great time to do this, and when you get stuck the help is right next to you. Or heck, if you just want to drop by and say hello, that’s fine, too.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Beer, coffee, and other drinks are provided, as well as Jenkins stickers.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/12/13/office-hours-next-week-metadata-plugin/</id>
<title>Office hours next week: metadata plugin</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-12-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/12/13/office-hours-next-week-metadata-plugin/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='plugins'></category>
<summary>
The last Jenkins office hour of the year hosts Robert Sandell and Tomas Westling, who will go over newly open-sourced metadata plugin from Sony Mobile Communications (more about this story on their website). This team from Sony Mobile has been known for several other popular plugins, including the Gerrit trigger plugin. And I think this latest batch of plugins will not disappoint!


As I understand, this plugin is a library plugin, which is primarily meant to be consumed by other plugins. With help of other plugins using this plugin, it can classify jobs and agents by adding metadata tags to them....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;The last Jenkins office hour of the year&lt;/a&gt; hosts Robert Sandell and Tomas Westling, who will go over &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Metadata+plugin&quot;&gt;newly open-sourced metadata plugin&lt;/a&gt; from Sony Mobile Communications (&lt;a href=&quot;https://developer.sonymobile.com/2012/11/22/sony-contributes-to-jenkins-software-tool/&quot;&gt;more about this story on their website&lt;/a&gt;). This team from Sony Mobile has been known for several other popular plugins, including &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gerrit+Trigger&quot;&gt;the Gerrit trigger plugin&lt;/a&gt;. And I think this latest batch of plugins will not disappoint!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I understand, this plugin is a &lt;a href=&quot;https://wiki.jenkins.io/label/JENKINS/plugin-library&quot;&gt;library plugin&lt;/a&gt;, which is primarily meant to be consumed by other plugins. With help of other plugins using this plugin, it can classify jobs and agents by adding metadata tags to them. This in turn enables more intelligent scheduling, views, access control, and so on.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Personally, I’m very interested in integrating &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/iOS+Device+Connector+Plugin&quot;&gt;the iOS device connector plugin&lt;/a&gt;, so that one could say &quot;run this job on a Mac where iPad2 is connected&quot;, etc. The other piece is to integrate this with &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/External+Resource+Dispatcher&quot;&gt;the external resource dispatcher&lt;/a&gt; so that Jenkins can grant exclusive device access to jobs while they are running so that tests don’t end up trying to use the same device.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you are a plugin developer, hopefully this gets you excited. See you &lt;a href=&quot;https://www.timeanddate.com/worldclock/fixedtime.html?msg=Jenkins+Office+Hours&amp;amp;iso=20121219T11&amp;amp;p1=283&amp;amp;ah=1&quot;&gt;Dec 19th 11am PST&lt;/a&gt;.&lt;br /&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/2012/11/18/comunidade-verde-amarela-do-jenkins-uni-vos/</id>
<title>Comunidade verde-amarela do Jenkins, uni-vos!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-11-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/11/18/comunidade-verde-amarela-do-jenkins-uni-vos/" />
<author>
<name>kinow</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='guest post'></category>
<summary>
O Jenkins, servidor de integração favorito de todos, é muito utilizado no Brasil, e agora tem uma lista de e-mails em Português além do primeiro encontro de usuários Jenkins no Brasil. Se você utiliza o Jenkins, desenvolve plug-ins, tem interesse em aprender mais sobre esta incrível ferramenta Open Source e sobre Integração Contínua, essa é a sua chance!


Além de matar dúvidas sobre o Jenkins e aprender com os outros participantes, há várias outras atividades na comunidade como a tradução de documentação, tutoriais e livros, bem como a divulgação de eventos e treinamentos.


Gostei! Como participo?


Você pode começar se inscrevendo na lista...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;O Jenkins, servidor de integração favorito de todos, é muito utilizado no Brasil, e agora tem uma &lt;a href=&quot;https://jenkins-ci.org/content/mailing-lists&quot;&gt;lista de e-mails&lt;/a&gt; em Português além do primeiro encontro de usuários Jenkins no Brasil. Se você utiliza o Jenkins, desenvolve plug-ins, tem interesse em aprender mais sobre esta incrível ferramenta Open Source e sobre Integração Contínua, essa é a sua chance!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Além de matar dúvidas sobre o Jenkins e aprender com os outros participantes, há várias outras atividades na comunidade como a tradução de documentação, tutoriais e livros, bem como a divulgação de eventos e treinamentos.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;gostei-como-participo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#gostei-como-participo&quot; /&gt;Gostei! Como participo?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Você pode começar se inscrevendo na &lt;a href=&quot;https://jenkins-ci.org/content/mailing-lists&quot;&gt;lista de e-mails&lt;/a&gt; de usuários do Jenkins em Português (jenkinsci-br). Lá você poderá enviar suas perguntas, bem como ajudar outros usuários com dúvidas sobre o Jenkins ou plug-ins. Se você utiliza o Twitter, os anúncios e links serão disponibilizados no @jenkins_br.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;encontro-de-usuários-jenkins-do-brasil-2012&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#encontro-de-usuários-jenkins-do-brasil-2012&quot; /&gt;Encontro de usuários Jenkins do Brasil 2012&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;O primeiro &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/91744672/&quot;&gt;encontro de usuários Jenkins do Brasil&lt;/a&gt; acontecerá no próximo dia 1 de Dezembro de 2012. O evento é gratuito e acontecerá na &lt;a href=&quot;https://www.usp.br&quot;&gt;USP&lt;/a&gt;, em São Paulo. Lá você poderá acompanhar palestras, lighting talks, conversar com outros profissionais e também terá a oportunidade de conhecer pessoalmente Kohsuke Kawaguchi, outros usuários e desenvolvedores de plug-ins do Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Confirme já sua presença no &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/91744672/&quot;&gt;encontro de usuários Jenkins do Brasil 2012&lt;/a&gt;! Apesar de gratuito temos lugares limitados e precisamos estimar o número de participantes para brindes, bebidas e para acomodar bem todos os  participantes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Esperamos você lá! :-)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/11/16/new-mailing-list-for-better-event-meet-up-local-community-coordination/</id>
<title>New mailing list for better event/meet-up/local community coordination</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-11-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/11/16/new-mailing-list-for-better-event-meet-up-local-community-coordination/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='mailing list'></category>
<category term='meetup'></category>
<summary>
As per the discussion in the project meeting today, we created a new mailing list events@lists.jenkins-ci.org for:




discussing and coordinating Jenkins related events


share knowledge between different local communities


helping new organizers by having existing community people offering advice


improving visibility and transparency of event organization work




If you are interested in facilitating local communities (being from Japan, I know for a fact that a local community that speaks the native language makes a big difference in many parts of the world!)


The list is open for anyone to join and the archive is public. Looking forward to seeing you in the list....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As per &lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins/2012/jenkins.2012-11-14-19.01.log.html#l-68&quot;&gt;the discussion in the project meeting today&lt;/a&gt;, we created &lt;a href=&quot;https://lists.jenkins-ci.org/mailman/listinfo/jenkins-events&quot;&gt;a new mailing list &lt;code&gt;events@lists.jenkins-ci.org&lt;/code&gt;&lt;/a&gt; for:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;discussing and coordinating Jenkins related events&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;share knowledge between different local communities&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;helping new organizers by having existing community people offering advice&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;improving visibility and transparency of event organization work&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 interested in facilitating local communities (being from Japan, I know for a fact that a local community that speaks the native language makes a big difference in many parts of the world!)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The list is &lt;a href=&quot;https://lists.jenkins-ci.org/mailman/listinfo/jenkins-events&quot;&gt;open for anyone to join&lt;/a&gt; and the archive is public. Looking forward to seeing you in the list.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/11/15/fundraising-for-travel-grant/</id>
<title>Fundraising for travel grant</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-11-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/11/15/fundraising-for-travel-grant/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<summary>
+  +


We are trying to raise $2000 travel grants for assisting Jenkins contributors to travel, meet, and strengthen their relationships with the other Jenkins contributors. Specifically, we have FOSDEM and SCALE11x in mind, in which there already are a fair amount of Jenkins contributors concentration.


Being an open-source project, Jenkins developers are highly dispersed, yet a lot gets done in the community through human relationships, just like any other organizations. This poses a challenge, because most of the contributors work on Jenkins on their spare times, and so people are on their own to travel to the shows, creating greater...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/colinzhu/321306018/&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/gift.png&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are trying to &lt;a href=&quot;https://co.clickandpledge.com/advanced/default.aspx?wid=46160&quot;&gt;raise $2000 travel grants&lt;/a&gt; for assisting Jenkins contributors to travel, meet, and strengthen their relationships with the other Jenkins contributors. Specifically, we have &lt;a href=&quot;https://fosdem.org/2013/&quot;&gt;FOSDEM&lt;/a&gt; and &lt;a href=&quot;https://www.socallinuxexpo.org/scale11x/&quot;&gt;SCALE11x&lt;/a&gt; in mind, in which there already are a fair amount of Jenkins contributors concentration.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Being an open-source project, Jenkins developers are highly dispersed, yet a lot gets done in the community through human relationships, just like any other organizations. This poses a challenge, because most of the contributors work on Jenkins on their spare times, and so people are on their own to travel to the shows, creating greater divides between those of us in the U.S., Europe, and in Asia.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This fundraising is a bit of experiment to see if it’s worth the money. The goal is to sponsor two people who don’t work on Jenkins full time to travel to those events (and hopefully present talks, although that’s subject to the acceptance by conferences.) We’ll also report back what came out of them.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you think this is a worthy goal, &lt;a href=&quot;https://co.clickandpledge.com/advanced/default.aspx?wid=46160&quot;&gt;please consider donating&lt;/a&gt;. If you’d like to donate but not for this cause, please drop us a note so that we can attribute it accordingly.&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/2012/11/14/sponsor-jenkins-bugs-with-freedom-sponsors/</id>
<title>Sponsor Jenkins bugs with Freedom Sponsors</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-11-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/11/14/sponsor-jenkins-bugs-with-freedom-sponsors/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<summary>
(This is a guest post by Tony França)







Hi all, my name is Tony, I&#8217;m the creator of (FreedomSponsors) and today I want to talk how Jenkins has inspired me to build it.


Before starting, I&#8217;d like to thank the Jenkins crew for letting me publish this guest post in their blog.
On top of that, thank you for maintaining Jenkins as well - I&#8217;m a big fan and a heavy user. Jenkins potential to make peoples lives easier is really amazing.
You guys are amazing.
And Kohsuke, you&#8217;re my personal hero :-)


All right, that being said, let&#8217;s move on with the story.


Most people who...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(This is a guest post by Tony França)&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://jenkins-ci.org/sites/default/files/images/FS_vertical_logo_colored_512x347.png&quot; alt=&quot;FS vertical logo colored 512x347&quot; width=&quot;128&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hi all, my name is Tony, I’m the creator of (&lt;a href=&quot;https://freedomsponsors.org/&quot;&gt;FreedomSponsors&lt;/a&gt;) and today I want to talk how Jenkins has inspired me to build it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Before starting, I’d like to thank the Jenkins crew for letting me publish this guest post in their blog.
On top of that, thank you for maintaining Jenkins as well - I’m a big fan and a heavy user. Jenkins potential to make peoples lives easier is really amazing.
You guys are amazing.
And Kohsuke, you’re my personal hero :-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All right, that being said, let’s move on with the story.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Most people who like FreedomSponsors probably don’t know that Jenkins is sort of the reason it exists in the first place. That’s right, if it wasn’t for Jenkins I’d probably never had the idea for FS.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is how it happened.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I was playing with the (&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/OpenID+plugin&quot;&gt;Jenkins OpenID plugin&lt;/a&gt;), and I was having some trouble with it.
After a little research, I found that there was a JIRA bug for it - (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/9216&quot;&gt;JENKINS-9216: Make OpenID work with Google Apps accounts&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;Bummer&quot; - I thought - &quot;Maybe I can try to debug it. Oh boy, but I don’t know anything about Jenkins code. That would be too…​ expensive! I bet there are a few people out there that would be willing to even pay a few bucks to the Jenkins crew to prioritize this.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The moment I thought that, a storm of ideas came rushing into my head.
It was like a conversation with myself in my mind.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;Wait a minute…​ why can’t people actually do just that?! They should be able to.&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Maybe a JIRA plugin could let them…​&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;But what about other projects, ones that don’t use JIRA?&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Maybe there could be a central place for all those offers. If many people &#39;sponsor&#39; the same issue, the developer who solve it might get a decent piece of gold - rightfully deserved. That could even free up more of their time to work on the projects they love :-)&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;The sponsors would pay the developers out of gratitude, and for the sake of keeping their word.&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;This has the &lt;a href=&quot;https://agilemanifesto.org/&quot;&gt;Agile&lt;/a&gt; spirit in it: Customer collaboration over contract negotiation&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And I kept thinking, and it didn’t took very long until I had the whole &quot;sponsoring model&quot; in my head.
I realised that that was one of the best ideas I had in my life. I was very excited and I had to act on it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I started studying &lt;a href=&quot;https://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt; on that same day. I had already learned some Python before and Django had been on my queue for some time. And I’m glad I did it. I’ve been building JavaEE (Java web) applications for about 8 years now, and, oh boy, Django makes things soooo much easier, and simpler, and faster to code - I’m in love with it…​ Okay, but I’m missing the point here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, I started building &quot;it&quot; alone on my free time. It took me a few days to pick a name for &quot;it&quot;.
The &quot;FreedomSponsors&quot; name came very naturally - it rightfully conveys what the platform would do, and the spirit of software freedom that I’d like to encourage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Seven weeks later it was done. I had already bought the domain and created an account at Amazon AWS.
So I put it up and started bugging everyone about it.
And guess who was the first person I wanted to tell? Kohsuke Kawaguchi :-)
It was just fair. So I sent him this email.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On Sun, Jul 8, 2012 at 3:36 AM, Tony França &lt;a href=&quot;mailto:tonylampada@gmail.com&quot;&gt;tonylampada@gmail.com&lt;/a&gt; wrote:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hi Kohsuke.
My name is Tony, I’m a Software Architect.
I’m a big fan and a (very) heavy user of Hudson - Jenkins.
It has really been enabling our company to move towards a &quot;continuous delivery&quot;-like development process in the past couple of years.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, thank you for that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, if it wasn’t for Jenkins, maybe I would never had the idea to build the FreedomSponsors web site.
That’s my personal project - an idea that I had about six weeks ago.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You see, most of the time I was developing it, I had you in mind.
I have always felt that &quot;Jenkins is so great, that Kohsuke really deserves to get rich for it&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I just launched FreedomSponsors - a few minutes ago.
It just felt right to come here and tell you about it :-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s see if I can get you rich now :-).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cheers!
Tony Lâmpada&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And his reply just made my day&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On Thu, Jul 12, 2012 at 5:19 PM, Kohsuke Kawaguchi &lt;kk at=&quot;&quot; kohsuke=&quot;&quot; dot=&quot;&quot; org=&quot;&quot;&gt;wrote:&lt;/kk&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Congratulations for launching your service.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I thought about a similar idea long time ago over a lunch with my colleagues, but my hats off to you for actually making it real. I can imagine a lot of obstacles (most of those you already note in FAQ), but if this works out I think it’d be great.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;By the way, I wonder if you have considered open-sourcing this, say under Aflo GPL. With the network effect and being the dominant contributor, it’s very difficult for anyone else to run the same code on public internet to compete with you, and it does let other people contribute small changes, and given your audience is open-source developers, I think it sends the right message as well as help you boost your development. It also seeds the ecosystem (of Bugzilla plugin, JIRA plugin, dashboard, etc.), too.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just my 2 cents.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You see, FS’s code was still closed when I launched it. I was worried about competition indeed.
But his arguments were very convincing. Specially when he talked about sending the right message to the Free Software community. I thought about it for while and came to the conclusion that he has absolutely right. It still took me a few weeks until I moved &lt;a href=&quot;https://github.com/freedomsponsors/www.freedomsponsors.org&quot;&gt;the code to Github&lt;/a&gt;. I’m glad I did it. The feedback loop has been great.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And that was not his only contribution. He also gave us this very useful piece of feedback:
(&lt;a href=&quot;https://freedomsponsors.org/core/issue/12/jira-plugin-to-link-from-tickets-to-freedomsponsors&quot;&gt;JIRA plugin to link from tickets to FreedomSponsors&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Indeed, that was a great idea. My friend and associate Arthur is the one who built it.
Kohsuke suggested that I joined the Jenkins crew at the (&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Meeting+Agenda&quot;&gt;Jenkins Governance meeting&lt;/a&gt;) to see if everyone would agree about installing it on Jenkins JIRA. Everyone liked the idea and had no ojections.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I can’t say enough how trilled and honored I felt knowing that Jenkins would be the first project to install our plugin. Thank you folks. Thanks Kohsuke. You guys are awesome :-)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now FreedomSponsors is growing, slowly but steadily. And what makes us really happy is that almost every developer we tell about it just loves the idea. We’ve received valuable, constructive feedback from a lot of people who want to see us moving forward. That’s the best incentive that I could wish for.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We still have a lot of challenges ahead of us. The biggest and closest one in the horizon is to start a &quot;movement&quot; that will help spread within companies a culture of contributing more to the free software projects they depend on, by making they realise that that’s what’s best for everyone. If we can achieve that then we’ll have made the free software world even better.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So, everything I wrote so far is, hopefully, only the beginning of this story. And I’m really excited and looking forward to see it unfold. Being a part of it is even more exciting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What about you? If you want to be updated about, or even help write the next chapters, then
&lt;a href=&quot;https://freedomsponsors.org/core/login/&quot;&gt;join&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/freedomsponsors&quot;&gt;follow&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/freedomsponsors&quot;&gt;like&lt;/a&gt;, &lt;a href=&quot;https://web.archive.org/web/20130310041955/https://blog.freedomsponsors.org/&quot;&gt;read&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/intent/tweet?hashtags=freedomsponsors&amp;amp;original_referer=http%3A%2F%2Fblog.freedomsponsors.org%2F&amp;amp;source=tweetbutton&amp;amp;text=Check%20this%20out!%20FreedomSponsors%20-%20Crowdfunding%20Open%20Source%2C%20one%20issue%20at%20a%20time&amp;amp;url=http%3A%2F%2Fwww.freedomsponsors.org&amp;amp;via=freedomsponsors&quot;&gt;spread the word&lt;/a&gt;, give &lt;a href=&quot;https://freedomsponsors.org/core/feedback&quot;&gt;feedback&lt;/a&gt; and &lt;a href=&quot;https://github.com/freedomsponsors/www.freedomsponsors.org&quot;&gt;contribute&lt;/a&gt; with code or new issues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thank you Jenkins crew, thank you Kohsuke.
We wouldn’t have made it here without you.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/09/28/take-the-jenkins-survey/</id>
<title>Take the Jenkins Survey!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-09-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/09/28/take-the-jenkins-survey/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='news'></category>
<summary>
Just like the last year, we are running a survey this year, to get some objective insights into what our users would like to see in the project. Obviously, the developers in the project deal with individual bug reports and feature requests all the time, but sometimes those day-to-day issues distract you from a bigger picture.


This year, we kept some of the questions the same, so that we can see the trend. But we also discussed what we wanted to ask among ourselves and revised some more.


The tricky thing about being an open-source project is that it&#8217;s not like some...
</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://upload.wikimedia.org/wikipedia/commons/0/01/Paid-surveys.jpg&quot; alt=&quot;image&quot; width=&quot;200&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just like &lt;a href=&quot;https://blog.cloudbees.com/2011/12/jenkins-community-survey-results-82.html&quot;&gt;the last year&lt;/a&gt;, &lt;a href=&quot;https://www.jenkins.io/survey&quot;&gt;we are running a survey this year&lt;/a&gt;, to get some objective insights into what our users would like to see in the project. Obviously, the developers in the project deal with &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;individual bug reports and feature requests&lt;/a&gt; all the time, but sometimes those day-to-day issues distract you from a bigger picture.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, we kept some of the questions the same, so that we can see the trend. But we also &lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins/2012/jenkins.2012-09-19-18.00.log.html#l-142&quot;&gt;discussed what we wanted to ask&lt;/a&gt; among ourselves and revised some more.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The tricky thing about being an open-source project is that it’s not like some of us can actually decide what we’ll be working on — in the end it’s up to individual contributors to decide what they want to work on. So I can’t make promises, but in a way, that’s precisely why we’d like to get these objective, measurable, quantitative feedbacks. It lets us discuss how to solve the problem, instead of spending time discussing what the problem is.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last year, we’ve heard loud and clear that people wanted to see some UI improvements. So a bunch of us sit down at &lt;a href=&quot;https://www.jenkins.io/blog/2012/02/21/fosdem-2012-recap/&quot;&gt;FOSDEM&lt;/a&gt;, picked up several key UI improvements, and &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/UI+Enhancements&quot;&gt;we’ve actually delivered on those&lt;/a&gt;. This year I hope to do the same.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The survey will close at the end of October, and if you participate, you’ll get to see the results first. As an added incentive, CloudBees had pitched in a $100 Amazon gift card. So &lt;a href=&quot;https://jenkins-ci.org/survey&quot;&gt;please let your voice be heard&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/09/28/saturday-night-drink-up/</id>
<title>Saturday night drink-up</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-09-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/09/28/saturday-night-drink-up/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
Because the dinner looks popular, here&#8217;s another last minute gathering for JUC San Francisco.


We&#8217;ll have a small drink-up Saturday night at 21st Amendment (563 2nd Street), like from 6pm to whenever. If you are coming from out of town, you probably are around, so why not join us!


At least abayer, majost, and kohsuke should be there, and hopefully more. If you are coming, please leave a comment in this post so that we get the sense of who to expect!...
</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://upload.wikimedia.org/wikipedia/commons/thumb/e/e3/NCI_Visuals_Food_Beer.jpg/320px-NCI_Visuals_Food_Beer.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/84235932/&quot;&gt;the dinner looks popular&lt;/a&gt;, here’s another last minute gathering for &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco.cb&quot;&gt;JUC San Francisco&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ll have a small drink-up Saturday night at &lt;a href=&quot;http://21st-amendment.com/&quot;&gt;21st Amendment&lt;/a&gt; (563 2nd Street), like from 6pm to whenever. If you are coming from out of town, you probably are around, so why not join us!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At least abayer, majost, and kohsuke should be there, and hopefully more. If you are coming, please leave a comment in this post so that we get the sense of who to expect!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/09/26/jenkins-sessions-at-javaone/</id>
<title>Jenkins sessions at JavaOne</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-09-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/09/26/jenkins-sessions-at-javaone/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='javaone'></category>
<summary>
It&#8217;s the JavaOne season again in San Francisco. This year, there are whopping 6 sessions that discuss Jenkins (including myself, which is the very first session in Monday!) Unfortunately some of them happen in the same time, but I for one am looking forward to seeing the mobile app test talk from Intuit.



CON6256 - Large-Scale Automation with Jenkins (Monday 8:30am, Hilton)

Jenkins is the most adopted open source continuous integration server today, and beyond the automated build and test, it is a platform for launching all kinds of automation tasks. As the use of Jenkins grows inside an organization, people are...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s the JavaOne season again in San Francisco. This year, there are whopping 6 sessions that discuss Jenkins (including myself, which is the very first session in Monday!) Unfortunately some of them happen in the same time, but I for one am looking forward to seeing the mobile app test talk from Intuit.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=6256&quot;&gt;CON6256 - Large-Scale Automation with Jenkins&lt;/a&gt; (Monday 8:30am, Hilton)&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Jenkins is the most adopted open source continuous integration server today, and beyond the automated build and test, it is a platform for launching all kinds of automation tasks. As the use of Jenkins grows inside an organization, people are automating complex activities that need to be choreographed—such as deploying an application, running a load test, cleaning up the environment, and then handing over the build to the operation team. Such orchestration of activities is a very useful building block for continuous delivery, a practice promoted in recent years. This session looks at various patterns and plug-ins that deal with this kind of choreography. It also briefly discusses what’s new in recent versions of Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=3648&quot;&gt;CON3648 - Take Your Mobile Applications Tests to the Next Level: Continuous Integration&lt;/a&gt; (Monday 1pm, Hilton)&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Mobile tests today can be automated by popular mobile testing frameworks in Java such as monkeyrunner, Sikuli, and Robotium. However, getting mobile tests running in continuous integration is not widely understood and rarely implemented. Whether you are an experienced mobile developer or tester or new to the mobile field, this session informs you about the complexities of emulators and devices and how you can navigate through each challenge to integrate mobile tests into Jenkins. You will be guided step-by-step through two case studies on how to integrate native Android and iPhone application tests by using monkeyrunner and Sikuli, respectively, into Jenkins. Leave with Java code samples of these automated tests as well as practical knowledge of mobile devices and emulators.&lt;br /&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=2822&quot;&gt;CON2822 - Real-World Strategies for Continuous Delivery with Maven and Jenkins&lt;/a&gt; (Tuesday 10am, Hilton)&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Maven is close to ubiquitous in the world of enterprise Java, and the Maven dependency ecosystem is the de facto industry standard. However, the traditional Maven build and release strategy, based on snapshot versions and carefully planned releases, is difficult to reconcile with modern continuous delivery practices, where any commit that passes a series of quality-control gateways can qualify as a release. How can teams using the standard Maven release process still leverage the benefits of continuous delivery? This presentation discusses strategies that can be used to implement continuous delivery solutions with Maven and demonstrates one such strategy using Maven, Jenkins, and Git.&lt;br /&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=12570&quot;&gt;CON12570 - Pragmatic Continuous Delivery&lt;/a&gt; (Tuesday 10am, Hilton)&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;When you send a package via FedEx, it goes through a tracked, automated process that makes sure the package arrives promptly at the destination. Continuous delivery describes how this process can similarly be made fully automated and transparent, with your commits “fedexed” to production. The focus of continuous delivery is the delivery pipeline. Every commit that enters the pipeline should go through automated integration and testing, and if successful, produce a release candidate. This presentation is based on a demo that uses Jenkins to orchestrate the delivery pipeline; Nexus for long-running and manual workflows; and LiveRebel to make production updates quick, automated, nondisruptive, and reversible.&lt;br /&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=3363&quot;&gt;CON3363 - HTML5 Testing in All Browsers with Java&lt;/a&gt; (Tuesday 11:30am, Parc 55)&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Would you love to test your HTML5 app in all browsers? The biggest challenge in writing HTML5 applications is that your application must run on many platforms, ranging from old desktop browsers to cutting-edge mobile browsers. Each browser behaves nearly the same, but inconsistencies can lead to major bugs. In this session, JavaOne Rockstar and Java Champion Kevin Nilson shows how you can leverage open source Java tools to test your HTML5 application in all browsers. The presentation shows examples of using tools such as TestSwarm, QUnit, jQuery, Jenkins/Hudson, Oracle VM VirtualBox, GlassFish Server technology, and Sun SPOTs to test your HTML5 application in all browsers.&lt;br /&gt;
&lt;/p&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=12983&quot;&gt;CON12983 - Java PaaS: The Engine for Delivering Enterprise and Mobile Applications&lt;/a&gt; (Wednesday 8:30am, Parc 55)&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Attend this demo-filled session that shows you how to use Java platform as a service (PaaS) to deploy complete enterprise applications in the cloud with Eclipse, Jenkins, and MySQL in addition to iOS/Android clients and full end-to-end continuous integration. In a few minutes, you’ll have cloud-based Git/SVN repositories set up with CI builds triggered automatically and your apps, databases, and supporting services up and running live. The presentation also shows how you can add more PaaS services—ALM, Web monitoring and analytics, hosted log management, e-mail integration, enterprise search, cloud DB services, and much more—to your apps right off the bat. Experience the future of Java development!&lt;br /&gt;
&lt;/p&gt;
&lt;/dd&gt;
&lt;/dd&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And it looks like the jclouds session will also touch jgroups plugin:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;a href=&quot;https://oracleus.activeevents.com/connect/sessionDetail.ww?SESSION_ID=8009&quot;&gt;CON8009 - What’s New in jclouds 1.5&lt;/a&gt; (Monday 10am, Parc 55)&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;jclouds 1.5 is the result of 3.5 years of development by nearly 100 developers interested in portable cloud computing. During this session, you’ll get up-to-date with cloud computing technology developments such as OpenStack. You’ll learn how to use jclouds 1.5 to control private and public infrastructures and storage clouds programmatically. You’ll also see examples of new tools powered by jclouds, including Jenkins and Brooklyn.&lt;br /&gt;
&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/09/26/dinner-after-juc/</id>
<title>Dinner after JUC</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-09-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/09/26/dinner-after-juc/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
+  +


Jenkins User Conference 2012 San Francisco is this weekend!


Based on the experience from the last year, we are going to make a reservation for a dinner after JUC. If you are interested in joining us, please RSVP. We haven&#8217;t decided where to go, but we&#8217;ll place a reservation somewhere (and if you know a good place to go, please tell us, too!), so that we won&#8217;t have to spend 30 minutes on the street looking for a place for a crowd.


Eating is more fun when there are more people. Please join us!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Neon_sign&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Neon_sign_Eat.jpg/160px-Neon_sign_Eat.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco.cb&quot;&gt;Jenkins User Conference 2012 San Francisco&lt;/a&gt; is this weekend!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Based on the experience from the last year, we are going to make a reservation for a dinner after JUC. If you are interested in joining us, &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/84235932/&quot;&gt;please RSVP&lt;/a&gt;. We haven’t decided where to go, but we’ll place a reservation somewhere (and if you know a good place to go, please tell us, too!), so that we won’t have to spend 30 minutes on the street looking for a place for a crowd.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Eating is more fun when there are more people. Please join us!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/09/24/jenkins-project-meeting-in-the-meat-space-call-for-agenda/</id>
<title>Jenkins project meeting in the meat space / Call for agenda</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-09-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/09/24/jenkins-project-meeting-in-the-meat-space-call-for-agenda/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='meetup'></category>
<category term='javaone'></category>
<category term='juc'></category>
<summary>
As you may or may not know, the Jenkins project has a bi-weekly IRC meeting where we discuss and decide on things necessary to keep the project running.


Next Sunday, we&#8217;ll bring this project meeting live to Jenkins User Conference San Francisco.


Since this is an unique opportunity to engage people who don&#8217;t normally come to these meetings, I&#8217;d like to encourage everyone to propose agenda items and add it to the agenda page.


The Wiki page lists all the past meetings, so you can get a sense of what it is like. But this time, we hope to have a good number...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you may or may not know, the Jenkins project has a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Meeting+Agenda&quot;&gt;bi-weekly IRC meeting&lt;/a&gt; where we discuss and decide on things necessary to keep the project running.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next Sunday, we’ll bring this project meeting live to &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco.cb&quot;&gt;Jenkins User Conference San Francisco&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since this is an unique opportunity to engage people who don’t normally come to these meetings, I’d like to encourage everyone to propose agenda items and add it to &lt;a href=&quot;https://www.jenkins.io/project/governance-meeting&quot;&gt;the agenda page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Wiki page lists all the past meetings, so you can get a sense of what it is like. But this time, we hope to have a good number of users to the meeting, not just project insiders. So if you have things you’d like to get users feedback on, or if you like project insiders to update you on things, please don’t hesitate to add them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I still need to work on the logistics, but the plan is to do a cross-over with IRC — I’d like to show the IRC client projected in the room, so that people in the room can see the conversation in IRC, and I’d like either real-time transcribing of voice conversations to IRC and/or live broadcasting of the room.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/09/21/start-your-own-jenkins-meetup-in-10-easy-steps/</id>
<title>Start Your Own Jenkins Meetup in 10 Easy Steps</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-09-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/09/21/start-your-own-jenkins-meetup-in-10-easy-steps/" />
<author>
<name>lisawells</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='meetup'></category>
<summary>
and be a Jenkins CIA agent too! If you&#8217;re interested in building an active local Jenkins community, read on to learn how. Really, we can sum it up in one simple step:



Just Do It!







Admittedly more detailed guidelines can be useful, so hopefully these steps will give you a roadmap and some ideas:




+
Find an organizer or two. This is probably you. If you can draft a friend, colleague, or random acquaintance or three to help, even better. To enlist additional help in your area, put the word out on the Jenkins Dev email list and on your Twitter account using the...
</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://jenkins-ci.org/sites/default/files/images/IMAG0786.jpg&quot; alt=&quot;image&quot; width=&quot;200&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;olist lowerroman&quot;&gt;
&lt;ol class=&quot;lowerroman&quot; type=&quot;i&quot;&gt;
&lt;li&gt;
&lt;p&gt;and be a &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+CIA+Program&quot;&gt;Jenkins CIA agent&lt;/a&gt; too! If you’re interested in building an active local Jenkins community, read on to learn how. Really, we can sum it up in one simple step:&lt;br /&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Just Do It!&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Admittedly more detailed guidelines can be useful, so hopefully these steps will give you a roadmap and some ideas:&lt;br /&gt;
&lt;/p&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;Find an organizer or two&lt;/strong&gt;. This is probably you. If you can draft a friend, colleague, or random acquaintance or three to help, even better. To enlist additional help in your area, put the word out on the &lt;a href=&quot;https://jenkins-ci.org/content/mailing-lists&quot;&gt;Jenkins Dev email list&lt;/a&gt; and on your Twitter account using the hashtag &lt;a href=&quot;https://twitter.com/#!/search/%23JenkinsCI&quot;&gt;#JenkinsCI&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
&lt;strong&gt;Let the Jenkins project know&lt;/strong&gt;. &lt;a href=&quot;https://twitter.com/jenkinsci&quot;&gt;Let&lt;/a&gt; &lt;a href=&quot;https://groups.google.com/group/jenkinsci-dev/topics&quot;&gt;us&lt;/a&gt; &lt;a href=&quot;https://jenkins-ci.org/content/chat%20&quot;&gt;know&lt;/a&gt; so that we can help you. We can promote it on the JenkinsCI blog, promote that on Twitter, and post a summary blog. We can send stickers for you to hand out in the meetup, and we can send you a T-shirt for you to wear. We might be even able to find you additional agents I mean helpers in your city. And if you’re recording the event or streaming it live (we can tell you how), the whole Jenkins world may want to know!&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
&lt;strong&gt;Decide how often you want to meet&lt;/strong&gt;. Once a month is a good frequency, but if you feel like all you can manage is every two months or even every quarter, go for it! You can always change it.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
&lt;strong&gt;Go to Meetup.com&lt;/strong&gt;. We have &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/&quot;&gt;an account that we can let you use&lt;/a&gt;, or you can create your own meetup. They make it very easy to manage attendance and also to spread the word to people with similar interests in your community.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
&lt;strong&gt;Determine the topic for your first meetup&lt;/strong&gt;. You could feature a speaker or two, or host a panel discussion, or just get folks together to talk about how you use Jenkins. YOU would probably be a great speaker for your first meetup – or perhaps some of your colleagues or friends. If you prefer to stay behind the scenes, Twitter and the Jenkins Dev list can help you find a speaker too. And as your meetup grows, you’ll have an automatic pool of interested parties.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
&lt;strong&gt;Come up with a format for the meetup&lt;/strong&gt;. Here’s an idea for a schedule:&lt;br&gt;
6-6:30pm: Check in, Networking &amp;amp; Munchies&lt;br&gt;
6:30-6:35: Announcements&lt;br&gt;
6:35-7:15: Speaker/panel (can also have 2 speakers, which might go longer)&lt;br&gt;
7:15-7:30: Q&amp;amp;A&lt;br&gt;
7:30: Wrap up, chat&lt;br&gt;
8:00: Say goodnight, or go out together and keep drinking&lt;br /&gt;
&lt;/br&gt;
&lt;li&gt;
&lt;p&gt;+
&lt;strong&gt;Find a venue, preferably a free one&lt;/strong&gt;. Ideally, your company or one you know can host… then the venue is free. Alternate solutions: hotels (which unfortunately cost $$$) or reserve a room at a local bar or restaurant. Sometimes a university or even a library can help out with a free room.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
&lt;strong&gt;Ask a company or two to sponsor the meetup&lt;/strong&gt;, which consists of paying for food and drinks for all (and some companies will bring along SWAG). Often the company hosting the venue will also sponsor. Sponsoring is a great way for companies to generate positive publicity in their locale, to get the word out that they’re hiring, and to support the Jenkins community in general.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
&lt;strong&gt;Plan the room logistics&lt;/strong&gt;. Consider how you want the room to be set up – theater style or as individual tables to encourage group discussions. Also make arrangements to secure a projector and screen. It’s a good idea to bring along connectors for both Mac and PC.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;+
&lt;strong&gt;Get the word out in any way you can&lt;/strong&gt;. Some ideas:&lt;br /&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;Tell us so that we can promote it through our existing channels.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;If you use Meetup.com, they’ll help get the word out. And as more people join to attend one meetup, they’ll receive word about future meetups too. EventBrite is also good about suggesting events in your area that might interest you.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Email folks at your company who might be interested&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Email friends and former colleagues and ask them to spread the word&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Post the event to your Twitter, Facebook, and/or LinkedIn profiles&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;If you know of any calendars that highlight local Tech events in your area, post your meetup there. Likewise for any Tech email digests you may receive.&lt;br /&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additional tips:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Get someone to record the event. Doesn’t have to be professional quality – a Flip cam or SmartPhone can take perfectly usable video (just make sure they can record long enough!). Better yet, stream it live if you can! Broadcasting makes the event accessible to the world, not just your community, and word will travel even farther! As well, future speakers can get an idea for how your group does things.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Plan that ~50% of the people who RSVP won’t make it. It’s a free event, and plans tend to change. Order food and drink accordingly.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Remember that free food and BEvERages are strong motivators! Pizza, giant subs, or other local favorite are great choices. For BEvERages, you’re probably fine with beer, Coke and water.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Bring a sign-in sheet and name tags (and pens).&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Consider asking the sponsor to bring SWAG or raffle off something cool (maybe even their product or service).&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;At the beginning or end of the meetup, ask attendees to suggest topics they want to cover in future meetups. Or have them write down suggestions and put them in a box (then maybe raffle off a prize from the pool of contributors).&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Vary the format of your meetup – presentation, Birds of a Feather discussion, hackathon, lightning talks, white board night, Jenkins problem-solving session… all of these may interest your audience. If you can, switch the venue as well – that way people get to see other interesting companies, and can also choose to attend meetups that may be more convenient to them.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Start and end on time. If things start to run over, you can always break and let people know they can go if they need to, but are welcome to stay if they like.&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Join forces with other groups when you can – this builds up both of your groups! For example, host a joint Jenkins-Selenium group on the topic of Testing with Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Still have questions? &lt;a href=&quot;https://twitter.com/jenkinsci&quot;&gt;Give us a holler&lt;/a&gt;!&lt;br&gt;
**Special thanks to our friends at &lt;a href=&quot;https://www.saucelabs.com&quot;&gt;Sauce Labs&lt;/a&gt; for some of this content — they wrote &lt;a href=&quot;https://sauceio.com/index.php/2011/10/so-you-want-to-start-a-selenium-meetup-group-now-what/&quot;&gt;a similar guide&lt;/a&gt; for starting Selenium meetups.&lt;/br&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/09/12/jenkins-user-event-cph/</id>
<title>Jenkins User Event CPH</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-09-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/09/12/jenkins-user-event-cph/" />
<author>
<name>ndeloof</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
This article was originally posted on my personal blog





Last week, praqma was organizing in Copenhagen a "Jenkins User Event". A User Event, compared to JenkinsConf, is a lighter meeting with (supposed to be) reduced costs organized by volunteers. Praqma got sponsorship from both CloudBees and Programing Research so that they can book a high quality conference room and prepare a nice meeting with all commodities.





That was my first travel to Danemark. I enjoyed the winds-farm on northern sea as well as the duty-free lego shop at airport, but didn&#8217;t have much time to discover the city - so will have...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This article was originally posted on my &lt;a href=&quot;https://blog.loof.fr/2012/09/jenkins-user-event-cph.html&quot;&gt;personal blog&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-U254sLok_CA/UEyaAzMGpYI/AAAAAAAAHuI/--wuCdF0j2Y/s1600/IMAG0397.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://4.bp.blogspot.com/-U254sLok_CA/UEyaAzMGpYI/AAAAAAAAHuI/--wuCdF0j2Y/s640/IMAG0397.jpg&quot; alt=&quot;image&quot; width=&quot;640&quot; height=&quot;102&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week, &lt;a href=&quot;https://www.praqma.com/&quot;&gt;praqma&lt;/a&gt; was organizing in Copenhagen a &quot;Jenkins User Event&quot;. A User Event, compared to JenkinsConf, is a lighter meeting with (supposed to be) reduced costs organized by volunteers. Praqma got sponsorship from both &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; and &lt;a href=&quot;https://www.programmingresearch.com/&quot;&gt;Programing Research&lt;/a&gt; so that they can book a high quality conference room and prepare a nice meeting with all commodities.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-v4CkSM9Sdog/UEyXZlXwSFI/AAAAAAAAHt4/D8g72T1meas/s1600/IMAG0388.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-v4CkSM9Sdog/UEyXZlXwSFI/AAAAAAAAHt4/D8g72T1meas/s320/IMAG0388.jpg&quot; alt=&quot;image&quot; width=&quot;240&quot; height=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That was my first travel to Danemark. I enjoyed the winds-farm on northern sea as well as the duty-free lego shop at airport, but didn’t have much time to discover the city - so will have to come back next year ;)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-GrC_1TF4XMY/UEyXRU5U7rI/AAAAAAAAHtw/nB_jKjSbiFE/s1600/IMAG0412.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-GrC_1TF4XMY/UEyXRU5U7rI/AAAAAAAAHtw/nB_jKjSbiFE/s320/IMAG0412.jpg&quot; alt=&quot;image&quot; width=&quot;320&quot; height=&quot;130&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.praqma.com/sites/default/files/img/codecamp.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.praqma.com/sites/default/files/img/codecamp.jpg&quot; alt=&quot;image&quot; width=&quot;320&quot; height=&quot;139&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thursday was about a &lt;a href=&quot;https://www.praqma.com/jcicodecamp12&quot;&gt;Jenkins Code Camp&lt;/a&gt; (aka &quot;hackathon&quot;), that I joined late at 2pm due to flight being delayed. 20 geeks were talking about some technical issues, new features, implementation strategies for a large set of topics. I contribute a group to solve an integration issue by &lt;a href=&quot;https://github.com/jenkinsci/jenkins/pull/558&quot;&gt;creating a new extension&lt;/a&gt; point in jenkins-core. Those already confident with jenkins development helped to write this code, some discovered the extension point design as well as way to contribute to jenkins (github pull request, etc), some were looking at jenkins source code for first time so learned a lot.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-8aFBYs3PV2I/UEyZp3x53sI/AAAAAAAAHuA/T0_1zOKFVn8/s1600/IMAG0391.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-8aFBYs3PV2I/UEyZp3x53sI/AAAAAAAAHuA/T0_1zOKFVn8/s640/IMAG0391.jpg&quot; alt=&quot;image&quot; width=&quot;640&quot; height=&quot;292&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Day ended with beer then a chinese restaurant (typical Danish food :P), with lots of fun and nice discussions.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.praqma.com/sites/default/files/img/event_logo.png&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.praqma.com/sites/default/files/img/event_logo.png&quot; alt=&quot;image&quot; width=&quot;320&quot; height=&quot;138&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-5Sa6Zq5IJLc/UEyad103oMI/AAAAAAAAHuQ/-8tgTK_uERE/s1600/IMAG0401.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-5Sa6Zq5IJLc/UEyad103oMI/AAAAAAAAHuQ/-8tgTK_uERE/s320/IMAG0401.jpg&quot; alt=&quot;image&quot; width=&quot;240&quot; height=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Friday was the Jenkins User Event. To reduce costs for such an event, compared to other Jenkins Conferences organized by CloudBees this year, lunch was not provided and conference program was &quot;packed&quot; into afternoon. This let praqma get a &quot;reasonable&quot; cost for this nice event, but still have a high quality conference, with printed programs, goodies, and coffee break. All praqma team was involved to make this event as pleasant as possible for all attendees, thanks a lot to them for contributing !&lt;br&gt;
Conference was sold-out on friday morning, with 80 attendees.&lt;br&gt;
After Lars Kruse welcome speak, and CloudBees to announce partnership with Praqma for DK, the conference started with two options : either an introduction to Jenkins, or an open-space discussion (~barcamp-like) for those that already know it well. I joined a small group first discussing about pre-tested commit, and then we divert speaking about best-practices, job and test performances issues, etc. Was a great exchange with interesting feedback.&lt;br&gt;
The rest of the conference was single-track.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-oCA1lQnDBeE/UEybtag0JmI/AAAAAAAAHuY/QSofsZ_ae1M/s1600/IMAG0408.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-oCA1lQnDBeE/UEybtag0JmI/AAAAAAAAHuY/QSofsZ_ae1M/s400/IMAG0408.jpg&quot; alt=&quot;image&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;1rst session was about &quot;&lt;em&gt;facilitate strategic reuse of software&lt;/em&gt;&quot; using jenkins CI. This session exposed how a industrial company changed it’s internal software development practices and team organization to share components and be more efficient. This for sure introduced some coordinations and integration costs but resulted in a significant productivity improvement. This talk was interesting as it demonstrate that highly industrial companies (here, a low energy consuming water pumps producer) today follow development practice to share component and use continuous integration practice to help. I just wondered speaker said &quot;Clearcase facilitated&quot; sharing components  -I wouldn’t expected those two words in same sentence :P&lt;br&gt;
&quot;&lt;em&gt;Tales from the trenches&lt;/em&gt;&quot; was a funny session explaining how Nokia came from stone age (manual integration with code freezes) to modern development practices. After reinventing the wheel with ~15 home made, perl-script based CI tools, they switched to Jenkins and Git as common tooling. Explanation on Git selection, evaluating multiple DVCS popularity, then migration from ClearCase, &lt;span class=&quot;underline&quot;&gt;helping a lot&lt;/span&gt; early adopters, and later evaluating benefits (1 day / week / developer) was very interesting. Conclusion was that, &quot;some tools a radically better&quot; and &quot;deep process renewal depends heavily on tools renewal&quot;.&lt;br&gt;
&quot;&lt;em&gt;Continuous Code Inspection&lt;/em&gt;&quot; talk explained use of industrial C++ coding standard and normative coding convention, with dedicated analysis tools. After explanation on those rules and tooling, a dedicated jenkins plugin was demonstrated. Such jenkins integration makes QA mostly a single checkbox to enable, and provide history graphs, reports, and external tools integration. Introduction was a little slow imho but content was demonstrating the power of jenkins plugin model to adapt software factory to specific industrial needs.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://4.bp.blogspot.com/-Vgq2K5JLj30/UEyfE86usmI/AAAAAAAAHuw/q4vbgqguyuY/s1600/IMAG0409.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://4.bp.blogspot.com/-Vgq2K5JLj30/UEyfE86usmI/AAAAAAAAHuw/q4vbgqguyuY/s320/IMAG0409.jpg&quot; alt=&quot;image&quot; width=&quot;320&quot; height=&quot;240&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Coffee break with delicious Danish chocolates …​&lt;br&gt;
Sony was presenting its &quot;&lt;em&gt;Huge Jenkins Cluster&lt;/em&gt;&quot;, with 4 controllers, some of them handling up to 6000 jobs, 300 agents, 7000 builds a day an executing 175,000 tests a day for android platforms. Development teams use a dedicated agent machine with android devices connected through USB.&lt;br&gt;
Such a build farm requires a dedicated support team and monitoring/maintenance tooling. IT only provides the computer and maintain the OS, but all Jenkins stuff is under the hands of a dedicated team. They evaluate plugins and core upgrades, educate teams, and analyse errors.&lt;br&gt;
With 45Gb for a single full android build, they have to monitor available disk space, and developed maintenance scripts to delete old build artifacts and cleanup /tmp. They also use a local git mirror to speed-up cloning, and integrated with CFEngine-managed infrastructure to ensure no update occurs as a agent is running a build. They also significantly optimized build speed by switching from NFS to SAN, and are now evaluating XFS.&lt;br&gt;
Remaining issue is about jenkins build queue (subject discussed on Jenkins Code Camp) because a 9 in the morning, thousand users connect to jenkins controller and the UI widget to expose the queue status hits the queue synchronisation bottleneck.&lt;br&gt;
Next talk was mine, exposing &lt;a href=&quot;https://www.cloudbees.com/jenkins-enterprise-by-cloudbees-overview.cb&quot;&gt;Jenkins Enterprise&lt;/a&gt; and demonstrating one ouf our Enterprise plugins. I’m not pleased by my talk, both because my english is crappy (maybe you already noticed?) and also because I was not confident with the standard JE slides. Assuming I had more time to prepare this talk, and as a tribute to this Danish event, I’d have used a bunch of lego bricks pictures to present Cloudbee plugins. So I quickly left the slides to run a demo, setting-up Jenkins Enterprise to run &lt;a href=&quot;https://www.cloudbees.com/jenkins-enterprise-by-cloudbees-features-validated-merge-plugin.cb&quot;&gt;pre-tested commits&lt;/a&gt;. Hope you enjoyed the talk.&lt;br&gt;
&lt;a href=&quot;https://4.bp.blogspot.com/-mnHy9gx9uGw/UEyixY_2Q0I/AAAAAAAAHvI/&amp;lt;em&amp;gt;KDQbGOTjw8/s1600/IMAG0407.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://4.bp.blogspot.com/-mnHy9gx9uGw/UEyixY_2Q0I/AAAAAAAAHvI/_KDQbGOTjw8/s320/IMAG0407.jpg&quot; alt=&quot;image&quot; width=&quot;240&quot; height=&quot;320&quot; /&gt;&lt;/span&gt;Last talk was Lars one, exposing praqma &quot;_Corporate approach to opensource&lt;/a&gt;&quot;. This light, generalist talk was welcome as last one after a heavy-technical afternoon. Lars exposed reason to switch to open-source :&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;costs - for sure, &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;but also open standards and interoperability, &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;and contribution to public good. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This last point distinguish &quot;&lt;em&gt;innovators&lt;/em&gt;&quot; that create new content and contribute to the oss project, and &quot;&lt;em&gt;free riders&lt;/em&gt;&quot; that only want to save money and consume other efforts. Lars didn’t went deeper into what &quot;contributing&quot; can be about, but spending some time joining the mailing lists, exposing detailed bug report, or writing blogs or documentation about the issues you encounter is already a huge contribution to opensource. Organizing such a great user event also is ;)&lt;br&gt;
Meeting ended with a &quot;socialize&quot; time, sponsored by Pragmatic Research, with beer and sandwiches. A nice time to discuss with speakers, know a face to match an #irc nickname, discuss about everything geeks like to discuss about, and round off this pleasant day.&lt;br /&gt;
&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/br&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/09/11/come-join-the-jenkins-user-conference-san-francisco-on-september-30th/</id>
<title>Come join the Jenkins User Conference San Francisco on September 30th!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-09-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/09/11/come-join-the-jenkins-user-conference-san-francisco-on-september-30th/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='javaone'></category>
<category term='juc'></category>
<summary>
Jenkins User Conference is back to San Francisco after a world tour. The conference is on the 30th of this month (Sunday), which makes it back to back with JavaOne, just like the last year. This schedule allows the community people from all over the world to attend and talk, so you see speakers from different part of the world!


You can see the agenda and the speaker list here, there&#8217;s a number of speakers from the big/serious users of Jenkins in the bay area, such as NetFlix, and Cisco, and HP. All of these guys not only just use Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Golden_Gate_Bridge&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/0/0c/GoldenGateBridge-001.jpg/250px-GoldenGateBridge-001.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco.cb&quot;&gt;Jenkins User Conference&lt;/a&gt; is back to San Francisco after a world tour. The conference is on the 30th of this month (Sunday), which makes it back to back with JavaOne, just like the last year. This schedule allows the community people from all over the world to attend and talk, so you see speakers from &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco-abstracts.cb#JevgeniKabanov&quot;&gt;different part&lt;/a&gt; of &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco-abstracts.cb#BaruchSadogursky&quot;&gt;the world&lt;/a&gt;!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can see &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco.cb&quot;&gt;the agenda and the speaker list here&lt;/a&gt;, there’s a number of speakers from the big/serious users of Jenkins in the bay area, such as &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco-abstracts.cb#JustinRyan&quot;&gt;NetFlix&lt;/a&gt;, and &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco-abstracts.cb#MaxSpring&quot;&gt;Cisco&lt;/a&gt;, and &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco-abstracts.cb#JamesBlair&quot;&gt;HP&lt;/a&gt;. All of these guys not only just use Jenkins but wrote additional plugins/programs to really tailor Jenkins into fitting their needs, and I think those would be really informative for those who are already using Jenkins, as well as those who are thinking about using Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This time we also have a couple of talks that discuss how to develop plugins. In JUC Israel, I was pleasantly surprised that a talk on this topic attracted a lot of people! If you are interested in writing a plugin, this would be a great chance to get started.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are also trying to bring &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Governance+Meeting+Agenda&quot;&gt;the Jenkins project meeting&lt;/a&gt;, which normally happens in IRC, into the real world in this conference. We are hoping that this would allow those who don’t normally come to the meeting to voice their thoughts. If you are interested, feel free to add stuff to the agenda list!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And oh, did you check out who’s on the sponsors list this year?&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I hope I convinced you that you must come to this conference — if so, &lt;a href=&quot;https://juc-san-francisco-september-2012-eorg.eventbrite.com/&quot;&gt;please register&lt;/a&gt;. I’ve been told that right now you can use the promotion code &lt;code&gt;JUC-2012SF&lt;/code&gt; to cut the price in half, so please use it while it still works!&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/08/27/volunteers-needed-for-juc-sf/</id>
<title>Volunteers needed for JUC SF</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-08-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/08/27/volunteers-needed-for-juc-sf/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='juc'></category>
<summary>
Recently, Jenkins User Conference organizer Alyssa Tong sent out the following request:




Jenkins User Conf SF is looking for volunteers to help us record the                                                                            ...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/Jenkins_SanFran_T-ShirtM.jpg&quot; alt=&quot;Jenkins SanFran T ShirtM&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently, Jenkins User Conference organizer Alyssa Tong sent out the following request:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins User Conf SF is looking for volunteers to help us record the                                                                                       &lt;br&gt;
sessions. Pls drop me an email if you’re able to help.&lt;/br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re trying to make sure we can capture video of as much of this year’s conference as possible, but the only way we can do that is with your help!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ll be in town for JavaOne, or just live in the bay area, drop Alyssa an email at &lt;code&gt;atong@cloudbees.com&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/08/20/report-intro-to-jenkins-meet-up-in-copenhagen/</id>
<title>Report: Intro to Jenkins meet-up in Copenhagen</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-08-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/08/20/report-intro-to-jenkins-meet-up-in-copenhagen/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='jenkinsci'></category>
<summary>
We have hosted two informal meetups introducing Jenkins Continuous Integration Server.


The first in end of June (announced here on this blog) and the second on the 7th of August. The first meet-up in June was only announced 8 days before, but had very good attendance  - the second was completely booked (15 seats).


The agenda is a short presentation of continuous integration and software validation to inspire the use of Jenkins, then a few words and terms about Jenkins and finally a live demo.
The live demo starts from scratch by downloaded the latest Jenkins java web archive, starts it, define...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have hosted two informal meetups introducing Jenkins Continuous Integration Server.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first in end of June (announced here on this blog) and the second on the 7th of August. The first meet-up in June was only announced 8 days before, but had very good attendance  - the second was completely booked (15 seats).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The agenda is a short presentation of continuous integration and software validation to inspire the use of Jenkins, then a few words and terms about Jenkins and finally a live demo.
The live demo starts from scratch by downloaded the latest Jenkins java web archive, starts it, define a job on one of our Maven based java projects on Github. We add two easy plugins (Warnings and Task Scanner). Second part of the demo is about unit testing and coverage and we show how easy it is to enable a JUnit report and add a Cobertura coverage report if there is already unit tests for the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The meetups have about 90 minutes scheduled, including questions and the discussion session after the demo, where we serve pizza, beer and cola. The theoretical presentation and live demo is typically finished within one hour, even though we encourage our guests to ask questions and discuss whatever comes into their mind on the way. The relatively short time used for the introduction demonstrates how easy it is to get started with continuous integration and software validation using Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As the live demo is based on a Java/Maven project we ask the guests about their technologies and try to relate that to their setup, so they know there also is an easy approach for them to use Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The meeting is quite informal, and limited to 15 participants, leaving plenty of time to discuss and answer questions both before and after the meeting. We are always a few developers from Praqma to facilitate the discussions about the participants individual setup and questions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These informal discussions are one of the main gains for us in Praqma, as it  is very interesting to share our experience with our guests and hear about all of their interesting challenges, that might have brought them north of Copenhagen to attend our meeting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because these first meet-ups have been so popular and interesting we have decided to arrange them regularly in the future. Not just the Jenkins introduction, which will be repeated as long as there is an interest, but we are also making plans for meetups about Git, Mercurial and other topics.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in more Jenkins and CI related meet-ups in the Copenhagen area, visit &lt;a href=&quot;http://www.praqma.net&quot;&gt;our homepage&lt;/a&gt; or follow the &lt;code&gt;#pragma&lt;/code&gt; hashtag on Twitter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We also have a &lt;a href=&quot;http://www.praqma.net/jciusrcph12&quot;&gt;Jenkins User Event in Copenhagen&lt;/a&gt; coming in September.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/07/26/jenkins-user-conference-san-francisco-call-for-papers/</id>
<title>Jenkins User Conference San Francisco: call for papers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-07-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/07/26/jenkins-user-conference-san-francisco-call-for-papers/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='javaone'></category>
<category term='juc'></category>
<summary>
Jenkins User Conference is touring around the world and coming back to San Francisco for this September, colocated with JavaOne.


And here is the call for papers — we&#8217;d love users and plugin developers to share their experience with others. Please tell us how you combine plugins in an interesting way, how some of the features in Jenkins did or did not work for you, tricks you use to effectively manage Jenkins instances, and so on.


I personally know many bay area tech companies that depend heavily on Jenkins. Really looking forward to hearing from you!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/blog/tags/juc&quot;&gt;Jenkins User Conference&lt;/a&gt; is touring around the world and coming back to San Francisco for this September, colocated with JavaOne.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And here is &lt;a href=&quot;https://www.cloudbees.com/forms/jenkins-user-conference-call-papers.cb&quot;&gt;the call for papers&lt;/a&gt; — we’d love users and plugin developers to share their experience with others. Please tell us how you combine plugins in an interesting way, how some of the features in Jenkins did or did not work for you, tricks you use to effectively manage Jenkins instances, and so on.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I personally know many bay area tech companies that depend heavily on Jenkins. Really looking forward to hearing from you!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/07/23/jenkins-user-conference-israel/</id>
<title>Jenkins User Conference Israel</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-07-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/07/23/jenkins-user-conference-israel/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
I&#8217;m back from the latest Jenkins User Conference in Israel, and I had such a fun (except the part where I strained my lower back on the day I head back to home so 10+5 hour flights were a torture.) I have this impression that Israeli people form a close-knit community on their own (somewhat like Japanese people do), perhaps because of the difference in the language or the culture. One of the great things about those communities are that people are well connected, and so reaching the right ears and spreading the ideas are easier. JUC Israel turns out...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m back from the latest Jenkins User Conference in Israel, and I had such a fun (except the part where I strained my lower back on the day I head back to home so 10+5 hour flights were a torture.) I have this impression that Israeli people form a close-knit community on their own (somewhat like Japanese people do), perhaps because of the difference in the language or the culture. One of the great things about those communities are that people are well connected, and so reaching the right ears and spreading the ideas are easier. JUC Israel turns out to be the biggets JUC we had this year. Shlomi told me that some 230 people registered and 240 people showed up, and this negative last-minute cancellation ratio is unheard of! We had booths from sponsors, 2 concurrent tracks of technical talks, and wonderful Israeli food, in a nice hotel by the beach.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/296/category/5/created-monthly-list-2012-7&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/07/12/20120712090747-e447b7c7.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For me, the conference started the night before, when JFrog folks took us to the Hudson restaurant, which was a wonderful steak house. Needless to say I took a lot of pictures. Hudson was great, and I got a wet-wipe in the end to wipe my hands off with Hudson.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/324/category/5&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/07/12/20120712091422-d48662cb.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As for the highlights from the sessions.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/363/category/5&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/07/12/20120712092442-6b807f97.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After I and Shlomi have done the keynote, Amir from HP did a wonderful job showing off how he uses the multi-configuration project type (AKA &quot;matrix project&quot;.) This is one of the areas where we made a lot of improvements lately, and one that I highlighted in my talk. I’ve always been feeling that this feature needs to be advertised more, so it was just perfect in that regard. It was also very useful for me personally, as I got some inspirations about improvements while he talks.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/384/category/5&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/07/12/20120712093014-62a9271b.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sacha then talked about why the future of server-side applications are in PaaS. He had this one point where he said increasing the failure rate of software projects isn’t necessarily a bad thing — if in a time frame of a year, you can do 10 projects and 2 succeed, then while that’s only 20% success rate, it’s better than doing 4 projects in the same time and having only 1 succeed. IOW, a machine-gun does a far more damage than a pistol, even though their accuracy can be much lower. And PaaS/Continuous-delivery plays a central role here because those are what lets you deliver 10 features in a year, instead of 4.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/397/category/5&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/07/12/20120712093400-c7816855.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Eyal from RedHat and Ronen from Ginger did two sessions showing off their use of Jenkins. One of the common theme in them is to use a text format (Puppet for Eyal and Groovy DSL for Ronen) to manage definitions of a large number of jobs. I think there’s a lot of value in managing job definitions outside the current GUI, and I’m going to encourage Ronen to move his Groovy DSL project into the Jenkins CI project. I also felt that the template feature in Jenkins Enterprise by CloudBees was validated, as it provides a similar capability (and in my opinion more easily deployable.)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/391/category/5&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/07/12/20120712093221-0c896346.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Another talk that made a strong impression on me was the introductory plugin development talk from Noam, who works for JFrog and develops the Jenkins Artifactory plugin. I expected there to be only like 20-30 people, but it turns out about half the audience is there, indicating the high degree of interest to customizing Jenkins! In the past, all my favorite JUC talks came from those who I call &quot;super Jenkins admins&quot; who not only figure out how to combine some plugins, but also developed a few glue plugins. And those those extra finish makes all the difference!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/411/category/5&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/07/12/20120712093759-5aec89e0.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The conference concluded with a social in the garden looking a sunset into the Mediterranean sea. Thank you very much for JFrog and CloudBees for making this event happen, and Marina in particular for lining up all the ducks in a row.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/428/category/5&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/07/12/20120712094258-6527b7cd.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br&gt;
&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/434/category/5&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/07/12/20120712094422-b45159bc.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next JUC will be in Tokyo, at the end of this month. Believe it or not, as of this writing we got 930 people registered, so it’ll be another awesome show! For future schedules of Jenkins User Conferences and registrations, check out &lt;a href=&quot;https://www.cloudbees.com/juc2012.cb&quot;&gt;the JUC website&lt;/a&gt;!&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/br&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/06/22/intro-to-jenkins-meetup-in-copenhagen/</id>
<title>Intro to Jenkins meetup in Copenhagen</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-06-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/06/22/intro-to-jenkins-meetup-in-copenhagen/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='meetup'></category>
<summary>
[ Editor&#8217;s Note: This was originally posted to the jenkinsci-users mailing list by community member Bue Petersen ]



Praqma inviterer til Gå-Hjem-Møde i Allerød, onsdag d 27. juni kl 17:00. Få en introduktion og demo af Jenkins CI server (Open Source). Vi byder på pizza og en kold øl eller vand. Arrangement er gratis, tilmelding er nødvendig.


Continuous Integration&#8201;&#8212;&#8201;er et princip der dikterer, at alle ændringer skal integreres, i det øjeblik de er skabt&#8201;&#8212;&#8201;kontinuerligt og automatisk. Continous Software Validation går skridtet videre - alle ændringer skal valideres, i det øjeblik de er skabt.


Jenkins Continuous Integration Server hurtigt blevet de facto standard for...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[ &lt;strong&gt;Editor’s Note&lt;/strong&gt;: This was originally posted to the &lt;a href=&quot;https://groups.google.com/group/jenkinsci-users/msg/9e1bb07e7a109c21?hl=en_US&quot;&gt;jenkinsci-users&lt;/a&gt; mailing list by community member Bue Petersen ]&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Praqma inviterer til Gå-Hjem-Møde i Allerød, onsdag d 27. juni kl 17:00. Få en introduktion og demo af Jenkins CI server (Open Source). Vi byder på pizza og en kold øl eller vand. Arrangement er gratis, tilmelding er nødvendig.&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Continuous Integration — er et princip der dikterer, at alle ændringer skal integreres, i det øjeblik de er skabt — kontinuerligt og automatisk. Continous Software Validation går skridtet videre - alle ændringer skal valideres, i det øjeblik de er skabt.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins Continuous Integration Server hurtigt blevet de facto standard for Continuous Integration. Og den er hjørnestenen i build- og softwarevaliderings-systemet og bindeledet mellem samtlige tools i hele den tool-chain, man ønsker at indføre eller udbygge.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;På Jenkins konfigureres jobs, som udover at bygge og eksekvere unittests også kan tage ansvar for valideringer som statisk kodeanalyse, rapportering af warnings, coverage-målinger af unittests, automatisk generering af dokumentation, eksekvering af funktionelle tests etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Vi holder et uformelt gå-hjem-møde med pizza, øl og sodavand, hvor vi præsenterer Jenkins Continuous Integration og viser dig, hvordan du nemt kommer i gang, så du allerede dagen efter kan høste synlige fordele på dine projekter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Du kan få helt ny viden og indsigt i din kodebase, og du kan skabe grundlag for ændring af arbejdsgange i udviklingen.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Onsdag 27. juni 2012  kl. 17.00 - 18.30&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Praqma A/S&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Allerød Stationsvej 4&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3450 Allerød&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Denmark&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://sites.google.com/a/praqma.net/www/seminar&quot;&gt;Tilmelding&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/06/19/jenkins-and-bioinformatics-catch-us-at-bosc-2012/</id>
<title>Jenkins and Bioinformatics, catch us at BOSC 2012</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-06-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/06/19/jenkins-and-bioinformatics-catch-us-at-bosc-2012/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='cia'></category>
<category term='meetup'></category>
<summary>
[ Editor&#8217;s Note: The following is a post from Jenkins CIA member Bruno P. Kinoshita ]


Jenkins will be represented at this years Bioinformatics Open Source Conference (BOSC 2012) on July 13-14th in Long Beach, California. I will be talking about Jenkins during my talk about BioUno.


BOSC 2012 will be held just before ISMB 2012, while registration is through ISMB you don&#8217;t have to register for ISMB in order to register for BOSC.


I will be at the event with some Jenkins stickers and available to answer questions you might have about BioUno and Jenkins!


About BioUno

BioUno is a project that uses Jenkins...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[ &lt;strong&gt;Editor’s Note:&lt;/strong&gt; &lt;em&gt;The following is a post from &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+CIA+Program&quot;&gt;Jenkins CIA&lt;/a&gt; member &lt;a href=&quot;https://kinoshita.eti.br&quot;&gt;Bruno P. Kinoshita&lt;/a&gt;&lt;/em&gt; ]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins will be represented at this years Bioinformatics Open Source Conference (&lt;a href=&quot;https://www.open-bio.org/wiki/BOSC_2012&quot;&gt;BOSC 2012&lt;/a&gt;) on July 13-14th in Long Beach, California. I will be talking about Jenkins during my talk about &lt;a href=&quot;https://www.biouno.org&quot;&gt;BioUno&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;BOSC 2012 will be held just before &lt;a href=&quot;https://www.iscb.org/ismb2012&quot;&gt;ISMB 2012&lt;/a&gt;, while registration is through ISMB you don’t have to register for ISMB in order to register for BOSC.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I will be at the event with some Jenkins stickers and available to answer questions you might have about BioUno and Jenkins!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;about-biouno&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#about-biouno&quot; /&gt;About BioUno&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;BioUno is a project that uses Jenkins as basis for building
&lt;a href=&quot;https://en.wikipedia.org/wiki/Bioinformatics_workflow_management_systems&quot;&gt;biology workflows&lt;/a&gt;.
BioUno provides an alternative update center with custom plug-ins for
bioinformatics tools like
&lt;a href=&quot;https://mrbayes.sourceforge.net/&quot;&gt;MrBayes&lt;/a&gt;,
&lt;a href=&quot;https://pritch.bsd.uchicago.edu/structure.html&quot;&gt;Structure&lt;/a&gt;,
&lt;a href=&quot;https://tree.bio.ed.ac.uk/software/figtree/&quot;&gt;Figtree&lt;/a&gt;,
&lt;a href=&quot;http://beast.community/&quot;&gt;Beast&lt;/a&gt;,
among &lt;a href=&quot;https://www.biouno.org/biouno-plugins/&quot;&gt;others&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the actual task of analysing or displaying data is handled by specific
tools, that are wrapped by plug-ins, Jenkins is responsible for user control,
web interface, notifications, distributed execution, job schedule and
management, as well as other important low level tasks.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;BioUno is similar to &lt;a href=&quot;http://biohpc.org/&quot;&gt;BioHPC&lt;/a&gt;,
&lt;a href=&quot;https://galaxy.psu.edu/&quot;&gt;Galaxy&lt;/a&gt; and
&lt;a href=&quot;https://taverna.incubator.apache.org/&quot;&gt;Taverna&lt;/a&gt;, in that all these tools enable creating and managing pipelines using different bioinformatics tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;However, as it is using Jenkins, BioUno has the advantage of having an Open Source community of hackers that can answer questions and provide assistance for creating new plug-ins. There is plenty documentation for &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Extend+Jenkins&quot;&gt;extending Jenkins&lt;/a&gt;
and troubleshooting issues, as well as plenty &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugins&quot;&gt;existing plug-ins&lt;/a&gt; (that can be used as reference while writing new plug-ins).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are projects and plug-ins that enable Jenkins to use resources in clouds or turn Jenkins into a &lt;a href=&quot;https://hadoop.apache.org/&quot;&gt;Hadoop&lt;/a&gt; node, for big data processing. The next steps of the project include the deployment of BioUno to a computer facility, basic infrastructure for BioUno, definition of the process for releasing plug-ins, the creation of more plug-ins and a study on how to handle large data structures, used by many bioinformatics tools.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project is being developed by &lt;a href=&quot;http://tupilabs.com&quot;&gt;TupiLabs&lt;/a&gt; under MIT License, and contributions and new plug-ins are welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/05/28/jenkins-a-besoin-de-vous/</id>
<title>Jenkins a besoin de vous</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-05-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/05/28/jenkins-a-besoin-de-vous/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='guest post'></category>
<summary>
[Editor&#8217;s Note: The following is a guest post by Jenkins contributor Baptiste Mathus. For the non-French speakers, we&#8217;re looking for French speakers to help translate "Jenkins: The Definitive Guide" ]







Si vous vous intéressez à Jenkins et que vous aimeriez pouvoir y contribuer, lisez la suite.


L&#8217;année dernière, en août, nous avons attaqué la traduction en français du Jenkins Definitive Guide, écrit en bonne partie par John Ferguson Smart. Le travail a avancé doucement, mais a avancé tout de même. A ce jour, sur la quinzaine de
chapitres, trois sont traduits et relus, et presque tout le reste est en cours.


Mais je ne...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[&lt;strong&gt;Editor’s Note&lt;/strong&gt;: &lt;em&gt;The following is a guest post by Jenkins contributor &lt;a href=&quot;https://twitter.com/bmathus&quot;&gt;Baptiste Mathus&lt;/a&gt;. For the non-French speakers, we’re looking for French speakers to help translate &quot;Jenkins: The Definitive Guide&quot;&lt;/em&gt; ]&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://batmat.net/dotclear/public/images/Superdupont_we_need_you.jpg&quot; alt=&quot;Woui Nide You!&quot; width=&quot;180&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si vous vous intéressez à Jenkins et que vous aimeriez pouvoir y contribuer, lisez la suite.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L’année dernière, en août, nous avons attaqué la traduction en français du &lt;a href=&quot;http://www.wakaleo.com/books/jenkins-the-definitive-guide&quot;&gt;Jenkins Definitive Guide&lt;/a&gt;, écrit en bonne partie par &lt;a href=&quot;http://www.wakaleo.com/about-us/about-wakaleo-consulting&quot;&gt;John Ferguson Smart&lt;/a&gt;. Le travail a avancé doucement, mais a avancé tout de même. A ce jour, sur la quinzaine de
chapitres, trois sont traduits et relus, et presque tout le reste est en cours.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;mais-je-ne-parle-pas-bien-anglais&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mais-je-ne-parle-pas-bien-anglais&quot; /&gt;Mais je ne parle pas bien anglais…​&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ce n’est pas grave. Il y a plusieurs chapitres où il faut simplement relire, et donc parler et écrire correctement le français est suffisant. Si éventuellement, vous ne comprenez pas certaines parties traduites, et qu’il faut relire l’original, vous pouvez toujours &lt;a href=&quot;https://groups.google.com/forum/#%21forum/jenkins-le-guide-complet&quot;&gt;soulever la question sur la liste de diffusion du projet où on parle français&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;je-ne-suis-pas-développeur-ou-je-ne-connais-pas-git-ou-les-deux&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#je-ne-suis-pas-développeur-ou-je-ne-connais-pas-git-ou-les-deux&quot; /&gt;Je ne suis pas développeur, ou je ne connais pas Git, ou les deux&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si vous voulez vous former à Git, c’est l’occasion. On se fera un plaisir de répondre à vos questions sur la liste de diffusion, même si elles sont exclusivement liées à Git, et pas (encore) à la traduction :-).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mais si vous ne le sentez pas ou n’avez pas le temps, ce n’est pas grave. Vous devez simplement savoir éditer un fichier XML. Il y en a &lt;a href=&quot;https://github.com/Jenkins-Le-guide-complet/jenkins-the-definitive-guide-book/tree/master/hudsonbook-content-fr/src/main/resources&quot;&gt;un pour chaque chapitre&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;super-par-où-je-commence-alors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#super-par-où-je-commence-alors&quot; /&gt;Super ! Par où je commence alors ?&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Comment se signaler :&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Il y a une &lt;a href=&quot;https://github.com/Jenkins-Le-guide-complet/jenkins-the-definitive-guide-book/wiki&quot;&gt;page wiki qui récapitule l’état de la traduction&lt;/a&gt;, chapitre par chapitre. Indiquez votre nom en tant que relecteur, et c’est parti.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Si vous le souhaitez, mais ce n’est pas une obligation, vous pouvez vous présenter sur la &lt;a href=&quot;https://groups.google.com/forum/#%21forum/jenkins-le-guide-complet&quot;&gt;liste de diffusion du projet&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comment relire les chapitres ?&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Le plus simple est de lire la &lt;a href=&quot;https://jenkins-le-guide-complet.github.com/&quot;&gt;version HTML publiée en continu grâce à CloudBees&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comment faire part de mes corrections ? Deux solutions :&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Git : vous forkez le projet &lt;a href=&quot;https://github.com/Jenkins-Le-guide-complet/jenkins-the-definitive-guide-book&quot;&gt;GitHub : Jenkins - Le Guide Complet&lt;/a&gt;, vous créez une branche pour la relecture, vous committez vos vos corrections, et vous faites une &lt;a href=&quot;https://help.github.com/send-pull-requests/&quot;&gt;pull-request&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copiez le &lt;a href=&quot;https://github.com/Jenkins-Le-guide-complet/jenkins-the-definitive-guide-book/tree/master/hudsonbook-content-fr/src/main/resources&quot;&gt;fichier XML du chapitre qui vous intéresse à partir de la page du projet&lt;/a&gt; puis vous l’envoyez sur la liste de diffusion lorsque vous avez fini.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si vous êtes intéressé, mais que vous avez des questions, surtout n’hésitez pas à les poser.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On vous attend ! :-)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/05/21/nyc-jenkins-user-conference-recap/</id>
<title>NYC Jenkins User Conference Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-05-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/05/21/nyc-jenkins-user-conference-recap/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<category term='meetup'></category>
<category term='juc'></category>
<summary>
Editor&#8217;s Note: The following is a write-up courtesy of Jesse Farinacci
This past week I had the pleasure of attending the Jenkins User Conference in NYC. A hundred other like-minded continuous integration enthusiasts and I packed a very posh Marriott Marquis for a full day of Jenkins excitement.
Famed Hudson and Jenkins founder Kohsuke Kawaguchi delivered the opening address to a crowded room.





I&#8217;m sure everyone knows the statistics by now, that Jenkins adoption and development continues at an unbridled pace. Pushing past all the mailing list users and posts, the JIRAs opening and closing, the Twitter followers, the five Jenkins User Conferences scheduled...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note:&lt;/strong&gt; &lt;em&gt;The following is a write-up courtesy of &lt;a href=&quot;https://twitter.com/0x4C4A0A46&quot;&gt;Jesse Farinacci&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
This past week I had the pleasure of attending the &lt;a href=&quot;https://www.cloudbees.com/juc2012.cb&quot;&gt;Jenkins User Conference&lt;/a&gt; in NYC. A hundred other like-minded continuous integration enthusiasts and I packed a very posh Marriott Marquis for a full day of Jenkins excitement.&lt;br&gt;
Famed Hudson and Jenkins founder &lt;a href=&quot;https://kohsuke.org/&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; delivered the opening address to a crowded room.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-zONIv2yCm1s/T7pLy0yCalI/AAAAAAAAANg/hXadCIg5XC0/s1600/kohsuke.jpg&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://3.bp.blogspot.com/-zONIv2yCm1s/T7pLy0yCalI/AAAAAAAAANg/hXadCIg5XC0/s320/kohsuke.jpg&quot; alt=&quot;image&quot; width=&quot;239&quot; height=&quot;320&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m sure everyone knows the statistics by now, that Jenkins adoption and development continues at an unbridled pace. Pushing past all the mailing list users and posts, the JIRAs opening and closing, the Twitter followers, the &lt;strong&gt;five&lt;/strong&gt; Jenkins User Conferences scheduled for this year, the unprecedented number of installations reporting anonymous usage, the native availability for &lt;strong&gt;nine&lt;/strong&gt; different OSes, in pushing past all of that..&lt;br&gt;
For me, the most impressive number was that on average there was about 1 plugin created every day over the past year. Let me reiterate that: &lt;strong&gt;1 plugin created every day for a year&lt;/strong&gt;. If that isn’t the best testament to the versatility, extensibility, and just plain usefulness of a piece of software, then I don’t know what would be!&lt;br&gt;
Announced at the conference was the general availability of &lt;a href=&quot;https://buildhive.cloudbees.com/&quot;&gt;CloudBees BuildHive&lt;/a&gt;, this is a mechanism for quickly and easily obtaining access to cloud-based Jenkins. If you have projects on &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;, you can effortlessly log in to BuildHive via GitHub OAuth, import your projects with literally a single click, and start benefiting from the powerful promise of the cloud. You’ll no longer have to worry about managing infrastructure, you’ll just get all that great Jenkins CI capability for your projects immediately.&lt;br&gt;
With BuildHive enabled projects, if a user of your project creates a pull request, then it will automatically pre-test that request before it hits the master tree — &lt;a href=&quot;https://github.com/jenkinsci/naginator-plugin/pull/2#issuecomment-5732481&quot;&gt;commenting inside the pull request&lt;/a&gt; whether or not the change broke the build. If a developer wants to test some changes before pushing them to the master tree, there’s the &lt;a href=&quot;https://www.cloudbees.com/jenkins-enterprise-by-cloudbees-features-validated-merge-plugin.cb&quot;&gt;Validated Merge feature&lt;/a&gt;, which can be used to screen commits before they land in master. Both of these features are wickedly awesome, to not use them would be a mistake for any F/OSS community.&lt;br&gt;
I would encourage you to try out BuildHive, it’s already active for most/all of the Jenkins plugins. There’s also an existing &lt;a href=&quot;https://groups.google.com/d/topic/jenkinsci-dev/kqPAOziY1as/discussion&quot;&gt;RFC thread&lt;/a&gt; which is in discussion for making this the de facto location for Jenkins plugin on Jenkins testing. Please give it a shot and then post your comments.&lt;br&gt;
Aside from this major announcement, I think the most interesting perspective I took away from the conference was the sheer diversity of Jenkins exploitation. People are using it on all sorts of hardware platforms, from mobile to cloud, on all sorts of languages from Java and C/C++ to Python and Ruby. I was also impressed with how many teams are using Jenkins as part of their mission critical business process.&lt;br&gt;
Finally, I’d like to thank all the Jenkins developers and users for making it the best continuous integration software available today. Keep up the good work!&lt;/br&gt;
&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/05/10/jenkins-user-conference-paris-summary/</id>
<title>Jenkins User Conference Paris Summary</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-05-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/05/10/jenkins-user-conference-paris-summary/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<category term='pipeline'></category>
<category term='workflow'></category>
<summary>
The first stop of Jenkins User Conference world tour this year was Paris, where there&#8217;s a considerable concentration of Jenkins developers and users (sometimes those of us on the other side of the Atlantic call them "the French gang") The event was held a day before Devoxx France, in the hope that we attract more attendance.





I believe there are 100+ people that actually showed up, and we had a full day divided in two tracks, talking all things about Jenkins. While many are French, some of the attendees come from all over the Europe. I was able to see some...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-paris.cb&quot;&gt;The first stop of Jenkins User Conference world tour&lt;/a&gt; this year was Paris, where there’s a considerable concentration of Jenkins developers and users (sometimes those of us on the other side of the Atlantic call them &quot;the French gang&quot;) The event was held a day before Devoxx France, in the hope that we attract more attendance.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/62/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423115916-5ed0a69e.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I believe there are 100+ people that actually showed up, and we had a full day divided in two tracks, talking all things about Jenkins. While many are French, some of the attendees come from all over the Europe. I was able to see some familiar faces, as well as those who I’ve only known by their names.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I tried to get in and out of both tracks to get the sense of what’s going on, so that I can report them later, and here’s my notes.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/75/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423121146-816f0806.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I kicked off the whole day with a keynote, looking back what we’ve done since we became Jenkins. I’ve looked into various activities in the community, such as LTS, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+CIA+Program&quot;&gt;Jenkins CIA&lt;/a&gt;, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+plugin+development+in+Ruby&quot;&gt;Ruby plugin development&lt;/a&gt;, and &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/UI+Enhancements&quot;&gt;UI enhancements&lt;/a&gt;. I updated my adoption statistics slides (we are happy to report that we crossed &lt;a href=&quot;https://imod.github.com/jenkins-stats/svg/svgs.html&quot;&gt;40K installations&lt;/a&gt; in our tracking), and reported that JFrog is now &lt;a href=&quot;https://java.dzone.com/announcements/jenkins-ci-and-jfrog-announce&quot;&gt;hosting our repositories&lt;/a&gt; that we rely on for the development. I showed some of what we’ve been lately working on at CloudBees — such as the upcoming version of &lt;a href=&quot;https://www.cloudbees.com/jenkins-enterprise-by-cloudbees-overview.cb&quot;&gt;Jenkins Enterprise by CloudBees&lt;/a&gt; that support high-availability, &lt;a href=&quot;https://www.cloudbees.com/press-room/cloudbees-donates-five-plugins-jenkins-community.cb&quot;&gt;our giving away the folder plugin for free&lt;/a&gt; (as in beer), and previews of some not quite public yet features, which is a treat only for those who came!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/89/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423123054-9f4acaef.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the first slot, &lt;a href=&quot;https://twitter.com/gboissinot/&quot;&gt;Gregory Boissinot&lt;/a&gt; went through a plugin development workshop. This was actually something I really wanted to understand, so that I get the objective view on where the pitfalls are. Even though the talk was in French, I did understand the code he was showing, and I took some notes about having some kind of skeleton code generator — for example, there’s a common pattern for building an UI bound model object (for asking the user to enter data that has structures, persisting them, and so on), and having a code generator command line tool (like &lt;a href=&quot;https://github.com/jenkinsci/jenkins.rb&quot;&gt;jenkins.rb&lt;/a&gt; has) could be really handy.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/93/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423123825-9ef5019f.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In another room, &lt;a href=&quot;https://twitter.com/ndeloof&quot;&gt;Nicolas&lt;/a&gt; and Mathieu were showing their &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Build+Flow+Plugin&quot;&gt;&quot;build flow&quot;&lt;/a&gt; plugin, which lets you write a workflow in Groovy DSL. Choreographing a complex workflow that involves multiple jobs is a commoon challenge among any Jenkins users, and so this talk was well attended, and I’m really looking forward to seeing this plugin mature (there’s &lt;a href=&quot;https://cisco.webex.com/ciscosales/lsr.php?AT=pb&amp;amp;SP=MC&amp;amp;rID=60616172&amp;amp;rKey=7caa63dde29ef758&quot;&gt;a separate effort&lt;/a&gt; to integrate BPMN workflow into Jenkins, see more about that here.) One thing I learned about Groovy DSL since then is the AST transformation. I’m thinking it might allow us to convert the DSL workflow script into a continuation passing style so that you can suspend/resume workflow at arbitrary point.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/106/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423125816-eb3613bb.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The day was so packed that we didn’t even waste the lunch time! While attendees are eating, we had lightening talks in the room. Olivier showed off how Apache runs Jenkins, which is quite sizable, then I pitched in for &lt;a href=&quot;https://twitter.com/4imod&quot;&gt;Domonik&lt;/a&gt;, who couldn’t make it to the conference, and covered the scriptler plugin. Vincent followed and covered the similar Groovy system console. Harpreet then closed off the lunch lightening talks by showing the templates plugin in Jenkins Enterprise by CloudBees.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/111/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423130341-35bbfbae.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the afternoon, &lt;a href=&quot;https://twitter.com/aheritier&quot;&gt;Arnaud&lt;/a&gt;, one of our French gangs, showed how you can set up the iOS development on Jenkins (from code change to test to the delivery of the binaries to actual phones.) Bruno then did a demo of how he uses DEV@cloud and RUN@cloud to quickly set up continuous deployment for Java webapps. For system integraters that deal with lots of projects, I think it is a great combination (for example allowing you to hand over the entire development environment to the customer when the project is over.)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/140/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423133439-5a7b4fbe.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While all that is going on in one room, in another room Lars Kruse showed off how the old meets the new — where you &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/ClearCase+UCM+Plugin&quot;&gt;take ClearCase UCM and use it to do validated merge&lt;/a&gt;, in which only the changes tested by Jenkins become visible to the rest of the team. I personally don’t know much about ClearCase, but it was very interesting that emerging techniques like validated merge can be applied on more traditional SCM tools. He also said his company works with clients to develop custom Jenkins plugins. I always felt that any big company adopting Jenkins need some custom glue plugins, and I regularly come across those companies, but CloudBees can only help so many. It’s great to see that there are more help available now!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/188/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423164957-bae4f4ad.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The talk that followed was from &lt;a href=&quot;https://twitter.com/#!/jcarsique&quot;&gt;Julien Carsique&lt;/a&gt; from Nuxeo, discussing how he manages and improves the CI environment for his organization. Now, I regret I didn’t take all the notes about details, but I think this was one of the best presentations of the day for me. I remember thinking that if we had the best Jenkins administrator award for those who push things to the limit and beyond, he would be my top pick. IIRC, he had a major Maven projects that span across different repos and all. He set up Jenkins such that any change triggers a cascade of new builds of downstream jobs, which later then fan out to cross-platform test jobs, then he made the whole thing visualized so you can track exactly where the time is spent and how those changes propagate. I think this was very inspirational to many other fellow Jenkins users, and I hope he will put his slides somewhere so that other people can mimic what he’s done.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/144/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423134050-8dd4dca8.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Back to the big room, my fellow colleagues &lt;a href=&quot;https://twitter.com/&amp;lt;mark&amp;gt;!/connolly_s&quot;&gt;Stephen&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/&amp;lt;/mark&amp;gt;!/singh_harpreet&quot;&gt;Harpreet&lt;/a&gt; did the only introductory talk in the whole day, going through check lists of production Jenkins deployments, recapping why you want CI, etc. (And I always forget that there are still many who don’t know much about Jenkins!)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/156/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423135955-e072a9a0.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was also great to see and hear &lt;a href=&quot;https://sebastian-bergmann.de/&quot;&gt;Sebastian Bergmann&lt;/a&gt;, the guy behind &lt;a href=&quot;https://jenkins-php.org/&quot;&gt;Jenkins PHP&lt;/a&gt;, talk about Jenkins and PHP integrations. I wish we had more of those people who bridge our community to different communities and help us spread the ideas. He even kindly gave me his Jenkins/PHP book and signed it for me!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://photo.kohsuke.org/picture.php?/159/category/2&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://photo.kohsuke.org/upload/2012/04/23/thumbnail/TN-20120423140457-1e3a42c8.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aside from talks, food was great, especially for those of us who came from the U.S. I’ve got some good inspirations about where we need to work. And I also managed to implement the search filter in the update center during the day, in response to the valid complaint from Sebastian. For virtual communities like ours, it’s really good to meet people in the meat space and put faces on names. Build automation engineers are often somewhat lonely in their respective organizations — there just aren’t that many people who get excited about automating things away, and so having so many of like-minded folks in one room was by itself a great experience.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the things to improve side, I felt that workshops was tricky to do in a limited time and in a big room. Maybe it would work out better if there’s a smaller room where smaller number of people can gather and hack away (probably some time slots designated for some specific topics), then we can collectively merge pending important pull requests, teaching how to develop plugins, or ask others to look at their plugins, etc. There also can be a valid discussion about JUC, run nicely in exchange of admission fee, vs JUC run cheaply but free.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In any case, I think the quality of presentations were very good, and knowing local Jenkins developers/users would help expand your horizon. As I said in the beginning, we are taking JUC around the world this year. &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-newyork.cb&quot;&gt;The one in New York&lt;/a&gt; is just in the next week, followed by Herzelia (Israel), Tokyo, San Francisco, and Antwerp. Please &lt;a href=&quot;https://www.cloudbees.com/juc2012.cb&quot;&gt;register while seats are still available&lt;/a&gt;!&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/04/13/continuous-information-vol-2/</id>
<title>Continuous Information vol.2</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-04-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/04/13/continuous-information-vol-2/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='links'></category>
<category term='news'></category>
<summary>
Because I work on Jenkins day in day out, it&#8217;s easy for me to forget that most people don&#8217;t pay /that/ much attention to Jenkins. If you fit that category, and if you want to stay on top of the latest happenings in Jenkins, don’t miss Volume 2 of Continuous Information, the CloudBees Newsletter for Jenkins.


This issue&#8230;&#8203;




Features details about the 6 upcoming Jenkins User Conferences (don’t miss these)


Announces the new Jenkins CIA Program (join us to promote Jenkins around the globe)


Shows you where to find in-depth information about the latest Jenkins UI improvements and featured plugins (cool stuff)


Highlights the importance...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because I work on Jenkins day in day out, it’s easy for me to forget that most people don’t pay /that/ much attention to Jenkins. If you fit that category, and if you want to stay on top of the latest happenings in Jenkins, don’t miss Volume 2 of &lt;a href=&quot;https://pages.cloudbees.com/index.php/email/emailWebview?mkt_tok=3RkMMJWWfF9wsRow5%2FmYJoDpwmWGd5mht7VzDtPj1OY6hBksIr%2BJK1TtuMFUGpsqOOqSDhcUEZVk0w%3D%3D&quot;&gt;Continuous Information, the CloudBees Newsletter for Jenkins&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This issue…​&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Features details about the 6 upcoming Jenkins User Conferences (don’t miss these)&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Announces the new Jenkins CIA Program (join us to promote Jenkins around the globe)&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Shows you where to find in-depth information about the latest Jenkins UI improvements and featured plugins (cool stuff)&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Highlights the importance of Jenkins Security Advisories (install these regularly)&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Tells you why Jenkins has blue balls instead of green ones (seriously)&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Shows you the latest Jenkins Usage Stats (still growing super-fast)&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;… and more great stuff, including a bit of Jenkins humor (courtesy of our friends at &lt;a href=&quot;https://geekandpoke.typepad.com/&quot;&gt;Geek and Poke&lt;/a&gt;)&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://pages.cloudbees.com/index.php/email/emailWebview?mkt_tok=3RkMMJWWfF9wsRow5%2FmYJoDpwmWGd5mht7VzDtPj1OY6hBksIr%2BJK1TtuMFUGpsqOOqSDhcUEZVk0w%3D%3D&quot;&gt;View this issue in full&lt;/a&gt; or &lt;a href=&quot;https://www.cloudbees.com/jenkins-newsletter.cb&quot;&gt;sign up to receive future newsletters&lt;/a&gt; directly or to stay on top of the latest Jenkins goodness.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On somewhat unrelated note, &lt;a href=&quot;https://www.cloudbees.com/forms/jenkins-user-conference-call-papers.cb&quot;&gt;call for Papers&lt;/a&gt; for upcoming JUC 2012 is open! Please help us spread the word…​&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/03/26/announcing-the-jenkins-cia/</id>
<title>Announcing the Jenkins CIA</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-03-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/03/26/announcing-the-jenkins-cia/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<summary>
For years, we&#8217;ve been hearing about covert installations of Jenkins by groups
of developers within larger companies. Rogue engineers, frustrated by the lack
of continuous integration would download jenkins.war and run it off their
workstation. As time went on, word-of-mouth within the organization spread
Jenkins far and wide.


Today we announce an initiative to help support these rogue agents: the
Jenkins CIA. CIA being short for Continuous
Integration Ambassador of course.


If you&#8217;re going to be speaking at a JUG or another event where you will have
the opportunity to promote and teach people about Jenkins, you too can join the
CIA:




Send us an email telling us about the event...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/jenkinsCIA.jpg&quot; alt=&quot;Agent L. Jenkins&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For years, we’ve been hearing about &lt;em&gt;covert&lt;/em&gt; installations of Jenkins by groups
of developers within larger companies. Rogue engineers, frustrated by the lack
of continuous integration would download &lt;code&gt;jenkins.war&lt;/code&gt; and run it off their
workstation. As time went on, word-of-mouth within the organization spread
Jenkins far and wide.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today we announce an initiative to help support these rogue agents: the
&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+CIA+Program&quot;&gt;Jenkins CIA&lt;/a&gt;. CIA being short for Continuous
Integration Ambassador of course.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re going to be speaking at a JUG or another event where you will have
the opportunity to promote and teach people about Jenkins, you too can join the
CIA:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Send us an email telling us about the event and how many people you expect&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write us a guest blog post ahead of time, talking about the event&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We dispatch Jenkins stickers and a CIA Agent shirt for you to wear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write up a summary blog post about the event afterwards&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Repeat!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the coming months, we’ll start collaborating and creating standard
presentations that can be easily re-used to introduce people not only to
Jenkins, but continuous integration in general, so stay tuned.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re not the speaking type but instead prefer to work behind the scenes,
you can join the &lt;a href=&quot;https://en.wikipedia.org/wiki/Office_of_Strategic_Services&quot;&gt;OSS&lt;/a&gt; by checking out the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Beginners+Guide+to+Contributing&quot;&gt;Beginner’s Guide to contributing
to Jenkins&lt;/a&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://twitter.com/agentdero/&quot;&gt;Agent Dero&lt;/a&gt;, over and out.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This message will self-destruct in 5.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;4.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;3.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;2.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;1.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;poof&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/03/13/why-does-jenkins-have-blue-balls/</id>
<title>Why does Jenkins have blue balls?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-03-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/03/13/why-does-jenkins-have-blue-balls/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='jenkinsci'></category>
<summary>
It is interesting having an open source project that is sufficiently old to start generating "lore" of some form or another. Jenkins is starting to get to be that age, having been started over 6 years ago.


One of the most commonly asked questions, is about Jenkins' use of "blue balls" to indicate success by default. This is enough of an "issue" for some users that the Green Balls plugin is in the list of top 10 installed plugins.


The reason behind our use of blue to indicate success has its basis in Kohsuke&#8217;s Japanese upbringing. The cultural differences were enumerated in...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/japanese-traffic-light.png&quot; alt=&quot;A japanese traffic light&quot; /&gt; It is interesting having an open source project that is sufficiently old to start generating &quot;lore&quot; of some form or another. Jenkins is starting to get to be that age, having been started over 6 years ago.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the most commonly asked questions, is about Jenkins&#39; use of &quot;blue balls&quot; to indicate success by default. This is enough of an &quot;issue&quot; for some users that the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Green+Balls&quot;&gt;Green Balls&lt;/a&gt; plugin is in the &lt;a href=&quot;https://imod.github.com/jenkins-stats/svg/201201-top-plugins1000.svg&quot;&gt;list of top 10 installed plugins&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The reason behind our use of blue to indicate success has its basis in &lt;a href=&quot;https://github.com/kohsuke&quot;&gt;Kohsuke’s&lt;/a&gt; Japanese upbringing. The cultural differences were enumerated in a bug report comically titled &quot;s/blue/green/g&quot; (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/369&quot;&gt;JENKINS-369&lt;/a&gt;):&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This response Kohsuke cited was taken &lt;a href=&quot;https://groups.yahoo.com/group/ParthenonWeekly/message/232&quot;&gt;from this Q&amp;amp;A thread&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Q.&lt;/strong&gt; &quot;&lt;em&gt;Why do Japanese people say that they have blue traffic lights when they are really green?&lt;/em&gt;&quot; --Question submitted by John Sypal&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; According to the book, Japan From A to Z: Mysteries of Everyday
Life Explained by James and Michiko Vardaman, the first traffic
signals in Japan were blue instead of green, but the blue lights were difficult to see from a long distance away so they were replaced with green ones. Vardaman says that the custom of referring to traffic lights is a holdover from those days.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This sounds like a good explanation, but the problem with it is that you will hear Japanese people refer to other green things (like
cucumbers, spinach, and sometimes grass) as being blue as well. This
is because historically, Japanese people considered green to be a
shade of blue. For example, the Chinese character for blue,
pronounced ao is made up of two characters, iki (life) and i (well)
and refers to the colour of plants which grow around a well, a colour between green and blue. When Chinese people see the character, they say it means green, but Japanese people say it means blue.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Japanese books on colours tell us that there are four tertiary colours: red, blue, white and black, and that all others are shades of those four main ones. Ao, therefore, is a sort of ideal blue, halfway between green and blue. The sky is said to be blue, but it is a different shade of ao than a traffic light is. Tree leaves are said to be green, but green is a shade of ao, like crimson is a shade of red.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In another interesting cultural difference relating
to colour, Japanese children always colour the sun red instead of
yellow.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(&lt;em&gt;here’s a &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/369?focusedCommentId=120769&amp;amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-120769&quot;&gt;direct link to Kohsuke’s comment&lt;/a&gt;&lt;/em&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately it’s not for color blind users, although that’s a pretty convincing explanation. Jenkins has blue balls because in Japan, red means stop and blue means go!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Image courtesy of &lt;a href=&quot;https://portal.nifty.com/cs/catalog/portal_koneta/detail/1.htm?aid=090509099530&quot;&gt;this site&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/03/06/critical-security-advisory-in-jenkins-core/</id>
<title>Critical security advisory in Jenkins core</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-03-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/03/06/critical-security-advisory-in-jenkins-core/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<summary>
We&#8217;ve identified and fixed a critical security vulnerabilities in
Jenkins core. This affects all the releases of Jenkins to date (main line releases up to 1.452 and LTS up to 1.424.3.) Please upgrade to the new releases at your earliest convenience, especially if your Jenkins is internet facing.


For more details about the vulnerabilities, affected versions, and so on, please consult the security advisory.


(See our page about security advisories about how we do these.)...
</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://upload.wikimedia.org/wikipedia/commons/thumb/archive/5/5f/20081206041458%21Ambox_warning_orange.svg/120px-Ambox_warning_orange.svg.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve identified and fixed a critical security vulnerabilities in&lt;br&gt;
Jenkins core. This affects all the releases of Jenkins to date (main line releases up to 1.452 and LTS up to 1.424.3.) Please upgrade to the new releases at your earliest convenience, especially if your Jenkins is internet facing.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For more details about the vulnerabilities, affected versions, and so on, please consult &lt;a href=&quot;https://www.jenkins.io/security/advisory/2012-03-05&quot;&gt;the security advisory&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(See &lt;a href=&quot;https://www.jenkins.io/security/&quot;&gt;our page about security advisories&lt;/a&gt; about how we do these.)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/02/21/sponsor-a-jenkins-user-conference/</id>
<title>Sponsor a Jenkins User Conference!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-02-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/02/21/sponsor-a-jenkins-user-conference/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
With the JUC Paris 2012 call for papers open, it&#8217;s important to mention that we are also looking for sponsors for the various Jenkins User Conferences that are being planned around the world right now!


Currently there are four conferences being put together right now:




JUC Paris


JUC New York


JUC San Francisco


JUC Antwerp




If your company is heavily invested in Jenkins or interested in reaching the kind of audience that will be at a JUC (highly technical, motivated) then you should consider becoming a sponsor one of these conferences (link below)!


Sponsor the Jenkins User Conference...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/images/user.svg&quot; alt=&quot;user&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the &lt;a href=&quot;https://www.jenkins.io/content/jenkins-user-conference-2012-paris&quot;&gt;JUC Paris 2012&lt;/a&gt; call for papers open, it’s important to mention that we are also looking for &lt;strong&gt;sponsors&lt;/strong&gt; for the various Jenkins User Conferences that are being planned around the world right now!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently there are four conferences being put together right now:&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.cloudbees.com/jenkins-user-conference-2012-paris.cb&quot;&gt;JUC Paris&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-newyork.cb&quot;&gt;JUC New York&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-san-francisco.cb&quot;&gt;JUC San Francisco&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-antwerp.cb&quot;&gt;JUC Antwerp&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;If your company is heavily invested in Jenkins or interested in reaching the kind of audience that will be at a JUC (highly technical, motivated) then you should consider becoming a sponsor one of these conferences (link below)!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-sponsorship.cb&quot;&gt;Sponsor the Jenkins User Conference&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/02/21/fosdem-2012-recap/</id>
<title>FOSDEM 2012 Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-02-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/02/21/fosdem-2012-recap/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
(Editor&#8217;s note: Apologies for the delay in getting this wrap-up out, it&#8217;s been quite a busy month!)


This year has already been full of milestones, the first of which being our first birthday as an open source project. The second major milestone for the project was that we went to FOSDEM 2012, arguably the largest volunteer-organized and operated open source conference on the planet.


We had a couple of things going on at FOSDEM that merit a mention:




The Jenkins project had a stand in the K building, the same building where the Free Java, Config and Systems Management, and a few other...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(&lt;strong&gt;Editor’s note:&lt;/strong&gt; &lt;em&gt;Apologies for the delay in getting this wrap-up out, it’s been quite a busy month!&lt;/em&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year has already been full of milestones, the first of which being our &lt;a href=&quot;https://www.jenkins.io/content/happy-birthday-jenkins&quot;&gt;first birthday&lt;/a&gt; as an open source project. The second major milestone for the project was that we went to &lt;a href=&quot;https://www.fosdem.org/2012/&quot;&gt;FOSDEM 2012&lt;/a&gt;, arguably the largest volunteer-organized and operated open source conference on the planet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had a couple of things going on at FOSDEM that merit a mention:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Jenkins project had a stand in the K building, the same building where the Free Java, Config and Systems Management, and a few other pertinent dev rooms were located&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Jenkins project gave away 2 free copies of &lt;a href=&quot;https://twitter.com/wakaleo&quot;&gt;John Smart’s&lt;/a&gt; book: &quot;&lt;a href=&quot;http://www.wakaleo.com/books/jenkins-the-definitive-guide&quot;&gt;Jenkins: The Definitive Guide&lt;/a&gt;&quot; (thanks to O’Reilly!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Community member &lt;a href=&quot;https://github.com/rtyler/&quot;&gt;R. Tyler Croy&lt;/a&gt; gave &lt;a href=&quot;http://unethicalblogger.com/2012/02/10/fosdem-slides.html&quot;&gt;a talk&lt;/a&gt; on running the Jenkins project infrastructure with &lt;a href=&quot;https://projects.puppetlabs.com/projects/puppet/wiki&quot;&gt;Puppet&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The O’Reilly folks brought 10+ Jenkins books to sell at their stand.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Project founder &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; and a number of project members held a constructive &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/FOSDEM+UI+Enhancement+discussion+notes&quot;&gt;UI Enhancements discussion&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;We were very fortunate to have &lt;em&gt;so many&lt;/em&gt; Jenkins contributors in attendance, who all helped with the Jenkins stand, introducing people to Jenkins and much more.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;fosdem-in-their-own-words&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#fosdem-in-their-own-words&quot; /&gt;FOSDEM in their own words&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(&lt;em&gt;after the break&lt;/em&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://twitter.com/ndeloof&quot;&gt;Nicholas de Loof&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;FOSDEM was for me an opportunity to meet other Jenkins contributors I only knew by IRC nickname. Those two days were awesome to discuss with users on our stand, joke and socialize, as well as having some more technical debates and encourage folks to get involved in the community. Even I couldn’t attend the talks I selected on the conference agenda due to room being full, I really enjoyed this 100% geek weekend.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://twitter.com/orrc&quot;&gt;Christopher Orr&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The people, the talks, the social events, the sheer size of FOSDEM all make for a pretty inspiring weekend.  And incredibly, it’s all for free.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can not help but feel motivated after attending.  You always learn something new, discover myriad projects — in niches you never knew existed — and talk to smart folk from all over.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Talking to people at the Jenkins stand was no different.  Though in a striking number of cases, people &lt;em&gt;had&lt;/em&gt; already heard of Jenkins, were big fans and took a clutch of stickers back home for their colleagues.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Speaking with those who weren’t yet using Jenkins was equally                                                                                                                                                                                                                    &lt;br&gt;
interesting. My favourite was talking to one guy who described a                                                                                                                                                                                                                &lt;br&gt;
particularly complex workflow; at each step he asked if Jenkins could do it, and I was able to cheerily reply &quot;yes&quot; to every single one.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Getting to put faces to names of Jenkins developers was also a huge plus, and resulted in numerous great conversations.&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://twitter.com/4imod&quot;&gt;Domi&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It was great to get some faces to the short names on IRC. Talking to other committers was awesome, I thought they are cool before I went to FOSDEM, but now I know!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Its was great to talk to people who are using the tools you are working on, there where so many just coming up to say thank you! (?and there where/are by far more then I thought!)
I know I’m standing on the shoulders of a giant - but I also do feel that my commitment is of value for others too.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feels great to be part of this community!&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://twitter.com/agentdero&quot;&gt;R Tyler Croy&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I spent so much time at the stand telling people about Jenkins or showing them, that I only ended up seeing a couple actual sessions the whole weekend.
The kinds of people who came to talk to us almost entirely developers of one kind or another, which was really great to talk about how Jenkins can be used effectively for Perl shops, for Python, C++, C#, Java (of course) or even for deployment automation. The spread was a pretty big endorsement, I think, of the extensible nature of the Jenkins plugin ecosystem.
In planning for FOSDEM I had urged Kohsuke to order &lt;em&gt;thousands&lt;/em&gt; of stickers for the event, and when all was said and done I think we had given away around 1000 stickers to new Jenkins fans, old Jenkins fans and a few folks in the community who were looking forward to going back to their local JUG to share.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m looking forward to making the trip to the bitter cold of Brussels in February again next year.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://twitter.com/fr3dg&quot;&gt;Fred G&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;FOSDEM had lots of interesting talks and was very well organized (from my point of view) and best of all…​ it’s free! Apart from the talks and nice lineup of speakers, it has been a great opportunity to meet people. People I already knew, some in person, some only from IRC, the mailing list, or as a maintainer of a plugin; but also people thatcame up to the Jenkins stand.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From the people that I talked to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;60% knew Jenkins and use it every day (&quot;Yeah, I know Jenkins. The whole company uses it and nothing works without it!&quot;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;35% had heard of it or were very interested (&quot;I know Jenkins, but we bought the Atlassian package and now we have to use Bamboo, Jira and Confluence.&quot; [me mentioning the Jira integration of Jenkins] &quot;Wow, I really have to try that out and convince our team to switch to Jenkins!&quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5% Weirdos and WTF!? (&lt;em&gt;disgusted&lt;/em&gt; &quot;Is this another one of these                                                                                                                                                                                                                 &lt;br&gt;
projects funded by Red Hat? They fund everything!&quot;)&lt;/br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Meeting Tom Huybrechts without knowing it (at first) was a big                                                                                                                                                                                                                   &lt;br&gt;
surprise. He has created or contributed to some of the best plugins                                                                                                                                                                                                               &lt;br&gt;
(eg. the parameterized-trigger plugin) and I see his name at least                                                                                                                                                                                                               &lt;br&gt;
once whenever I browse through core source code. During the impromptu UI enhancement meetings he showed us another three plugins that he wrote but never made public just because he doesn’t have time to support them all.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Then at the stand he casually mentioned that he is administering                                                                                                                                                                                                                 &lt;br&gt;
around 3000 jobs on 100+ build machines. At the same time he seems                                                                                                                                                                                                               &lt;br&gt;
like a very humble and low key character.&lt;/br&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To sum it up, the best thing about an open source project like Jenkins is the community. Working together with nice people from all over the world to create the best CI server has been a great experience. The FOSDEM weekend was another event that proved that.
I’ll definitely come back.&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;FOSDEM is one of the few conferences that has a distinctive hand-made geek-for-geek feeling to it. No marketing people, no bullshit flyers, but lots of technical folks and good beer. I really enjoyed talking to users, as always, but above all I was very happy to see developers and project members in the Jenkins community come out in full force, and I felt they enjoyed it just as much. I’m really hoping that we’ll now keep this going for years to come.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I think it’s safe to assume we’ll be back next year for &lt;strong&gt;FOSDEM 2013&lt;/strong&gt;, hope to see you there!&lt;/p&gt;
&lt;/div&gt;
&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/02/13/jenkins-user-conference-2012-paris/</id>
<title>Jenkins User Conference 2012 Paris</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-02-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/02/13/jenkins-user-conference-2012-paris/" />
<author>
<name>ndeloof</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
+  +


(English text follows the French text)


Après le succès de la Jenkins User Conference l’an dernier à San Francisco et à l’intérêt qu’elle a soulevé, nous organisons cette année la JUC dans quatre grande villes à travers le monde. La premiére étape de cette tournée est la JUC 2012 à Paris, le 17 avril. La conférence aura lieu la veille de Devoxx France dans les mêmes locaux. La date a été spécialement choisie pour que vous puissiez faire d’une pierre deux coups, ou plutôt deux confs !


Les inscriptions sont ouvertes. Inscrivez-vous dès maintenant pour bénéficier de la réduction réservée...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Tourism_in_France&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/7/79/Paris_06_Eiffelturm_4828.jpg/151px-Paris_06_Eiffelturm_4828.jpg&quot; alt=&quot;image&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(English text follows the French text)&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Après le succès de la &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2011-session-abstracts.cb&quot;&gt;Jenkins User Conference l’an dernier à San Francisco&lt;/a&gt; et à l’intérêt qu’elle a soulevé, nous organisons cette année la JUC dans quatre grande villes à travers le monde. La premiére étape de cette tournée est la &lt;a href=&quot;https://www.cloudbees.com/juc2012.cb&quot;&gt;JUC 2012 à Paris&lt;/a&gt;, le 17 avril. La conférence aura lieu la veille de &lt;a href=&quot;https://www.devoxx.com/display/FR12/Accueil&quot;&gt;Devoxx France&lt;/a&gt; dans les mêmes locaux. La date a été spécialement choisie pour que vous puissiez faire d’une pierre deux coups, ou plutôt deux confs !&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les &lt;a href=&quot;https://cloudbees-jenkins-user-confs.eventbrite.com/&quot;&gt;inscriptions sont ouvertes&lt;/a&gt;. Inscrivez-vous dès maintenant pour bénéficier de la réduction réservée au plus enthousiastes. Vous pouvez également &lt;a href=&quot;https://www.cloudbees.com/forms/jenkins-user-conference-call-papers.cb&quot;&gt;proposer un sujet&lt;/a&gt; ou bien &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-sponsorship.cb&quot;&gt;soutenir la conférence en tant que sponsor&lt;/a&gt;. Comme il est bien connu que les Français aiment voir leurs compatriotes sur scène, j’espère que nos nombreux développeurs jenkins francophones (les meilleurs, soit dit en passant) proposeront un sujet !&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cette année, nous demandons une contribution pour les inscriptions (avec un tarif réduit avant le 18 février), afin de couvrir les frais d’organisation, mais nous vous offrirons en contrepartie le T-shirt officiel ainsi que des autocollants Jenkins. Si on se base sur la JUC 2011, &lt;a href=&quot;https://jenkins-ci.org/event/jenkins-scale-10x-los-angeles&quot;&gt;SCALE 10x&lt;/a&gt;, ou le &lt;a href=&quot;https://www.jenkins.io/blog/2012/02/21/fosdem-2012-recap/&quot;&gt;FOSDEM&lt;/a&gt;, ce sera une opporunité exceptionnelle pour rencontrer et discuter avec les dévelopeurs majeurs du coeur ou des plugins, ainsi que les nombreux utilisateurs prêts à partager leur expérience et à répondre à toutes vos questions.&lt;br /&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the success of &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2011-session-abstracts.cb&quot;&gt;the Jenkins User Conference last year at San Francisco&lt;/a&gt; and high interest, this year we are bringing JUC to 4 cities around the world. And the first stop is &lt;a href=&quot;https://www.cloudbees.com/juc2012.cb&quot;&gt;JUC 2012 in Paris&lt;/a&gt;, on April 17. This is one day before &lt;a href=&quot;https://www.devoxx.com/display/FR12/Accueil&quot;&gt;Devoxx France&lt;/a&gt;, and in the same venue. The date is specifically chosen so that you can kill two conferences in one stone!&lt;br&gt;
Register for JUC Paris now (&lt;a href=&quot;https://www.cloudbees.com/juc2012.cb&quot; class=&quot;bare&quot;&gt;https://www.cloudbees.com/juc2012.cb&lt;/a&gt;) and get the Early Bird discount - which is a significant reduction in the registration fee! The conference is &lt;a href=&quot;https://cloudbees-jenkins-user-confs.eventbrite.com/&quot;&gt;accepting registrations&lt;/a&gt; as well as looking for &lt;a href=&quot;https://www.cloudbees.com/forms/jenkins-user-conference-call-papers.cb&quot;&gt;talk submissions&lt;/a&gt; and &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2012-sponsorship.cb&quot;&gt;sponsors&lt;/a&gt;. I get the impression that French people like other fellow French speaking, so I hope our French-speaking plugin developers will submit talks.&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This year, we are charging a small amount of money in the hope of covering the expense, but we’ll give out T-shirts (which were really hot last year!) as well as stickers. And if the experience at JUC 2011, &lt;a href=&quot;https://jenkins-ci.org/event/jenkins-scale-10x-los-angeles&quot;&gt;SCALE 10x&lt;/a&gt;, and &lt;a href=&quot;https://www.jenkins.io/blog/2012/02/21/fosdem-2012-recap/&quot;&gt;FOSDEM&lt;/a&gt; was any indication, this is a great opportunity to meet and talk with plugin/core developers, and other fellow users with whom you can discuss your experience/questions.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/02/02/happy-birthday-jenkins/</id>
<title>Happy birthday Jenkins!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-02-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/02/02/happy-birthday-jenkins/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<summary>
On February 2nd, 2011 the first release of Jenkins, version 1.396, was made available for public consumption. Thus marking a new beginning for many of us who had come to rely on this very versatile piece of software and wanted to see it continue to thrive.


Along with some other bug fixes, the 1.396 release of Jenkins included a very important changelog item:




Fixed a trademark bug that caused a considerable fiasco by renaming to Jenkins




On behalf of the core Jenkins team and the governance board I would like to extend a extremely large Thank You! to all of the plugin developers,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On February 2nd, 2011 the first release of Jenkins, version 1.396, was made available for public consumption. Thus marking a new beginning for many of us who had come to rely on this very versatile piece of software and wanted to see it continue to thrive.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Along with some other bug fixes, the 1.396 release of Jenkins included a &lt;em&gt;very&lt;/em&gt; important changelog item:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Fixed a trademark bug that caused a considerable fiasco by renaming to Jenkins&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On behalf of the core Jenkins team and the governance board I would like to extend a extremely large &lt;big&gt;&lt;strong&gt;Thank You!&lt;/strong&gt;&lt;/big&gt; to all of the &lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;plugin developers&lt;/a&gt;, &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;bug filers&lt;/a&gt;, &lt;a href=&quot;https://wiki.jenkins.io&quot;&gt;wiki page editors&lt;/a&gt;, &lt;a href=&quot;http://www.wakaleo.com/books/jenkins-the-definitive-guide&quot;&gt;book authors&lt;/a&gt; and the users who have helped grow Jenkins into the project it is today.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of the tidbits from our highlight reel:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;As of this writing there have been &lt;strong&gt;54&lt;/strong&gt; releases of Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jenkins now supports &lt;a href=&quot;https://www.jenkins.io/content/beginning-new-era-ruby-plugins-now-reality&quot;&gt;writing plugins in Ruby&lt;/a&gt; as well as Java (more languages in the process)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have &lt;a href=&quot;http://mirrors.jenkins-ci.org/status.html&quot;&gt;7 high-speed mirrors&lt;/a&gt; streaming Jenkins packages to users around the world.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are now over 450 different plugins available for Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 80 donors participated in our &lt;a href=&quot;https://www.jenkins.io/content/fundraising-drive-update-thank-you-everyone&quot;&gt;end of year fundraising drive&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;5 &quot;Long Term Support&quot; releases have been published by the Jenkins community, offering users a slower moving upgrade target (supported even further by CloudBees&#39; &lt;a href=&quot;https://www.cloudbees.com/jenkins-enterprise-by-cloudbees-available-plugins.cb&quot;&gt;Enterprise Jenkins&lt;/a&gt; product)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Public project governance meetings are held and &lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins/&quot;&gt;recorded&lt;/a&gt; (almost) every couple of weeks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More than 340 individuals contribute &lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;on GitHub&lt;/a&gt; to the project in some form or another.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;About 750 members of the &lt;a href=&quot;https://groups.google.com/group/jenkinsci-dev?lnk=&quot;&gt;developers mailing list&lt;/a&gt; and around 1700 on the &lt;a href=&quot;https://groups.google.com/group/jenkinsci-users?lnk=&quot;&gt;users mailing list&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;There are many other impressive sounding numbers I could rattle off, but the list is far too long to be interesting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The project isn’t perfect and nor is the software, but we’re off to a fine start and I hope you’ll join us in making this next year of Jenkins even better than the first.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/01/20/highlight-video-from-juc-2011/</id>
<title>Highlight video from JUC 2011</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-01-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/01/20/highlight-video-from-juc-2011/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<summary>
A slick highlight video from the Jenkins User Conference, 2011 was posted recently which captures some great quotes from a number of the fantastic speakers who participated in the inaugural JUC.


I&#8217;ve embedded the video below, enjoy!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A slick highlight video from the &lt;a href=&quot;https://www.jenkins.io/content/jenkins-user-conference&quot;&gt;Jenkins User Conference, 2011&lt;/a&gt; was posted recently which captures some great quotes from a number of the fantastic speakers who participated in the inaugural JUC.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve embedded the video below, enjoy!&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/_l9OgJc4_-w&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/01/05/thank-you-page-for-windows-os-x-installers/</id>
<title>&quot;Thank you&quot; page for Windows/OS X installers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-01-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/01/05/thank-you-page-for-windows-os-x-installers/" />
<author>
<name>kohsuke</name>
</author>
<category term='infrastructure'></category>
<category term='core'></category>
<summary>
I&#8217;ve tweaked the website so that downloading the Windows and Mac installers will navigate the browser to "thank you/what&#8217;s next" page. These pages have links to Wiki that educate the users on where/how the installer will run Jenkins.


Hopefully this makes it little easier for new users to get started on Jenkins. I&#8217;ve tested the new mechanism with IE, Safari, and Firefox, but if you notice a problem, please let us know....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve tweaked the website so that downloading the Windows and Mac installers will navigate the browser to &quot;thank you/what’s next&quot; page. These pages have links to Wiki that educate the users on where/how the installer will run Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hopefully this makes it little easier for new users to get started on Jenkins. I’ve tested the new mechanism with IE, Safari, and Firefox, but if you notice a problem, please let us know.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2012/01/04/building-jenkins-plugins-with-gradle/</id>
<title>Building Jenkins plugins with Gradle</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2012-01-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2012/01/04/building-jenkins-plugins-with-gradle/" />
<author>
<name>abayer</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='meta'></category>
<category term='plugins'></category>
<category term='jenkinsci'></category>
<summary>
Until now, Jenkins plugins written in Java or Groovy could only be built with Maven, using the maven-hpi-plugin to generate a proper manifest and archive which Jenkins can consume. But starting now, you can also use Gradle!


See the wiki for information on how you can use Gradle and the new gradle-jpi-plugin to build, test and release your Java or Groovy Jenkins plugin....
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.jenkins.io/sites/default/files/images/gradle_logo.gif&quot; alt=&quot;gradle logo&quot; width=&quot;170&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Until now, Jenkins plugins written in Java or Groovy could only be built with Maven, using the maven-hpi-plugin to generate a proper manifest and archive which Jenkins can consume. But starting now, you can also use &lt;a href=&quot;https://gradle.org&quot;&gt;Gradle&lt;/a&gt;!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gradle+JPI+Plugin&quot;&gt;the wiki&lt;/a&gt; for information on how you can use Gradle and the new gradle-jpi-plugin to build, test and release your Java or Groovy Jenkins plugin.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/12/28/adding-diagrams-to-wiki/</id>
<title>Adding diagrams to Wiki</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-12-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/12/28/adding-diagrams-to-wiki/" />
<author>
<name>kohsuke</name>
</author>
<category term='infrastructure'></category>
<category term='tutorial'></category>
<summary>
Thanks to the kindness from Gliffy, we can now add diagrams to Wiki pages, in a way that enables collaborative edits.


See more info, including a sample diagram in a Wiki page....
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/gliffy.png&quot; alt=&quot;gliffy&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://www.gliffy.com/&quot;&gt;the kindness from Gliffy&lt;/a&gt;, we can now add diagrams to &lt;a href=&quot;https://wiki.jenkins.io/&quot;&gt;Wiki pages&lt;/a&gt;, in a way that enables collaborative edits.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;See more info, including a sample diagram in &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Adding+diagrams&quot;&gt;a Wiki page&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/12/23/jenkins-survey-result-and-what-ui-improvement-would-you-like/</id>
<title>Jenkins survey result and what UI improvement would you like?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-12-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/12/23/jenkins-survey-result-and-what-ui-improvement-would-you-like/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='feedback'></category>
<category term='juc'></category>
<summary>
">


Jenkins community survey result is in, which shows a number of interesting stats for us developers, such as 82% of people saying their Jenkins is mission critical, or the spread of distributed builds, especially compared to my earlier similar usage analytics.


But just as interesting is the free-form answers to questions like "If there was anything you could you change about Jenkins CI, what would it be?", and while the answer is colorful, there are a few common themes that one can easily spot.


One of them is "nothing!", which made me feel good, but another is "UI improvement." And incidentally, Domi...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wiktionary.org/wiki/too_many_cooks_spoil_the_broth&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://livinghealthy.typepad.com/photos/uncategorized/2007/07/11/toomanycooksblog.jpg&quot; alt=&quot;toomanycooksblog&quot; width=&quot;160&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/span&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudbees.com/2011/12/jenkins-community-survey-results-82.html&quot;&gt;Jenkins community survey result is in&lt;/a&gt;, which shows a number of interesting stats for us developers, such as 82% of people saying their Jenkins is mission critical, or the spread of distributed builds, especially compared to &lt;a href=&quot;https://weblogs.java.net/blog/kohsuke/archive/2009/01/hudson_usage_an.html&quot;&gt;my earlier similar usage analytics&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But just as interesting is the free-form answers to questions like &quot;If there was anything you could you change about Jenkins CI, what would it be?&quot;, and while the answer is colorful, there are a few common themes that one can easily spot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of them is &quot;nothing!&quot;, which made me feel good, but another is &quot;UI improvement.&quot; And incidentally, Domi has started &lt;a href=&quot;https://jenkins.361315.n4.nabble.com/Jenkins-UI-enhancements-td4196887.html&quot;&gt;a thread in the Jenkins-users list&lt;/a&gt; about this exact topic a week ago.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The idea is to brainstorm what kind of concrete improvements people would like to see, then run them through some real user experience designers and decide which ones are good ideas and which ones are not.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I find this thread useful  so much so that one of those ideas (always show the &quot;Save&quot; button at the bottom in the config page) is already implemented toward the next release of Jenkins. So if you have some thoughts to share, please chime in on that thread.&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/12/20/thanks-for-the-support-pagerduty/</id>
<title>Thanks for the support PagerDuty!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-12-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/12/20/thanks-for-the-support-pagerduty/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='meta'></category>
<summary>
Over drinks this evening Kohsuke pointed out that he never saw a blog post about PagerDuty.image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/pagerduty_logo.png


If you&#8217;ve never worked in a sysadmin role or in any other position that would require an on-call rotation, then you may have never seen PagerDuty.


In essence the service provides a great series of integration points with Pingdom or Nagios for handling monitoring. As an infrastructure guy (part time), I can honestly say it&#8217;s a great tool and I&#8217;m grateful to PagerDuty for supporting Jenkins with our own account to help manage project infrastructure.


A couple weekends ago I finished setting up Nagios (read-only username/password: jenkins/jenkins)...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over drinks this evening &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; pointed out that he never saw a blog post about &lt;a href=&quot;https://www.pagerduty.com&quot;&gt;PagerDuty&lt;/a&gt;.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/pagerduty_logo.png&lt;span class=&quot;pagerduty.com&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve never worked in a sysadmin role or in any other position that would require an on-call rotation, then you may have never seen PagerDuty.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In essence the service provides a great series of integration points with Pingdom or Nagios for handling monitoring. As an infrastructure guy (part time), I can honestly say it’s a great tool and I’m grateful to PagerDuty for supporting Jenkins with our own account to help manage project infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A couple weekends ago I finished setting up &lt;a href=&quot;https://nagios.jenkins-ci.org/nagios3/&quot;&gt;Nagios&lt;/a&gt; (read-only username/password: &lt;code&gt;jenkins&lt;/code&gt;/&lt;code&gt;jenkins&lt;/code&gt;) for critical project services which by itself is a good step forward. Combine that with PagerDuty’s Nagios integration and a solid on-call rotation, and I’m more confident than I’ve ever been that Kohsuke or myself could actually take a vacation!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Check them out, and be sure to thank them on Twitter at &lt;a href=&quot;https://twitter.com/pagerduty&quot;&gt;@PagerDuty&lt;/a&gt; for supporting Jenkins!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/12/19/fundraising-drive-update-thank-you-everyone/</id>
<title>Fundraising drive update: thank you everyone!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-12-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/12/19/fundraising-drive-update-thank-you-everyone/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meta'></category>
<category term='news'></category>
<summary>
">


Our earlier appeal for donation was a drastic boost to our fund-raising drive, (and looking at the twitter reactions, it feels like the Wikipedia parody we put on Jenkins on Jenkins helped spread the words&#8201;&#8212;&#8201;I guess jokes do work!


And I&#8217;m happy to report that we&#8217;ve successfully raised over $12000 as of today. That&#8217;s more than enough to pay off all the current balance and it should keep the project going for quite a while. I&#8217;ve assembled the donor list in appreciation.


So once again, thanks everyone for their generous support!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.flickr.com/photos/colinzhu/321306018/&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/gift.png&quot; alt=&quot;&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/span&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our &lt;a href=&quot;https://www.jenkins.io/content/holiday-appeal-please-help-jenkins-pay-project-expense&quot;&gt;earlier appeal&lt;/a&gt; for donation was a drastic boost to &lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;our fund-raising drive&lt;/a&gt;, (and looking at the twitter reactions, it feels like the Wikipedia parody we put on &lt;a href=&quot;https://ci.jenkins-ci.org/&quot;&gt;Jenkins on Jenkins&lt;/a&gt; helped spread the words — I guess jokes do work!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And I’m happy to report that we’ve successfully raised over $12000 as of today. That’s more than enough to pay off all the current balance and it should keep the project going for quite a while. I’ve assembled &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Donors&quot;&gt;the donor list&lt;/a&gt; in appreciation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So once again, thanks everyone for their generous support!&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/12/05/holiday-appeal-please-help-jenkins-pay-the-project-expense/</id>
<title>Holiday appeal: please help Jenkins pay the project expense</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-12-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/12/05/holiday-appeal-please-help-jenkins-pay-the-project-expense/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
As we approach the holiday season, which is when people start to feel more charitable, at least in the U.S. So I&#8217;d like to make one more plea, that the Jenkins project needs your help in paying its expense, and that we are still about $1000 shy of the goal we need to get to. So if you can, please help us by donating to Jenkins via SPI.


Think about all the benefits you are getting from your Jenkins, and think about all the volunteer efforts that went into it. Some help by writing code, some help by answering other users...
</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://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Mcol_money_bag.svg/100px-Mcol_money_bag.svg.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we approach the holiday season, which is when people start to feel more charitable, at least in the U.S. So I’d like to make one more plea, that the Jenkins project needs your help in &lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;paying its expense&lt;/a&gt;, and that we are still about $1000 shy of the goal we need to get to. So if you can, please help us by &lt;a href=&quot;https://co.clickandpledge.com/advanced/default.aspx?wid=46160&quot;&gt;donating to Jenkins via SPI&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Think about all the benefits you are getting from your Jenkins, and think about all the volunteer efforts that went into it. Some help by writing code, some help by answering other users questions, and some help by spreading words about Jenkins. If you’ve been wanting to contribute to the project but you haven’t figured out how, this is one way to do it.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a thank you, I’m writing a special &quot;friend of Jenkins&quot; plugin that I’d like to send out to those who have donated, so that you can show off your support on your Jenkins instance.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once again, please help us reach &lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;our fundraising goal&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/12/02/community-contributed-localizations-to-be-bundled-in-jenkins-1-443/</id>
<title>Community-contributed localizations to be bundled in Jenkins 1.443</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-12-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/12/02/community-contributed-localizations-to-be-bundled-in-jenkins-1-443/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<summary>
In 1.430, we added the translation assistance plugin in the hope of increasing the contribution from the community. It&#8217;s been 3 months, and I&#8217;ve finally took the opportunity to integrate them into Jenkins.


The result is pretty amazing. Before this, we had 26 languages, with wildly varying degree of completeness, such as French, Japanese, German, etc. This is still pretty good, but this integration added updates to 40 languages, including 17 brand-new languages, pushing the total up to whopping 43 languages. Among the newly added languages are Arabic (sorry, no right-to-left support yet), Esperanto, Hebrew, as well as large amount of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Tower_of_Babel&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Brueghel-tower-of-babel.jpg/350px-Brueghel-tower-of-babel.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 1.430, we added &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Translation+Assistance+Plugin&quot;&gt;the translation assistance plugin&lt;/a&gt; in the hope of increasing the contribution from the community. It’s been 3 months, and I’ve finally took the opportunity to integrate them into Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The result is pretty amazing. Before this, we had 26 languages, with wildly varying degree of completeness, such as French, Japanese, German, etc. This is still pretty good, but this integration added updates to 40 languages, including 17 brand-new languages, pushing the total up to whopping 43 languages. Among the newly added languages are Arabic (sorry, no right-to-left support yet), Esperanto, Hebrew, as well as large amount of Chinese (both simplified and traditional) and Korean.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While working with this, I’ve also discovered an issue that prevented Jenkins from correctly showing Hebrew, Indonesian, and Yedish localizations. All these changes will be in 1.443. And going forward, I’ll be integrating changes more frequently to reduce the delay.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So big thank you for everyone who contributed localizations, and please keep them coming! &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Translation+Assistance+Plugin&quot;&gt;Contributing localization is very easy&lt;/a&gt;. If you are interested in more seriously working on localizations, please see &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Internationalization#Internationalization-Whattranslatorsneedtoknow%2Fdo&quot;&gt;this Wiki page&lt;/a&gt; and request the committership in the project. This is yet another way people can contribute to OSS without writing code.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/11/15/the-beginning-of-a-new-era-ruby-plugins-now-a-reality/</id>
<title>The beginning of a new era: Ruby plugins now a reality</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-11-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/11/15/the-beginning-of-a-new-era-ruby-plugins-now-a-reality/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='plugins'></category>
<category term='jruby'></category>
<summary>
It&#8217;s not often that I get to use that much hyperbole in a Jenkins blog post, but I think in this case it&#8217;s allowable. A journey that started over a year ago by Charles Lowell has reached a new level, thanks to lots of help from Kohsuke along with Hiroshi Nakamura and J&oslash;rgen Tjern&oslash;.


As of today, with Jenkins 1.438, you can now download and install Ruby plugins from the update center (the Path Ignore plugin being the first).


Words simply can&#8217;t express what a monumental achievement this is for the Jenkins project, both from the technical perspective but also in terms...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/jruby.png&quot; alt=&quot;Yay JRuby!&quot; width=&quot;180&quot; /&gt; It’s not often that I get to use &lt;em&gt;that&lt;/em&gt; much hyperbole in a Jenkins blog post, but I think in this case it’s allowable. A journey that started over a year ago by &lt;a href=&quot;https://twitter.com/cowboyd&quot;&gt;Charles Lowell&lt;/a&gt; has reached a new level, thanks to lots of help from &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; along with &lt;a href=&quot;https://twitter.com/nahi&quot;&gt;Hiroshi Nakamura&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/jorgenpt&quot;&gt;Jrgen Tjern&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As of today, with Jenkins 1.438, you can now &lt;strong&gt;download and install Ruby plugins from the update center&lt;/strong&gt; (the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Pathignore+Plugin&quot;&gt;Path Ignore plugin&lt;/a&gt; being the first).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Words simply can’t express what a monumental achievement this is for the Jenkins project, both from the technical perspective but also in terms of what this means for the future of the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;According to the &lt;a href=&quot;https://github.com/languages&quot;&gt;languages dashboard on GitHub&lt;/a&gt;, Ruby is over two times as popular as Java on the site. I do not intend to start a language popularity contest here, but if we pretend just for a minute that the GitHub ecosystem is all that exists. Can you then imagine how powerful it would be to engage and include a community of open source developers that would be two times the size of the current pool of contributors? That’s &lt;strong&gt;tremendous&lt;/strong&gt; potential!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;great-where-do-i-start&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#great-where-do-i-start&quot; /&gt;Great! Where do I start?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For those that are curious, the first officially released Ruby plugin for Jenkins is Jrgen’s &lt;a href=&quot;https://github.com/jenkinsci/pathignore-plugin&quot;&gt;pathignore-plugin&lt;/a&gt; which can be found in the update center. If you’re looking for a reference project, this is currently the most up-to-date plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is also a &lt;strong&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jenkins+plugin+development+in+Ruby&quot;&gt;wiki page covering Ruby plugin development&lt;/a&gt;&lt;/strong&gt;, which might be a little out-of-date but covers most of the essentials.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally you might find the &lt;a href=&quot;https://github.com/cowboyd/jenkins-prototype-ruby-plugin&quot;&gt;jenkins-prototype-plugin&lt;/a&gt; an interesting resource as it is practically a kitchen sink of demo/test Ruby plugin code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently only a few extension points (BuildStep, Publisher, BuildWrapper) are mapped in a Ruby-friendly manner. Don’t let that scare you though! If you dig around in the &lt;a href=&quot;https://github.com/cowboyd/jenkins-plugin-runtime&quot;&gt;jenkins-plugin-runtime&lt;/a&gt; you can see how the existing extension points are mapped from Java into Ruby, because Ruby plugins are running under JRuby, if you need to access some Java APIs, you can do so without too much trouble.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-thank-yous&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-thank-yous&quot; /&gt;The Thank Yous&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Great efforts like this one don’t just happen without support, which is why I’d like to call out and thank &lt;a href=&quot;https://thefrontside.net/&quot;&gt;The FrontSide&lt;/a&gt; for their &lt;strong&gt;wonderful&lt;/strong&gt; support, helping to cover costs of WebEx for Office Hours and covering Charles&#39; time while he worked with Kohsuke on the internal plumbing needed to make Ruby plugins possible within Jenkins core. If the name &quot;The FrontSide&quot; looks familiar to you, that might be because they also created and donated the Jenkins logo!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We should also thank &lt;a href=&quot;https://www.mylookout.com&quot;&gt;Lookout, Inc&lt;/a&gt; (&lt;em&gt;full disclosure: Lookout is my employer&lt;/em&gt;) and &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; for affording some employee time for Jrgen and Kohsuke respectively to work on the project.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/11/10/jenkins-conference-slides-and-videos-online/</id>
<title>Jenkins Conference Slides and Videos Online</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-11-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/11/10/jenkins-conference-slides-and-videos-online/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='juc'></category>
<category term='video'></category>
<summary>
It is just turning into a video heavy week isn&#8217;t it? First the videos from the Munich Meetup were made available, and now the videos from the first ever Jenkins User Conference.


The full list of slides and videos can be found on this page, hosted by CloudBees who  did a phenomenal job helping to organize and host the conference.


I want to thank everybody else involved once again, the fantastic speakers, the enthusiastic attendees and of course the sponsors for making it possible (CloudBees, Red Hat, LifeRay, New Relic, Sauce Labs, Chariot Solutions and eXo)....
</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/sites/default/files/images/headshot.png&quot; alt=&quot;headshot&quot; /&gt;It is just turning into a video heavy week isn’t it? First the &lt;a href=&quot;https://www.jenkins.io/content/jenkins-meetup-munich-videos&quot;&gt;videos from the Munich Meetup&lt;/a&gt; were made available, and now the videos from the &lt;em&gt;first&lt;/em&gt; ever &lt;a href=&quot;https://www.jenkins.io/content/jenkins-user-conference&quot;&gt;Jenkins User Conference&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The full list of slides and videos can be found &lt;strong&gt;&lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2011-session-abstracts.cb&quot;&gt;on this page&lt;/a&gt;&lt;/strong&gt;, hosted by &lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; who  did a phenomenal job helping to organize and host the conference.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I want to thank everybody else involved once again, the fantastic speakers, the enthusiastic attendees and of course the sponsors for making it possible (CloudBees, Red Hat, LifeRay, New Relic, Sauce Labs, Chariot Solutions and eXo).&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/11/07/jenkins-meetup-munich-videos/</id>
<title>Jenkins Meetup Munich Videos</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-11-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/11/07/jenkins-meetup-munich-videos/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='video'></category>
<summary>
Better late than never right? Back in June, during his world tour, Andrew Bayer stopped by Munich to participate in a Jenkins Meetup along with Dr. Ullrich Hafner.


Andrew gave a talk titled "The State of Jenkins" (slides) and Ullrich talked about "Static Code Analysis with Jenkins" (slides)


You can view the videos on this page hosted by TNG.


Thanks to Stefan Wolf for the heads up!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Better late than never right? Back in June, during his world tour, &lt;a href=&quot;https://twitter.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt; stopped by Munich to participate in a Jenkins Meetup along with Dr. Ullrich Hafner.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Andrew gave a talk titled &quot;The State of Jenkins&quot; (&lt;a href=&quot;https://video.tngtech.com/veranstaltungen/2011/06-30Jenkins/The_State_of_Jenkins.pdf&quot;&gt;slides&lt;/a&gt;) and Ullrich talked about &quot;Static Code Analysis with Jenkins&quot; (&lt;a href=&quot;https://video.tngtech.com/veranstaltungen/2011/06-30Jenkins/Static_Code_Analysis_With_Jenkins.pdf&quot;&gt;slides&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can view the videos on &lt;a href=&quot;https://video.tngtech.com/veranstaltungen/2011/06-30Jenkins/#&quot;&gt;this page&lt;/a&gt; hosted by &lt;a href=&quot;https://www.tngtech.com&quot;&gt;TNG&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Thanks to Stefan Wolf for the heads up!&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/11/04/a-dead-bug-is-a-good-bug/</id>
<title>A dead bug is a good bug</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-11-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/11/04/a-dead-bug-is-a-good-bug/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='core'></category>
<summary>
As if getting a Kindle for reporting bugs and getting an AppleTV for filing a survey aren&#8217;t enough, you can also win an iPad for fixing an issue.


So if you&#8217;ve been thinking about tinkering with Jenkins code base but haven&#8217;t done so yet, this is a great opportunity to get going. There&#8217;s documentation about how to get started, and there&#8217;s Jenkins Office Hours and IRC channel if you need some interactive help from existing devs. I think new features, not just bug fixes, would qualify, so long as it&#8217;s recorded in the issue tracker. And similarly, I think the plugins...
</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.cloudbees.com/sites/default/files/imagefield_thumbs/Buggy_Code.png&quot; alt=&quot;image&quot; width=&quot;129&quot; height=&quot;96&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As if &lt;a href=&quot;https://jenkins-ci.org/content/report-bugs-and-win-kindle&quot;&gt;getting a Kindle for reporting bugs&lt;/a&gt; and &lt;a href=&quot;https://jenkins-ci.org/content/jenkins-community-survey&quot;&gt;getting an AppleTV for filing a survey&lt;/a&gt; aren’t enough, you can also &lt;a href=&quot;https://www.cloudbees.com/jenkins-community-contests.cb#bugbounty&quot;&gt;win an iPad for fixing an issue&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So if you’ve been thinking about tinkering with &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/GitHub+Repositories&quot;&gt;Jenkins code base&lt;/a&gt; but haven’t done so yet, this is a great opportunity to get going. There’s &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Extend+Jenkins&quot;&gt;documentation about how to get started&lt;/a&gt;, and there’s &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Office+Hours&quot;&gt;Jenkins Office Hours&lt;/a&gt; and &lt;a href=&quot;https://jenkins-ci.org/content/chat&quot;&gt;IRC channel&lt;/a&gt; if you need some interactive help from existing devs. I think new features, not just bug fixes, would qualify, so long as it’s recorded in the issue tracker. And similarly, I think the plugins would qualify, not just core.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aside from iPad, there’s one $50 Amazon gift certificate going out every week, which is almost a steal! So be sure to submit your entry!&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/11/03/jenkins-community-survey/</id>
<title>Jenkins Community Survey</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-11-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/11/03/jenkins-community-survey/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='jenkinsci'></category>
<summary>
+  +


There&#8217;s currently a survey running to get a better sense of our use base. Those inputs help us steer the effort wisely, so we appreciate your taking time to fill it in. The result would be more useful if larger number of people participate, so feel free to encourage others to fill it in as well.


In the same spirit of the fundraising drive in NPR, CloudBees is throwing in a "thank you gift" of AppleTV as an added incentive. See their blog post for more details....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Census&quot;&gt;+ &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Volkstelling_1925_Census.jpg/300px-Volkstelling_1925_Census.jpg&quot; alt=&quot;image&quot; height=&quot;140&quot; /&gt; +&lt;/span&gt;&lt;br /&gt;
&lt;/a&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There’s currently &lt;a href=&quot;https://bit.ly/rYnFy2&quot;&gt;a survey running&lt;/a&gt; to get a better sense of our use base. Those inputs help us steer the effort wisely, so we appreciate your taking time to fill it in. The result would be more useful if larger number of people participate, so feel free to encourage others to fill it in as well.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In the same spirit of the fundraising drive in NPR, CloudBees is throwing in a &quot;thank you gift&quot; of AppleTV as an added incentive. See &lt;a href=&quot;https://blog.cloudbees.com/2011/11/take-jenkins-survey.html&quot;&gt;their blog post&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/10/21/report-bugs-and-win-kindle/</id>
<title>Report bugs and win Kindle</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-10-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/10/21/report-bugs-and-win-kindle/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='feedback'></category>
<summary>
CloudBees is running a 60-days "bring me bugs" contest for the Jenkins project where you may win a Kindle and Amazon gift cards for a bug report you made during the contest period. See the linked site for details about how to enter into the drawing. Greg Moy from Electronic Arts has already won for the first week, but there are more rounds to come.


Several years ago Sun did the same thing around GlassFish, and it was useful to drive more participations into the project. Whether or not you were around the last time, don&#8217;t forget to participate this time....
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://www.cloudbees.com/sites/default/files/imagefield_thumbs/A_Bug%27s_Life.png&quot; alt=&quot;A Bug%27s Life&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; is running a 60-days &lt;a href=&quot;https://www.cloudbees.com/jenkins-community-contests.cb&quot;&gt;&quot;bring me bugs&quot;&lt;/a&gt; contest for the Jenkins project where you may win a Kindle and Amazon gift cards for a bug report you made during the contest period. See the linked site for details about how to enter into the drawing. Greg Moy from Electronic Arts has already won for the first week, but there are more rounds to come.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Several years ago &lt;a href=&quot;https://jenkins.361315.n4.nabble.com/ANN-GlassFish-Community-Awards-175-000-give-away-for-contributions-td389095.html&quot;&gt;Sun did the same thing around GlassFish&lt;/a&gt;, and it was useful to drive more participations into the project. Whether or not you were around the last time, don’t forget to participate this time.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/10/17/andrew-bayer-discusses-jenkins-with-tim-obrien/</id>
<title>Andrew Bayer discusses Jenkins with Tim O&#39;Brien</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-10-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/10/17/andrew-bayer-discusses-jenkins-with-tim-obrien/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='interview'></category>
<category term='javaone'></category>
<summary>
Recently, Jenkins Interim Governance Board member and core contributor, Andrew Bayer sat down with Tim O&#8217;Brien to discuss the Jenkins project.


You can watch the video on YouTube or via the embed below....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently, Jenkins Interim Governance Board member and core contributor, &lt;a href=&quot;https://twitter.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt; sat down with &lt;a href=&quot;https://twitter.com/tobrian&quot;&gt;Tim O’Brien&lt;/a&gt; to discuss the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can watch the video &lt;a href=&quot;https://www.youtube.com/watch?v=0p815FUCK_g&quot;&gt;on YouTube&lt;/a&gt; or via the embed below.&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/0p815FUCK_g&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/10/05/ci-dinner-wednesday-at-630/</id>
<title>CI Dinner Wednesday at 6:30</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-10-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/10/05/ci-dinner-wednesday-at-630/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='meetup'></category>
<category term='javaone'></category>
<summary>
Apologies for the late notice, I think most of us have been pre-occupied with that fantastic Jenkins User Conference. While there are plenty of folks in town for JavaOne, I wanted to host a meetup/dinner at Cafe Chaat here in San Francisco.


If you&#8217;re coming from JavaOne directly, use these directions


If you&#8217;re coming from Oracle OpenWorld, use these directions


Kohsuke will be in attendance as will some other Jenkins User Conference speakers, so if you still have left-over questions, I&#8217;m sure you can get them answered before the last of the Mango Lassi is finished!


Look forward to seeing you there!...
</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://s3-media2.ak.yelpcdn.com/bphoto/fFGPBtsutYpn3A155Sf75Q/l.jpg&quot; alt=&quot;Photo from inside Cafe Chaat&quot; width=&quot;200&quot; /&gt;Apologies for the late notice, I think most of us have been pre-occupied with &lt;a href=&quot;https://www.cloudbees.com/jenkins-user-conference-2011.cb&quot;&gt;that fantastic Jenkins User Conference&lt;/a&gt;. While there are plenty of folks in town for JavaOne, I wanted to host a meetup/dinner at &lt;strong&gt;&lt;a href=&quot;https://www.yelp.com/biz/cafe-chaat-san-francisco-4&quot;&gt;Cafe Chaat&lt;/a&gt;&lt;/strong&gt; here in San Francisco.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re coming from JavaOne directly, use &lt;a href=&quot;https://g.co/maps/dwwzj&quot;&gt;these directions&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re coming from Oracle OpenWorld, use &lt;a href=&quot;https://g.co/maps/2db79&quot;&gt;these directions&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; will be in attendance as will some other Jenkins User Conference speakers, so if you still have left-over questions, I’m sure you can get them answered before the last of the &lt;a href=&quot;https://secure.wikimedia.org/wikipedia/en/wiki/Lassi#Mango_lassi&quot;&gt;Mango Lassi&lt;/a&gt; is finished!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Look forward to seeing you there!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/09/20/ips-packages-of-jenkins-for-solaris-openindiana/</id>
<title>IPS Packages of Jenkins for Solaris/OpenIndiana</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-09-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/09/20/ips-packages-of-jenkins-for-solaris-openindiana/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='releases'></category>
<summary>
Image Packaging System (IPS) is a new package manager Sun has developed for OpenSolaris. While I have my doubts about whether a brand-new package manager was a good way of spending engineering resources, OpenSolaris had a number of very nice features that made it a convincing platform to run Jenkins, thanks to SMF, ZFS, and zones. So I used to produce IPS packages for Jenkins. I lost the ability to do this as I left Oracle and lost access to a Solaris system, but a recent blog post renewed my interest.


So I&#8217;m happy to announce that the Jenkins project has...
</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://upload.wikimedia.org/wikipedia/en/thumb/3/3b/Solaris_OS_logo.svg/220px-Solaris_OS_logo.svg.png&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Image Packaging System (IPS) is a new package manager Sun has developed for OpenSolaris. While I have my doubts about whether a brand-new package manager was a good way of spending engineering resources, OpenSolaris had a number of very nice features that made it a convincing platform to run Jenkins, thanks to SMF, ZFS, and zones. So I used to produce IPS packages for Jenkins. I lost the ability to do this as I left Oracle and lost access to a Solaris system, but &lt;a href=&quot;https://www.dev-eth0.de/jenkins-continuous-integration-on-opensolaris/&quot;&gt;a recent blog post&lt;/a&gt; renewed my interest.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So I’m happy to announce that the Jenkins project has started producing &lt;a href=&quot;https://ips.jenkins-ci.org/&quot;&gt;IPS packages for the releases&lt;/a&gt;. With this addition, the Jenkins project now produces 9 packages on different platforms (10, if you count &lt;a href=&quot;https://rubygems.org/gems/jenkins-war&quot;&gt;Ruby as a separate platform&lt;/a&gt; :-)&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/09/19/2011-donation-drive/</id>
<title>2011 Donation Drive</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-09-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/09/19/2011-donation-drive/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<summary>
Since the end of April, Jenkins has been officially part of the
SPI (Software
in the Public Interest), an umbrella organization which offers a useful level
of legal status for the project.


Up until recently we had not taken proper advantage of this new legal
umbrella, thankfully that&#8217;s changed as we&#8217;re now capable of accepting
donations!


For the project this is a big step forward as it will allow us to offset the
cost of servers for the project, bandwidth, SSL certificates and other costs
incurred as part of running such a large open source project.



Trivia: The machine that this page is being served from originally started
out as "hudson...
</summary>
<content type='html'>
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/tip-jar.png&quot; alt=&quot;tip jar&quot;&gt;
&lt;/img&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the end of April, Jenkins has been officially part of the
&lt;a href=&quot;https://www.spi-inc.org&quot;&gt;SPI&lt;/a&gt; (Software
in the Public Interest), an umbrella organization which offers a useful level
of legal status for the project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Up until recently we had not taken proper advantage of this new legal
umbrella, thankfully that’s changed as we’re now capable of &lt;strong&gt;&lt;a href=&quot;https://www.jenkins.io/donate/&quot;&gt;accepting
donations!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the project this is a big step forward as it will allow us to offset the
cost of servers for the project, bandwidth, SSL certificates and other costs
incurred as part of running such a large open source project.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Trivia:&lt;/em&gt; The machine that this page is being served from originally started
out as &quot;hudson labs&quot;, purchased and colocated by
&lt;a href=&quot;https://twitter.com/abayer&quot;&gt;abayer&lt;/a&gt;,
&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;kohsuke&lt;/a&gt; and
&lt;a href=&quot;https://twitter.com/agentdero&quot;&gt;myself&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since we’re now able to accept donations, we’re kicking off a donation drive to
help recover some of the costs incurred this summer (&lt;a href=&quot;https://www.jenkins.io/content/mirror-mirror-wall&quot;&gt;which I’ve discussed
previously&lt;/a&gt;). Our immediate goal is to raise $5130
to recoup bandwidth costs, if you can spare some change, head on over to the
&lt;a href=&quot;https://co.clickandpledge.com/advanced/default.aspx?wid=46160&quot;&gt;SPI online donation
page&lt;/a&gt; and help
us out :)&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/09/14/jenkins-long-term-release-1-409-2-is-out/</id>
<title>Jenkins Long-Term Release 1.409.2 is out</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-09-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/09/14/jenkins-long-term-release-1-409-2-is-out/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='releases'></category>
<category term='lts'></category>
<summary>
We just posted the updated Long-term Release (LTS) of 1.409.2.


Just as a recap, with LTS releases, we plan on providing a release train that only has backported changes. 1.409.2 contains a handful of important bug fixes since 1.409.1. For more about LTS, see this wiki page.


Thanks to the heroic effort of those who are involved, namely Vojtech Juranek and a bunch of heroes, this release went through a rather rigorous testing, including all the automated tests we have plus a considerable number of manual eye-ball tests.


To download, click the "Long-Term Support Release" tab from the top page. If you&#8217;ve already...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We just posted the updated Long-term Release (LTS) of 1.409.2.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just as a recap, with LTS releases, we plan on providing a release train that only has backported changes. 1.409.2 contains &lt;a href=&quot;https://jenkins-ci.org/changelog-stable&quot;&gt;a handful of important bug fixes&lt;/a&gt; since 1.409.1. For more about LTS, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/LTS+Release+Line&quot;&gt;see this wiki page&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the heroic effort of those who are involved, namely Vojtech Juranek and a bunch of heroes, this release went through a rather rigorous testing, including all the automated tests we have plus &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/LTS+1.409.x+RC+Testing&quot;&gt;a considerable number of manual eye-ball tests&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To download, click the &quot;Long-Term Support Release&quot; tab from &lt;a href=&quot;https://jenkins-ci.org/&quot;&gt;the top page&lt;/a&gt;. If you’ve already been using LTS, you should start receiving update notifications soon.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/09/01/call-for-testers-upcoming-lts-update/</id>
<title>Call for Testers: Upcoming LTS update</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-09-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/09/01/call-for-testers-upcoming-lts-update/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='lts'></category>
<summary>
A couple of months
ago Jenkins embarked on an new project, the
Jenkins "LTS" (Long Term Support) release line. A LTS branch of development is
common in most major open source projects, especially those with substantial
corporate adoption, so this was a great step for the project as a whole.


We&#8217;re now coming up on the second LTS release, which will be an incremental
update to the previous one (1.409.1) with only the most important fixes
back-ported to the branch.


Now is when we need your help.


We need testers and interested parties from the community to help verify the
stability of the planned LTS update, 1.409.2, which is now...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.jenkins.io/content/jenkins-long-term-support-release&quot;&gt;couple of months
ago&lt;/a&gt; Jenkins embarked on an new project, the
Jenkins &quot;LTS&quot; (Long Term Support) release line. A LTS branch of development is
common in most major open source projects, especially those with substantial
corporate adoption, so this was a great step for the project as a whole.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re now coming up on the second LTS release, which will be an incremental
update to the previous one (1.409.1) with only the most important fixes
back-ported to the branch.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Now&lt;/strong&gt; is when we need your help.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We need testers and interested parties from the community to help verify the
stability of the planned LTS update, 1.409.2, which is now in the release
candidate stages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The testing of 1.409.2 has been spearheaded by community member &lt;code&gt;vjuranek&lt;/code&gt; who
has created &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/LTS+1.409.x+RC+Testing&quot;&gt;this &lt;strong&gt;fantastic test
matrix&lt;/strong&gt;&lt;/a&gt; to
help coordinate testing of release candidates.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The LTS project is entirely community driven, so your input is invaluable in making
these releases successful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in helping, speak up on the &lt;a href=&quot;https://www.jenkins.io/content/mailing-lists&quot;&gt;-dev mailing
list&lt;/a&gt; and start pitching in on the test matrix!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/08/09/jenkins-user-conference-call-for-papers/</id>
<title>Jenkins User Conference: Call for Papers</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-08-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/08/09/jenkins-user-conference-call-for-papers/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='javaone'></category>
<category term='juc'></category>
<summary>
As we announced yesterday, we are organizing a Jenkins User Conference, and we are delighted to announce its Call for Papers is now open. We are looking forward to receiving amazing proposals from infrastructure experts to novice developers in the Jenkins community. Use your creativity. Share and showcase your unique approach to utilizing Jenkins technology.
We do not encourage overt marketing pitches. We encourage breakout sessions, work shops, good case studies with transferable, tangible lessons and other topics like:




plug-in development


Specific Jenkins applications that solve testing/building problems in particular areas: mobility, enterprise/web/cloud applications, and UI testing


Beyond Java (i.e Jenkins w/ PHP, Ruby,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.jenkins.io/content/jenkins-user-conference&quot;&gt;As we announced yesterday&lt;/a&gt;, we are organizing a Jenkins User Conference, and we are delighted to announce its Call for Papers is now open. We are looking forward to receiving amazing proposals from infrastructure experts to novice developers in the Jenkins community. Use your creativity. Share and showcase your unique approach to utilizing Jenkins technology.&lt;br&gt;
We do not encourage overt marketing pitches. We encourage breakout sessions, work shops, good case studies with transferable, tangible lessons and other topics like:&lt;br /&gt;
&lt;/br&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;plug-in development&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Specific Jenkins applications that solve testing/building problems in particular areas: mobility, enterprise/web/cloud applications, and UI testing&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Beyond Java (i.e Jenkins w/ PHP, Ruby, etc)&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Jenkins best practices, lessons learned, case studies, tips and tricks&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Lightning Talks (10 min)&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT:&lt;/strong&gt; Submit your proposal as soon as possible to &lt;a href=&quot;mailto:juc-cfp@cloudbees.com&quot;&gt;CFP alias&lt;/a&gt;. Call for Papers closes Sept 1, 2011.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sessions are 50 min long. In your proposal pls include the following info:&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Name&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Job Title&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Email&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;twitter id&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Company/website&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Paper Title&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Audience Level (General, Beginner, Intermediate, Advance)&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Paper Abstract&lt;br /&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;Your bio&lt;br /&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/08/08/jruby-branch-merged/</id>
<title>JRuby Branch merged!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-08-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/08/08/jruby-branch-merged/" />
<author>
<name>cowboyd</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='jenkinsci'></category>
<category term='ruby'></category>
<category term='jruby'></category>
<summary>
Yesterday, Kohsuke announced that the 'jruby' branch of jenkins-core had been merged to master.


This doesn&#8217;t mean that we&#8217;re done and that you can go forth and write pure ruby plugins&#8230;&#8203; not by any stretch of the imagination. Instead, what it does mean, is that the Jenkins mainline is much more friendly to runtime analysis of classes with which it is not familiar.


The problem


When analyzing plugin classes, Jenkins uses just about every kind of metadata you can think of to get information about them: Class name, Field names, method names, member modifiers, annotations, you name it. It even uses the containing...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/jruby.png&quot; alt=&quot;jruby&quot; width=&quot;150&quot; /&gt; Yesterday, &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; &lt;a href=&quot;https://groups.google.com/group/jenkinsrb/msg/32815b1ea917355d&quot;&gt;announced&lt;/a&gt; that the &#39;jruby&#39; branch of jenkins-core had been &lt;a href=&quot;https://github.com/jenkinsci/jenkins/commit/f6373f7ada14a7914f4ae08b6af4c1b27d343c21&quot;&gt;merged to master&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This doesn’t mean that we’re done and that you can go forth and write pure ruby plugins…​ not by any stretch of the imagination. Instead, what it &lt;em&gt;does&lt;/em&gt; mean, is that the Jenkins mainline is much more friendly to runtime analysis of classes with which it is not familiar.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-problem&quot; /&gt;The problem&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When analyzing plugin classes, Jenkins uses just about every kind of metadata you can think of to get information about them: Class name, Field names, method names, member modifiers, annotations, you name it. It even uses the containing class relationship for inner classes to match Descriptors with what they describe.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s all a great example of convention over configuration (CoC). In fact, I’ve never really seen CoC implemented in a Java project before as successfully as it has been in Jenkins. Plugin authors don’t have to duplicate any metadata that Jenkins can figure out for you — and it’s alot! The drawback though, is that extensions depend very heavily on conforming to the structure of a conventional Java class.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The changes in this merge, and in several of the modules on which Jenkins depends, allow more than ever to get this information by asking an object directly rather than querying its private class structure.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-kicker&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-kicker&quot; /&gt;The Kicker&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many of theses changes aren’t even JRuby specific! While they do enable JRuby integration, They’re really just making things more friendly for dynamic languages in general. So, in theory, it should pave the way for others like JavaScript and Python.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;where-now&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-now&quot; /&gt;Where now?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re still working on the ruby runtime and tools which will provide as crisp a Ruby development experience as we can. I don’t want to proffer an estimate of when those will begin to be useable, but it is important to mark this very important milestone and explain what it does and does not mean.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;we-need-you&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#we-need-you&quot; /&gt;We need you!&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is still much work to be done to enable a writing Jenkins plugins in Ruby, we are looking for people who know Ruby and feel like pitching in: writing Rake tasks, improving the glue layer, documentation, etc.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested, most of the action is happening on the &lt;a href=&quot;https://groups.google.com/group/jenkinsrb&quot;&gt;jenkinsrb@googlegroups.com&lt;/a&gt; mailing list, so join us!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/08/08/jenkins-user-conference/</id>
<title>Jenkins User Conference</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-08-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/08/08/jenkins-user-conference/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='javaone'></category>
<category term='jenkinsci'></category>
<category term='juc'></category>
<summary>
We&#8217;ve done meetups, we&#8217;ve done sessions, we&#8217;ve done workshops, now it&#8217;s about time we went ahead and did user conference don&#8217;t you think?


Our pals over at CloudBees (Harpeet specifically) have taken the initiative in starting to organize just that: a Jenkins User Conference on October 2nd.


If you have your calendar at the ready, you&#8217;ll notice that October 2nd is the Sunday before JavaOne kicks off this year in San Francisco.


The details are still coming together, but a proposed agenda has already been posted by Harpeet.


As this is a community event, I&#8217;ll be sure to keep the updates coming on this...
</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/user.svg&quot; alt=&quot;user&quot; /&gt; We’ve done meetups, we’ve done sessions, we’ve done workshops, now it’s about time we went ahead and did user conference don’t you think?&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our pals over at CloudBees (Harpeet specifically) have taken the initiative in starting to organize just that: a &lt;strong&gt;&lt;a href=&quot;https://blog.cloudbees.com/2011/08/jenkins-user-conference.html&quot;&gt;Jenkins User Conference&lt;/a&gt;&lt;/strong&gt; on &lt;strong&gt;October 2nd&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have your calendar at the ready, you’ll notice that October 2nd is the Sunday before JavaOne kicks off this year in San Francisco.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The details are still coming together, but a &lt;a href=&quot;https://blog.cloudbees.com/2011/08/jenkins-user-conference-proposed-agenda.html&quot;&gt;proposed agenda&lt;/a&gt; has already been posted by Harpeet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As this is a community event, I’ll be sure to keep the updates coming on this site but you may want to add the &lt;a href=&quot;https://blog.cloudbees.com/&quot;&gt;CloudBees&#39; Blog&lt;/a&gt; to your feed reader just in case (or just follow them on Twitter: &lt;a href=&quot;https://twitter.com/cloudbees&quot;&gt;@CloudBees&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/07/18/mirror-mirror-on-the-wall/</id>
<title>Mirror, mirror on the wall</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-07-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/07/18/mirror-mirror-on-the-wall/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='news'></category>
<summary>
Let me preface this entire post with this: I love
Contegix.



While working on some infrastructure tasks I had long-since put-off for the
Jenkins project, I noticed something this weekend that scared the hell out of
me.


At some undetermined time, our MirrorBrain
installation stopped redirecting to our mirror network. Absolutely zero
downloads were being redirected, meaning that cucumber, the 1U machine
graciously colocated by Contegix had served up
far more bits than I ever wanted it to.


As such, I would like to publicly apologize to Contegix on behalf of the
Jenkins project. Their support for the project has been tremendous but
this glitch caused such an incredible amount of traffic...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let me preface this entire post with this: &lt;strong&gt;I love
&lt;a href=&quot;https://contegix.com&quot;&gt;Contegix&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While working on some infrastructure tasks I had long-since put-off for the
Jenkins project, I noticed something this weekend that scared the hell out of
me.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At some undetermined time, our &lt;a href=&quot;http://mirrorbrain.org&quot;&gt;MirrorBrain&lt;/a&gt;
installation &lt;em&gt;stopped&lt;/em&gt; redirecting to our mirror network. Absolutely &lt;strong&gt;zero&lt;/strong&gt;
downloads were being redirected, meaning that &lt;code&gt;cucumber&lt;/code&gt;, the 1U machine
graciously colocated by &lt;a href=&quot;https://www.contegix.com&quot;&gt;Contegix&lt;/a&gt; had served up
&lt;strong&gt;&lt;em&gt;far&lt;/em&gt;&lt;/strong&gt; more bits than I ever wanted it to.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As such, I would like to publicly apologize to Contegix on behalf of the
Jenkins project. Their support for the project has been tremendous but
this glitch caused such an incredible amount of traffic to be pushed through
their network that I feel exceptionally bad about it (turns out, Jenkins is pretty popular!)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, for the good news. In diagnosing and debugging this issue (in a
caffeine-fueled frenzy I might add) I managed to do a couple things:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I corrected the redirection relatively easily&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I fixed our long-standing geo-location issue, &lt;strong&gt;finally enabling redirection to our european
and asian mirrors!&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;Within 30 minutes of correcting the error, I was able to add &lt;em&gt;two&lt;/em&gt; mirrors in
Germany, re-enable one from Taiwan and add a new mirror in Japan!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m hoping to add even more mirrors in even more regions as volunteers with
bandwidth step-forward, if you’re interested in hosting a mirror you can drop
me a line at &lt;code&gt;tyler@linux.com&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/06/24/ruby-plugins-hack-session-notes-6-23-2011/</id>
<title>Ruby Plugins Hack Session Notes 6/23/2011</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-06-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/06/24/ruby-plugins-hack-session-notes-6-23-2011/" />
<author>
<name>cowboyd</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='ruby'></category>
<category term='jruby'></category>
<summary>
You know that the night is going to be productive whenever @kohsukekawa shows up, and last night was no exception. We talked about problems on the horizon, potential solutions, and then I spent the last half hour ripping a bit of code.


The truth of the matter is that most of the changes that have to be done to Jenkins core have already been made, so now the bulk of the heavy lifting falls to the Ruby side of things (right now, me).


Anyhow, on to the notes!


Attendees


@kohsukekawa, @cowboyd


extract more stuff into the jenkins-plugins.rb support library (@cowboyd)

We&#8217;re in the process of extracting,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You know that the night is going to be productive whenever @kohsukekawa shows up, and last night was no exception. We talked about problems on the horizon, potential solutions, and then I spent the last half hour ripping a bit of code.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The truth of the matter is that most of the changes that have to be done to Jenkins core have already been made, so now the bulk of the heavy lifting falls to the Ruby side of things (right now, me).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anyhow, on to the notes!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;attendees&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#attendees&quot; /&gt;Attendees&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;@kohsukekawa, @cowboyd&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;extract-more-stuff-into-the-jenkins-plugins-rb-support-library-cowboyd&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#extract-more-stuff-into-the-jenkins-plugins-rb-support-library-cowboyd&quot; /&gt;extract more stuff into the jenkins-plugins.rb support library (@cowboyd)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re in the process of extracting, normalizing, documenting all the goop that’s currently residing in the &lt;a href=&quot;https://github.com/cowboyd/jenkins-ruby-plugins-playground&quot;&gt;ruby plugins playground&lt;/a&gt; into a formal plugin support gem called jenkins-plugins &lt;a href=&quot;https://github.com/cowboyd/jenkins-plugins.rb&quot; class=&quot;bare&quot;&gt;https://github.com/cowboyd/jenkins-plugins.rb&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;recruit-rubyists-to-implement-non-jenkins-specific-code-kohsukekawa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#recruit-rubyists-to-implement-non-jenkins-specific-code-kohsukekawa&quot; /&gt;recruit Rubyists to implement non-Jenkins specific code (@kohsukekawa)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you know Ruby and would like to be able to write Jenkins plugins with it, but don’t know the first thing about Jenkins and/or JRuby, that’s OK. You can help by implementing some of the &lt;a href=&quot;https://github.com/cowboyd/jenkins-plugins.rb/tree/master/features&quot;&gt;cucumber features&lt;/a&gt; found in that repo&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;@kohsukekawa is going to be knocking on your door to ask if you’re ready to step up, so I hope you’ve been nice this year!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;testing-strategy-cowboyd-kohsukekawa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#testing-strategy-cowboyd-kohsukekawa&quot; /&gt;testing strategy (@cowboyd, @kohsukekawa)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ruby folk love their tests, and a plugin development solution won’t be complete unless testing is a breeze. That means that as we extract the plugin support library, we take make sure you can test plugin classes in isolation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the Jenkins side, KK will think about how to run tests that require a full Jenkins environment. A system like this exists currently for testing java plugins, but some thought might be required on how to do this for Ruby.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;packaging-reloaded-kohsukekawa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#packaging-reloaded-kohsukekawa&quot; /&gt;packaging reloaded (@kohsukekawa)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;KK is going to jump in and write some rake tasks to take a ruby plugin structure and package it into a valid .hpi file, and with no maven involved.  According to him, Ruby plugins aren’t the only system that wants to run maven-free. There is desire to be able to do plugin development with Gradle (another Java build system), so this could be a double win.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;different-schedule-kohsukekawa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#different-schedule-kohsukekawa&quot; /&gt;different schedule (@kohsukekawa)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;8:30pm Central in North America, doesn’t seem to be a very good time. Especially for hackers in Asia Pacific. KK will investigate a new time that works for everybody and encourages more participation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/06/16/jenkins-long-term-support-release/</id>
<title>Jenkins Long-Term Support Release</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-06-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/06/16/jenkins-long-term-support-release/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='releases'></category>
<category term='lts'></category>
<summary>
We have released 1.409.1, our first long-term support (LTS) release, from the Jenkins project.


The idea of the LTS release is to provide a second release line the favors more stability and bug fix only maintenance. This release line branches off from a bit old Jenkins release (in this case 1.409), and we will only put important backported bug fixes. We&#8217;ll keep releasing 1.409.2, 1.409.3, and so on, as such bugs appear, and in several months (our current thinking is 3 months) we&#8217;ll designate another release and repeat this process all over again. I think it provides more comfortable upgrade path...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have released &lt;a href=&quot;https://jenkins-ci.org/&quot;&gt;1.409.1, our first long-term support (LTS) release&lt;/a&gt;, from the Jenkins project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The idea of the LTS release is to provide a second release line the favors more stability and bug fix only maintenance. This release line branches off from a bit old Jenkins release (in this case 1.409), and we will only put important backported bug fixes. We’ll keep releasing 1.409.2, 1.409.3, and so on, as such bugs appear, and in several months (our current thinking is 3 months) we’ll designate another release and repeat this process all over again. I think it provides more comfortable upgrade path for larger deployments. For more about this, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/LTS+Release+Line&quot;&gt;see Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In large companies that use Jenkins in a large scale, there often is a team of people who looks at incoming Jenkins release, tests it with their environments and their plugins, and then let their internal group consume them. With this release line, I’m calling for them to join the effort on this branch. Vojtech Juranek from Red Hat is already helping us tremendously, so is Yahoo in choosing the base release line and backporting. But it’d be great to get more people on board, as I think it’ll benefit everyone to have a larger number of eyeballs on the same code. You’ll also have a say on what bugs need to be backcported, etc. If you are interested in this effort, please let us know.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/06/14/upcoming-events-in-june-and-early-july/</id>
<title>Upcoming Events in June and early July</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-06-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/06/14/upcoming-events-in-june-and-early-july/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='just for fun'></category>
<category term='meetup'></category>
<category term='meta'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<summary>
I&#8217;ve just added three events coming up in the next few weeks to the Jenkins calendar. Conveniently, they are all events I&#8217;ll be attending while traveling around Western Europe!




The Cologne JUG is having a meetup on Saturday, June 25th, starting at 2pm. We&#8217;ll be talking about Jenkins, maybe doing some coding, and then heading out for drinks and more talk! You can find more information and sign up at Xing.


A few days later, TNG Technology Consulting is generously hosting a meetup in Munich, on Wednesday, June 30th, starting at 3pm. I&#8217;ll be giving a quick talk on the state of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve just added three events coming up in the next few weeks to &lt;a href=&quot;https://www.jenkins.io/event-calendar&quot;&gt;the Jenkins calendar&lt;/a&gt;. Conveniently, they are all events I’ll be attending while traveling around Western Europe!&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://jugcologne.org&quot;&gt;The Cologne JUG&lt;/a&gt; is having a meetup on Saturday, June 25th, starting at 2pm. We’ll be talking about Jenkins, maybe doing some coding, and then heading out for drinks and more talk! You can find more information and sign up at &lt;a href=&quot;https://www.xing.com/events/jugc-jenkins-town-763587&quot;&gt;Xing&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A few days later, TNG Technology Consulting is generously hosting a meetup in Munich, on Wednesday, June 30th, starting at 3pm. I’ll be giving a quick talk on the state of the Jenkins project, followed by Ullrich Haffner (the author of the static analysis plugins for Jenkins) giving a quick talk on how those plugins are used. After that, we’ll be having a hackathon, and then more beer! Again, you can find more information and sign up at &lt;a href=&quot;https://www.xing.com/events/jenkins-treffen-munchen-30-06-2011-776226&quot;&gt;Xing&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A week later, the London CI meetup group is hosting a meetup as well, on Wednesday, July 6th, starting at 6:30pm. We’ll be meeting up at the Royal Festival Hall for discussion and drinking. You can find more information and sign up at &lt;a href=&quot;https://www.meetup.com/Continuous-Integration-London/events/21752121/&quot;&gt;Meetup&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;Do you have a Jenkins event you’d like to have added to &lt;a href=&quot;https://www.jenkins.io/event-calendar&quot;&gt;our calendar&lt;/a&gt;? Let us know!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/06/09/a-big-thanks-to-rackspace/</id>
<title>A big thanks to Rackspace</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-06-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/06/09/a-big-thanks-to-rackspace/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='meta'></category>
<summary>
This post is long over-due and I really apologize for that.


Some months ago we put out the call for "more agent machines!" through the
mailing lists, sky-writers and twitter. We had a serious problem, for a
continuous integration project, a large number of our plugins and
dependencies weren&#8217;t being built in a continuous and automated fashion!


We had some builds on a couple of flakey machines on home connections
contributed by various individuals, until Rackspace stepped up in a big
way and donated an infrastructure server for the project to use.image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/rackspace.jpg


For months now, just about all plugins and core have been built and tested on spinach,
the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This post is long over-due and I really apologize for that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some months ago we put out the call for &quot;more agent machines!&quot; through the
mailing lists, sky-writers and twitter. We had a serious problem, for a
continuous integration project, a &lt;strong&gt;large&lt;/strong&gt; number of our plugins and
dependencies weren’t being built in a continuous and automated fashion!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We had some builds on a couple of flakey machines on home connections
contributed by various individuals, until Rackspace stepped up in a &lt;strong&gt;big&lt;/strong&gt;
way and donated an infrastructure server for the project to use.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/rackspace.jpg&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For months now, just about all plugins and core have been built and tested on &lt;code&gt;spinach&lt;/code&gt;,
the always-on machine in the Rackspace Cloud. Dutifully chugging away building
core, plugin after plugin and occasionally getting flooded with work from &lt;a href=&quot;https://twitter.com/fcamblor&quot;&gt;Frederic
Camblor’s&lt;/a&gt; plugin compatibility tester!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In hindsight, having a powerful infrastructure machine for nothing other than
builds has helped us build great software faster; I can’t imagine how difficult
things might be otherwise.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve personally had a lot of interaction with Rackspace engineers through the &lt;a href=&quot;https://www.openstack.org/&quot;&gt;OpenStack
project&lt;/a&gt; and have a number of friends who operate businesses on
Rackspace/Rackspace Cloud hybrid infrastructures.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The folks at Rackspace are
top notch and I can’t thank them enough for contributing to the Jenkins
project.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/06/08/building-a-software-diamond-with-jenkins/</id>
<title>Building a software diamond with Jenkins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-06-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/06/08/building-a-software-diamond-with-jenkins/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<category term='plugins'></category>
<category term='tutorial'></category>
<summary>
[Editor&#8217;s Note: This is a guest post from Jenkins community member Tom Rini]


Alternatively: How to make your parallel jobs kick one last job at the end


Many of us have had occasion to think: "I could make this project build quicker if I could just run parts in parallel and then one final job to wrap it up."


Well, good news! Jenkins is here to help!  With the Join Plugin you can do just that.  Over on the confluence page it&#8217;s got a number of examples and fancy flow charts.  But the take-away is that if you can describe...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[&lt;strong&gt;Editor’s Note:&lt;/strong&gt; &lt;em&gt;This is a guest post from Jenkins community member &lt;a href=&quot;https://www.linkedin.com/in/tomrini&quot;&gt;Tom Rini&lt;/a&gt;&lt;/em&gt;]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alternatively: &lt;strong&gt;How to make your parallel jobs kick one last job at the end&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Many of us have had occasion to think: &quot;&lt;em&gt;I could make this project build quicker if I could just run parts in parallel and then one final job to wrap it up.&lt;/em&gt;&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well, good news! Jenkins is here to help!  With the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Join+Plugin&quot;&gt;Join Plugin&lt;/a&gt; you can do just that.  Over on the confluence page it’s got a number of examples and fancy flow charts.  But the take-away is that if you can describe the flow, you can make it happen.  But you’re saying &quot;wait, I need to pass information around between the jobs.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve got that one covered for you too with the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Parameterized+Trigger+Plugin&quot;&gt;Parameterized Trigger Plugin&lt;/a&gt;.  And here’s the best part, these two can work together!  With both plugins installed you can follow the steps listed in the Build Parameters section of the Join Plugin.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/join_trigger.png&lt;span class=&quot;Click to enlarge&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And as they say, &lt;em&gt;now you’re cooking with gas!&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/05/27/ruby-plugins-hack-session-5-27-2011/</id>
<title>Ruby Plugins Hack Session 5/27/2011</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-05-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/05/27/ruby-plugins-hack-session-5-27-2011/" />
<author>
<name>cowboyd</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='ruby'></category>
<category term='jruby'></category>
<summary>
After a one week hiatus, we returned to the weekly hack session on a mission light up the sky with fire!


Attendees


Charles Lowell, Rasheed Abdul-Aziz, Hiroshi Nakamura




Discussion/Accomplished




How to manage the different ScriptingContainers inside the Jenkins


renamed the experimental repo where we&#8217;ve been doing all of our development from fog.hpi to the more aptly name [https://github.com/cowboyd/jenkins-ruby-plugins-playground]


started a separate gem for housing the support libraries for jenkins here [https://github.com/cowboyd/jenkins-plugins.rb]


started with more formal definition of the plugin API there....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a one week hiatus, we returned to the weekly hack session on a mission light up the sky with fire!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;attendees&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#attendees&quot; /&gt;Attendees&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://twitter.com/cowboyd&quot;&gt;Charles Lowell&lt;/a&gt;, Rasheed Abdul-Aziz, &lt;a href=&quot;https://twitter.com/nahi&quot;&gt;Hiroshi Nakamura&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;discussionaccomplished&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#discussionaccomplished&quot; /&gt;Discussion/Accomplished&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;How to manage the different ScriptingContainers inside the Jenkins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;renamed the experimental repo where we’ve been doing all of our development from fog.hpi to the more aptly name [&lt;a href=&quot;https://github.com/cowboyd/jenkins-ruby-plugins-playground&quot; class=&quot;bare&quot;&gt;https://github.com/cowboyd/jenkins-ruby-plugins-playground&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;started a separate gem for housing the support libraries for jenkins here [&lt;a href=&quot;https://github.com/cowboyd/jenkins-plugins.rb&quot; class=&quot;bare&quot;&gt;https://github.com/cowboyd/jenkins-plugins.rb&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;started with more formal definition of the plugin API there.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/05/12/the-state-of-the-jenkins-project/</id>
<title>The State of the Jenkins Project</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-05-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/05/12/the-state-of-the-jenkins-project/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='meta'></category>
<category term='news'></category>
<summary>
A few weeks ago our very own Kohsuke Kawaguchi gave a presentation at the Silicon Valley CI Summit held in Mountain View.


Within the presentation, Kohsuke included a collection of numbers about the vibrancy of the Jenkins project that certainly hasn&#8217;t gotten enough attention. While the slideshow is embedded below, here&#8217;s some good high-level points:




Over 170 GitHub pull requests in the past four months, with more being sent every day.


Formalization of a "Jenkins Stable" branch of development with longer release cycles and back-ported bugfixes.


Over 280 tickets in JIRA have been resolved.


After posting a "special" release of Hudson which presents users with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few weeks ago our very own &lt;a href=&quot;https://www.twitter.com/kohsukekawa&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; gave a presentation at the &lt;a href=&quot;https://events.linkedin.com/Silicon-Valley-Continuous-Integration/pub/591454&quot;&gt;Silicon Valley CI Summit&lt;/a&gt; held in Mountain View.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Within the presentation, Kohsuke included a collection of numbers about the vibrancy of the Jenkins project that certainly hasn’t gotten enough attention. While the slideshow is embedded below, here’s some good high-level points:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Over 170 &lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;GitHub&lt;/a&gt; pull requests in the past four months, with more being sent every day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Formalization of a &quot;Jenkins Stable&quot; branch of development with longer release cycles and back-ported bugfixes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 280 tickets in &lt;a href=&quot;https://issues.jenkins.io&quot;&gt;JIRA&lt;/a&gt; have been resolved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After posting a &quot;special&quot; release of Hudson which presents users with a choice, &lt;strong&gt;87.25%&lt;/strong&gt; are choosing to upgrade to Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 500 tickets have been created&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Roughly 13,000 downloads of &lt;code&gt;jenkins.war&lt;/code&gt; and native packages a week&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;New&lt;/strong&gt; and vibrant community-driven initiatives like &lt;a href=&quot;https://twitter.com/fcamblor&quot;&gt;Frederic Camblor’s&lt;/a&gt; plugin compatibility tester and &lt;a href=&quot;https://twitter.com/cowboyd&quot;&gt;Charles Lowell’s&lt;/a&gt; JRuby plugin support project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We’ve crossed 1500 participants on the &lt;code&gt;jenkinsci-user&lt;/code&gt; mailing list, and are over 900 participants on the &lt;code&gt;jenkinsci-dev&lt;/code&gt; list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&quot;https://twitter.com/jenkinsci&quot;&gt;@jenkinsci&lt;/a&gt; twitter account recently crossed the 4,000 follower threshold.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On a personal note, I think this speaks all to the level of unbridled enthusiasm about the future of Jenkins by contributors both new and old.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Without further delay, the slides:&lt;center&gt;&lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/kohsuke/current-state-of-jenkins&quot;&gt;Current state of Jenkins&lt;/a&gt;&lt;/strong&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/05/12/ruby-plugins-hack-session-5-12-2011/</id>
<title>Ruby Plugins Hack Session 5/12/2011</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-05-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/05/12/ruby-plugins-hack-session-5-12-2011/" />
<author>
<name>cowboyd</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='plugins'></category>
<category term='ruby'></category>
<summary>
[Editor&#8217;s Note: For the past few weeks Jenkins community member Charles Lowell has been working with Kohsuke on adding support for building plugins in Ruby. As part of this effort, Charles has been hosting weekly hack sessions via WebEx]


As always, last night&#8217;s Ruby Plugins hack session was a pleasure. Below is a quick notation of what items were discussed and/or accomplished followed by next steps to be taken my those in attendance.


Discussion/Accomplished




Ruby Plugin project structure and how to bundle into an .hpi file.


Review of the new XSTREAM serialization method


API for marking fields as transient


What mods, if any, are required to...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[&lt;strong&gt;Editor’s Note:&lt;/strong&gt; &lt;em&gt;For the past few weeks Jenkins community member &lt;a href=&quot;https://twitter.com/cowboyd&quot;&gt;Charles Lowell&lt;/a&gt; has been working with &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; on adding support for building plugins in Ruby. As part of this effort, &lt;a href=&quot;https://twitter.com/cowboyd&quot;&gt;Charles&lt;/a&gt; has been hosting weekly hack sessions via WebEx&lt;/em&gt;]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As always, last night’s Ruby Plugins hack session was a pleasure. Below is a quick notation of what items were discussed and/or accomplished followed by next steps to be taken my those in attendance.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;discussionaccomplished&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#discussionaccomplished&quot; /&gt;Discussion/Accomplished&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;Ruby Plugin project structure and how to bundle into an .hpi file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Review of the new XSTREAM serialization method&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API for marking fields as transient&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What mods, if any, are required to get .hpl to work with Ruby 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;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;sect2&quot;&gt;
&lt;h3 id=&quot;charles&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#charles&quot; /&gt;Charles&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;to research what can be shared between JRuby &lt;code&gt;ScriptingContainer&lt;/code&gt;s&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API for unmarshalling hooks on serialized ruby objects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Change the name of the repo :)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Document…​ something!&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;kohsuke&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#kohsuke&quot; /&gt;Kohsuke&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;test more view functions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;add debug mode outside of hpi:run&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/2011/05/04/hamburg-hackathon-a-great-success/</id>
<title>Hamburg hackathon a great success!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-05-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/05/04/hamburg-hackathon-a-great-success/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<summary>
Thanks to the kindness of BigPoint GmbH and Kutzi, we had the first Jenkins Hackathon in Europe, in a very large and airly conference room in their Hamburg campus, on a nice sunny Sunday of May 1st. About 10 people came, including the static code analysis plugin fame Ullrich Hafner, Androd emulator plugin fame Christopher Orr, the instant messenger plugin (and others) fame Christoph Kutzinski. Some of us came from pretty far away places like Munich, Bonn, and Netherland. There was a good mix of existing developers and new developers, too.


During the hackathon, new folks developed whopping three plugins —...
</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://farm6.static.flickr.com/5303/5686094521_c891761b7b_m.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the kindness of &lt;a href=&quot;https://www.bigpoint.net/&quot;&gt;BigPoint GmbH&lt;/a&gt; and Kutzi, we had the first Jenkins Hackathon in Europe, in a very large and airly conference room in their Hamburg campus, on a nice sunny Sunday of May 1st. About 10 people came, including the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Static+Code+Analysis+Plug-ins&quot;&gt;static code analysis plugin&lt;/a&gt; fame Ullrich Hafner, &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Android+Emulator+Plugin&quot;&gt;Androd emulator plugin&lt;/a&gt; fame &lt;a href=&quot;https://twitter.com/orrc&quot;&gt;Christopher Orr&lt;/a&gt;, the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Instant+Messaging+Plugin&quot;&gt;instant messenger plugin&lt;/a&gt; (and others) fame &lt;a href=&quot;https://twitter.com/#!/kutzi&quot;&gt;Christoph Kutzinski&lt;/a&gt;. Some of us came from pretty far away places like Munich, Bonn, and Netherland. There was a good mix of existing developers and new developers, too.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;During the hackathon, new folks developed whopping three plugins — a security realm that connects to &lt;a href=&quot;https://github.com/jenkinsci/kerberos-authenticator-plugin&quot;&gt;Kerberos (password entering kind, not SSO)&lt;/a&gt;, &lt;a href=&quot;https://github.com/jenkinsci/builton-column-plugin&quot;&gt;a plugin that adds a list view column to show where the last build was done&lt;/a&gt;, and &lt;a href=&quot;https://github.com/jenkinsci/extra-columns-plugin/&quot;&gt;another plugin that attempts to collect small list view column implementations&lt;/a&gt;. German translations were improved, automated installation of Android SDKs are discussed and its implementation strategies explained. I’ve done my share of contribution by working on &lt;a href=&quot;https://github.com/jenkinsci/jruby-xstream&quot;&gt;XStream support for JRuby&lt;/a&gt;, which is one of the ground work necessary for JRuby-based Jenkins plugin development, and I also showed the prototype Groovy-based templating that can potentially supersede Jelly. There were additional exchange of tips and tricks, how you do this and that.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Strong coffee and engaged conversations kept me awake all day, although German keyboard layout (on top of usual IDE difference + Mac/PC difference) made it hard to code on other people’s computers, but all in all it was a very productive hackathon. In fact, the best ever. We wrapped up around 7pm and headed to a seafood restaurant near Elbe river, stayed there until 11pm-ish.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next hackathon is planned in Paris toward the end of the month. I’m looking forward to another productive Hackathon, so if you are nearby, please &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/17178842/&quot;&gt;RSVP and join us&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/04/14/jenkins-new-look/</id>
<title>Jenkins&#39; New Look</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-04-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/04/14/jenkins-new-look/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='news'></category>
<summary>
As you might have noticed Jenkins finally has
a brand spankin' new logo! Over the past couple weeks we&#8217;ve run two series
of votes, one for the initial 11 logo
submissions
and then a final, run-off election, for the two most popular
choices.
I&#8217;d like to take this opportunity to thank everybody that submitted logos! It
is incredibly flattering to have so many people passionate about the project
and willing to spend the time creating new art for us.image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/runoff_election_piechart.png


At the end of the votes, there was a clear winner though, everybody seems to
really love the submission by the folks over at The
FrontSide which you can see adorning this...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you might have noticed &lt;a href=&quot;https://twitter.com/jenkinsci/&quot;&gt;Jenkins&lt;/a&gt; finally has
a &lt;strong&gt;brand spankin&#39; new logo!&lt;/strong&gt; Over the past couple weeks we’ve run two series
of votes, &lt;a href=&quot;https://jenkins-ci.org/content/polls-are-open-jenkins-logo-contest&quot;&gt;one for the initial 11 logo
submissions&lt;/a&gt;
and then a final, run-off election, for the &lt;a href=&quot;https://jenkins-ci.org/content/final-two-run-vote-new-jenkins-logo&quot;&gt;two most popular
choices&lt;/a&gt;.
I’d like to take this opportunity to thank everybody that submitted logos! It
is incredibly flattering to have so many people passionate about the project
and willing to spend the time creating new art for us.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/runoff_election_piechart.png&lt;span class=&quot;Runoff election pie chart&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the end of the votes, there was a clear winner though, everybody seems to
really love the submission by the folks over at &lt;a href=&quot;https://thefrontside.net/&quot;&gt;The
FrontSide&lt;/a&gt; which you can see adorning this very page.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’d like to download the SVG version of the logo, or the variants in different sizes, I’ve gone ahead and uploaded a tarball and all the variants to &lt;a href=&quot;http://mirrors.jenkins-ci.org/art/&quot;&gt;this directory&lt;/a&gt;, there is also a good &lt;a href=&quot;http://mirrors.jenkins-ci.org/art/jenkins_colors.pdf&quot;&gt;color palette here&lt;/a&gt; (&lt;em&gt;obligatory PDF warning&lt;/em&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once again, thank you to &lt;strong&gt;everybody&lt;/strong&gt; that participated!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/04/04/the-final-two-run-off-vote-for-the-new-jenkins-logo/</id>
<title>The final two: run-off vote for the new Jenkins logo</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-04-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/04/04/the-final-two-run-off-vote-for-the-new-jenkins-logo/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<summary>
A little over a week ago we opened the polls to the larger user-base to vote for the new and improved Jenkins logo. After receiving hundreds of votes, we are now ready to enter the final round of voting (click images to see larger versions in a new window).


Voting will end April 9th at 23:59 UTC, so make sure to tell your friends, coworkers and bus drivers to get their votes in as soon as possible!








 + Logo #1">
 + Logo #2">




The Vote

If the iframe doesn&#8217;t properly load for you, you can open Loading..." class="bare">https://spreadsheets.google.com/viewform?formkey=dEl2T1gwdko1YXBxcktiTEJzUXZleUE6MQLoading...



If you&#8217;re interested in the results...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A &lt;a href=&quot;https://jenkins-ci.org/content/polls-are-open-jenkins-logo-contest&quot;&gt;little over a week ago&lt;/a&gt; we opened the polls to the larger user-base to vote for the &lt;strong&gt;&lt;em&gt;new and improved&lt;/em&gt;&lt;/strong&gt; Jenkins logo. After receiving hundreds of votes, we are now ready to enter the final round of voting (click images to see larger versions in a new window).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voting will &lt;strong&gt;end&lt;/strong&gt; April 9th at 23:59 UTC, so make sure to tell your friends, coworkers and bus drivers to get their votes in as soon as possible!&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;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-10&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_adrian_moya.thumbnail.png&quot; alt=&quot;&amp;lt;/a&amp;gt; + &amp;lt;strong&amp;gt;Logo #1&amp;lt;/strong&amp;gt;&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-9&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_frontside_1.thumbnail.png&quot; alt=&quot;&amp;lt;/a&amp;gt; + &amp;lt;strong&amp;gt;Logo #2&amp;lt;/strong&amp;gt;&quot; /&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-vote&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-vote&quot; /&gt;The Vote&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the iframe doesn’t properly load for you, you can open &lt;a href=&quot;https://spreadsheets.google.com/viewform?formkey=dEl2T1gwdko1YXBxcktiTEJzUXZleUE6MQ&amp;lt;span class=&quot; the=&quot;&quot; form=&quot;&quot; in=&quot;&quot; a=&quot;&quot; new=&quot;&quot; window=&quot;&quot;&gt;&lt;iframe src=&quot;https://spreadsheets.google.com/embeddedform?formkey=dEl2T1gwdko1YXBxcktiTEJzUXZleUE6MQ&quot; width=&quot;760&quot; height=&quot;443&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; /&gt;Loading...&lt;/a&gt;&quot; class=&quot;bare&quot;&amp;gt;https://spreadsheets.google.com/viewform?formkey=dEl2T1gwdko1YXBxcktiTEJzUXZleUE6MQ&lt;span class=&quot;the form in a new window&quot;&gt;&lt;iframe src=&quot;https://spreadsheets.google.com/embeddedform?formkey=dEl2T1gwdko1YXBxcktiTEJzUXZleUE6MQ&quot; width=&quot;760&quot; height=&quot;443&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; /&gt;Loading...&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in the results for the first round, you can find them in &lt;a href=&quot;https://gist.github.com/900991&quot;&gt;this gist&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/hr&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;/table&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/04/01/san-francisco-jenkins-meetup-wednesday-april-13th/</id>
<title>San Francisco Jenkins Meetup - Wednesday, April 13th</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-04-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/04/01/san-francisco-jenkins-meetup-wednesday-april-13th/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<summary>
We&#8217;re happy to announce that there&#8217;ll be a Jenkins meetup in San Francisco on Wed., Apr 13th, generously hosted by Engine Yard. The meetup will start at 6:30 - you can find more information here. Dr Nic Williams of Engine Yard will talk about their use of Jenkins with Ruby, and Kohsuke will give an update on the JRuby plugin development work he and cowboyd have been working on. If you&#8217;re interesting in giving a short talk on your usage of Jenkins, plugin work, or whatever, there should be time for an open mic. Hope to see you there!...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/images/ey_logo.png&quot; alt=&quot;Engine Yard!&quot; /&gt;We’re happy to announce that there’ll be a Jenkins meetup in San Francisco on Wed., Apr 13th, generously hosted by &lt;a href=&quot;https://www.engineyard.com/&quot;&gt;Engine Yard&lt;/a&gt;. The meetup will start at 6:30 - you can find more information &lt;a href=&quot;https://www.meetup.com/jenkinsmeetup/events/17090726/&quot;&gt;here&lt;/a&gt;. &lt;a href=&quot;https://twitter.com/drnic&quot;&gt;Dr Nic Williams of Engine Yard&lt;/a&gt; will talk about their use of Jenkins with Ruby, and Kohsuke will give an update on the JRuby plugin development work he and &lt;a href=&quot;https://twitter.com/cowboyd&quot;&gt;cowboyd&lt;/a&gt; have been working on. If you’re interesting in giving a short talk on your usage of Jenkins, plugin work, or whatever, there should be time for an open mic. Hope to see you there!&lt;/span&gt;
&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/03/23/windows-installers-are-now-available/</id>
<title>Windows installers are now available</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-03-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/03/23/windows-installers-are-now-available/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='releases'></category>
<category term='jenkinsci'></category>
<summary>
Good portion of Java developers use Windows, so we tend to think the opposite is true, that a good portion of Windows folks use Java. But this is not true.


As Jenkins gains traction among .NET developers, it&#8217;s becoming increasingly clear that Java is very alien to them. They naturally have no idea of what a war file means, and often don&#8217;t even have Java installed, and so it was just not easy enough for them to start using Jenkins.


I&#8217;m happy to report that I&#8217;ve finally fixed this problem with the new Windows installer. It is primarily packaged as an MSI...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Good portion of Java developers use Windows, so we tend to think the opposite is true, that a good portion of Windows folks use Java. But this is not true.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Jenkins gains traction among .NET developers, it’s becoming increasingly clear that Java is very alien to them. They naturally have no idea of what a war file means, and often don’t even have Java installed, and so it was &lt;em&gt;just not easy enough&lt;/em&gt; for them to start using Jenkins.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m happy to report that I’ve finally fixed this problem with the new Windows installer. It is primarily packaged as &lt;a href=&quot;https://en.wikipedia.org/wiki/Windows_Installer&quot;&gt;an MSI file&lt;/a&gt; — a common format that seasoned Windows devs/admins are familiar with. It can, for example, be deployed remotely on a large number of servers via Active Directory remotely. Or you can just double-click it to install it interactively. It bundles JRE, so no separate Java installation is needed.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The package also contains the bootstrap &lt;code&gt;setup.exe&lt;/code&gt;, to install .NET 2.0 runtime if it’s not installed yet. Between that and JRE, it got all the dependencies covered. I tested that by installing it on a fresh Windows XP install.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So I hope this makes Jenkins more attractive to .NET and other developers who live and die by Windows.&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/2011/03/21/the-polls-are-open-for-the-jenkins-logo-contest/</id>
<title>The polls are open for the Jenkins Logo Contest!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-03-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/03/21/the-polls-are-open-for-the-jenkins-logo-contest/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='news'></category>
<summary>
After a number of absolutely fantastic logo submissions from a number of designers, I&#8217;m extremely pleased to open the polls on the vote for the brand new Jenkins logo!


The thumbnails do not do any of these logos justice in my opinion, so I recommend opening each logo up in its own tab to get the full effect :)


I plan to end voting March 28th at 12:01 UTC.


The Logos













Logo #1
Logo #2
Logo #3







Logo #4
Logo #5
Logo #6







Logo #7
Logo #8
Logo #9







Logo #10
Logo #11






The Vote

If the iframe doesn&#8217;t properly load for you, you can open Loading..." class="bare">https://spreadsheets.google.com/viewform?formkey=dE9GNlpNbVEwa0VPZHl1TkJCaUI1Z2c6MQLoading......
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After a number of &lt;strong&gt;absolutely&lt;/strong&gt; fantastic logo submissions from a number of designers, I’m extremely pleased to open the polls on the vote for the &lt;strong&gt;&lt;em&gt;brand new Jenkins logo!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The thumbnails do not do any of these logos justice in my opinion, so I recommend opening each logo up in its own tab to get the full effect :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I plan to end voting &lt;strong&gt;March 28th at 12:01 UTC&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-logos&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-logos&quot; /&gt;The Logos&lt;/h3&gt;
&lt;table class=&quot;tableblock frame-all grid-all stretch&quot;&gt;
&lt;colgroup&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3333%;&quot;&gt;
&lt;col style=&quot;width: 33.3334%;&quot;&gt;
&lt;/col&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;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_matthias_cullman.thumbnail.png&quot; alt=&quot;jenkins matthias cullman.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_christopher_getschmann.thumbnail.png&quot; alt=&quot;jenkins christopher getschmann.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_emily_bertelson.thumbnail.png&quot; alt=&quot;jenkins emily bertelson.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-1&quot;&gt;Logo #1&lt;/a&gt;&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;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-2&quot;&gt;Logo #2&lt;/a&gt;&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;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-3&quot;&gt;Logo #3&lt;/a&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;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_tomas_ekeli.thumbnail.png&quot; alt=&quot;jenkins tomas ekeli.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_vimil_saju.thumbnail.png&quot; alt=&quot;jenkins vimil saju.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_akiko_takano.thumbnail.png&quot; alt=&quot;jenkins akiko takano.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-4&quot;&gt;Logo #4&lt;/a&gt;&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;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-5&quot;&gt;Logo #5&lt;/a&gt;&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;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-6&quot;&gt;Logo #6&lt;/a&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;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_jeremy_murray.thumbnail.png&quot; alt=&quot;jenkins jeremy murray.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_frontside_2.thumbnail.png&quot; alt=&quot;jenkins frontside 2.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_frontside_1.thumbnail.png&quot; alt=&quot;jenkins frontside 1.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-7&quot;&gt;Logo #7&lt;/a&gt;&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;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-8&quot;&gt;Logo #8&lt;/a&gt;&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;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-9&quot;&gt;Logo #9&lt;/a&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;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_adrian_moya.thumbnail.png&quot; alt=&quot;jenkins adrian moya.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://jenkins-ci.org/sites/default/files/images/jenkins_ben_minne.thumbnail.png&quot; alt=&quot;jenkins ben minne.thumbnail&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;/td&gt;
&lt;tr&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot;&gt;&lt;p class=&quot;tableblock&quot;&gt;&lt;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-10&quot;&gt;Logo #10&lt;/a&gt;&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;a href=&quot;https://jenkins-ci.org/content/jenkins-logo-entry-11&quot;&gt;Logo #11&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td class=&quot;tableblock halign-left valign-top&quot; /&gt;
&lt;/tr&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/td&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-vote&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-vote&quot; /&gt;The Vote&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If the iframe doesn’t properly load for you, you can open &lt;a href=&quot;https://spreadsheets.google.com/viewform?formkey=dE9GNlpNbVEwa0VPZHl1TkJCaUI1Z2c6MQ&amp;lt;span class=&quot; the=&quot;&quot; form=&quot;&quot; in=&quot;&quot; a=&quot;&quot; new=&quot;&quot; window=&quot;&quot;&gt;&lt;iframe src=&quot;https://spreadsheets.google.com/embeddedform?formkey=dE9GNlpNbVEwa0VPZHl1TkJCaUI1Z2c6MQ&quot; width=&quot;760&quot; height=&quot;734&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; /&gt;Loading...&lt;/a&gt;&quot; class=&quot;bare&quot;&amp;gt;https://spreadsheets.google.com/viewform?formkey=dE9GNlpNbVEwa0VPZHl1TkJCaUI1Z2c6MQ&lt;span class=&quot;the form in a new window&quot;&gt;&lt;iframe src=&quot;https://spreadsheets.google.com/embeddedform?formkey=dE9GNlpNbVEwa0VPZHl1TkJCaUI1Z2c6MQ&quot; width=&quot;760&quot; height=&quot;734&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; /&gt;Loading...&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/03/13/jenkins-hits-1-400/</id>
<title>Jenkins hits 1.400</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-03-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/03/13/jenkins-hits-1-400/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<summary>
Jenkins is now at 1.400 (as of last Monday, yes, I know. But better late than never&#8230;&#8203;). As with 1.300 and 1.200, this release doesn&#8217;t particularly signify any substantial major release, but nonetheless it is a milestone for those of us who are involved in the project — I think repeating something 400 times is something one can be proud of. It&#8217;s a bit like climbing a mountain. Left foot, right foot, left foot, right foot, &#8230;&#8203; and when you look up, voila!


In 2 years since 1.300, which was April 2009, we&#8217;ve added a lot of features. We now have...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jenkins-ci.org/&quot;&gt;Jenkins&lt;/a&gt; is now at 1.400 (as of last Monday, yes, I know. But better late than never…​). As with &lt;a href=&quot;https://weblogs.java.net/blog/2009/04/22/hudson-hits-1300?force=752&quot;&gt;1.300&lt;/a&gt; and &lt;a href=&quot;https://weblogs.java.net/blog/kohsuke/archive/2008/03/hudson_hits_120.html?force=824&quot;&gt;1.200&lt;/a&gt;, this release doesn’t particularly signify any substantial major release, but nonetheless it is a milestone for those of us who are involved in the project — I think repeating something 400 times is something one can be proud of. It’s a bit like climbing a mountain. Left foot, right foot, left foot, right foot, …​ and when you look up, voila!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 2 years since 1.300, which was April 2009, we’ve added a lot of features. We now have a CLI to manipulate the server, auto-installation of JDK/Ant/Maven to simplify cluster management, concurrent builds of the same job, community-contributed localizations to 20+ languages, boolean expression over the job/label assignment control, parallel initialization based on a dynamically built acyclic directed graph, console annotations to enrich the build output, far more extensible queue (that enabled a lot of plugins), Windows 7 / Vista support, improved controller/agent communication stability, Maven 3 support, and then all around performance improvements, in memory footprint, in startup time, and in page rendering speed.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And of course, we had to change the name of the project. That was a real distraction, but now that the divorce is over, things have been &lt;a href=&quot;https://bobbickel.blogspot.com/2011/03/jenkins-vs-hudson-time-to-upgrade.html&quot;&gt;moving well&lt;/a&gt; for Jenkins. I guess any organization (including any sizable OSS project) is really more than sum of all individuals. If you take a store of Target and replace all its workers by those of nearby Staples, it’ll probably not work out well. I think &lt;a href=&quot;https://jenkins-ci.org/why&quot;&gt;people understand that&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And on the positive side, I do think we came out stronger. We are now running &lt;a href=&quot;https://jenkins-ci.org/node/280&quot;&gt;governance meetings on IRC&lt;/a&gt;, we now have &lt;a href=&quot;https://jenkins-ci.org/content/jenkins&quot;&gt;somewhat more formal governance structure&lt;/a&gt;. The core development is actually accelerating with the help of &lt;a href=&quot;https://github.com/jenkinsci/jenkins/graphs/impact&quot;&gt;many new developers&lt;/a&gt;, such as Olivier Lamy, (scroll to the right), and &lt;a href=&quot;https://twitter.com/#!/jenkins_release&quot;&gt;plugin releases kept coming at amazing rate&lt;/a&gt; — we are now at 350+ plugins, more than doubled since 1.300.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking at future, we are working on a number of new initiatives in the community, too. For example, Arnaud Héritier is working on revisiting &lt;a href=&quot;https://issues.jenkins.io/&quot;&gt;our JIRA project structure&lt;/a&gt;, Andrew Bayer is running a contest for new logo, Tyler is in process of getting additional hardwares at OSUOSL for the project. I’m also doing a lot of things, but for example, I’m going to write a proposal to start a stable patch releases of Jenkins that only consists of backported important bug fixes, in addition to the current weekly release model. Several large users maintain private branches of Jenkins, and so I think it makes a lot of sense for those folks to align their efforts around this release line. I’m also thinking that we could launch a community acceptance testing (CAT) effort around this, much like &lt;a href=&quot;https://qa.netbeans.org/processes/cat/67/faqs.html&quot;&gt;NetBeans&lt;/a&gt; and &lt;a href=&quot;https://glassfish.java.net/quality/portal/&quot;&gt;GlassFish&lt;/a&gt; have done it. I think the first stable release line would branch off from 1.400, so if anything that’s another reason you should upgrade to 1.400.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I reflect on the project, I’m surprised at just how much work there is to be done, after so much that has been achieved. But I’m still excited at what we can do with this platform. I thank everyone for their continued patoronage of Jenkins, and I hope to see more of you in the mailing lists, in the chat rooms, and in the meet-up events. And here is &lt;a href=&quot;https://en.wikipedia.org/wiki/Buzz_Lightyear&quot;&gt;to infinity and beyond!&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(Cross-posted to &lt;a href=&quot;https://kohsuke.org/2011/03/13/jenkins-hits-1-400/&quot;&gt;Kohsuke’s blog&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;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/03/03/updated-usage-stats-available/</id>
<title>Updated Usage Stats Available!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-03-03T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/03/03/updated-usage-stats-available/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='meta'></category>
<category term='news'></category>
<category term='plugins'></category>
<category term='jenkinsci'></category>
<summary>
Updated usage statistics are now available at https://jenkins-ci.org/census This data has been scrubbed of distinguishing information as much as possible, filtered for installations we&#8217;ve seen at least twice a month with at least one job set up, and split up into monthly JSON files. Starting with August, we only have data on installations of version 1.368 or later - before that, reports go to the old Oracle-owned server, and we aren&#8217;t able to retrieve them. So that&#8217;s why you&#8217;ll see a fairly hefty drop in install count, etc from July to August.


I haven&#8217;t had a chance to do any analysis...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Updated usage statistics are now available at &lt;a href=&quot;https://jenkins-ci.org/census&quot; class=&quot;bare&quot;&gt;https://jenkins-ci.org/census&lt;/a&gt; This data has been scrubbed of distinguishing information as much as possible, filtered for installations we’ve seen at least twice a month with at least one job set up, and split up into monthly JSON files. Starting with August, we only have data on installations of version 1.368 or later - before that, reports go to the old Oracle-owned server, and we aren’t able to retrieve them. So that’s why you’ll see a fairly hefty drop in install count, etc from July to August.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I haven’t had a chance to do any analysis to speak of on the data. I intend to get the &lt;a href=&quot;https://bit.ly/aC6wIo&quot;&gt;plugin usage spreadsheet&lt;/a&gt; updated n the next few days, but I wanted to make this data available to you all ASAP. If you come up with any interesting analysis or use of the data, please let us know!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/02/14/upcoming-jenkins-events-in-tokyo/</id>
<title>Upcoming Jenkins events in Tokyo</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-02-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/02/14/upcoming-jenkins-events-in-tokyo/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
I&#8217;ll be visiting Tokyo again for the week of 2/21 for a number of events.


Tokyo Jenkins User Meetup


The Japanese Jenkins user community may not be as visible from outside but very strong. This is the 2nd meet up in Tokyo, and once again we maxed out the 80 people room capacity in just a few days (but you can still RSVP for the social event after the meetup.) This meetup is focused on Java &amp; Jenkins, so we have a number of speakers lined up to discuss hwo they use Jenkins in their Java projects. This will be the first...
</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://farm4.static.flickr.com/3280/2964930888_6a91b9ddda_m.jpg&quot; alt=&quot;image&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll be visiting Tokyo again for the week of 2/21 for a number of events.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;tokyo-jenkins-user-meetup&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#tokyo-jenkins-user-meetup&quot; /&gt;Tokyo Jenkins User Meetup&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Japanese Jenkins user community may not be as visible from outside but very strong. This is the 2nd meet up in Tokyo, and once again we maxed out the 80 people room capacity in just a few days (but you can &lt;a href=&quot;https://kokucheese.com/event/index/6710/&quot;&gt;still RSVP for the social event&lt;/a&gt; after the meetup.) This meetup is focused on Java &amp;amp; Jenkins, so we have a number of speakers lined up to discuss hwo they use Jenkins in their Java projects. This will be the first user meetup event after the name has changed to Jenkins.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;cloudbees-jenkins-training-in-tokyo&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cloudbees-jenkins-training-in-tokyo&quot; /&gt;CloudBees Jenkins training in Tokyo&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll deliver this one-day training course, all about Jenkins from the setup to continuous deployment to code analysis. If you are interested, you can find &lt;a href=&quot;https://www.cloudbees.com/training_ja.cb&quot;&gt;more details about this&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;japan-grailsgroovy-user-group-jggug&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#japan-grailsgroovy-user-group-jggug&quot; /&gt;Japan Grails/Groovy User Group (JGGUG)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jenkins internally use Groovy a lot in many places (as well as some of its peripheral tools depend on Groovy.) So I’ll be speaking in the JGGUG meetup event, on behalf of the Jenkins project, and highlight those usages and how much we all love Groovy. Yes, I do.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aside from these public events, I have a few visits planned to various companies. If you are interested in having me over and look at your Jenkins, or want to discuss something, please let me know at kk at kohsuke dot org.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/02/05/first-governance-meeting-recap/</id>
<title>First Governance Meeting Recap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-02-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/02/05/first-governance-meeting-recap/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<summary>
As mentioned on Friday the Jenkins project held it&#8217;s first meeting on the IRC channel at the request of the interim board. In the interest of transparency, we recorded meeting minutes and tried to involve as many folks as possible.


Topics Covered



Proposal/Discussion of Jenkins project governance structure


What to do about the logo


Registering the Jenkins trademark


Moving Jenkins under an umbrella organization


What shall we do with a new CLA?


Logistics for the next project meeting




If you&#8217;re interested, you can read through the full logs or just look over the high-level meeting minutes.


This first meeting went a bit long due to the massive amount of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As mentioned &lt;a href=&quot;https://www.jenkins.io/content/governance-meeting-today&quot;&gt;on Friday&lt;/a&gt; the Jenkins project held it’s first meeting on the &lt;a href=&quot;https://www.jenkins.io/content/chat&quot;&gt;IRC channel&lt;/a&gt; at the request of the interim board. In the interest of transparency, we recorded meeting minutes and tried to involve as many folks as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;topics-covered&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#topics-covered&quot; /&gt;Topics Covered&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proposal/Discussion of Jenkins project governance structure&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What to do about the logo&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Registering the Jenkins trademark&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Moving Jenkins under an umbrella organization&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What shall we do with a new CLA?&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Logistics for the next project meeting&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;If you’re interested, you can read through the &lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins/2011/jenkins.2011-02-04-23.02.log.html&quot;&gt;full logs&lt;/a&gt; or just look over the high-level &lt;a href=&quot;https://meetings.jenkins-ci.org/jenkins/2011/jenkins.2011-02-04-23.02.html&quot;&gt;meeting minutes&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This first meeting went a bit long due to the massive amount of items needing to be discussed, so the project has scheduled another meeting for &lt;strong&gt;Wednesday Feb 9, 11am PST (19:00 UTC)&lt;/strong&gt;; mark your calendars!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to everybody who participated, we’ll see you again next time.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/02/04/the-first-24-hours-in-downloads/</id>
<title>The first 24 hours in downloads</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-02-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/02/04/the-first-24-hours-in-downloads/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='just for fun'></category>
<summary>
As I had mentioned in a previous post back when Jenkins was called something else, who can remember what anymore, I spent a lot of time working on a mirroring network. With our departure from any and all Oracle infrastructure, this mirroring network has now become our sole distribution mechanism for pushing out all releases and all plugins, in short, lots and lots of bits.


Just how much data are we now distributing through the Jenkins mirror network?


Over 52GB in 24 hours


Here&#8217;s the following in terms of a loose breakdown of the number of files served over the past day:




788 .war


447...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I had mentioned in &lt;a href=&quot;https://jenkins-ci.org/content/installing-plugins-has-always-been-easy-now-its-fast-too&quot;&gt;a previous post&lt;/a&gt; back when Jenkins was called something else, who can remember what anymore, I spent a lot of time working on a mirroring network. With our departure from any and all Oracle infrastructure, this mirroring network has now become our sole distribution mechanism for pushing out &lt;strong&gt;all&lt;/strong&gt; releases and &lt;strong&gt;all&lt;/strong&gt; plugins, in short, &lt;strong&gt;lots and lots of bits&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just how much data are we now distributing through the Jenkins mirror network?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;big&gt;Over 52GB in 24 hours&lt;/big&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s the following in terms of a loose breakdown of the number of files served over the past day:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;788 &lt;code&gt;.war&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;447 &lt;code&gt;.deb&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;290 &lt;code&gt;.rpm&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1759 &lt;code&gt;.hpi&lt;/code&gt; (plugins)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re off to a great start! I’d like to extend my thanks again to the &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSUOSL&lt;/a&gt; and &lt;a href=&quot;https://mirrors.xmission.com&quot;&gt;XMission&lt;/a&gt; for their help getting the Jenkins mirrors functional as soon as possible&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/02/04/governance-meeting-today/</id>
<title>Governance Meeting Today</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-02-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/02/04/governance-meeting-today/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
Amongst all the work this week with setting up project infrastructure, the first release of Jenkins and a flood of developer activity on GitHub, the interim governance board has decided to hold periodic virtual meetings.


The first meeting will be held today at 3pm PST (23:00 UTC) in the #jenkins channel on IRC (more details here).


In Kohsuke&#8217;s post to the mailing list, he further explained the goals of such meetings:




We can use it to report/discuss various issues of the project (not bugs in code, but more project level stuff.) I also plan to report the infrastructure work that&#8217;s done thus far.


We&#8217;d...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Amongst all the work this week with setting up project infrastructure, &lt;a href=&quot;http://mirrors.jenkins-ci.org/war/1.396/&quot;&gt;the first release of Jenkins&lt;/a&gt; and a &lt;em&gt;flood&lt;/em&gt; of developer activity &lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;on GitHub&lt;/a&gt;, the interim governance board has decided to hold periodic virtual meetings.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first meeting will be held &lt;strong&gt;today&lt;/strong&gt; at 3pm PST (23:00 UTC) in the &lt;code&gt;#jenkins&lt;/code&gt; channel on IRC (&lt;a href=&quot;https://jenkins-ci.org/content/chat&quot;&gt;more details here&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In &lt;a href=&quot;https://twitter.com/kohsukekawa/&quot;&gt;Kohsuke’s&lt;/a&gt; post to the mailing list, he further explained the goals of such meetings:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We can use it to report/discuss various issues of the project (not bugs in code, but more project level stuff.) I also plan to report the infrastructure work that’s done thus far.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’d like to hear from you, and the point is to engage the broader community, so please join us.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is a new thing, so it’s not like we’ve figured this all out, but let’s see how it goes.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you don’t have an IRC client, you can use the Freenode &lt;a href=&quot;https://webchat.freenode.net/&quot;&gt;webchat client&lt;/a&gt; to join in, hope to see you there!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/01/29/jenkins/</id>
<title>Jenkins!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-01-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/01/29/jenkins/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='mailing list'></category>
<category term='meta'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<summary>
(This was sent as an email to the Hudson dev and users mailing lists after voting concluded, but I thought it&#8217;d be good to post it here as well.)


The vote is closed, and the results are in. More than half of the total votes were from ineligible voters, but the result would have been the same either way. The final result of all eligible votes is as follows: 214 votes to rename, and 14 for the status quo. You can see the individual votes hudson-jenkins-vote.
So what does this mean now? Well, it means Jenkins lives. We&#8217;ve registered jenkins-ci.org, though it&#8217;s...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(This was sent as an email to the Hudson dev and users mailing lists after voting concluded, but I thought it’d be good to post it here as well.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The vote is closed, and the results are in. More than half of the total votes were from ineligible voters, but the result would have been the same either way. The final result of all eligible votes is as follows: 214 votes to rename, and 14 for the status quo. You can see the individual votes &lt;a href=&quot;https://groups.google.com/group/hudson-jenkins-vote&quot;&gt;hudson-jenkins-vote&lt;/a&gt;.
So what does this mean now? Well, it means Jenkins lives. We’ve registered jenkins-ci.org, though it’s empty at the moment. In the coming days, we will be renaming the existing Google Groups to jenkins-*@googlegroups.com, renaming the Twitter account from @hudsonci to &lt;a href=&quot;https://twitter.com/jenkinsci&quot;&gt;@jenkinsci&lt;/a&gt;, and renaming our organization at Github from hudson to jenkinsci. I wanted to make sure everyone had notice ahead of time that this was happening, so that no one gets surprised by changes to their incoming mail, etc. As said before, the initial, interim governance board will consist of me, Kohsuke and, if he and Oracle are willing, Winston. If Winston is unwilling or unable to continue in that role with Jenkins, we will select a replacement interim member. The interim board will work on the details of a more permanent governance process going forward. Discussions on the infrastructure changes (including things like the Maven groupId/artifactIds, etc) will be in public, on these lists. We’re working to get the JIRA and wiki contents migrated over to the Jenkins site, and hope to work with Oracle to get that done in the next couple days.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Putting aside logistics, I want to personally thank everyone for voting, and especially thank everyone who voted for renaming for supporting the Jenkins project and its future. Jenkins is not Oracle’s project, nor CloudBee’s project, nor my project, nor Kohsuke’s project - it’s the community’s project, and it’s going to thrive.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/01/11/hudsons-future/</id>
<title>Hudson&#39;s future</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-01-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/01/11/hudsons-future/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='meta'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<summary>
First, my apologies for the lack of updates on the Hudson/Oracle situation for
the last few weeks. While talks have been ongoing, the holidays have slowed
things down, and we didn&#8217;t want to send out information that would later turn
out not to be true. We&#8217;ve been waiting for the talks to reach a resolution -
and I believe they now have.


Since the java.net migration problems, Oracle and representatives from the
Hudson community have been involved in talks on the future of the project in a
number of areas. The Hudson representatives have been myself, Kohsuke
Kawaguchi, and Sacha Labourey  (CEO of CloudBees and Kohsuke&#8217;s boss),...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, my apologies for the lack of updates on the &lt;a href=&quot;https://www.jenkins.io/blog/2010/11/30/whos-driving-this-thing/&quot;&gt;Hudson/Oracle situation&lt;/a&gt; for
the last few weeks. While talks have been ongoing, the holidays have slowed
things down, and we didn’t want to send out information that would later turn
out not to be true. We’ve been waiting for the talks to reach a resolution -
and I believe they now have.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since the &lt;a href=&quot;https://www.java.net&quot;&gt;java.net&lt;/a&gt; migration problems, Oracle and representatives from the
Hudson community have been involved in talks on the future of the project in a
number of areas. The Hudson representatives have been &lt;a href=&quot;https://twitter.com/abayer&quot;&gt;myself&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke
Kawaguchi&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/SachaLabourey&quot;&gt;Sacha Labourey&lt;/a&gt;  (CEO of CloudBees and Kohsuke’s boss), who was
brought in to help provide experience with discussions on a corporate/executive
level which neither Kohsuke nor I have, with Alan Harder and &lt;a href=&quot;https://twitter.com/agentdero&quot;&gt;R. Tyler Croy&lt;/a&gt;
advising on the side.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;These talks have in many ways been fruitful - we came to working agreements
with Oracle on the project infrastructure (such as mailing lists and SCM
repository location), code review policy for Hudson core, and perhaps most
significantly, a governance structure for the project going forward. Some
issues are not yet entirely resolved, such as questions on restrictions on
third party dependency licenses. But one issue, which we feel is the most
significant issue of all, one for which we now believe no resolution is
possible: the rights to the name &lt;strong&gt;Hudson&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Oracle has told us that they have trademark applications filed in both the EU
and US for Hudson, based on Hudson’s creation by Kohsuke while working at Sun.
The problem is that this trademark ownership gives Oracle the ability to revoke
the Hudson project’s right to call itself Hudson at any time, and while Oracle
has made an attempt to offer some guarantees (most notably, that binary
releases of Hudson, once they’ve been released with the name Hudson attached,
will always retain the right to the name), they are not offering any binding
guarantee that the Hudson project will be able to retain its use of the name in
perpetuity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Therefore, to continue using the name Hudson means ceding some of the project’s
independence to Oracle - if the project and its governance board opted to go in
a direction Oracle disapproved of, Oracle would be able to take away the naming
rights. Or, in a less dramatic scenario, Oracle could insist on certain changes
to the code, infrastructure decisions, process, etc, regardless of opposition
from the Hudson development community, in order to retain the rights to the
name.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In short, we’d be living under a sword of &lt;a href=&quot;https://secure.wikimedia.org/wikipedia/en/wiki/Damocles&quot;&gt;Damocles&lt;/a&gt;, regardless of the goodwill
of the individuals we’ve been negotiating with at Oracle - Hudson as a project
would be beholden to Oracle’s whims for its continued use of its own name, and
we believe that’s not viable.
As I see it, the only viable option facing the project now is to rename it, in
order to free it from the burden of Oracle’s ownership of its name. This is not
a first choice, not by a long shot, but I don’t see any other choice available
to us that would preserve the integrity of the project going forward. Oracle
will be presenting their proposal for the project continuing under their
umbrella - I encourage you to read it when it becomes available and weigh it
accordingly. I’ll just focus on what Kohsuke, other prominent Hudson community
members and I have endorsed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-proposal&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-proposal&quot; /&gt;The Proposal&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First, we rename the project - the choice for a new name is &lt;strong&gt;Jenkins&lt;/strong&gt;, which we
think evokes the same sort of English butler feel as Hudson. We’ve already
registered domains, Twitter users, etc for the new name, and have done our best
to verify that there are no existing trademarks which would conflict with it.
Kohsuke will be registering the trademark for Jenkins in his name, with the
intent of transferring ownership of the trademark to the umbrella of the
&lt;a href=&quot;https://www.sfconservancy.org/&quot;&gt;Software Freedom Conservancy&lt;/a&gt; once the Jenkins project has been admitted to it
(which, I should add, is very much our plan, hopefully in their next round of
new projects in a few months - we’ve already had preliminary contacts with
SFC). We still invite Oracle to remain involved with the project, on equal
terms with all other contributors, and hope they’ll take us up on this
invitation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Second, out of respect for Oracle’s trademark claim on Hudson, we will move our
infrastructure off of Oracle-owned and hosted servers, and we will rename
existing independent components of the infrastructure to no longer use &quot;Hudson&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;i.e., mailing lists, Github repos, etc. This would be a gradual process,
obviously.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Third, we will put in place an interim governance board for the project,
consisting of three members - myself, Kohsuke and, if Oracle elects to remain
involved, Winston Prakash, the Oracle engineer working on Hudson. The interim
board members will serve for the next 3-6 months, until the governance
structure can be nailed down securely enough to hold elections for the board
members.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Obviously, such a move could not be undertaken without the agreement and
support of the Hudson community. We believe this proposal is the best choice
for the project in the situation it’s currently in, but we aren’t closing off
discussion, questions, etc, and we encourage your feedback and comments. If
there’s anything you need clarified, please ask and we’ll do our best to
answer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Once Oracle’s proposal is available later this week (hopefully Wednesday,
possibly Thursday, from what I’ve been told), which I strongly advise you all to
read and consider, we’ll be putting up a poll to determine the position of the
community. Once that vote is done, assuming the consensus is to rename, we’ll
put the mechanisms in motion and switch over as fast we can.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There may be some confusion as to whether we’re proposing to fork Hudson, or
rename the existing project. I firmly believe we are proposing the latter - for
me, the project’s key component is Kohsuke himself. If the community decides to
support renaming the project to Jenkins, and Oracle chooses to continue
development themselves under the name Hudson, they are, obviously, entirely
welcome to do so. But with Kohsuke working on Jenkins, that’s the true home and
the future of the project for me, regardless of the name.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2011/01/08/installing-plugins-has-always-been-easy-now-its-fast-too/</id>
<title>Installing plugins has always been easy, now it&#39;s fast too!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2011-01-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2011/01/08/installing-plugins-has-always-been-easy-now-its-fast-too/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='news'></category>
<summary>
As one of the "men behind the scenes" of the Hudson project, a lot of my contributions tend to be in writing articles or handling infrastructure, anything to ensure folks like Kohsuke can continue to make Hudson great without being distracted by inane system administration tasks. This past week, one of my long-running infrastructure projects has finally "gone live," making downloads of plugins and packages faster than ever!


Some number of months ago I became frustrated with the download speeds reported by our international users, while the majority of Hudson&#8217;s infrastructure is all colocated inside of the United States, there is...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As one of the &quot;men behind the scenes&quot; of the Hudson project, a lot of my contributions tend to be in writing articles or handling infrastructure, anything to ensure folks like &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; can continue to make Hudson great without being distracted by inane system administration tasks. This past week, one of my long-running infrastructure projects has finally &quot;gone live,&quot; making downloads of plugins and packages faster than ever!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some number of months ago I became frustrated with the download speeds reported by our international users, while the majority of Hudson’s infrastructure is all colocated inside of the United States, there is a &lt;strong&gt;huge&lt;/strong&gt; number of Hudson users and developers who are both in Europe and Asia.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After discussing things with some of the folks that run &lt;a href=&quot;https://download.opensuse.org&quot;&gt;download.opensuse.org&lt;/a&gt;, a &lt;a href=&quot;https://mirrorbrain.org&quot;&gt;MirrorBrain&lt;/a&gt; powered redirector, I set out to build something similar. A mirroring network which could be easily managed and help direct users&#39; downloads to the geographically closest and fastest mirror available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;where-are-we-mirrored&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#where-are-we-mirrored&quot; /&gt;Where are we mirrored?&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently we have mirrors in a few locations within the United States, and one overseas:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Southwest U.S. (Utah) - &lt;em&gt;Thanks to &lt;a href=&quot;https://www.xmission.com&quot;&gt;XMission&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Midwest U.S. (Chicago) - &lt;em&gt;Thanks to the &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSUOSL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Northeast U.S. (New York City) - &lt;em&gt;Thanks to the &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSUOSL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Germany - &lt;em&gt;Thanks to &lt;a href=&quot;https://www.aragost.com/&quot;&gt;aragost Trifork ag&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;using-the-mirrors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#using-the-mirrors&quot; /&gt;Using the mirrors&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve updated or installed plugins from within Hudson lately, guess what! You’re already using mirrors! In fact, since we flipped the switch on January 7th, over &lt;strong&gt;800&lt;/strong&gt; plugins and &lt;strong&gt;600&lt;/strong&gt; &lt;code&gt;hudson.war&lt;/code&gt; updates have been downloaded from the mirroring network!
If you’d like to download directly from the mirrors, you can browse on over to &lt;a href=&quot;https://mirrors.hudson-labs.org&quot;&gt;mirrors.hudson-labs.org&lt;/a&gt;, which will redirect your request for specific files to the appropriate mirror based on your IP address. It’s just that easy!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We are currently working with more providers to add additional mirrors, hopefully we’ll have an Asian mirror online within the next two weeks and if we’re lucky, we’ll find some more European mirrors too.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I would like to thank the &lt;strong&gt;immensely&lt;/strong&gt; helpful and supportive engineers over at the &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSUOSL&lt;/a&gt; for offering gratis tech support, suggestions, and bandwidth to serve as our &lt;em&gt;primary&lt;/em&gt; mirror.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/12/05/weekend-update-with-andrew-bayer/</id>
<title>Weekend Update with Andrew Bayer</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-12-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/12/05/weekend-update-with-andrew-bayer/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='meta'></category>
<category term='news'></category>
<category term='jenkinsci'></category>
<summary>
[Ed. note Andrew was not involved in selecting this post&#8217;s title - rtyler]


I wanted to give the Hudson community a quick update on the current status of the issues Tyler has discussed in the earlier posts here.


Friday afternoon, Kohsuke, CloudBees CEO Sacha Labourey and myself jumped on a conference call with Hudson contributor/Oracle employee Winston Prakash, Oracle manager Denis Tyrell and of course Ted Farrell.


We discussed a wide range of issues relating to the Hudson project, such as governance, the rights to the name Hudson, and the infrastructure hosting the Hudson project. While we didn&#8217;t agree on resolutions to all...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;[&lt;strong&gt;Ed. note&lt;/strong&gt; &lt;em&gt;Andrew was not involved in selecting this post’s title - rtyler&lt;/em&gt;]&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I wanted to give the Hudson community a quick update on the current status of the issues Tyler has &lt;a href=&quot;https://hudson-labs.org/content/whos-driving-thing&quot;&gt;discussed in the earlier posts&lt;/a&gt; here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Friday afternoon, &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt;, &lt;a href=&quot;https://www.cloudbees.com&quot;&gt;CloudBees&lt;/a&gt; CEO &lt;a href=&quot;https://twitter.com/SachaLabourey&quot;&gt;Sacha Labourey&lt;/a&gt; and myself jumped on a conference call with Hudson contributor/Oracle employee &lt;a href=&quot;https://twitter.com/wjprakash&quot;&gt;Winston Prakash&lt;/a&gt;, Oracle manager Denis Tyrell and of course Ted Farrell.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We discussed a wide range of issues relating to the Hudson project, such as governance, the rights to the name Hudson, and the infrastructure hosting the Hudson project. While we didn’t agree on resolutions to all issues, I feel real progress was made towards a framework that provides what the Hudson community needs while also preventing the sort of conflicts we’ve seen the last week or two.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;More work has to be done - we’ll be talking again next week, and I’m hoping we can reach agreement on the contentious issues by the end of the week.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks for your patience.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/12/01/a-brief-update/</id>
<title>A brief update</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-12-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/12/01/a-brief-update/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='jenkinsci'></category>
<summary>
Let me be the first to say thank you all for your overwhelming support for
Hudson and the work we&#8217;ve been doing. The Hudson community in general has
always been incredibly supportive and friendly, but the outpouring of support from
friends and users who&#8217;ve not previously spoken up has been awe inspiring.


That said, let&#8217;s get down to business. As I covered
yesterday there is some
bubbling frustration within the developer community regarding some project
infrastructure decisions and Oracle&#8217;s reactions to them. If you can&#8217;t spare the
time to read that novel of a blog post, the extremely shortened version is: devs want to
move codebase to GitHub, Oracle...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let me be the first to say &lt;strong&gt;thank you all&lt;/strong&gt; for your &lt;a href=&quot;https://twitter.com/#search?q=http%3A%2F%2Fwww.hudson-labs.org%2Fcontent%2Fwhos-driving-thing%2F&quot;&gt;overwhelming support&lt;/a&gt; for
Hudson and the work we’ve been doing. The Hudson community in general has
always been incredibly supportive and friendly, but the outpouring of support from
friends and users who’ve not previously spoken up has been awe inspiring.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;That said, let’s get down to business. As &lt;a href=&quot;https://www.jenkins.io/content/whos-driving-thing&quot;&gt;I covered
yesterday&lt;/a&gt; there is some
bubbling frustration within the developer community regarding some project
infrastructure decisions and Oracle’s reactions to them. If you can’t spare the
time to read that novel of a blog post, the extremely shortened version is: devs want to
move codebase to GitHub, Oracle disagrees and claims to have final say (hijinks
ensue).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While there is still a lot unresolved, several of the core contributors are
debating and weighing our options for moving forward in a way that best
suits Hudson both as a project and community. In the next couple days, Kohsuke
or Andrew will be proposing a course of action for the community after some of
the options have been fully vetted. Please bear in mind that Hudson is a &lt;strong&gt;very&lt;/strong&gt; big project with some fairly unique needs. We have &lt;em&gt;hundreds&lt;/em&gt; of contributors committing either to core or the plugins, we release core once a week with plugin releases occurring to the tune of 20-40 updates a week. We’ve been pinging folks who work with various foundations and major open source projects to make sure we’re covering all our bases to make sure distractions like this don’t come up again for the foreseeable future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Due to issues with MySQL, Java, OpenOffice/LibreOffice, there is clearly a lot of anti-Oracle emotion out there right now, but I want
to make sure that it’s clear that this &lt;em&gt;is not&lt;/em&gt; about &quot;Us versus Oracle.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our goal isn’t to &quot;stick it to the man,&quot; that doesn’t help make Hudson any better.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our goal is to foster the kind of community that we all want to
participate in, and to build and improve the best continuous integration
server available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Stay tuned :)
---&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/11/30/whos-driving-this-thing/</id>
<title>Who&#39;s driving this thing?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-11-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/11/30/whos-driving-this-thing/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='jenkinsci'></category>
<summary>
There&#8217;s been a lot of discussion on the new mailing lists as of late regarding some of the infrastructure and ownership of the Hudson project. In case you haven&#8217;t been following along at home, I&#8217;ll try to catch you up as impartially as possible.


The Facts




2009.06.02: After substantial problems with Java.net infrastructure, the
dev community discusses new infrastructure
options,
including SourceForge, Google Code, Kenai, Berlios, GitHub, etc. Instead of
moving the entire project, some key components such as the
issues.hudson-ci.org are moved off of
Java.net. Discussions about moving source code off of Java.net and onto other hosts like
GitHub come up almost every four months on the mailing...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/health-60to79.gif&quot; alt=&quot;health 60to79&quot; /&gt;There’s been a lot of discussion on the &lt;a href=&quot;https://hudson-labs.org/content/new-hudson-mailing-lists&quot;&gt;new mailing lists&lt;/a&gt; as of late regarding some of the infrastructure and ownership of the Hudson project. In case you haven’t been following along at home, I’ll try to catch you up as impartially as possible.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-facts&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-facts&quot; /&gt;The Facts&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;2009.06.02&lt;/strong&gt;: After substantial problems with Java.net infrastructure, the
&lt;a href=&quot;https://hudson.361315.n4.nabble.com/On-the-future-of-Hudson-hosting-and-infrastructure-td393278.html&quot;&gt;dev community discusses new infrastructure
options&lt;/a&gt;,
including SourceForge, Google Code, Kenai, Berlios, GitHub, etc. Instead of
moving the entire project, some key components such as the
&lt;a href=&quot;https://issues.hudson-ci.org&quot;&gt;issues.hudson-ci.org&lt;/a&gt; are moved off of
Java.net. Discussions about moving source code off of Java.net and onto other hosts like
GitHub come up almost every four months on the mailing lists, typically
coinciding with serious Java.net downtime or reliability issues..&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2010.11.01&lt;/strong&gt;: A discussion occurs on the developers mailing list about
adding &lt;a href=&quot;https://twitter.com/wjprakash&quot;&gt;Winston Prakash&lt;/a&gt;, the Oracle engineer re-assigned to replace &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; (Hudson
founder/lead developer), as a co-owner to the Java.net project. Winston
mentions that his question was driven by Oracle management who felt he should
&quot;co-own the project.&quot; After a round of discussion, it’s decided by the devs
list that it’s acceptable and grants Winston co-ownership of the project as a
sign of good faith from the community towards Oracle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2010.11.17&lt;/strong&gt;: &lt;a href=&quot;https://twitter.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt;, core contributor
and maintainer of numerous plugins emails the users and devs list with a
proposal to move the mailing lists off of Java.net which has had notorious
reliability issues within the Java ecosystem and was scheduled for a series of
downtimes and migrations over the coming weeks. Google Groups is selected as the
most reasonable by the community.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2010.11.19&lt;/strong&gt;: Hudson project is lumped into the same Java.net migration bucket as Glassfish. Emails are sent to project owners, the users and the developers list. The mail to users and developers never arrives due to the sender not being subscribed. Both project owners (Kohsuke, Winston) miss the message, leaving the Hudson community in the dark regarding the pending migration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2010.11.22&lt;/strong&gt;: Shortly after midnight, Jacob Robertson reports that his
SVN credentials no longer work, Kohsuke informs the developers list that the project is
locked due to the migration, SVN is inaccessible and mailing lists fail shortly after that. &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/health-40to59.gif&quot; alt=&quot;health 40to59&quot; /&gt;The Hudson Java.net project
begins its migration from the legacy infrastructure to the newer
Java.net infrastructure (formerly known as &quot;Kenai&quot;). A group of core Hudson
community members accelerate the move to Google Groups, pushing out
announcements via &lt;a href=&quot;https://hudson-labs.org/content/new-hudson-mailing-lists&quot;&gt;this
blog&lt;/a&gt; and
&lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;twitter&lt;/a&gt; hoping to keep as many members in the
loop as possible.&lt;/span&gt;
&lt;/p&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2010.11.23&lt;/strong&gt;: Frustrated by the locking down of Hudson’s source code,
which sees between 3-8 commits to &quot;core&quot; a day, not counting the 300+
plugins, Kohsuke &lt;a href=&quot;https://groups.google.com/group/hudson-dev/browse_thread/thread/8d3cf0ca1240280a&quot;&gt;proposes moving to
GitHub&lt;/a&gt;
on the new developers mailing list. The general consensus amongst the plugin
and core developers was to go forward with moving to GitHub, no major
objections were raised by the developer community.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2010.11.27&lt;/strong&gt;: After Thanksgiving, Andrew Bayer submits the &quot;&lt;a href=&quot;https://groups.google.com/group/hudson-dev/browse_thread/thread/c935a4740af0b920&quot;&gt;formal
proposal&lt;/a&gt;&quot;
for migrating over to GitHub, Sets a deadline of the following tuesday
(2010.11.30) for raising any major objections before &quot;flipping the switch.&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Monday morning prior to the planned switchover to GitHub, Oracle Senior VP
of Tools and Middleware &lt;a href=&quot;https://www.oracle.com/us/corporate/press/Spokespeople/016474&quot;&gt;Ted
Farrell&lt;/a&gt; sent &lt;a href=&quot;https://groups.google.com/group/hudson-users/msg/cf0d72a7d97f2438&quot;&gt;a
message to the users list&lt;/a&gt; expressing concerns he had regarding the migration of
the Hudson codebase from Java.net to GitHub:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Oracle’s goal is to grow the community and make hudson stronger. You all might not be aware of this, but the actual hudson user base is very large. Much bigger than what you see on the mailing lists or in the forums. The unfortunate part of that is how many of these users do not contribute to the core, and do not participate in these discussions. They want to do that, but don’t feel like they can be heard. We want them to be heard. We need to make the hudson community a place that will welcome all the hudson users and encourage its growth and longevity. We will be announcing some changes in the upcoming weeks that we believe will foster that.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For now, however, we are going to stay on the java.net
infrastructure.  We believe it is important for hudson to stay
connected with the rest of the java community, as well as take
advantage of some of the cool changes we will have coming to
java.net.  Moving to GIT can be done while staying on java.net.  It is
not a requirement to move to github.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because it is open source, we can’t stop anybody from forking it.  We
do however own the trademark to the name so you cannot use the name
outside of the core community.  We acquired that as part of Sun.  We
hope that everyone working on hudson today will do as they claim to
want, and work with us to make hudson stronger.&amp;lt;/em&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;(Ted’s message was rather long, you can read the &lt;a href=&quot;https://groups.google.com/group/hudson-users/msg/cf0d72a7d97f2438&quot;&gt;whole
post here&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As one might expect, Ted’s response to the thread was received with
mixed responses ranging from general confusion to obvious frustration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Long time contributor to Hudson’s Git plugin, &lt;a href=&quot;https://github.com/magnayn&quot;&gt;Nigel Magnay&lt;/a&gt; tried to clarify the benefits of migrating to GitHub instead of using Git on the &quot;new&quot; Java.net as succinctly as possible:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Just having git support != git support on github. They work full time on providing the best community development tools; I doubt kenai could even catch up, let alone surpass what they’re doing.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;…​&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m confused.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What things are you saying you will not let the Hudson developer community
do?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I.E: Are you saying that, as the holders of the Hudson &#39;name&#39;, you are
prohibiting the developer community from choosing (for ourselves) to migrate
the infrastructure (bug tracking / wiki)? The repositories ?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So far the response from the developers has been pretty strongly in favour
of the migration to google groups for mail, to github for code repositories
and collaboration, and to a self-hosted site for bug tracking and
information.&amp;lt;/em&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/health-20to39.gif&quot; alt=&quot;health 20to39&quot; /&gt;
Ted’s response to Nigel contained one of the most important nugget of
information for the whole discussion nestled in the middle of &lt;a href=&quot;https://groups.google.com/group/hudson-users/msg/5540655e05ef2982&quot;&gt;the message&lt;/a&gt;:&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Nigel, what I am saying is that I believe the _final&lt;/em&gt; decision of what to do w.r.t. infrastructure belongs to Oracle and that decision should be made according to the will of the community as it makes sense_&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;the-part-where-i-editorialize&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-part-where-i-editorialize&quot; /&gt;The part where I editorialize&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I readily admit, there is a lot of information to take in here, for clarification there are two distinct &quot;communities&quot; involved in Hudson:&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;developers&lt;/strong&gt;: the &lt;em&gt;hundreds&lt;/em&gt; of developers actively communicating on the
&lt;a href=&quot;https://groups.google.com/group/hudson-dev&quot;&gt;developers list&lt;/a&gt; and
contributing to the 300+ plugins&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;users&lt;/strong&gt;: tens of thousands of individuals and companies using Hudson
either as a straight &lt;code&gt;.war&lt;/code&gt; file, or using the native packages provided by
the community&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The fundamental issue here is that the &lt;strong&gt;developers&lt;/strong&gt; want to make a change in
how &lt;em&gt;they&lt;/em&gt; contribute to Hudson, and have made their voices heard to that end.
From the users&#39; perspective, such a change would have literally &lt;strong&gt;zero&lt;/strong&gt; impact
on them, which makes Oracle’s conflation of the two sides of Hudson
particularly frustrating.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Part of the impasse between Oracle management and the developer community lies
in an inherent meritocracy in any large open source project, whether it be the
Linux kernel, the Python language and runtime, or the PostgreSQL database
server, those that contribute carry more weight within the community
&lt;strong&gt;because&lt;/strong&gt; they are actively pushing things forward. On top of that, Oracle
continues to cite a &quot;larger community&quot; that’s apparently larger than those
active committing to Hudson on a daily or weekly basis, without naming names or
citing specific contributions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ted, and in turn, Oracle’s approach to the Hudson community seems to stem from
a systematic misunderstanding of how most (if not all) major open source
projects operate. Mentioning closed-door meetings between Sonatype and Oracle
regarding &quot;how to make Hudson better&quot; do nothing to aid many developers&#39;
concerns about Oracle’s commitment to Hudson as an open source project or a
community.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my humble opinion, we are being told one thing while Oracle’s actions speak
to another. Insisting that Hudson development remain on Java.net, after the
development community committed to GitHub, contradicts the words promising to
work with the Hudson community and to help facilitate its growth. Asserting
that Oracle isn’t trying to exert unwelcome control over the project, while
doing exactly that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Personally, I do want Oracle to continue to be involved, along with CloudBees,
Sonatype and many other companies that contribute to the ever-growing Hudson
ecosystem. The involvement of a plethora of different companies only helps
emphasize the importance of Hudson to the developer community and underline the
value of Hudson as a community owned and operated project.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;December will be an interesting month, stay tuned.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&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/2010/11/23/new-hudson-mailing-lists/</id>
<title>New Hudson Mailing Lists!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-11-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/11/23/new-hudson-mailing-lists/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='mailing list'></category>
<category term='jenkinsci'></category>
<summary>
As Kohsuke mentioned in this post, the Java.net migration has caught just about everybody off-guard in the Hudson community.


The tools we use hosted by Java.net are essentially locked from us until further notice (no ETA on the migration) which is, as you might imagine frustrating both for the core developers but hundreds of plugin developers that make Hudson the best damned CI server on the planet.


For source code we&#8217;re working on getting something in place for contributions on GitHub thanks to some assistance from the GitHub team.


For mailing lists we&#8217;ve gone ahead and dumped Java.net mailing lists in favor of...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/duke-construction.gif&quot; alt=&quot;Duke is not amused :(&quot; /&gt;As Kohsuke &lt;a href=&quot;https://hudson-labs.org/content/javanet-migration-status-update&quot;&gt;mentioned in this post&lt;/a&gt;, the Java.net migration has caught just about everybody off-guard in the Hudson community.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The tools we use hosted by Java.net are essentially locked from us until further notice (no ETA on the migration) which is, as you might imagine frustrating both for the core developers but &lt;strong&gt;hundreds&lt;/strong&gt; of plugin developers that make Hudson the best damned CI server on the planet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For &lt;strong&gt;source code&lt;/strong&gt; we’re working on getting something in place for contributions on &lt;a href=&quot;https://github.com/hudson/hudson&quot;&gt;GitHub&lt;/a&gt; thanks to some assistance from the GitHub team.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For &lt;strong&gt;mailing lists&lt;/strong&gt; we’ve gone ahead and dumped Java.net mailing lists in favor of a collection of Google Groups:&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://groups.google.com/group/hudson-dev/&quot;&gt;hudson-dev&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/group/hudson-users/&quot;&gt;hudson-users&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/group/hudson-commits/&quot;&gt;hudson-commits&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://groups.google.com/group/hudson-issues/&quot;&gt;hudson-issues&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;Contrary to popular belief, you &lt;strong&gt;do not need a Google account&lt;/strong&gt; to subscribe to these lists, else we wouldn’t have chosen Google Groups. All you need to do is send an email to &quot;&lt;a href=&quot;mailto:hudson-users+subscribe@googlegroups.com&quot;&gt;hudson-users+subscribe@googlegroups.com&lt;/a&gt;&quot; and you’ll receive a confirmation email from the mailing list server shortly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since our &lt;a href=&quot;https://issues.hudson-ci.org&quot;&gt;issues.hudson-ci.org&lt;/a&gt; isn’t actually hosted on Java.net, but rather on a machine provided by Oracle, they &lt;em&gt;should&lt;/em&gt; continue to function as per usual. The login for the systems is somewhat tied to Java.net so I am honestly not sure how stable they will be this week.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I apologize sincerely for the confusion and frustration, you can trust that we’re likely ten-times more frustrated with this situation right now.
---&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/11/23/java-net-migration-status-update/</id>
<title>Java.net migration status update</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-11-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/11/23/java-net-migration-status-update/" />
<author>
<name>kohsuke</name>
</author>
<category term='infrastructure'></category>
<category term='core'></category>
<summary>
Monday morning I came into work and discovered that I cannot commit to the Hudson Subversion repository. Initially I wasn&#8217;t worried — I thought it was just another java.net outage that will resolve itself in a few hours — but a little research a bit later revealed that Hudson was locked down and being migrated to new java.net infrastructure.


I and the whole community was quite surprised by this, as we are supposed to be "notified as soon as we assign a date for [our] projects to move." But by the time the developer community noticed, the project was already locked...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Monday morning I came into work and discovered that I cannot commit to the Hudson Subversion repository. Initially I wasn’t worried — I thought it was just another java.net outage that will resolve itself in a few hours — but a little research a bit later revealed that Hudson was locked down and being &lt;a href=&quot;https://weblogs.java.net/blog/communitymanager/archive/2010/11/03/javanet-begins-migration-collabnet-kenai-infrastructure&quot;&gt;migrated to new java.net infrastructure&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I and the whole community was quite surprised by this, as we are supposed to be &quot;notified as soon as we assign a date for [our] projects to move.&quot; But by the time the developer community noticed, the project was already locked down, repository is read-only, and mailing lists can stop functioning any time. My immediate action was to contact the folks who are doing migration to get Hudson out of this cycle of the migration, but I was told that the ship has sailed and it was too late.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Even worse, there’s no ETA — it’ll definitely take a week, but since this is a Thanksgiving weekend, it can take longer, Oracle said.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I find this situation plain unacceptable, and &lt;a href=&quot;https://java.net/projects/jersey/lists/dev/archive/2010-11/message/3&quot;&gt;e-mails from the earlier migration effort&lt;/a&gt; made me doubt if the new infrastructure is any better. I also had a pleasure of working closely with CollabNet folks over the past years and I was also involved in some earlier conversation and experiments about the new java.net infrastructure, and when it comes to performance and monitoring, CollabNet folks really knew what they are doing. So I had multiple reasons to worry if the new infrastructure can handle the load of java.net, which the old CollabNet-hosted one couldn’t handle.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But fortunately, since the general java.net migration has been announced, we’ve &lt;a href=&quot;https://hudson.361315.n4.nabble.com/Mailing-list-change-proposal-td3047548.html&quot;&gt;discussed&lt;/a&gt; the migration of some of the project infrastructure. So we’ve accelerated the plan and implemented it, so as not to lose the critical project infrastructure services.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;mailing-lists&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#mailing-lists&quot; /&gt;Mailing Lists&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson mailing lists are moved to Google Groups. See &lt;a href=&quot;https://hudson-labs.org/content/mailing-lists&quot;&gt;more details here&lt;/a&gt; and &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mailing%20List&quot;&gt;here&lt;/a&gt;. The new mailing lists provide a real search capability, decent UI for archives, and it makes it easier for people with multiple e-mail addresses to post from multiple addresses and receive just one copy. The stability of the service is also much better.&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;source-code&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#source-code&quot; /&gt;Source code&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson core source code has been long synced to GitHub. We’ve been getting several contributions through that already, and people have been asking &lt;a href=&quot;https://hudson.361315.n4.nabble.com/On-the-future-of-Hudson-hosting-and-infrastructure-td393278i20.html&quot;&gt;for&lt;/a&gt; &lt;a href=&quot;https://hudson.361315.n4.nabble.com/Git-repository-for-Hudson-td394409.html#a394412&quot;&gt;Git&lt;/a&gt; &lt;a href=&quot;https://hudson.361315.n4.nabble.com/hudson-plugins-git-repository-td1477941.html&quot;&gt;migration&lt;/a&gt; &lt;a href=&quot;https://hudson.361315.n4.nabble.com/Hudson-on-github-td2252960.html&quot;&gt;for&lt;/a&gt; &lt;a href=&quot;https://hudson.361315.n4.nabble.com/Expose-the-Hudson-SVN-as-a-GIT-repository-td391333.html&quot;&gt;long&lt;/a&gt; &lt;a href=&quot;https://hudson.361315.n4.nabble.com/version-control-for-hudson-source-bidirectional-git-lt-gt-svn-td978706.html&quot;&gt;time&lt;/a&gt; anyway. So going forward I’ll be committing to and producing releases from &lt;a href=&quot;https://github.com/hudson/hudson&quot;&gt;the Hudson repository on GitHub&lt;/a&gt; at &lt;code&gt;https://kohsuke@github.com/hudson/hudson.git&lt;/code&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The new Git-based repository would be far snappier to work with, and it’ll make it easier for people to maintain private changes and contribute changes back. There’s also a work in progress to set up Gerrit to streamline the patch review process to the core. So I think this further reduces the barrier of entry to the Hudson project and accelerate the progress.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The migration of Hudson plugin repositories still needs to be discussed, so stay tuned for the updates in &lt;a href=&quot;https://groups.google.com/group/hudson-dev&quot;&gt;the dev list&lt;/a&gt; today or tomorrow. I’ve developed a bulk import program whose output can be seen &lt;a href=&quot;https://github.com/HudsonLabs&quot;&gt;here&lt;/a&gt;, so I’m going to propose this as the migration strategy.&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusions&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conclusions&quot; /&gt;Conclusions&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My apologies that these changes had to happen quickly — I’m just as frustrated as you are, but given the circumstances, I think this is the best course of action. Hopefully everything will be in place within a few days. And in the mean time, thanks for your patience.&lt;br /&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;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/10/21/hudson-user-meet-up-in-jerusalem/</id>
<title>Hudson User Meet-up in Jerusalem</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-10-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/10/21/hudson-user-meet-up-in-jerusalem/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
In tradition of taking advantages of my travel, Tikal, ExLibris, and InfraDNA hosted a Hudson users meetup in Jerusalem yesterday.





There were 10+ people from Jerusalem and Tel Aviv who came over, which was great given the lack of upfront advertisement (my fault.) I did a short presentation about the current state of the Hudson project and where we are focusing efforts on. Then we had a very energetic Q&amp;A sessions that lasted like 3 hours.





People from Tikal told me that they deploy and manage a lot of Hudson instances, so their feedbacks in the workflow/choreography/orchestration related features were very useful....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In tradition of taking advantages of my travel, &lt;a href=&quot;https://www.tikalk.com/&quot;&gt;Tikal&lt;/a&gt;, &lt;a href=&quot;https://web.archive.org/web/20171202185204/https://exlibris.co.il/&quot;&gt;ExLibris&lt;/a&gt;, and &lt;a href=&quot;https://infradna.com/&quot;&gt;InfraDNA&lt;/a&gt; hosted a Hudson users meetup in Jerusalem yesterday.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/20150327193330if_/http://www.gate1travel.com/israel-travel/Images/photos/JerusalemNight.jpg&quot; alt=&quot;image&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were 10+ people from Jerusalem and Tel Aviv who came over, which was great given the lack of upfront advertisement (my fault.) I did a short presentation about the current state of the Hudson project and where we are focusing efforts on. Then we had a very energetic Q&amp;amp;A sessions that lasted like 3 hours.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://hudson-labs.org/sites/default/files/images/DSC00105.preview.JPG&quot; alt=&quot;image&quot; width=&quot;400&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;People from Tikal told me that they deploy and manage a lot of Hudson instances, so their feedbacks in the workflow/choreography/orchestration related features were very useful. And as usual, people have some positively fascinating crazy use cases — One of the participants was from a semiconductor company that builds GPU, and he said he tests their graphics cards with Hudson, which involves multiple reboots of a computer, installing software, and making sure the card doesn’t produce unwanted visual artifacts!&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the discussion, we went out for a nice dinner in a restaurant inside one of the old buildings (one of the many things Jerusalem is good at!), and by the time I got back to the hotel it was 11pm. You can see &lt;a href=&quot;https://www.tikalk.com/alm/hudson-israeli-users-group-meetup&quot;&gt;Ittay’s take on this meetup here&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://hudson-labs.org/sites/default/files/images/IMG_0199.JPG&quot; alt=&quot;image&quot; height=&quot;400&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of my concerns before starting this world-wide spontaneous Hudson users meetups was if enough people show up, but I’m starting to feel comfortable now that I’ve done several. Hudson appears to be entrenched everywhere, and people are interested in finding out their neighbors who are using them. So stay tuned for future Hudson meetups around the world — it might be in your city!&lt;/p&gt;
&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/22/javaone-day-two-in-pictures/</id>
<title>JavaOne: Day Two in Pictures</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/22/javaone-day-two-in-pictures/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='javaone'></category>
<summary>
On the off chance you&#8217;ve not seen some of the photos posted to the @hudsonci Twitter stream, here&#8217;s some of the photos from day two of JavaOne.&lt;/param&gt; &lt;/param&gt; &lt;/param&gt;&lt;/embed&gt;...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On the off chance you’ve not seen some of the photos posted to the &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci Twitter stream&lt;/a&gt;, here’s some of the photos from day two of JavaOne.&lt;center&gt;&lt;object width=&quot;400&quot; height=&quot;300&quot;&gt;&lt;param name=&quot;flashvars&quot; value=&quot;offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2Fhudsonlabs%2Fsets%2F72157625004467040%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2Fhudsonlabs%2Fsets%2F72157625004467040%2F&amp;amp;set_id=72157625004467040&amp;amp;jump_to=&quot; /&gt;&amp;lt;/param&amp;gt; &lt;param name=&quot;movie&quot; value=&quot;https://www.flickr.com/apps/slideshow/show.swf?v=71649&quot; /&gt;&amp;lt;/param&amp;gt; &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&amp;lt;/param&amp;gt;&lt;embed type=&quot;application/x-shockwave-flash&quot; src=&quot;https://www.flickr.com/apps/slideshow/show.swf?v=71649&quot; allowfullscreen=&quot;true&quot; flashvars=&quot;offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2Fhudsonlabs%2Fsets%2F72157625004467040%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2Fhudsonlabs%2Fsets%2F72157625004467040%2F&amp;amp;set_id=72157625004467040&amp;amp;jump_to=&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&amp;lt;/embed&amp;gt;&lt;/object&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/21/video-kohsuke-talks-hudson-on-otn/</id>
<title>Video: Kohsuke talks Hudson on OTN</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/21/video-kohsuke-talks-hudson-on-otn/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='javaone'></category>
<summary>
For the uninitiated, "OTN" is short for the "Oracle Technology Network" where speakers and other persons of interest sit in front of cameras and their words are streamed live to the internets.


After his session yesterday, Kohsuke hustled over to OTN headquarters, which look suspiciously like a tent in the middle of Mason St., and gave the following interview/chat.&lt;/embed&gt;...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the uninitiated, &quot;OTN&quot; is short for the &quot;Oracle Technology Network&quot; where speakers and other persons of interest sit in front of cameras and their words are &lt;a href=&quot;https://www.oracle.com/us/javaonedevelop/oracle-technology-network-live-166853.html&quot;&gt;streamed live&lt;/a&gt; to the internets.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After &lt;a href=&quot;https://www.jenkins.io/content/live-blog-kohsukes-presentation-javaone&quot;&gt;his session yesterday&lt;/a&gt;, Kohsuke hustled over to OTN headquarters, which look suspiciously like a tent in the middle of Mason St., and gave the following interview/chat.&lt;center&gt;&lt;object id=&quot;flashObj&quot; width=&quot;486&quot; height=&quot;322&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;https://c.brightcove.com/services/viewer/federated_f9?isVid=1&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#FFFFFF&quot; /&gt;&lt;param name=&quot;flashVars&quot; value=&quot;videoId=610282501001&amp;amp;linkBaseURL=http%3A%2F%2Fmedianetwork.oracle.com%2Fmedia%2Fshow%2F15622&amp;amp;playerID=1640183659&amp;amp;playerKey=AQ%2E%2E,AAAAAFcSbzI%2E,OkyYKKfkn3za9MF0qI3Ufg1AerdkqfR3&amp;amp;domain=embed&amp;amp;dynamicStreaming=true&quot; /&gt;&lt;param name=&quot;base&quot; value=&quot;https://admin.brightcove.com&quot; /&gt;&lt;param name=&quot;seamlesstabbing&quot; value=&quot;false&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;swLiveConnect&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;https://c.brightcove.com/services/viewer/federated_f9?isVid=1&quot; bgcolor=&quot;#FFFFFF&quot; flashvars=&quot;videoId=610282501001&amp;amp;linkBaseURL=http%3A%2F%2Fmedianetwork.oracle.com%2Fmedia%2Fshow%2F15622&amp;amp;playerID=1640183659&amp;amp;playerKey=AQ%2E%2E,AAAAAFcSbzI%2E,OkyYKKfkn3za9MF0qI3Ufg1AerdkqfR3&amp;amp;domain=embed&amp;amp;dynamicStreaming=true&quot; base=&quot;https://admin.brightcove.com&quot; name=&quot;flashObj&quot; width=&quot;486&quot; height=&quot;322&quot; seamlesstabbing=&quot;false&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; swliveconnect=&quot;true&quot; allowscriptaccess=&quot;always&quot; pluginspage=&quot;https://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash&quot; /&gt;&amp;lt;/embed&amp;gt;&lt;/object&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/21/live-blog-john-smart-demos-advanced-hudson-usage/</id>
<title>Live Blog: John Smart demos advanced Hudson usage</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/21/live-blog-john-smart-demos-advanced-hudson-usage/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='javaone'></category>
<summary>
Editor&#8217;s Note: This is a very rough set of notes from John Ferguson Smart&#8217;s presentation at JavaOne 2010. Unlike Kohsuke&#8217;s presentation, John spent a lot of time in demos which made live-blogging a bit difficult.image:https://farm5.static.flickr.com/4129/5012383102_cf258075a6.jpg


John takes the stage at 9:30, this presentation is totally different from yesterday&#8217;s presentation from Kohsuke


Taking Hudson a little further, beyond just scheduling a build job.


Who is not using Hudson, less than 10% raise hands.


Focusing on the more technical/nitty-gritty things with Hudson. Looking at:




CI Basics


Notification strategies


Quality metrics


Build promotions


Automated deployment
Who knows what build promotions? Who uses build promotions? Very few in the audience use build promotions.




Who uses...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note:&lt;/strong&gt; &lt;em&gt;This is a &lt;strong&gt;very&lt;/strong&gt; rough set of notes from &lt;a href=&quot;https://twitter.com/wakeleo&quot;&gt;John Ferguson Smart’s&lt;/a&gt; presentation at JavaOne 2010. Unlike &lt;a href=&quot;https://www.jenkins.io/content/live-blog-kohsukes-presentation-javaone&quot;&gt;Kohsuke’s presentation&lt;/a&gt;, John spent a lot of time in demos which made live-blogging a bit difficult.&lt;/em&gt;&lt;center&gt;image:https://farm5.static.flickr.com/4129/5012383102_cf258075a6.jpg&lt;span class=&quot;John Smart (@wakeleo) talking about advanced Hudson use&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;John takes the stage at 9:30, this presentation is &lt;em&gt;totally&lt;/em&gt; different from yesterday’s presentation from Kohsuke&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Taking Hudson a little further, beyond just scheduling a build job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Who is &lt;strong&gt;not&lt;/strong&gt; using Hudson, less than 10% raise hands.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Focusing on the more technical/nitty-gritty things with Hudson. Looking at:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CI Basics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Notification strategies&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quality metrics&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build promotions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automated deployment
Who knows what build promotions? Who uses build promotions? Very few in the audience use build promotions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Who uses Hudson for automated deployment, a handful raise their hands. Plenty of Tomcat and JBOSS users automating deployment. John going to use Tomcat for the automated deployment demo in this presentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;John mentions he’s authoring the &quot;Continuous Integration with Hudson&quot; book, which will be available for download as it comes out.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Let’s talk about Continuous Integration! Summing up what CI is in three words: &lt;strong&gt;feedback, visibility&lt;/strong&gt; and &lt;strong&gt;delivery&lt;/strong&gt;. CI is about &lt;em&gt;snappy feedback&lt;/em&gt;. You want feedback in &lt;strong&gt;minutes&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Visibility should be associated with continuous integration, getting everybody in the product life cycle into the loop with continuous integration (product people, QA, developers, etc).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;What makes Hudson so great?&lt;/strong&gt; (according to John)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Easy to use&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plenty of plugins/the ecosystem around Hudson for extending/integrating Hudson&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reporting/coverage features&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Distributed builds&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First demo, the Hudson dashboard (starring the Nested View plugin). Starting with a basic dashboard filled with some unstable and stable builds. Cloudy builds thanks to Cobertura coverage grading.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using the Nested View plugin to group views to make the dashboard more useflu for a &lt;strong&gt;ton&lt;/strong&gt; of jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Covering build radiators, not enough of the audience uses radiators. John advocates commandeering big monitors for radiators as part of your &quot;notification strategy&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Covering the basic version control integration, John &lt;strong&gt;highly&lt;/strong&gt; recommends using a &quot;Repository Browser&quot;. &quot;The point is, you want one&quot; John starts improvising with making some changes, pops over to Eclipse and refactors some code, commits and kicks off a build. Navigates to the source changes for the newly broken build in &quot;Sventon&quot;, his repository browser of choice which was connected to the job&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;John shows the job using Maven integration and deploying artifacts to the Maven repository he’s set up on his local machine.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson will automatically keep track of jar files/war files, so enable the &quot;Discard Old Builds&quot; checkbox to prevent Hudson from eating all kinds of disk space. Useful to only discard the artifacts for the last X builds instead of the test results/code coverage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Desktop build notifiers are quite useful, email can tend to get clutter/lost in the mess with everything else coming into your inbox.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;test-results-integration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#test-results-integration&quot; /&gt;Test results integration&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Going into the test results dashboard per-build and the test-result and build time trends for a specific job.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why is the build time trend useful? If the build suddenly takes a &lt;em&gt;huge&lt;/em&gt; amount of time to run, you’ve likely got performance issues that need fixing.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;publishing-html-reports&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#publishing-html-reports&quot; /&gt;Publishing HTML reports&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starring the HTML Publisher plugin! Using the plugin to publish HTML reports generated from easyb for publishing acceptance test results for more wide-spread consumption.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Bouncing from HTML reports to integrating with Sonar for code quality metrics&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;build-promotion&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#build-promotion&quot; /&gt;Build Promotion&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Starring the Promoted Builds plugin! Covering some similar concepts to Kohsuke’s talk yesterday but literally going into the Hudson configuration and setting it up.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Time is running out, John’s flipping back and forth between the M2 release plugin and his automatic deployment to his local Tomcat environment.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;qa&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#qa&quot; /&gt;Q&amp;amp;A&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;Can Hudson be used for other environments&quot;. Yes! Supports a number of build plugins, MSBuild, NAnt, CMake, in addition to the freestyle build. &quot;Maven 3 support&quot; Sonatype is apparently working on an integrated version of Hudson with Maven 3, Hudson core planning support &quot;eventually.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/21/javaone-day-one-in-pictures/</id>
<title>JavaOne: Day One in Pictures</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/21/javaone-day-one-in-pictures/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='javaone'></category>
<summary>
In case you haven&#8217;t been following the frequently updated @hudsonci Twitter stream. Here&#8217;s a collection of photos I&#8217;ve taken thus far.&lt;/param&gt; &lt;/param&gt; &lt;/param&gt;&lt;/embed&gt;...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In case you haven’t been following the &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;frequently updated @hudsonci&lt;/a&gt; Twitter stream. Here’s a collection of photos I’ve taken thus far.&lt;center&gt;&lt;object width=&quot;400&quot; height=&quot;300&quot;&gt;&lt;param name=&quot;flashvars&quot; value=&quot;offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2Fhudsonlabs%2Fsets%2F72157624996965000%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2Fhudsonlabs%2Fsets%2F72157624996965000%2F&amp;amp;set_id=72157624996965000&amp;amp;jump_to=&quot; /&gt;&amp;lt;/param&amp;gt; &lt;param name=&quot;movie&quot; value=&quot;https://www.flickr.com/apps/slideshow/show.swf?v=71649&quot; /&gt;&amp;lt;/param&amp;gt; &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&amp;lt;/param&amp;gt;&lt;embed type=&quot;application/x-shockwave-flash&quot; src=&quot;https://www.flickr.com/apps/slideshow/show.swf?v=71649&quot; allowfullscreen=&quot;true&quot; flashvars=&quot;offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2Fhudsonlabs%2Fsets%2F72157624996965000%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2Fhudsonlabs%2Fsets%2F72157624996965000%2F&amp;amp;set_id=72157624996965000&amp;amp;jump_to=&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&amp;lt;/embed&amp;gt;&lt;/object&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/20/tweet-of-the-day/</id>
<title>Tweet of the Day</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/20/tweet-of-the-day/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<summary>
Some of you may have been following all the photos posted to the hudsonlabs Flickr account from this year&#8217;s JavaOne conference in San Francisco.


Alan O&#8217;Leary responded to this photo with one of the funniest comments of the day:
"Java and Oracle - 'In Opposite Directions'"...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Some of you may have been following all the photos posted to the &lt;a href=&quot;https://www.flickr.com/photos/hudsonlabs/&quot;&gt;hudsonlabs Flickr account&lt;/a&gt; from this year’s JavaOne conference in San Francisco.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/a1o1&quot;&gt;Alan O’Leary&lt;/a&gt; responded to this photo with one of the &lt;a href=&quot;https://twitter.com/a1o1/status/25032555850&quot;&gt;funniest comments&lt;/a&gt; of the day:&lt;center&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/hudsonlabs/5008009575/&quot;&gt;&lt;img src=&quot;https://farm5.static.flickr.com/4151/5008009575_52e7f18fdf.jpg&quot; alt=&quot;This way to JavaOne&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;&quot;Java and Oracle - &#39;In Opposite Directions&#39;&quot;&lt;/em&gt;&lt;/strong&gt;&lt;/br&gt;&lt;/span&gt;
&lt;/center&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/20/pre-javaone-hudson-meetup-redux/</id>
<title>Pre-JavaOne Hudson Meetup Redux</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/20/pre-javaone-hudson-meetup-redux/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
Yesterday Digg was kind enough to host and "sponsor" (read: free drinks and
pizza!) a Hudson meetup at their offices in San Francisco. While Digg has been
the source of some controversy and press due to their recent redesign and corporate
shake-ups, as far as the Hudson community goes they&#8217;ve been largely responsible for
a great case study on continuous deployment using Hudson and Gerrit.image:https://farm5.static.flickr.com/4130/5005123971_403f24733d.jpg


Attendees included all of InfraDNA (Kohsuke and Kedar), some folks from CloudBees, a
number of local users/developers like LewisHam and myself, and
to top off the list a couple Oracle employees including Winston Prakash who is now hacking on Hudson inside of...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Yesterday Digg was kind enough to host and &quot;sponsor&quot; (read: free drinks and
pizza!) a Hudson meetup at their offices in San Francisco. While Digg has been
the source of some controversy and press due to their recent redesign and corporate
shake-ups, as far as the Hudson community goes they’ve been largely responsible for
a &lt;a href=&quot;https://about.digg.com/blog/continuous-deployment-code-review-and-pre-tested-commits-digg4&quot;&gt;great case study on continuous deployment&lt;/a&gt; using Hudson and &lt;a href=&quot;https://code.google.com/p/gerrit&quot;&gt;Gerrit&lt;/a&gt;.&lt;center&gt;image:https://farm5.static.flickr.com/4130/5005123971_403f24733d.jpg&lt;span class=&quot;Thanks to @digg for hosting the #HudsonCI meetup&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Attendees included all of InfraDNA (Kohsuke and Kedar), some folks from CloudBees, a
number of local users/developers like &lt;a href=&quot;https://twitter.com/LewisHam&quot;&gt;LewisHam&lt;/a&gt; and myself, and
to top off the list a couple Oracle employees including &lt;a href=&quot;https://twitter.com/wjprakash&quot;&gt;Winston Prakash&lt;/a&gt; who is now hacking on Hudson inside of Oracle.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As folks started arriving there was a lot of discussion around &quot;Hudson at Scale&quot;, specifically
regarding Hudson &quot;in the cloud&quot;. We also got to hear about one of the most interesting Hudson
use-cases I’ve ever seen by &lt;a href=&quot;https://edwardmgoldberg.com&quot;&gt;Edward M. Goldberg&lt;/a&gt; who I’ll post an
interview with shortly, imagine using Hudson with &lt;strong&gt;thousands&lt;/strong&gt; of machines, it’s that interesting.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Through the afternoon there were a number of great discussions concerning Hudson stability,
engaging more of the community and nitty-gritty details regarding Hudson’s internals such
as the plugin API.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ve posted &lt;a href=&quot;https://www.flickr.com/photos/hudsonlabs/sets/72157624992088468/&quot;&gt;photos from the event&lt;/a&gt; on
Flickr for posterity in case you’re interested. Overall I’d judge the meetup to be a success, it was a
lot of fun and a great way to spend a Sunday with Hudson.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re going to be at JavaOne, come track me down and let’s talk about Hudson, if you’re not in San Francisco for the event, you can always follow my updates on &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;Twitter&lt;/a&gt; or hit up &lt;a href=&quot;https://www.flickr.com/photos/hudsonlabs/sets/72157624996965000/&quot;&gt;Flickr&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/20/live-blog-kohsukes-presentation-at-javaone/</id>
<title>Live Blog: Kohsuke&#39;s Presentation at JavaOne</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/20/live-blog-kohsukes-presentation-at-javaone/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='javaone'></category>
<summary>
Editor&#8217;s note: This is a very rough set of notes from Kohsuke Kawaguchi&#8217;s presentation at JavaOne 2010.







Kohsuke takes the stage, asks "who uses&#8217;s Hudson" the majority of
audience raises their hands


Discussing the great ecosystem using Hudson across the wide-variety of platforms/languages.
330+ community written plugins. Last year at JavaOne we had 230+ plugins


Eclipse Community Survey, Hudson adoption from 9.1% in 2009 to 21.8%


Discussing Hudson adoption, going over Hudson job postings on indeed.com going up compared to a stagnant Cruise Control.


Kohsuke introduces himself and InfraDNA, started Hudson in 2004/2005.


First steps to CI, 10,000 foot overview of SCM monitoring/build/testing. Delving into using Hudson
for automating...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s note:&lt;/strong&gt; &lt;em&gt;This is a &lt;strong&gt;very&lt;/strong&gt; rough set of notes from &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke Kawaguchi’s&lt;/a&gt; presentation at JavaOne 2010.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/hudsonlabs/5008629375/&quot;&gt;&lt;img src=&quot;https://farm5.static.flickr.com/4083/5008629375_6f603b6093_m.jpg&quot; alt=&quot;Kohsuke talks to a packed room at #JavaOne&quot; width=&quot;180&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kohsuke takes the stage, asks &quot;who uses’s Hudson&quot; the majority of
audience raises their hands&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Discussing the great ecosystem using Hudson across the wide-variety of platforms/languages.
330+ community written plugins. Last year at JavaOne we had 230+ plugins&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Eclipse Community Survey, Hudson adoption from 9.1% in 2009 to 21.8%&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Discussing Hudson adoption, going over Hudson job postings on indeed.com going up compared to a stagnant Cruise Control.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kohsuke introduces himself and InfraDNA, started Hudson in 2004/2005.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;First steps to CI, 10,000 foot overview of SCM monitoring/build/testing. Delving into using Hudson
for automating &lt;strong&gt;everything&lt;/strong&gt; to get &quot;more out of your Hudson deployment.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;interconnecting-jobs-aka-workflows&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#interconnecting-jobs-aka-workflows&quot; /&gt;&quot;Interconnecting Jobs aka Workflows&quot;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson allows for hosting many projects on one Hudson deployment, meaning you need a smaller number of administrators for a larger number of jobs compared to Cruise Control.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building Block #1: Triggering. Using &quot;upstream&quot; and &quot;downstream&quot; jobs to interconnect jobs to form a workflow in Hudosn. Triggering is asynchronoys in Hudson, useful for separating builds and multiple test jobs. Splitting the build and test jobs so you build quickly test many tests in parallel.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avoid recompiling compilation/builds in the &quot;downstream&quot; test runs. &quot;Copy Artifact&quot; plugin very useful for passing built executables to test jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Upstream/downstream separation also highly useful for separating build and deployment into a continuous workflow.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building Block #2: Join plugin. Fan downstream jobs out and then bring everything back together for final
steps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Shows Join plugin configuration screen because &quot;perhaps the configuration is a little unintuitive&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Building block #3: Fingerprints. Using MD5 checksums from artifacts to learn more about those artifacts in your
Hudson, tying together artifacts from different jobs/builds. Letting Hudson recording these fingerprints of those artifacts in your lifecycle allows Hudson to help you find out where/when those executables came from.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Fingerprinting mechanism good for tracking dependencies from third parties, Hudson uses 3rd party fingerprints to compute additional information. Also useful for aggregating reports.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Going a bit further using the &quot;build promotion plugin&quot; to weed out which builds are &quot;better than others.&quot; Taking fingerprints from a build job all the way through the life cycle and passing that fingerprint around test/smoke test jobs, if that passes, build passes on to more rigorous testing, only if it’s passed base-level testing. Basic model of promotion maps to a &quot;confidence level&quot;, 1st level passes compilation, 2nd level passes smoke test, 3rd level passes expensive/time-consuming tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the reasons to use promotion in your lifecycle to ensure that artifacts meet a minimum &quot;confidence level&quot; so you’re not expending resources running the longer tests )think about a promotion hierarchy)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Demo time!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kohsuke demoing build promotion live with fingerprinting of sample jar files. Creating a &quot;component-X&quot; build and a &quot;test-X&quot; build. test-X job using the &quot;Copy Artifact&quot; plugin to grab artifacts from the component-X build.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Defining the promotion criteria in &quot;component-X&quot;, &quot;test-X&quot; promoted, indicates that certain builds promoted a build.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;End demo time!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;maven-integration&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#maven-integration&quot; /&gt;Maven Integration&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Maven integration highlights. Going over POM comprehension and simplified configuration due to more information
getting inferred from the POMs. Building dependency chains with Maven integration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;That’s the basics, let’s talk about advanced integration with Maven&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Parallel-module builds! Letting Hudson builds modules with a single checkbox, meaning wherever possible Hudson will try to build your modules in parallel when possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Incremental builds! Only building changed modules in a build run to be more efficient, preventing the need to rebuild the whole project from scratch every time. Hudson’s SCM integration to determine what the mapping between files changed and modules needing to be built.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Private Maven repositories! Avoiding artifacts being overwritten by others, telling Hudson to create a Maven repository &lt;strong&gt;per-project&lt;/strong&gt; (at the expense of more bandwidth/disk space needed), helps segregate builds to avoid them stomping on each other.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After-the-fact deployment, avoiding deploying modules unless the whole build is successful (all modules properly built). Instead of using &lt;code&gt;mvn deploy&lt;/code&gt;, you tell Hudson to deploy to your Maven repository with a single checkbox.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;matrix-project&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#matrix-project&quot; /&gt;Matrix Project&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;No longer alpha! Production-ready!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Often used to build/test across slight variations of build environments such as different platforms for a C++ project. Conceptually it’s like running your build in a for loop.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson supports a number of different axes, most popular of which being a &quot;agent axis&quot; which allows you to use different labels or specific agents for the build. Hudson also supports arbitrary text fields as axes to be passed along to the build steps as environment variables.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Touching on &quot;filtering&quot; in the matrix project support to remove parts of an axis that you do not need. I.e if you have a &quot;platform&quot; and a &quot;browser&quot; axes for web testing, you can exclude the &quot;iexplore&quot; value of the &quot;browser&quot; axis when the &quot;platform&quot; axis is &quot;mac&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Demo time!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Defining two axes, &quot;agent&quot; axis and the &quot;JDK&quot; axis to build against different JDK versions on linux, solaris and windows. Excluding &quot;touchstone builds&quot; to avoid rebuilding a large number of matrix builds unless a limited subset of the combinations successfully build. Used to avoid spending a lot of time spinning cycles on very obvious errors that the first few builds &quot;recognize&quot; immediately.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;End demo time&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;doing-selenium-testing-on-hudson&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#doing-selenium-testing-on-hudson&quot; /&gt;Doing Selenium testing on Hudson&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Use &quot;Selenium Grid plugin&quot; to install Selenium binaries on all agents and prepares them all to talk to each other. Useful for &quot;overloading&quot; an existing Hudson cluster as a Selenium cluster.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using labels in Hudson to better determine which node has which browser.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Selenium integration is &lt;strong&gt;very&lt;/strong&gt; powerful when combined with the join plugin and the matrix configuration support in Hudson for web testing across a large number of platforms and browsers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Hudson project has invested heavily in getting great cluster support which helps tremendously with Selenium which has invested as heavily in clustering.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;How to you deal with Selenium needing a GUI while Hudson agents are largely headless. Use the Xvnc plugin! On Windows things are bit trickier, easier to let Hudson agent/service &quot;interact with desktop&quot; such that it can access dialogs/etc. Failing everything else, configuring Windows for auto-login and then have JNLP agents autostart at login will work for allowing the agent to use the GUI and network resources.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The rest of the session was dedicated to some good Q&amp;amp;A. Great session by Hudson’s founder.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/17/javaone-taking-shape/</id>
<title>JavaOne taking shape</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/17/javaone-taking-shape/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='javaone'></category>
<summary>
Last night on my way out of San Francisco I stopped by 4th and Howard St to get my first taste of JavaOne/Oracle OpenWorld which was already taking shape at the location. Besides snapping the photo below, I also managed to get yelled out by an old woman wearing a red "security" jacket; suffice to say my JavaOne experience is already everything I expected!image:https://farm5.static.flickr.com/4107/4997929716_1675745efe.jpg


Unlike last year&#8217;s Oracle OpenWorld, which also shut down this segment of Howard St in San Francisco and took over the adjacent Yerba Buena Gardens, this event will be crammed together with JavaOne. 


At this point I&#8217;m...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last night on my way out of San Francisco I stopped by 4th and Howard St to get my first taste of JavaOne/Oracle OpenWorld which was already taking shape at the location. Besides snapping the photo below, I also managed to get yelled out by an old woman wearing a red &quot;security&quot; jacket; suffice to say my JavaOne experience is already everything I expected!&lt;center&gt;image:https://farm5.static.flickr.com/4107/4997929716_1675745efe.jpg&lt;span class=&quot;Oracle taking over Howard St&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unlike last year’s Oracle OpenWorld, which also shut down this segment of Howard St in San Francisco and took over the adjacent Yerba Buena Gardens, this event will be crammed together with JavaOne. &lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/agentdero/4998934102/&quot;&gt;&lt;img src=&quot;https://farm5.static.flickr.com/4084/4998934102_d7c71e575e_m.jpg&quot; alt=&quot;20100917_003.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At this point I’m not sure what I can expect as far as the JavaOne portion of the event goes, we do have &lt;strong&gt;two&lt;/strong&gt; Hudson related events scheduled:&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;Getting More Out of Your Hudson&lt;/strong&gt; - Monday at 10:00 a.m. - Hosted by our very own &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;, the session will be 60 minutes at Parc 55, Embarcadero.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Getting More from Your CI Server: Taking Hudson to the Next Level&lt;/strong&gt; - Tuesday at 9:30 a.m. - Hosted by the (in)famous &lt;a href=&quot;https://twitter.com/wakeleo&quot;&gt;John Smart&lt;/a&gt; the session will also be 60 minutes at Parc 55, Cyril Magnin 1.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/agentdero/4998330661/&quot;&gt;&lt;img src=&quot;https://farm5.static.flickr.com/4132/4998330661_91514f797a_m.jpg&quot; alt=&quot;20100917_004.jpg&quot; width=&quot;240&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Unfortunately those were the only specifically-Hudson related tracks I could find, as &lt;a href=&quot;https://twitter.com/abayer&quot;&gt;Andrew Bayer&lt;/a&gt; has &lt;a href=&quot;https://twitter.com/abayer/status/24507253586&quot;&gt;mentioned before&lt;/a&gt;, finding a proper schedule is near impossible. While at JavaOne, I intend on posting updates, pictures and maybe a little scathing commentary (they did give me a blogger pass for some silly reason).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re going to be at JavaOne, &lt;a href=&quot;https://www.jenkins.io/content/lets-talk-about-hudson-javaone&quot;&gt;think about coming and talking to me&lt;/a&gt; about how you/your company uses Hudson. I might just have stickers!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;hr /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/09/lets-talk-about-hudson-at-javaone/</id>
<title>Let&#39;s talk about Hudson at JavaOne</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/09/lets-talk-about-hudson-at-javaone/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='interview'></category>
<summary>
A few months ago I enjoyed running a couple interviews with folks who were using Hudson but lately I&#8217;ve lacked the time and coffee to get more interviews done. 


I am planning on making up for it by bringing my fancy smancy tape recorder (i.e. a smartphone) and a few notepads to the upcoming JavaOne conference here in San Francisco.


If you&#8217;re interested in talking to me about how you or your company uses Hudson in your quest for world domination, you will be able to find me at the Hudson hackathon on Sunday the 19th, or at JavaOne on Monday,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few months ago I enjoyed running a couple &lt;a href=&quot;https://web.archive.org/web/20130514044904/https://jenkins-ci.org/views/interviews&quot;&gt;interviews with folks&lt;/a&gt; who were using Hudson but lately I’ve lacked the time and coffee to get more interviews done. &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/sites/default/files/taperecorder.jpg&quot; alt=&quot;Interview time!&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am planning on making up for it by bringing my fancy smancy tape recorder (i.e. a smartphone) and a few notepads to the upcoming &lt;a href=&quot;https://www.oracle.com/us/javaonedevelop/index.html&quot;&gt;JavaOne conference&lt;/a&gt; here in San Francisco.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in talking to me about how you or your company uses Hudson in your quest for world domination, you will be able to find me at the &lt;a href=&quot;https://www.jenkins.io/content/pre-javaone-hudson-meetup&quot;&gt;Hudson hackathon&lt;/a&gt; on Sunday the 19th, or at JavaOne on Monday, Tuesday and &lt;em&gt;maybe&lt;/em&gt; Wednesday.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Feel free to drop me a line at tyler[at]linux.com and we’ll set something up!&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/05/hudsonmobi-dons-a-black-turtleneck-and-jumps-to-ios4/</id>
<title>HudsonMobi dons a black turtleneck and jumps to iOS4</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/05/hudsonmobi-dons-a-black-turtleneck-and-jumps-to-ios4/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='news'></category>
<summary>
Last time I talked about HudsonMobi 2.0 there were some hiccups with the QR code which made me pretty irritated. Now the leading mobile app for Hudson users has regained my trust with their latest release for iOS 4, the latest incarnation of Apple&#8217;s mobile operating systems for iPhones and iPod Touches.


Since I fall into the category of subhumans who for one reason or another choose not to own an iPhone, I can&#8217;t verify the awesomeness of this new HudsonMobi release. If it is anything like the 2.0 release for Android you can expect enhancements such as:




Tighter integration with iOS...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://hudsonmobi.wordpress.com/2010/09/04/hudsonmobi-for-ios-4-is-here/&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/sites/default/files/hudson-mobi-appstore1.png&quot; alt=&quot;HudsonMobi in the Appstore&quot; /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last time I &lt;a href=&quot;https://www.jenkins.io/content/hudsonmobi-20-hits-android-market&quot;&gt;talked about HudsonMobi 2.0&lt;/a&gt; there were some hiccups with the QR code which &lt;a href=&quot;https://twitter.com/hudsonci/status/21335228733&quot;&gt;made me pretty irritated&lt;/a&gt;. Now the leading mobile app for Hudson users has regained my trust with their &lt;a href=&quot;https://hudsonmobi.wordpress.com/2010/09/04/hudsonmobi-for-ios-4-is-here/&quot;&gt;latest release for iOS 4&lt;/a&gt;, the latest incarnation of Apple’s mobile operating systems for iPhones and iPod Touches.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since I fall into the category of subhumans who for one reason or another choose not to own an iPhone, I can’t verify the awesomeness of this new HudsonMobi release. If it is anything like the 2.0 release for Android you can expect enhancements such as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tighter integration with iOS 4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Embedded artifact viewer!&lt;/strong&gt; For archived build artifacts that are text-based, you can view them directly on your handset.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Access to the build history and changes for a job.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quick and easy access to a job’s last build&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you own a device with iOS &lt;strong&gt;3.0 or higher&lt;/strong&gt; you should be able to download HudsonMobi 2.0 from the appstore, if you give it a whirl, please leave a comment to let me know how awesome it is :)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br&gt;
---&lt;/br&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/04/hudson-events-calendar/</id>
<title>Hudson Events Calendar</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-04T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/04/hudson-events-calendar/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meta'></category>
<summary>
Just wanted to let everybody know that I&#8217;ve gone ahead and added a Calendar for all the upcoming Hudson-related events.


Hopefully we&#8217;ll be able to add more and more events for the rest of the year including seminars, more meetups and potentially a few drink-ups!


Worth mentioning that I&#8217;ve not yet tested the iCal feed so if you have troubles with it, let me know (via the comments)....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just wanted to let everybody know that I’ve gone ahead and added a &lt;a href=&quot;https://www.jenkins.io/event-calendar&quot;&gt;Calendar&lt;/a&gt; for all the upcoming Hudson-related events.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hopefully we’ll be able to add more and more events for the rest of the year including seminars, more meetups and potentially a few drink-ups!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Worth mentioning that I’ve not yet tested the iCal feed so if you have troubles with it, let me know (via the comments).&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/02/recent-label-and-matrix-project-improvement/</id>
<title>Recent label and matrix project improvement</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/02/recent-label-and-matrix-project-improvement/" />
<author>
<name>kohsuke</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='tutorial'></category>
<summary>
Today, I&#8217;d highlight two recent improvements to the label and matrix projects.


When you have multiple agents in your Hudson build farm, you can use labels to classify agents by their capability/environment/architecture/etc. For example, your one agent might have &#8220;32bit&#8221; and &#8220;windows&#8221; label, while another one might have &#8220;linux&#8221;, &#8220;ubuntu&#8221;, and &#8220;64bit.&#8221; (with plugins like &lt;a href=`"https://wiki.jenkins.io/display/JENKINS/PlatformLabeler+Plugin`"&gt;platform-labeler plugin&lt;/a&gt;, you can attach labels automatically, too.) Or if you do Selenium testing, you might add browser names as labels to indicate which agent has which browser available.


With such set up, you then specify that such and such jobs can be only run on...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Today, I’d highlight two recent improvements to the label and matrix projects.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When you have multiple agents in your Hudson build farm, you can use labels to classify agents by their capability/environment/architecture/etc. For example, your one agent might have “32bit” and “windows” label, while another one might have “linux”, “ubuntu”, and “64bit.” (with plugins like &amp;lt;a href=`&quot;https://wiki.jenkins.io/display/JENKINS/PlatformLabeler+Plugin`&quot;&amp;gt;platform-labeler plugin&amp;lt;/a&amp;gt;, you can attach labels automatically, too.) Or if you do Selenium testing, you might add browser names as labels to indicate which agent has which browser available.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With such set up, you then specify that such and such jobs can be only run on such and such labels. For example, you might say your “test-foo” job requires the “windows” label, while your “compile-bar” job might require the “macos” label.
Starting 1.372, Hudson now lets you use boolean expressions here, instead of just specifying one label as the requirement. For example, your “seleniumTest-zot” job can now say it requires “windows&amp;amp;&amp;amp;firefox” since it’s meant to run on Windows with Firefox. Or if your job requires a shell script, you might say “!windows” to indicate that it has to be run somewhere that’s not Windows.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Labels are also often used in the context of the multi-configuration project (a.k.a. matrix project.) In a multi-configuration project, you specify what to execute to build your project, then specify a number of “axes” that represents the variable and their possible values to execute a build. There are several different kinds of axes (and this is of course extensible), and one of them is the label axis.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example, say you have a test suite that you want to run on Windows, Linux, and Solaris, to make sure it works correctly under all these environments. In such a case, you define one label axis, and tell Hudson that you have three possible values “windows”, “linux”, and “solaris.” When you build this project, Hudson will run your build three times by finding appropriate agent that carries the specified label.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In 1.373, you can now specify multiple label axes. For example, you might have a C++ project that needs to be compiled on various platforms. In such a case, you can define one label axis to be “windows”, “linux”, “solaris”, and you can define another label axis to be “32bit” and “64bit”. This will generate 3x2=6 combinations to be executed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sometimes the exhaustive combinations do not make sense. In such a case, you can use a filter boolean expression to eliminate some values. You can also use the same mechanism to create a sparse matrix — that is, you tell Hudson to reduce the coverage to 33%, and Hudson will eliminate every 2 out of 3 combinations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finally, I’d like to thank &lt;a href=&quot;https://www.sandia.gov/&quot;&gt;Sandia National Laboratories&lt;/a&gt; for sponsoring this work, which made it possible for &lt;a href=&quot;https://infradna.com&quot;&gt;InfraDNA&lt;/a&gt; to provide this feature to the community. People often think that contributing code is the only way to give back to the project, but sponsoring features like this is another great way to do it.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/09/01/copenhagen-hudson-user-meetup/</id>
<title>Copenhagen Hudson User Meetup</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-09-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/09/01/copenhagen-hudson-user-meetup/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
September is turning into a meetup month for the Hudson community. In parallel to the meetup in Oslo and the meetup in JavaOne, Nokia and InfraDNA are hosting a meetup in Copenhagen on September 6th, Monday. Read on for the details.


The current tentative plan is to do a short "state of the union / what&#8217;s new" kind of presentation, then use the rest of the time for open mic Q&amp;A, but if you have other ideas, or better yet if you want to do some talks, please let me know. I think the event will be fun.


If you plan on...
</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://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Kopenhagen_Innenstadt.JPG/280px-Kopenhagen_Innenstadt.JPG&quot; alt=&quot;image&quot; /&gt;September is turning into a meetup month for the Hudson community. In parallel to &lt;a href=&quot;https://hudson-labs.org/content/hudson-javazone-meetup-oslo&quot;&gt;the meetup in Oslo&lt;/a&gt; and &lt;a href=&quot;https://hudson-labs.org/content/pre-javaone-hudson-meetup&quot;&gt;the meetup in JavaOne&lt;/a&gt;, &lt;a href=&quot;https://www.nokia.com/&quot;&gt;Nokia&lt;/a&gt; and &lt;a href=&quot;https://infradna.com/&quot;&gt;InfraDNA&lt;/a&gt; are hosting a meetup in Copenhagen on September 6th, Monday. Read on for the details.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The current tentative plan is to do a short &quot;state of the union / what’s new&quot; kind of presentation, then use the rest of the time for open mic Q&amp;amp;A, but if you have other ideas, or better yet if you want to do some talks, please let me know. I think the event will be fun.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you plan on coming, please &lt;a href=&quot;mailto:event@infradna.com&quot;&gt;drop me a note&lt;/a&gt;, so that we can get some sense of the attendance.&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;When:&lt;/strong&gt; September 6th, 18:30&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; Auditorium 1, Nokia Denmark A/S, København (&lt;a href=&quot;https://maps.google.dk/maps?f=q&amp;amp;source=s_q&amp;amp;hl=da&amp;amp;geocode=&amp;amp;q=Nokia+Danmark+A/S,+K%C3%B8benhavn&amp;amp;sll=55.869147,11.228027&amp;amp;sspn=9.259564,26.367188&amp;amp;ie=UTF8&amp;amp;hq=Nokia+Danmark+A/S,&amp;amp;hnear=K%C3%B8benhavn&amp;amp;t=h&amp;amp;ll=55.649606,12.541698&amp;amp;spn=0.000284,0.000805&amp;amp;z=21&quot;&gt;map&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Food will be provided.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/31/hudson-at-javazone-meetup-in-oslo/</id>
<title>Hudson at JavaZone, Meetup in Oslo </title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/31/hudson-at-javazone-meetup-in-oslo/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
JavaZone is a big Java conference in Scandinavia, and Hudson is well represented there. On September 8th, Håkon Snøtun will be presenting "Top 5 plugins for Hudson and Chuck Norris." and on September 9th, I&#8217;ll be presenting "Getting more out of your Hudson."


But more importantly, what is a conference without drinking!? So in that spirit, InfraDNA will be organizing a Hudson User Meetup at The Scotsman from Sep 8th 19:30 (website.) We&#8217;ll get together, have some drinks, and enjoy geeky conversations.


So if you are local or visiting Oslo for JavaZone, come join us. If you plan to join us at...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://jz10.java.no/&quot;&gt;JavaZone&lt;/a&gt; is a big Java conference in Scandinavia, and Hudson is well represented there. On September 8th, Håkon Snøtun will be presenting &quot;Top 5 plugins for Hudson and Chuck Norris.&quot; and on September 9th, I’ll be presenting &quot;Getting more out of your Hudson.&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;But more importantly, what is a conference without drinking!? So in that spirit, &lt;a href=&quot;https://infradna.com/&quot;&gt;InfraDNA&lt;/a&gt; will be organizing a Hudson User Meetup at &lt;a href=&quot;https://maps.google.com/maps?hl=en&amp;amp;q=Oslo&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Oslo,+Norway&amp;amp;ll=59.912614,10.743604&amp;amp;spn=0.001589,0.004823&amp;amp;t=h&amp;amp;z=18&quot;&gt;The Scotsman&lt;/a&gt; from Sep 8th 19:30 (&lt;a href=&quot;https://www.scotsman.no/&quot;&gt;website&lt;/a&gt;.) We’ll get together, have some drinks, and enjoy geeky conversations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So if you are local or visiting Oslo for JavaZone, come join us. If you plan to join us at The Scotsman, please &lt;a href=&quot;mailto:kohsuke@infradna.com&quot;&gt;RSVP&lt;/a&gt;, and watch out for &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;my twitter updates&lt;/a&gt; for any last minute time/location changes.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/30/pre-javaone-hudson-meetup/</id>
<title>Pre-JavaOne Hudson Meetup</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/30/pre-javaone-hudson-meetup/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='meetup'></category>
<category term='javaone'></category>
<summary>
As we near autumn up here in the Northern Hemisphere, the wind is starting to blow a bit chillier and here in the Bay Area that can only mean one thing: Oracle is suing everybody! it&#8217;s time for JavaOne!


A whole lot has changed since last year, Sun Microsystems was acquired by Oracle, Kohsuke left Snoracle to found InfraDNA and Hudson has continued to power on as the single best continuous integration server on the planet.


While the tickets for Oracle OpenWorld/JavaOne are just as outrageously expensive as they were last year, we are hosting a meetup/hackathon/continuous-drinking-contest at Digg the Sunday prior....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As we near autumn up here in the Northern Hemisphere, the wind is starting to blow a bit chillier and here in the Bay Area that can only mean one thing: &lt;strike&gt;Oracle is suing everybody!&lt;/strike&gt; it’s time for JavaOne!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A whole lot has changed since last year, Sun Microsystems was acquired by Oracle, &lt;a href=&quot;https://kohsuke.org/&quot;&gt;Kohsuke&lt;/a&gt; left Snoracle to found &lt;a href=&quot;https://web.archive.org/web/20100612130510/http://infradna.com/&quot;&gt;InfraDNA&lt;/a&gt; and Hudson has continued to &lt;a href=&quot;https://www.jenkins.io/content/cloudbees-announce-hudson-service&quot;&gt;power on&lt;/a&gt; as the single &lt;strong&gt;best&lt;/strong&gt; continuous integration server on the planet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While the tickets for Oracle OpenWorld/JavaOne are just as outrageously expensive as they were last year, we &lt;strong&gt;are&lt;/strong&gt; hosting a meetup/hackathon/continuous-drinking-contest at &lt;a href=&quot;https://about.digg.com/opensource&quot;&gt;Digg&lt;/a&gt; the Sunday prior. We have not yet set any kind of agenda, but some core Hudson hackers and plenty of plugin developers should be in town so it should be a great time hacking on and/or with Hudson.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;big&gt;https://www.meetup.com/hudsonmeetup/calendar/14515128/&lt;span class=&quot;RSVP Here!&quot; /&gt;&lt;/big&gt;&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;When:&lt;/strong&gt; September 19th, 1:00 p.m.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Location:&lt;/strong&gt; Digg’s Office: 1040 Mariposa St - Suite 100, San Francisco, CA 94107&lt;center&gt;&lt;iframe width=&quot;300&quot; height=&quot;300&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; src=&quot;https://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=1040+Mariposa+St+-+Suite+100+San+Francisco,+CA+94107&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=39.780156,78.662109&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=1040+Mariposa+St,+San+Francisco,+California+94107&amp;amp;ll=37.764201,-122.394304&amp;amp;spn=0.020356,0.025749&amp;amp;z=14&amp;amp;iwloc=A&amp;amp;output=embed&quot; /&gt;&lt;br&gt;
&lt;small&gt;https://maps.google.com/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=1040+Mariposa+St+-+Suite+100+San+Francisco,+CA+94107&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=39.780156,78.662109&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=1040+Mariposa+St,+San+Francisco,+California+94107&amp;amp;ll=37.764201,-122.394304&amp;amp;spn=0.020356,0.025749&amp;amp;z=14&amp;amp;iwloc=A&lt;span class=&quot;View Larger Map&quot; /&gt;&lt;/small&gt;&lt;/br&gt;&lt;/center&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&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;
Unlike last year, we’re trying to organize this with &lt;a href=&quot;https://meetup.com&quot;&gt;Meetup.com&lt;/a&gt;, if you experience any difficulties RSVPing let us know
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr /&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/29/hudson-user-meet-up-in-copenhagen-oslo/</id>
<title>Hudson User Meet-up in Copenhagen/Oslo</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/29/hudson-user-meet-up-in-copenhagen-oslo/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<summary>
I&#8217;ll be in Copenhagen from 9/5-9/7 and in Oslo 9/8-9/9 to present in JavaZone. I&#8217;d like to take advantage of the opportunities and have user meet-up events in those cities. Depending on the number of participants, it could be just a drink in a bar, or a talk in a meeting room.


So if you are:




in those cities,


available in the evening of 9/6, 9/8, or 9/9, and


willing to attend such an event,




... then please let me know.


Also, if you have an office in those cities and willing to provide a space for an event, that would be extra appreciated!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’ll be in Copenhagen from 9/5-9/7 and in Oslo 9/8-9/9 to present in JavaZone. I’d like to take advantage of the opportunities and have user meet-up events in those cities. Depending on the number of participants, it could be just a drink in a bar, or a talk in a meeting room.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So if you are:&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;in those cities,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;available in the evening of 9/6, 9/8, or 9/9, and&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;willing to attend such an event,&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;... then please &lt;a href=&quot;mailto:kohsuke@infradna.com&quot;&gt;let me know.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Also, if you have an office in those cities and willing to provide a space for an event, that would be extra appreciated!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/26/cloudbees-announce-hudson-as-a-service/</id>
<title>CloudBees announce Hudson-as-a-Service</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/26/cloudbees-announce-hudson-as-a-service/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='core'></category>
<summary>
CloudBees announced the beta availability of their new Hudson-as-a-service "HaaS" today. I see this as yet another validation to Hudson, and as such, I welcome this new addition to the community and wish them well! — more companies betting on Hudson means we&#8217;ll get more investment to the project, which is all goodness for Hudson users. It&#8217;s been 5 months since I left Oracle to start InfraDNA, and I was initially worried about a possible negative impact on adoption, but instead Hudson has shown with no sign of slowing down (see picture on the right, from Andrew&#8217;s report, which shows...
</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://hudson-labs.org/sites/default/files/usage-stats.gif&quot; alt=&quot;image&quot; /&gt; &lt;a href=&quot;https://cloudbees.com/&quot;&gt;CloudBees&lt;/a&gt; announced the beta availability of their new Hudson-as-a-service &quot;HaaS&quot; today. I see this as &lt;a href=&quot;https://labs.creativecommons.org/2010/08/12/welcome-hudson-to-creative-commons/&quot;&gt;yet&lt;/a&gt; &lt;a href=&quot;https://hudson-mobi.com/&quot;&gt;another&lt;/a&gt; &lt;a href=&quot;https://about.digg.com/blog/digg-technical-talks-kohsuke-kawaguchi&quot;&gt;validation&lt;/a&gt; to Hudson, and as such, I welcome this new addition to the community and wish them well! — more companies betting on Hudson means we’ll get more investment to the project, which is all goodness for Hudson users. It’s been 5 months since I left Oracle to start &lt;a href=&quot;https://infradna.com/&quot;&gt;InfraDNA&lt;/a&gt;, and I was initially worried about a possible negative impact on adoption, but instead Hudson has shown with no sign of slowing down (see picture on the right, from Andrew’s report, which shows # of estimated active installations that participates to our usage stats survey). And &lt;a href=&quot;https://infradna.com/&quot;&gt;InfraDNA&lt;/a&gt; is going well too - we’ve helped &lt;a href=&quot;https://infradna.com/customers&quot;&gt;companies big and small&lt;/a&gt; to improve their Hudson usage/adoption, and &lt;a href=&quot;https://infradna.com/ichci&quot;&gt;our commercial value-add Hudson distribution&lt;/a&gt; is getting plenty of interest.&lt;br&gt;
Hosted Hudson offers an interesting trade-off, compared to on-premises Hudson. On the plus side, given the current hourly pricing of public clouds like EC2 and Rackspace, you get a better pricing model, as CloudBees charge by minutes. You also get rid of machines and upfront cost, which is great for small business. On top of that, you can also expect them to gradually develop more value-adds and better integration to various other pieces, which can get really interesting.&lt;br&gt;
On the down side, you have less control over the environment that runs the builds, and you do not have access back to your intranet environment (think databases that you need to talk to, for example.) Also, in the current pricing (8.5 cents/hour of EC2 vs 1 cent/minute of CB), if your build takes longer than 9 minutes, you’ll save more by just using Hudson EC2 plugin.&lt;br&gt;
On a related note, I think one of the sweet spots is Hudson that’s well integrated with on-premises cloud solution. As you can see in &lt;a href=&quot;https://www.liferay.com/web/brian.chan/blog/-/blogs/improving-quality-with-100-hudson-test-servers&quot;&gt;the discussion with Liferay Hudson setup&lt;/a&gt;, with sufficient load it gets cheaper to have your own hardware, and many companies need some degree of control to the build/test environment that matches with their production environment. Plus with those on-premises virtualized environments, you can do &lt;a href=&quot;https://www.cs.toronto.edu/~brudno/public/publication/2009-04-01_lagar2009snowflock/&quot;&gt;snapshots and forks&lt;/a&gt;, which can be made to do &lt;strong&gt;very&lt;/strong&gt; interesting things.&lt;br&gt;
Finally, I think the part that everyone can agree on is that the elasticity of build environment is hugely useful to the CI environment, as &lt;a href=&quot;https://java.sun.com/javaone/2009/articles/gen_hudson.jsp&quot;&gt;I discussed in my JavaOne 2009 talk&lt;/a&gt; (&lt;a href=&quot;https://wiki.jenkins.io/download/attachments/37323793/Hudson+J1+2009.ppt?version=1&amp;amp;modificationDate=1244127211000&quot;&gt;slides&lt;/a&gt;.) I’m very happy to see that the foundation work we’ve made in Hudson for this is getting validated more and more, and I think the added elasticity will drive a lot more changes in Hudson and more broadly into the way we develop software. It is an exciting time!&lt;br /&gt;
&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/br&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/20/hudson-sauce-ondemand-webinar/</id>
<title>Hudson / Sauce OnDemand webinar</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-20T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/20/hudson-sauce-ondemand-webinar/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='news'></category>
<summary>
On September 1st, I&#8217;ll be presenting in a Sauce Labs webinar about Hudson and Sauce OnDemand. The talk will discuss how Hudson can be used with Sauce OnDemand, naturally, but it&#8217;ll also cover broader Hudson/Selenium integrations.


Please register to this free event, and looking forward to seeing to you virtually....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On September 1st, I’ll be &lt;a href=&quot;https://saucelabs.com/about/webinars#webinar-hudson&quot;&gt;presenting in a Sauce Labs webinar about Hudson and Sauce OnDemand&lt;/a&gt;. The talk will discuss how Hudson can be used with Sauce OnDemand, naturally, but it’ll also cover broader Hudson/Selenium integrations.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Please &lt;a href=&quot;https://www1.gotomeeting.com/register/789261128&quot;&gt;register to this free event&lt;/a&gt;, and looking forward to seeing to you virtually.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/17/hudson-anonymous-usage-data/</id>
<title>Hudson Anonymous Usage Data</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/17/hudson-anonymous-usage-data/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='just for fun'></category>
<category term='meta'></category>
<category term='news'></category>
<category term='plugins'></category>
<category term='jenkinsci'></category>
<summary>
In late 2008, the Hudson team released version 1.264 which added an anonymous reporting feature (you can opt-out in the "Manage Hudson" screen). The reporting feature has been sending information back to the Hudson team to help us understand how Hudson is used in aggregate; the info being reported includes the number of jobs configured, agent configurations, what plugins (and what versions of those plugins) are installed, and more. This data has not been available publicly until now! The raw data needed to be decrypted and scrubbed of any potentially identifying information, such as non-public plugin names or usernames in...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In late 2008, the Hudson team released version 1.264 which added an anonymous reporting feature (you can opt-out in the &quot;Manage Hudson&quot; screen). The reporting feature has been sending information back to the Hudson team to help us understand how Hudson is used in aggregate; the info being reported includes the number of jobs configured, agent configurations, what plugins (and what versions of those plugins) are installed, and more. This data has not been available publicly until now! The raw data needed to be decrypted and scrubbed of any potentially identifying information, such as non-public plugin names or usernames in snapshot versions. We’ve finally scrubbed the data and are &lt;strong&gt;making it available&lt;/strong&gt;!&lt;br&gt;
The data is currently in monthly JSON bundles, organized by unique install key. We’ve filtered out reports of installations without any jobs configured, as well as any installations with only one report in a given month.&lt;br&gt;
If you’d like access to the data, please send an email to &lt;a href=&quot;mailto:dev@hudson.dev.java.net&quot;&gt;dev@hudson.dev.java.net&lt;/a&gt; or jump onto the &lt;a href=&quot;https://hudson-labs.org/content/chat&quot;&gt;IRC channel&lt;/a&gt; and ask - we’ll send you the URL and a private username/password which you’ll need to access the info. We’re also planning to do more analysis of the data ourselves, for now feast your eyes on &lt;a href=&quot;https://bit.ly/aC6wIo&quot;&gt;this spreadsheet&lt;/a&gt;, which shows the total number of unique installations seen per month and the number of unique installations of each publicly available plugin per month.&lt;br /&gt;
&lt;/br&gt;&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/17/hudson-1-372-sets-sail/</id>
<title>Hudson 1.372 sets sail</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/17/hudson-1-372-sets-sail/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='releases'></category>
<summary>
Last Friday the Hudson team rolled out a small 1.372 with two enhancements following the critical 1.371 release on Monday. Not a whole lot to say about this release other than go get it!


Enhancements



Persist matrix-based security settings in a consistent order (issue 7138)


Jobs can now use boolean expression over labels to control where they run.





You can go grab the latest .war file straight from our OSL mirror or if you&#8217;re using a native package, use your package manager to upgrade....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last Friday the Hudson team rolled out a small 1.372 with two enhancements following the &lt;strong&gt;critical&lt;/strong&gt; &lt;a href=&quot;https://www.jenkins.io/blog/2010/08/10/big-security-fix-hudson-1-371-released/&quot;&gt;1.371 release on Monday&lt;/a&gt;. Not a whole lot to say about this release other than go get it!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Persist matrix-based security settings in a consistent order (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/7138&quot;&gt;issue 7138&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jobs can now use boolean expression over labels to control where they run.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://ftp.osuosl.org/pub/hudson/war/1.372/hudson.war&quot;&gt;latest .war file&lt;/a&gt; straight from our &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSL mirror&lt;/a&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/16/hudsonmobi-2-0-hits-the-android-market/</id>
<title>HudsonMobi 2.0 hits the Android Market</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/16/hudsonmobi-2-0-hits-the-android-market/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='news'></category>
<category term='releases'></category>
<summary>
The folks over at LMT Software just released their HudsonMobi 2.0 to the Android market. This release of HudsonMobi brings a lot of the features to Android that iPhone/iPad users of HudsonMobi have enjoyed for some time.


Features unleashed to Android users in this revision of the app are:




Full Android user-experience with Menu and back controls


Embedded artifact viewer! For archived build artifacts that are text-based, you can view them directly on your handset.


Access to the build history and changes for a job.


Quick and easy access to a job&#8217;s last build\


Restyled and updated user-experience, making HudsonMobi "feel better" on an Android device










If...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The folks over at &lt;a href=&quot;https://web.archive.org/web/20140106081207/http://lmitsoftware.com/&quot;&gt;LMT Software&lt;/a&gt; just released their HudsonMobi &lt;strong&gt;2.0&lt;/strong&gt; to the Android market. This release of HudsonMobi brings a lot of the features to Android that iPhone/iPad users of HudsonMobi have enjoyed for some time.&lt;center&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/sites/default/files/hudsonmobi-v2-0-android1.png&quot; alt=&quot;hudsonmobi v2 0 android1&quot; /&gt;&lt;/span&gt;&lt;/center&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Features unleashed to Android users in this revision of the app are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Full Android user-experience with Menu and back controls&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Embedded artifact viewer!&lt;/strong&gt; For archived build artifacts that are text-based, you can view them directly on your handset.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Access to the build history and changes for a job.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quick and easy access to a job’s last build\&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restyled and updated user-experience, making HudsonMobi &quot;feel better&quot; on an Android device&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&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/sites/default/files/hudsonmobi-qr_0.png&quot; alt=&quot;hudsonmobi qr 0&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you want to get HudsonMobi for &lt;strong&gt;free&lt;/strong&gt; from the Android Market, whip our your phone and take a picture of its QR code:&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/11/quiet-period-feature/</id>
<title>Quiet Period Feature</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/11/quiet-period-feature/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='tutorial'></category>
<summary>
Commits often come in a burst. This seems to happen mainly for two reasons&#8201;&#8212;&#8201;people sometimes forget to commit some files, and in the tranquility of waiting for your SCM to finish a commit, people sometimes realize the problems in the commit and they quickly make follow-up changes. The conventional wisdom is that the CI server should wait for the burst to finish before attempting a build. This is said to reduce the chance of having broken build, and it is also sometimes useful in reducing the average turn-around time for builds that take longer.


As such, Hudson is capable of waiting...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Commits often come in a burst. This seems to happen mainly for two reasons — people sometimes forget to commit some files, and in the tranquility of waiting for your SCM to finish a commit, people sometimes realize the problems in the commit and they quickly make follow-up changes. The conventional wisdom is that the CI server should wait for the burst to finish before attempting a build. This is said to reduce the chance of having broken build, and it is also sometimes useful in reducing the average turn-around time for builds that take longer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As such, Hudson is capable of waiting for a commit burst to be over before it triggers a new build, and this feature is called &quot;quiet period.&quot; There are two parts in Hudson that interacts with the quiet period. One is the SCM polling behavior and the other is the queue.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The queue portion of the quiet period is straight-forward. When a build is scheduled into the queue with quiet period, the build will sit in the queue until the quiet period expires. If during this period, additional attempts are made to put the same build in the queue, the quiet period resets to its initial value. For example, if the quiet period is 5 minutes, and the build is put into the queue 9:00am and 9:03am, the actual build will only happen after 9:08am. Thus another way to think of the quiet period is that you are requiring a certain period of inactivity.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The above applies to all the mechanisms in Hudson that puts builds into the queue. This includes REST API call, CLI call, downstream triggers, and SCM pollings. So if you implement some kind of a &quot;push&quot; mechanism in your SCM to notify Hudson of a new commit, then you get the desired effect by just setting the quiet period in Hudson, and those push scripts don’t have to do anything tricky.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is also possible for some of those to override the quiet period configured in the project. For example, when you click &quot;Build Now&quot; button in your browser, your browser is making a REST API call, but with the quiet period of zero. I used to run a &quot;push&quot; script that looks into a commit message and overrides the quiet period by taking advantages of this feature.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The other portion of the quiet period that often matters is the SCM polling behaviour. Up until Hudson 1.346, the way Hudson defined the SCM abstraction made it impossible for SCMs to correctly report newly detected commits since the last polling. Instead, it was only possible to report if the repository is newer than the workspace. As a result, if the polling interval is set shorter than the quiet period, the build stayed in the quiet period forever. This was tracked in HUDSON-2180.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson 1.346 fixed this issue, and so if you are using a newer version of Hudson and SCM plugins that take advantage of this improvement, then everything works as expected. Otherwise, avoid setting quiet period longer than the polling interval.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/10/big-security-fix-hudson-1-371-released/</id>
<title>Big Security Fix! Hudson 1.371 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/10/big-security-fix-hudson-1-371-released/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='news'></category>
<category term='releases'></category>
<category term='jenkinsci'></category>
<summary>
Hot on the heels of Hudson 1.370, which was released last Friday, the Hudson team released 1.371 which addresses a critical vulnerability in all Hudson versions prior to 1.371. The vulnerability was disclosed by InfraDNA in the following security advisory, which details the issue:




This critical vulnerability allows an attacker to use CLI commands that they are otherwise unauthorized for. CLI commands can perform various administrative operations.




It is advised that all Hudson instances be upgraded immediately to avoid data loss or other ill effects from this issue. If you&#8217;re upgrading from a version earlier than 1.370, you can consult the changelog...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hot on the heels of Hudson 1.370, which was released last Friday, the Hudson team released 1.371 which addresses a &lt;strong&gt;critical vulnerability&lt;/strong&gt; in &lt;strong&gt;all&lt;/strong&gt; Hudson versions prior to 1.371. The vulnerability was disclosed by &lt;a href=&quot;https://infradna.com&quot;&gt;InfraDNA&lt;/a&gt; in the &lt;a href=&quot;https://infradna.com/content/security-advisory-2010-08-09&quot;&gt;following security advisory&lt;/a&gt;, which details the issue:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This critical vulnerability allows an attacker to use CLI commands that they are otherwise unauthorized for. CLI commands can perform various administrative operations.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is advised that &lt;strong&gt;all&lt;/strong&gt; Hudson instances be upgraded immediately to avoid data loss or other ill effects from this issue. If you’re upgrading from a version earlier than 1.370, you can consult the &lt;a href=&quot;https://www.jenkins.io/changelog&quot;&gt;changelog&lt;/a&gt; for details on the other bug fixes and enhancements covered by the upgrade of your version to 1.371.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you run a Hudson instance, it is recommended that Hudson system admins subscribe to either the &lt;a href=&quot;https://feeds.feedburner.com/hudson-security-advisories&quot;&gt;security advisories RSS feed&lt;/a&gt; or the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/#jenkinsci-advisories-googlegroups-com&quot;&gt;advisories@ mailing list&lt;/a&gt;
---&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://ftp.osuosl.org/pub/hudson/war/1.371/hudson.war&quot;&gt;latest .war file&lt;/a&gt; straight from our &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSL mirror&lt;/a&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/08/02/dogfooding-hudson-were-looking-for-slaves/</id>
<title>Dogfooding Hudson - We&#39;re Looking for Agents!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-08-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/08/02/dogfooding-hudson-were-looking-for-slaves/" />
<author>
<name>abayer</name>
</author>
<category term='infrastructure'></category>
<category term='core'></category>
<category term='meta'></category>
<category term='jenkinsci'></category>
<summary>
As you may have noticed, thanks to the link on this and the other pages here at hudson-labs.org, the Hudson development community has recently introduced ci.hudson-labs.org, the official Hudson-on-Hudson instance. We&#8217;re currently building Hudson proper, the Hudson core RC branch, individual builds for the various Hudson plugins and Gerrit, as well as various libraries and infrastructure jobs Hudson depends on.
We&#8217;re currently running all those builds on a dedicated Linux agent, generously provided to the Hudson project by Digg, my employer. This has been great - except for the day when I&#8217;d just added all the individual plugin jobs for the...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you may have noticed, thanks to the link on this and the other pages here at &lt;a href=&quot;https://hudson-labs.org&quot;&gt;hudson-labs.org&lt;/a&gt;, the Hudson development community has recently introduced &lt;a href=&quot;https://ci.hudson-labs.org&quot;&gt;ci.hudson-labs.org&lt;/a&gt;, the official Hudson-on-Hudson instance. We’re currently building &lt;a href=&quot;https://ci.hudson-labs.org/job/hudson_main_trunk/&quot;&gt;Hudson proper&lt;/a&gt;, the &lt;a href=&quot;https://ci.hudson-labs.org/job/hudson_rc_branch/&quot;&gt;Hudson core RC branch&lt;/a&gt;, individual builds for &lt;a href=&quot;https://ci.hudson-labs.org/view/Plugins/&quot;&gt;the various Hudson plugins&lt;/a&gt; and &lt;a href=&quot;https://ci.hudson-labs.org/job/gerrit_master/&quot;&gt;Gerrit&lt;/a&gt;, as well as various &lt;a href=&quot;https://ci.hudson-labs.org/view/Libraries/&quot;&gt;libraries&lt;/a&gt; and &lt;a href=&quot;https://ci.hudson-labs.org/view/Infrastructure/&quot;&gt;infrastructure jobs&lt;/a&gt; Hudson depends on.&lt;br&gt;
We’re currently running all those builds on a dedicated Linux agent, generously provided to the Hudson project by &lt;a href=&quot;https://digg.com&quot;&gt;Digg&lt;/a&gt;, my employer. This has been great - except for the day when I’d just added all the individual plugin jobs for the first time, we haven’t had real problems with capacity. But we are limited in the environments we can run our tests on as a result of only having a Linux agent. We’re currently playing with a temporary Windows agent, but we’d really like to have at least one more permanent Windows agent, and a Mac agent as well, so that we can run Hudson’s core integration tests on those platforms as well. Since this is Hudson we’re talking about, we don’t need the agent to be in any given physical location - we just need it to be running the agent process and talking to our server. If you’re interested in helping us out with this, please contact me at andrew dot bayer at gmail dot com. Thanks!&lt;br /&gt;
&lt;/br&gt;&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/28/hosting-your-hudson-plugin-at-github/</id>
<title>Hosting your Hudson plugin at Github</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/28/hosting-your-hudson-plugin-at-github/" />
<author>
<name>abayer</name>
</author>
<category term='development'></category>
<category term='meta'></category>
<category term='plugins'></category>
<category term='tutorial'></category>
<category term='jenkinsci'></category>
<summary>
For as long as Hudson&#8217;s had a plugin model and development community, we&#8217;ve provided source code and binary hosting through our Subversion repo at java.net. But what if you&#8217;re a plugin developer and you don&#8217;t want to use Subversion? Well, we have an alternative for your source code: host it with Hudson on GitHub.





To get this in place, send an email to dev@hudson.dev.java.net (or ask in the IRC channel) asking to get a repository created for your plugin at Github. Make sure to include the name of the plugin and your Github username (and the Github usernames of any other...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For as long as Hudson’s had a plugin model and development community, we’ve provided &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hosting+Plugins&quot;&gt;source code and binary hosting&lt;/a&gt; through our Subversion repo at &lt;a href=&quot;https://java.net&quot;&gt;java.net&lt;/a&gt;. But what if you’re a plugin developer and you don’t want to use Subversion? Well, we have an alternative for your source code: host it with &lt;a href=&quot;https://github.com/hudson&quot;&gt;Hudson on GitHub&lt;/a&gt;.&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/sites/default/files/octocat.png&quot; alt=&quot;Octocat!&quot; width=&quot;180&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To get this in place, send an email to &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mailing+List&quot;&gt;dev@hudson.dev.java.net&lt;/a&gt; (or ask in &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/IRC+Channel&quot;&gt;the IRC channel&lt;/a&gt;) asking to get a repository created for your plugin at Github. Make sure to include the name of the plugin and your Github username (and the Github usernames of any other developers who’ll be pushing to your plugin’s repo). If your plugin is already in Github, include the URL for the existing repo so that we can fork it. One of the Hudson admins will create the repository (forking if appropriate) and add the user(s) to the list of users with push access to the Hudson-hosted repositories at Github. Once you hear back from them, you’ll be able to push code to the new repository.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You will need to make a few changes to your plugin’s POM, as compared to what works for a plugin POM in the java.net Subversion tree.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, add the following to the &lt;code&gt;++&lt;/code&gt; section:&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;&amp;lt;plugin&amp;gt;
  &amp;lt;groupid&amp;gt;org.apache.maven.plugins&amp;lt;/groupid&amp;gt;
  &amp;lt;artifactid&amp;gt;maven-release-plugin&amp;lt;/artifactid&amp;gt;
  &amp;lt;version&amp;gt;2.0&amp;lt;/version&amp;gt;
  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupid&amp;gt;org.apache.maven.scm&amp;lt;/groupid&amp;gt;
      &amp;lt;artifactid&amp;gt;maven-scm-provider-gitexe&amp;lt;/artifactid&amp;gt;
      &amp;lt;version&amp;gt;1.3&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
&amp;lt;/plugin&amp;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 needed to make sure we’re overriding the parent POM’s SCM provider settings. Next, add the following to the &lt;code&gt;++&lt;/code&gt; section:&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;&amp;lt;extensions&amp;gt;
  &amp;lt;extension&amp;gt;
    &amp;lt;groupid&amp;gt;org.jvnet.wagon-svn&amp;lt;/groupid&amp;gt;
    &amp;lt;artifactid&amp;gt;wagon-svn&amp;lt;/artifactid&amp;gt;
    &amp;lt;version&amp;gt;1.9&amp;lt;/version&amp;gt;
  &amp;lt;/extension&amp;gt;
&amp;lt;/extensions&amp;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 needed because we’re still going to be using wagon-svn to deploy the artifacts in the release process. Lastly, add an &lt;code&gt;` section, within the `&lt;/code&gt; section of the POM, like the following:&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;&amp;lt;scm&amp;gt;
  &amp;lt;connection&amp;gt;scm:git:git://github.com/hudson/your-plugin-repo.git&amp;lt;/connection&amp;gt;
  &amp;lt;developerconnection&amp;gt;scm:git:git@github.com:hudson/your-plugin-repo.git&amp;lt;/developerconnection&amp;gt;
  &amp;lt;url&amp;gt;https://github.com/hudson/your-plugin-repo&amp;lt;/url&amp;gt;
&amp;lt;/scm&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As with the first section, this is needed to override the default SCM settings in the parent POM. Make sure to change &quot;your-plugin-repo&quot; to your actual plugin repository name, of course! It’d also be a good idea to put a link to your Github repo on your plugin’s wiki page at &lt;a href=&quot;https://wiki.jenkins.io&quot;&gt;the Hudson wiki&lt;/a&gt;, since the default source link will go to Subversion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now, with these changes in place, committed and pushed to the master branch in your plugin’s repository, you should be able to run &quot;mvn release:prepare release:perform&quot; just as you would if the plugin were hosted in Subversion, with your plugin showing up in the Update Center within a few hours. Be sure that you’ve configured the login information for the java.net Maven repository, as detailed &lt;a href=&quot;https://javanettasks.dev.java.net/nonav/maven/config.html&quot;&gt;here&lt;/a&gt; - this is still needed for plugins hosted at and released from Github, since Hudson’s Maven repository still lives at java.net. If you run into any issues releasing your plugin from Github, first be sure to review the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hosting+Plugins&quot;&gt;wiki page on plugin hosting&lt;/a&gt;, which addresses many of the issues you may encounter when running the Maven release plugin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re still stumped, feel free to email &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mailing+List&quot;&gt;the Hudson developer list&lt;/a&gt; or ask in &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/IRC+Channel&quot;&gt;the IRC channel&lt;/a&gt; for help.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/27/hudson-1-368-released/</id>
<title>Hudson 1.368 Released!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/27/hudson-1-368-released/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='news'></category>
<category term='releases'></category>
<category term='jenkinsci'></category>
<summary>
Regular readers will recognize that I&#8217;ve been slacking off quite a bit lately with my release announcements, my apologies. With the release of 1.368 on Sunday, which fixed a few fairly important bugs, I figured I&#8217;d dusty off my blogging fedora and give this a shot.


This release has three bug fixes in it which were causing some issues for some users, particularly those deploying Hudson inside the recently released Tomcat 7.0 (see issue 6738).


Hudson users utilizing the JDK auto-installation feature between different platforms may have been affected by issue 6880 which was also fixed in this release.


Bringing up the rear...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regular readers will recognize that I’ve been slacking off quite a bit lately with my release announcements, my apologies. With the release of 1.368 on Sunday, which fixed a few fairly important bugs, I figured I’d dusty off my blogging fedora and give this a shot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release has three bug fixes in it which were causing some issues for some users, particularly those deploying Hudson inside the recently released &lt;a href=&quot;https://tomcat.apache.org/tomcat-7.0-doc/changelog.html&quot;&gt;Tomcat 7.0&lt;/a&gt; (see &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6738&quot;&gt;issue 6738&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson users utilizing the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Tool+Auto-Installation&quot;&gt;JDK auto-installation&lt;/a&gt; feature between different platforms may have been affected by &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6880&quot;&gt;issue 6880&lt;/a&gt; which was also fixed in this release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Bringing up the rear is the fix to &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/7004&quot;&gt;issue 7004&lt;/a&gt; which detailed a few discrepancies between the &lt;code&gt;/buildWithParameters&lt;/code&gt; and the &lt;code&gt;/build&lt;/code&gt; remote APIs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re not affected by these issues, you may want to wait for the soon-to-be-released 1.369 which has &lt;strong&gt;even more&lt;/strong&gt; juicy bug fixes in it (with a dash of enhancements) to upgrade.
---&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://ftp.osuosl.org/pub/hudson/war/1.368/hudson.war&quot;&gt;latest .war file&lt;/a&gt; straight from our &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSL mirror&lt;/a&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/22/continuous-deployment-on-the-new-digg/</id>
<title>Continuous Deployment on the new Digg</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/22/continuous-deployment-on-the-new-digg/" />
<author>
<name>abayer</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='guest post'></category>
<category term='links'></category>
<category term='plugins'></category>
<category term='jenkinsci'></category>
<summary>
In my capacity as Build Guy at Digg, I&#8217;ve written up a blog post on our new continuous deployment/code review/pre-tested commit workflow. We&#8217;re using a combination of Hudson, Git and Gerrit, Selenium and more to make sure that every change going to Digg&#8217;s new site has been thoroughly tested.
Read the whole post, with all the juicy details over on Digg&#8217;s Technology Blog!...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my capacity as Build Guy at &lt;a href=&quot;https://digg.com&quot;&gt;Digg&lt;/a&gt;, I’ve written up a blog post on our new continuous deployment/code review/pre-tested commit workflow. We’re using a combination of Hudson, Git and &lt;a href=&quot;https://code.google.com/p/gerrit/&quot;&gt;Gerrit&lt;/a&gt;, &lt;a href=&quot;https://seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt; and more to make sure that every change going to Digg’s &lt;a href=&quot;https://new.digg.com&quot;&gt;new site&lt;/a&gt; has been thoroughly tested.&lt;br&gt;
&lt;strong&gt;Read the whole post, with all the juicy details over &lt;a href=&quot;https://about.digg.com/blog/continuous-deployment-code-review-and-pre-tested-commits-digg4&quot;&gt;on Digg’s Technology Blog&lt;/a&gt;!&lt;/strong&gt;&lt;/br&gt;
&lt;/p&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/21/hudson-with-selenium-and-sauce-on-demand-videos/</id>
<title>Hudson with Selenium and Sauce On-Demand Videos</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-21T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/21/hudson-with-selenium-and-sauce-on-demand-videos/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='interview'></category>
<category term='meetup'></category>
<category term='jenkinsci'></category>
<summary>
A few weeks ago, Kohsuke stopped by the San Francisco Selenium Meetup hosted by Sauce Labs to talk about all things Selenium and Hudson related (with a bit of Sauce in there too).


The good folks over at Sauce Labs have gotten around to posting some of the videos taken with Kohsuke.


Instead of embed the videos, I wanted to directly link to the post and make sure that you all went over to check out Sauce Labs, they&#8217;re up to some interesting things over there....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few weeks ago, Kohsuke stopped by the &lt;a href=&quot;https://meetup.com/seleniumsanfrancisco&quot;&gt;San Francisco Selenium Meetup&lt;/a&gt; hosted by &lt;a href=&quot;https://saucelabs.com&quot;&gt;Sauce Labs&lt;/a&gt; to talk about all things Selenium and Hudson related (with a bit of Sauce in there too).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The good folks over at Sauce Labs have gotten around to posting some of the videos taken with Kohsuke.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of embed the videos, I wanted to directly &lt;strong&gt;&lt;a href=&quot;https://saucelabs.com/blog/index.php/2010/07/sfse-meetup-videos-hudson-with-selenium-sauce-ondemand/&quot;&gt;link to the post&lt;/a&gt;&lt;/strong&gt; and make sure that you all went over to check out Sauce Labs, they’re up to some interesting things over there.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/13/monitor-hudson-from-your-android/</id>
<title>Monitor Hudson from your Android</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/13/monitor-hudson-from-your-android/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='releases'></category>
<summary>
So you&#8217;ve got your fancy Android cell phone and you&#8217;re thinking to yourself "besides feeling smugly superior to iPhone users, what can I do with this thing?" Perhaps you should be considering using it as a phone but if that&#8217;s too boring, check out the new and improved Hudson Mood widget for Android! The latest release brings support for multiple servers and fancier graphics.


If you&#8217;re interested in installing the widget, search for "Hudson Mood" in the Android Market, and be sure to thank Siarhei Dudzin for creating the widget!...
</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/sites/default/files/mood_widget-good.png&quot; alt=&quot;mood widget good&quot; /&gt; So you’ve got your fancy Android cell phone and you’re thinking to yourself &quot;besides feeling smugly superior to iPhone users, what can I do with this thing?&quot; Perhaps you should be considering using it as a &lt;em&gt;phone&lt;/em&gt; but if that’s too boring, check out the new and improved &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hudson+Mood+widget+for+Android&quot;&gt;Hudson Mood widget for Android&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;! The latest release brings support for multiple servers and fancier graphics.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in installing the widget, search for &quot;Hudson Mood&quot; in the Android Market, and be sure to thank &lt;a href=&quot;https://sdudzin.blogspot.com/&quot;&gt;Siarhei Dudzin&lt;/a&gt; for creating the widget!&lt;center&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.jenkins.io/sites/default/files/mood_widget-settings.png&quot; alt=&quot;mood widget settings&quot; /&gt;&lt;/span&gt;&lt;/center&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/12/updated-chrome-extension/</id>
<title>Updated Chrome Extension</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/12/updated-chrome-extension/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='releases'></category>
<summary>
The developer for the Hudson extension for Google Chrome, Sebastian Sanitz, emailed the users@ list today to inform the community of an update to his fantastic extension.


Sebastian&#8217;s extension monitors ci.hudson-labs.org by default, but the URL and polling interval are both trivial to change. When any of the builds in the configured URL fail, you&#8217;ll see a red "Fail" indicator, otherwise green "Ok".





If you&#8217;re interested in contributing to the plugin, good news! It&#8217;s open source! You can find it on GitHub....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The developer for the Hudson extension for Google Chrome, &lt;a href=&quot;https://github.com/sanitz&quot;&gt;Sebastian Sanitz&lt;/a&gt;, emailed the &lt;code&gt;users@&lt;/code&gt; list today to inform the community of an update to his &lt;strong&gt;&lt;a href=&quot;https://chrome.google.com/extensions/detail/hfncndbfmjmafoodaigpoicpbdfhhgdo&quot;&gt;fantastic extension&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Sebastian’s extension monitors &lt;a href=&quot;https://ci.hudson-labs.org&quot;&gt;ci.hudson-labs.org&lt;/a&gt; by default, but the URL and polling interval are both trivial to change. When any of the builds in the configured URL fail, you’ll see a red &quot;Fail&quot; indicator, otherwise green &quot;Ok&quot;.&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/sites/default/files/images/chrome_extension_success.png&quot; alt=&quot;chrome extension success&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in contributing to the plugin, good news! It’s open source! You can find it &lt;a href=&quot;https://github.com/sanitz/hudson-chrome-extension&quot;&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/08/a-python-love-story-virtualenv-and-hudson/</id>
<title>A Python Love Story: Virtualenv and Hudson</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/08/a-python-love-story-virtualenv-and-hudson/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<category term='tutorial'></category>
<summary>
Over the past year Hudson has grown tremendously, both within the Java community and outside of it. Partially thanks to (Titus Brown)'s PyCon 2010 Atlanta coverage of continuous integration for Python (which we&#8217;ve covered before), Hudson has made great strides within the Python community as well. In my experience, the majority of Python developers are not using Hudson to build anything, unless they have C extensions, but rather to test their packages, which presents its own set of specific requirements for jobs. Jobs for testing Python code need to be able to reliaby reproduce an environment with the same set...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past year Hudson has grown tremendously, both within the Java community and outside of it. Partially thanks to (&lt;a href=&quot;https://twitter.com/ctitusbrown&quot;&gt;Titus Brown&lt;/a&gt;)&#39;s PyCon 2010 Atlanta coverage of continuous integration for Python (which we’ve &lt;a href=&quot;https://www.jenkins.io/content/hudson-pycon&quot;&gt;covered before&lt;/a&gt;), Hudson has made great strides within the Python community as well. In my experience, the majority of Python developers are not using Hudson to &lt;strong&gt;build&lt;/strong&gt; anything, unless they have C extensions, but rather to &lt;strong&gt;test&lt;/strong&gt; their packages, which presents its own set of specific requirements for jobs. Jobs for testing Python code need to be able to reliaby reproduce an environment with the same set of dependencies from one run to the next in order to provide consistent testing. Unlike their Java counterparts, Python developers cannot rely on a powerful system like &lt;a href=&quot;https://maven.apache.org/&quot;&gt;Maven2&lt;/a&gt; for enumerating build/test targets or defining their project’s dependencies in their jobs; fortunately, w e can have something close: &lt;a href=&quot;https://pypi.python.org/pypi/virtualenv&quot;&gt;virtualenv&lt;/a&gt; and &lt;a href=&quot;https://pypi.python.org/pypi/pip&quot;&gt;pip&lt;/a&gt;. Virtualenv does exactly what you might expect it to, it creates a &quot;virtual environment&quot; with custom &lt;code&gt;site-packages&lt;/code&gt; directory, and modified &lt;code&gt;python&lt;/code&gt; executable. Using virtualenv you can create a staged environment to use for running unit and integration tests. Adding pip alongside that and you have a &lt;strong&gt;fantastic&lt;/strong&gt; Python package manager/installer to use with the virtual environment. Below, I’ve outlined the steps required to use virtualenv and pip to &lt;strong&gt;automatically&lt;/strong&gt; manage a custom environment for your Python jobs.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;the-recipe&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#the-recipe&quot; /&gt;The Recipe&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this recipe to work, you should make sure that your agent machines all have &lt;code&gt;virtualenv&lt;/code&gt; and &lt;code&gt;pip&lt;/code&gt; installed and accessible from your agent agent’s &lt;code&gt;$PATH&lt;/code&gt;. For Mac OS X users, &lt;code&gt;sudo easy_install virtualenv&lt;/code&gt; should do the trick, Linux users should be able to run &lt;code&gt;sudo [aptitude/yum/zypper] install python-virtualenv&lt;/code&gt; with your respective package manager. You will also need the &lt;a href=&quot;https://plugins.jenkins.io/setenv&quot;&gt;SetEnv Plugin&lt;/a&gt; installed in Hudson.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-1&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-1&quot; /&gt;Step 1&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Inside of the job’s configuration page (&lt;a href=&quot;https://hudson/job/configure&quot;&gt;http;//hudson/job/configure&lt;/a&gt;), we need to define an environment variable for the job. Using the SetEnv plugin, define a new &lt;code&gt;$PATH&lt;/code&gt;: `PATH=.env/bin:$PATH&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What this will do is modify the &lt;code&gt;$PATH&lt;/code&gt; environment variable for all of the &quot;Execute shell&quot; build steps in your job. As you might have guessed, we’re going to install the virtualenv in &lt;code&gt;.env&lt;/code&gt; in the workspace root directory.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-2&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-2&quot; /&gt;Step 2&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To set up the virtualenv, you want to add a build step of type &quot;Execute shell&quot; and paste the following commands into the text area:&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;if [ -d &quot;.env&quot; ]; then
  echo &quot;**&amp;gt; virtualenv exists&quot;
else
  echo &quot;**&amp;gt; creating virtualenv&quot;
  virtualenv .env
fi&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This will create a virtualenv the first time the job runs on a particular agent, a virtualenv that will persist until the workspace is cleared. Since we’re going to install dependencies in the virtualenv, we want to keep it around between jobs to reduce the amount of network hits to download packages.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;step-3&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#step-3&quot; /&gt;Step 3&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With our virtualenv and our &lt;code&gt;$PATH&lt;/code&gt; properly set up, the job can now properly install dependencies into its virtualenv, this is where &lt;code&gt;pip&lt;/code&gt; shines. A little known feature of &lt;code&gt;pip&lt;/code&gt; allows you to define a &quot;requirements file&quot; which enumerates the packages to install. In my example project, I defined the following requirements in a file called &lt;code&gt;pip-requires.txt&lt;/code&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&gt;eventlet&amp;gt;=0.9.9
nose&amp;gt;=0.11.3
MySQL-python&amp;gt;=1.2.3c1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my hypothetical example, I’ll need &lt;code&gt;nose&lt;/code&gt; to run my tests, while &lt;code&gt;eventlet&lt;/code&gt; and &lt;code&gt;MySQL-python&lt;/code&gt; are required for my project to properly run. With the &lt;code&gt;pip-requires.txt&lt;/code&gt; file in the root of my source repository, I can add an additional &quot;Execute shell&quot; build step that does the following:&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;pip install -r pip-requires.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Assuming the &lt;code&gt;$PATH&lt;/code&gt; environment variable was properly defined, this will use the virtualenv’s version of &lt;code&gt;pip&lt;/code&gt; and it will install the packages defined in &lt;code&gt;pip-requires.txt&lt;/code&gt; &lt;strong&gt;into&lt;/strong&gt; the virtualenv! With the dependencies all properly installed in the virtualenv, I can now configure the remainder of my job to build my project and execute the tests. Pretty snazzy if you ask me!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/07/gee-thanks/</id>
<title>Gee Thanks</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/07/gee-thanks/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<summary>
Squee-D had some nice things to say in the #hudson IRC channel yesterday that I thought I would share:




Just to sing some praise again, make sure you all know how appreciated it is, we absolutely love hudson, and appreciate everyone who develops and maintains it.




Positive feedback (and negative really) is always appreciated; have you thanked your plugin maintainer today?...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;Squee-D&lt;/code&gt; had some nice things to say in the &lt;code&gt;#hudson&lt;/code&gt; &lt;a href=&quot;https://www.jenkins.io/chat/&quot;&gt;IRC channel&lt;/a&gt; yesterday that I thought I would share:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Just to sing some praise again, make sure you all know how appreciated it is, we absolutely love hudson, and appreciate everyone who develops and maintains it.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Positive feedback (and negative really) is always appreciated; have you thanked your plugin maintainer today?&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/06/security-fix-hudson-1-365-released/</id>
<title>Security Fix! Hudson 1.365 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-06T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/06/security-fix-hudson-1-365-released/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='news'></category>
<category term='releases'></category>
<summary>
The Hudson team has released Hudson 1.365 which contains a critical security fix! A security advisory released yesterday by InfraDNA goes on to explain the hole with more detail:




This vulnerability allows an attacker to read arbitrary files in the
server file system whose path names are known, by sending malicious
HTTP GET requests. While such access is still subject to the normal
access control enforced by the operating system, Hudson can still leak
"secrets" possessed by Hudson




The vulnerability inside of Hudson affects Hudson instances running inside the embedded Winstone container, instances behind Glasshfish or Jetty (for example) are not subject to this vulnerability. Instances...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Hudson team has released Hudson 1.365 which contains a critical security fix! A security advisory &lt;a href=&quot;https://infradna.com/content/security-advisory-2010-07-05&quot;&gt;released yesterday by InfraDNA&lt;/a&gt; goes on to explain the hole with more detail:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This vulnerability allows an attacker to read arbitrary files in the
server file system whose path names are known, by sending malicious
HTTP GET requests. While such access is still subject to the normal
access control enforced by the operating system, Hudson can still leak
&quot;secrets&quot; possessed by Hudson&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The vulnerability inside of Hudson affects Hudson instances running inside the embedded Winstone container, instances behind Glasshfish or Jetty (for example) are not subject to this vulnerability. Instances running behind a reverse proxy such as mod_proxy or Nginx.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson system administrators should subscribe to either the &lt;a href=&quot;https://feeds.feedburner.com/hudson-security-advisories&quot;&gt;security advisories RSS feed&lt;/a&gt; or the &lt;a href=&quot;https://www.jenkins.io/mailing-lists/#jenkinsci-advisories-googlegroups-com&quot;&gt;advisories@ mailing list&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://ftp.osuosl.org/pub/hudson/war/1.363/hudson.war&quot;&gt;latest .war file&lt;/a&gt; straight from our &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSL mirror&lt;/a&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/05/so-youve-found-a-vulnerability-now-what/</id>
<title>So you&#39;ve found a vulnerability, now what?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/05/so-youve-found-a-vulnerability-now-what/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='plugins'></category>
<summary>
Hudson, like all web applications, is not immune from vulnerabilities that could open up attack vectors for malicious use. What puts Hudson in a league of its own compared to others is its ability to execute arbitrary commands on agent machines, or in the case of the EC2 plugin, execute arbitrary commands "in the cloud." In light of all this, Hudson is quite secure and offers a variety of mechanisms to reduce the potential for exploits. 


Despite Hudson&#8217;s security track record, you&#8217;ve managed to find a vulnerability in Hudson, and decide to don your white hat and inform the Hudson...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson, like all web applications, is not immune from vulnerabilities that could open up attack vectors for malicious use. What puts Hudson in a league of its own compared to others is its ability to execute arbitrary commands on agent machines, or in the case of the EC2 plugin, execute arbitrary commands &quot;in the cloud.&quot; In light of all this, Hudson is quite secure and offers a variety of mechanisms to reduce the potential for exploits. &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://www.thinkgeek.com/images/products/zoom/hacker-hat.jpg&quot; alt=&quot;hacker hat&quot; width=&quot;150&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Despite Hudson’s security track record, you’ve managed to find a vulnerability in Hudson, and decide to don your white hat and inform the Hudson team. First off, let me commend you on your brilliant decision to report the vulnerability, you are truly a leader among men.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Generally immediate public disclosure of vulnerabilities is frowned upon as it doesn’t give us much time to react, investigate and patch the hole. For this reason there is the &quot;&lt;a href=&quot;https://issues.hudson-ci.org/browse/SECURITY&quot;&gt;SECURITY&lt;/a&gt;&quot; project in Hudson’s JIRA. The SECURITY project is a more locked down section of JIRA than the other projects and allows you to submit issues and have them reviewed by the Hudson core developers who can assess the vulnerability. When reporting the issue, it will be helpful to include information regarding the environment the Hudson instance is running in (such as the servlet container) as well as any pertinent reproduction steps so the team can reproduce, fix and verify with as little wheel-spinning as possible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What happens next wholly determines on the severity of the issue, if it’s a highly critical vulnerability, the team will likely make an out-of-schedule release and advise users to upgrade. If it’s a less critical hole, the fix will be included in an upcoming scheduled release. Either way, the Hudson team has a good track record of correct potential security holes in a timely fashion.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After the hole you’ve discovered has been patched and released, you can revel in the fact that you helped make Hudson better, thanks!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;em&gt;Image courtesy of &lt;a href=&quot;https://www.thinkgeek.com/tshirts-apparel/hats-ties/6345/&quot;&gt;ThinkGeek&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/07/05/links-for-2010-07-05/</id>
<title>Links for 2010-07-05</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-07-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/07/05/links-for-2010-07-05/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='links'></category>
<summary>
It&#8217;s been quite a while since I posted a Hudson links-roundup post, so without further ado, here goes nothing




Max tells us about using Hudson with Symbian&#8217;s CodeScanner tool.


Running agents on Mac OS X? Mirko has some handy launchctl foo for keeping his JNLP agents online


Scott threw up a great configuration sample for running Hudson with an Nginx reverse proxy with SSL


Mark walks us through using Xvfb to run headless cucumber/selenium tests with Hudson


Our friends behind Build Doctor wrote an interesting build radiator that works seamlessly with Hudson....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been quite a while since I posted a Hudson links-roundup post, so without further ado, here goes nothing&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Max tells us about using &lt;a href=&quot;https://techmodblog.blogspot.com/2010/01/hudson-and-codescanner.html&quot;&gt;Hudson with Symbian’s CodeScanner&lt;/a&gt; tool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Running agents on Mac OS X? Mirko has &lt;a href=&quot;https://illegalstateexception.blogspot.com/2010/07/using-launchctl-to-restart-hudson-mac.html&quot;&gt;some handy launchctl foo&lt;/a&gt; for keeping his JNLP agents online&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scott threw up a great configuration sample for running &lt;a href=&quot;https://sleeplesscoding.blogspot.com/2010/07/hudson-ci-behind-nginx-reverse-proxy.html&quot;&gt;Hudson with an Nginx reverse proxy with SSL&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mark walks us through using Xvfb to run &lt;a href=&quot;https://markgandolfo.com/2010/07/01/hudson-ci-server-running-cucumber-in-headless-mode-xvfb&quot;&gt;headless cucumber/selenium tests with Hudson&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our friends behind Build Doctor wrote &lt;a href=&quot;https://www.build-doctor.com/2010/07/01/announcing-xfd&quot;&gt;an interesting build radiator&lt;/a&gt; that works seamlessly with Hudson.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/06/29/11th-international-free-software-forum-in-brazil/</id>
<title>11th International Free Software Forum in Brazil</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-06-29T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/06/29/11th-international-free-software-forum-in-brazil/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
Last week, friend-of-Hudson Leandro Nunes sent the following message to the users mailing list regarding his upcoming talk on continuous integration and Hudson:




Next month I will present a talk about Hudson in the 11th
International Free Software Forum (FISL 11), held in Porto Alegre
Brazil (detailed time and date of the talk are not yet scheduled so).




FISL 11 is one of the biggest free software events in Latin America and will quite literally attract thousands of free software users, hackers, and enthusiasts. It will be held from the 21st to the 24th of July in Porto Alegre, if you&#8217;re in Central or...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week, friend-of-Hudson &lt;a href=&quot;https://leandron.wordpress.com/&quot;&gt;Leandro Nunes&lt;/a&gt; sent the following message to the &lt;code&gt;users&lt;/code&gt; &lt;a href=&quot;https://www.jenkins.io/mailing-lists&quot;&gt;mailing list&lt;/a&gt; regarding his upcoming talk on continuous integration and Hudson:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Next month I will present &lt;a href=&quot;https://verdi.softwarelivre.org/papers_ng/activity/view?activity_id=44&quot;&gt;a talk about Hudson&lt;/a&gt; in the 11th
International Free Software Forum (&lt;a href=&quot;https://softwarelivre.org/fisl11&quot;&gt;FISL 11&lt;/a&gt;), held in Porto Alegre
Brazil (detailed time and date of the talk are not yet scheduled so).&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;FISL 11 is one of the biggest free software events in Latin America and will quite literally attract &lt;em&gt;thousands&lt;/em&gt; of free software users, hackers, and enthusiasts. It will be held from the 21st to the 24th of July in Porto Alegre, if you’re in Central or South America, you should &lt;em&gt;definitely&lt;/em&gt; try to attend.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Leandro will have Hudson stickers on hand to give out and will surely do a fantastic job presenting Hudson to all those future Hudson users, I hope you can make it!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/06/28/digg-technical-talk/</id>
<title>Digg Technical Talk</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-06-28T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/06/28/digg-technical-talk/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='links'></category>
<category term='meetup'></category>
<category term='news'></category>
<summary>
Recently our fearless leader, Kohsuke Kawaguchi, was invited by the nice folks over at Digg to give a tech talk about continuous integration and automated testing. The Digg engineering team is full of believers in continuous integration, including our very own Andrew Bayer (abayer). Being big users of the Sauce Labs service to drive their vast Selenium test suite, the house was packed with Selenium hackers/users and Hudson users, the stage was set for Kohsuke to give a great presentation.&lt;/embed&gt;


Digg Technical Talks - Kohsuke Kawaguchi from Digg Development on Vimeo.


You can find slides of the presentation here
---


For those not familiar...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Recently our fearless leader, Kohsuke Kawaguchi, was invited by the nice folks over at Digg to give a &lt;a href=&quot;https://about.digg.com/blog/digg-technical-talks-kohsuke-kawaguchi&quot;&gt;tech talk about continuous integration&lt;/a&gt; and automated testing. The Digg engineering team is full of believers in continuous integration, including our very own Andrew Bayer (&lt;code&gt;abayer&lt;/code&gt;). Being big users of the &lt;a href=&quot;https://twitter.com/saucelabs&quot;&gt;Sauce Labs&lt;/a&gt; service to drive their vast Selenium test suite, the house was packed with Selenium hackers/users and Hudson users, the stage was set for Kohsuke to give a great presentation.&lt;center&gt;&lt;object width=&quot;400&quot; height=&quot;225&quot;&gt;&lt;param name=&quot;allowfullscreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;movie&quot; value=&quot;https://vimeo.com/moogaloop.swf?clip_id=12859357&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; /&gt;&lt;embed src=&quot;https://vimeo.com/moogaloop.swf?clip_id=12859357&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; width=&quot;400&quot; height=&quot;225&quot; /&gt;&amp;lt;/embed&amp;gt;&lt;/object&gt;&lt;/center&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://vimeo.com/12859357&quot;&gt;Digg Technical Talks - Kohsuke Kawaguchi&lt;/a&gt; from &lt;a href=&quot;https://vimeo.com/digg&quot;&gt;Digg Development&lt;/a&gt; on &lt;a href=&quot;https://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can find slides of the presentation &lt;a href=&quot;https://about.digg.com/files/HudsonDigg.ppt&quot;&gt;here&lt;/a&gt;
---&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For those not familiar with Digg’s peripheral involvement in the Hudson community, they’ve graciously donated a build machine to help run Hudson builds on &lt;a href=&quot;https://ci.hudson-labs.org/&quot;&gt;ci.hudson-labs.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/06/23/stickers-starting-to-arrive/</id>
<title>Stickers starting to arrive</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-06-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/06/23/stickers-starting-to-arrive/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<category term='meta'></category>
<summary>
Way back in March, I asked you all: Want some Hudson stickers?


Turns out, a lot of you do! Thanks to a huge amuont of help by my future wife, the first shipment of Hudson stickers went into the mail last week.  This first shipment was only to United States addresses! If you live outside of the U.S., or if you requested more than 50-ish stickers, I&#8217;ve not yet been able to send you stickers. I expect to start sending out international shipments later this week and early next week.
To those of you that have received your stickers, I&#8217;d like...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Way back in March, I asked you all: &lt;a href=&quot;https://www.jenkins.io/content/want-some-hudson-stickers&quot;&gt;Want some Hudson stickers?&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Turns out, a &lt;strong&gt;lot&lt;/strong&gt; of you do! Thanks to a huge amuont of help by &lt;a href=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/erinandtylerswedding.com/images/gallery/mq/img-9.jpg&quot;&gt;my future wife&lt;/a&gt;, the &lt;em&gt;first&lt;/em&gt; shipment of Hudson stickers went into the mail last week. &lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://farm3.static.flickr.com/2743/4425921960_a056d816f1_m.jpg&quot; alt=&quot;4425921960 a056d816f1 m&quot; /&gt; This first shipment was only to United States addresses! If you live outside of the U.S., or if you requested more than 50-ish stickers, I’ve not yet been able to send you stickers. I expect to start sending out international shipments later this week and early next week.
To those of you that have received your stickers, I’d like to remind you of the terms of our agreement:&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;Conferences&lt;/strong&gt;: The only condition being that you tell me all about the event and how Hudson was received after the fact (this may involve an interview).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Companies&lt;/strong&gt;: I always appreciate stickers, pens, branded bouncy balls, etc (see: swag) in return!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nice People&lt;/strong&gt;: If you’re just a fan of Hudson, stickers, or both, I’ll still gladly mail you a few stickers with the condition that you take pictures of where the stickers end up (and maybe of your Hudson install) and either email me some cool pictures or post them to  Flickr (tagged: &quot;hudsonstickers&quot;)&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;a class=&quot;image&quot; href=&quot;https://twitter.com/decriptor/status/16737013469&quot;&gt;&lt;img src=&quot;https://placeholder.apture.com/ph/355x210_TwitterArticle/&quot; alt=&quot;355x210 TwitterArticle&quot; width=&quot;355px&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To be honest, I &lt;em&gt;really&lt;/em&gt; just want to see some pictures of Hudson stickers slapped all over cool stuff: laptops, bosses, servers, desks, stop signs, coworkers, cats, you name it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;If you did not request stickers, but want some now:&lt;/strong&gt; please refer to the &lt;a href=&quot;https://www.jenkins.io/content/want-some-hudson-stickers&quot;&gt;original post&lt;/a&gt; for directions. I do still have stickers left, but there are some &quot;bulk requests&quot; I’ve not yet filled. I will do my best to send out as many stickers as I can.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/06/22/hudson-1-363-released/</id>
<title>Hudson 1.363 Released!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-06-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/06/22/hudson-1-363-released/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='releases'></category>
<category term='jenkinsci'></category>
<summary>
Last Friday the Hudson team released release 1.363 which is yet another mixed bag of enhancements and bug fixes. Along with the usual bunch of fixes, this release includes a number of localization updates courtesy of a team of Hudson community volunteers participating in the Hudson Internationalization project.


It is also worth noting that this post is being published on Tuesday, contrary to the schedule that I operated on with Continuous Blog, I will no longer be posting release updates on Monday morning. Traditionally Hudson is released Friday afternoon (PST), meaning any potential regressions are reported early on Monday morning after...
</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/sites/default/files/images/Hudson_coatofarms.gif&quot; alt=&quot;Hudson coatofarms&quot; /&gt; Last Friday the Hudson team released release &lt;strong&gt;1.363&lt;/strong&gt; which is yet another mixed bag of enhancements and bug fixes. Along with the usual bunch of fixes, this release includes a number of localization updates courtesy of a team of Hudson community volunteers participating in the Hudson &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Internationalization&quot;&gt;Internationalization project&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It is also worth noting that this post is being published on Tuesday, contrary to the schedule that I operated on with Continuous Blog, I will no longer be posting release updates on Monday morning. Traditionally Hudson is released Friday afternoon (PST), meaning any potential regressions are reported early on Monday morning after our European users start to upgrade. Publishing this release announcement on Tuesday gives me more time to test out the release so I can report with greater confidence in the reliability of the update. (&lt;em&gt;Note&lt;/em&gt;: This may change in the future as we push for easier RC testing capabilities within Hudson)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re a regular reader of the Hudson Labs blog, you may also notice that this change log looks eerily similar to the &lt;a href=&quot;https://www.jenkins.io/content/hudson-1362-released&quot;&gt;1.362 announcement&lt;/a&gt; from last week. Turns out I had mistakenly taken the upcoming changes from 1.363 and reported them as fixes in 1.362; I’ve since updated the post regarding 1.362’s change log.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;bug-fixes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bug-fixes&quot; /&gt;Bug Fixes&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fix queue handling to close locking gap between removing job from queue and starting build, to prevent unintended concurrent builds (refactor of change first made in 1.360). (&lt;a href=&quot;https://hudson.361315.n4.nabble.com/Patch-to-fix-concurrent-build-problem-td2229136.html&quot;&gt;report&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allow multiple dependencies between same two projects, as they may trigger under different conditions and with different parameters. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5708&quot;&gt;issue 5708&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Timeline on build trend page should use server timezone instead of always GMT. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6692&quot;&gt;issue 6692&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don’t mask the cause of the checkout related exception.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;who am I?&quot; page should be visible to everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reinstall a JDK when a different version is selected. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5551&quot;&gt;issue 5551&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Avoid pointless and harmful redirection when downloading agent.jar. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5752&quot;&gt;issue 5752&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cache downloaded JDKs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integrated community-contributed translations (Germany, Greek, Spanish, Finnish, Hungarian, Italian, Japanese, French, Russian, Slovenian, Dutch, Traditional Chinese, Swedish, Ukrainian, and Portuguese.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgraded bundled Ant to version 1.8.1. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6562&quot;&gt;issue 6562&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://ftp.osuosl.org/pub/hudson/war/1.363/hudson.war&quot;&gt;latest .war file&lt;/a&gt; straight from our &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSL mirror&lt;/a&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/06/14/hudson-1-362-released/</id>
<title>Hudson 1.362 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-06-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/06/14/hudson-1-362-released/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='core'></category>
<category term='releases'></category>
<category term='jenkinsci'></category>
<summary>
The 1.362 release of Hudson has a few bug-fixes and a few minor enhancements, all together a good stabilization release. Not too much interesting to discuss so straight on to the changelog!


Bugs



Restored optional container-based authentication for CLI. (issue 6587)


Fix javascript error when a plugin uses an empty dropdownList, resulting in LOADING overlay being left up. (issue 6542)





Enhancements



Add setting so job views may show only enabled or disabled jobs. (issue 6673)


File parameters can now be downloaded from the build Parameters page. (issue 6719)


Added an ability to point to different update sites.


Added a new extension point to plug in custom utility to...
</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/sites/default/files/images/hudson.gif&quot; alt=&quot;hudson&quot; /&gt; The 1.362 release of Hudson has a few bug-fixes and a few minor enhancements, all together a good stabilization release. Not too much interesting to discuss so straight on to the changelog!&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;bugs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs&quot; /&gt;Bugs&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Restored optional container-based authentication for CLI. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6587&quot;&gt;issue 6587&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix javascript error when a plugin uses an empty &lt;tt&gt;dropdownList&lt;/tt&gt;, resulting in LOADING overlay being left up. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6542&quot;&gt;issue 6542&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add setting so job views may show only enabled or disabled jobs. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6673&quot;&gt;issue 6673&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;File parameters can now be downloaded from the build Parameters page. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6719&quot;&gt;issue 6719&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added an ability to point to different update sites.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added a new extension point to plug in custom utility to kill processes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added a proactive error diagnostics to look for a broken reverse proxy setup. (&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Running+Hudson+behind+Apache#RunningHudsonbehindApache-modproxywithHTTPS&quot;&gt;report&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://ftp.osuosl.org/pub/hudson/war/1.362/hudson.war&quot;&gt;latest .war file&lt;/a&gt; straight from our &lt;a href=&quot;https://www.osuosl.org&quot;&gt;OSL mirror&lt;/a&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;small&quot;&gt;Image courtesy of &lt;a href=&quot;https://hudsonsgrill.com/&quot;&gt;Hudson’s Grill&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/06/11/casual-fridays-directing-traffic-with-hudson/</id>
<title>Casual Fridays: Directing traffic with Hudson</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-06-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/06/11/casual-fridays-directing-traffic-with-hudson/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='just for fun'></category>
<summary>
Intrepid Hudson user Christian Pelster posted a little project of his this week to the "users" mailing list called: hudsontrafficlights.


Christian describes the project as:




This Java based daemon aggregates the status of one or more jobs from a Hudson continuous integration server into a single status (red, yellow, green) and invokes a shell script on status change.




You can use hudsontrafficlights to control a USB traffic light (such as this USB Traffic Light from Cleware, GmbH) to give you and your colleagues nearly instant feedback on jobs in Hudson, without ever needing to leave your text editor!image:https://hudsontrafficlights.googlecode.com/files/CIMG1635.JPG...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Intrepid Hudson user Christian Pelster posted a little project of his this week to the &quot;users&quot; &lt;a href=&quot;https://www.jenkins.io/content/mailing-lists&quot;&gt;mailing list&lt;/a&gt; called: &lt;strong&gt;&lt;a href=&quot;https://code.google.com/p/hudsontrafficlights/&quot;&gt;hudsontrafficlights&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Christian describes the project as:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This Java based daemon aggregates the status of one or more jobs from a Hudson continuous integration server into a single status (red, yellow, green) and invokes a shell script on status change.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can use hudsontrafficlights to control a USB traffic light (such as this &lt;a href=&quot;https://www.cleware.de/catalog/product_info.php?cPath=23&amp;amp;products_id=118&amp;amp;language=en&quot;&gt;USB Traffic Light&lt;/a&gt; from Cleware, GmbH) to give you and your colleagues nearly instant feedback on jobs in Hudson, without ever needing to leave your text editor!&lt;center&gt;image:https://hudsontrafficlights.googlecode.com/files/CIMG1635.JPG&lt;span class=&quot;hudsontrafficlights in action with a Cleware Traffic Light&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/06/10/subversion-repository-change-notification-push-vs-pull/</id>
<title>Subversion repository change notification: push vs pull</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-06-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/06/10/subversion-repository-change-notification-push-vs-pull/" />
<author>
<name>kohsuke</name>
</author>
<category term='general'></category>
<category term='jenkinsci'></category>
<summary>
People often configure Hudson to start a new build whenever a change is made to the repository. In fact, this is often considered central to the practice of continuous integration.


There are two ways to achieve this. One is the "pull" model, where Hudson periodically reaches out to a Subversion repository to see if there is any changes. The other is the "push" model, where you make the Subversion repository reach out to Hudson.


Both approaches have trade-offs. The pull model is easier to configure, since you can do this entirely from Hudson. But this comes at the expense of increased load...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;People often configure &lt;a href=&quot;https://en.wikipedia.org/wiki/Hudson%20%28software%29&quot;&gt;Hudson&lt;/a&gt; to start a new build whenever a change is made to the repository. In fact, this is often considered central to the practice of continuous integration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There are two ways to achieve this. One is the &quot;pull&quot; model, where Hudson periodically reaches out to a Subversion repository to see if there is any changes. The other is the &quot;push&quot; model, where you make the Subversion repository reach out to Hudson.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Both approaches have trade-offs. The pull model is easier to configure, since you can do this entirely from Hudson. But this comes at the expense of increased load to the Subversion server. Even though the overhead of Subversion polling is relatively low, as you add more projects to Hudson and increase the polling frequency, the overhead may get non-trivial (imagine the number of Hudson pollings that the poor &lt;a href=&quot;https://java.net&quot;&gt;java.net&lt;/a&gt; Subversion server gets, for example.) A more serious downside, in my opinion, is that this increases the delay from your commit to a build. For example, if your build just takes 5 mins, then even if you poll every minute, you pay on average 30 seconds delay before a build starts — a 10% overhead!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The push approach eliminates those two downsides, but it requires a post-commit hook configuration in the Subversion repository, which has to be done manually by the administrator, because those scripts are not exposed to external systems like Hudson.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With that said, if you do have an access to the Subversion repository post-commit hook, I highly recommend the push approach, and in Hudson we made it as easy as possible to configure the set up. Here’s the script you’ll need in your post-commit hook:&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;REPOS=&quot;$1&quot; REV=&quot;$2&quot; UUID=\`svnlook uuid $REPOS\` /usr/bin/wget \
       --header &quot;Content-Type:text/plain;charset=UTF-8&quot; \
       --post-data &quot;\`svnlook changed --revision $REV $REPOS\`&quot; \
       --output-document &quot;-&quot; \
       https://server/hudson/subversion/${UUID}/notifyCommit?rev=$REV&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This script basically just tells Hudson that there was a change in a repository. Hudson will then check this information against all the jobs that have a polling configured, and schedule the builds accordingly. The beauty of this approach is two-folds:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The script doesn’t change when you add/remove/rename jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The overhead is constant regardless of the number of jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you haven’t configured a push setup yet, now is the time to do so!&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/06/09/welcome-to-hudson-labs/</id>
<title>Welcome to Hudson Labs!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-06-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/06/09/welcome-to-hudson-labs/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='meta'></category>
<category term='news'></category>
<summary>
Hello again! It&#8217;s been a long time since I&#8217;ve written for the Hudson community, but now I&#8217;m back and ready to tackle some of the latest developments in the Hudson community.


What is Hudson Labs?

As you may have read in April, Kohsuke left Oracle to found InfraDNA, a company specializing around Hudson. The departure meant the Hudson community would no longer have access to some of the hardware and services that Kohsuke had accumulated over the years working on Hudson at Sun Microsystems. While we are still happily part of the Java.net community, we&#8217;ve recognized the need for some community-owned resources...
</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/sites/default/files/images/scientist.thumbnail.gif&quot; alt=&quot;scientist.thumbnail&quot; /&gt; Hello again! It’s been a long time since I’ve written for the Hudson community, but now I’m back and ready to tackle some of the latest developments in the Hudson community.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-is-hudson-labs&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-is-hudson-labs&quot; /&gt;What is Hudson Labs?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As you may have &lt;a href=&quot;https://www.jenkins.io/content/kohsuke-leaves-sun&quot;&gt;read in April&lt;/a&gt;, Kohsuke left Oracle to found &lt;a href=&quot;https://web.archive.org/web/20100612130510/http://infradna.com/&quot;&gt;InfraDNA&lt;/a&gt;, a company specializing around Hudson. The departure meant the Hudson community would no longer have access to some of the hardware and services that Kohsuke had accumulated over the years working on Hudson at Sun Microsystems. While we are still happily part of the &lt;a href=&quot;https://java.net/&quot;&gt;Java.net&lt;/a&gt; community, we’ve recognized the need for some community-owned resources and Hudson Labs was born.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past couple months, a group within the Hudson community, &quot;infra&quot; (short for &quot;infrastructure&quot;), has been working to get machines set up and build the foundation for a more open Hudson project infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;what-does-hudson-labs-provide&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-does-hudson-labs-provide&quot; /&gt;What does Hudson Labs provide?&lt;/h3&gt;
&lt;h5 id=&quot;builds&quot; class=&quot;discrete&quot;&gt;Builds&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the first tasks we set upon when building out Hudson Labs was to start improving the build and release process of Hudson by moving as much of it into a &lt;a href=&quot;https://ci.hudson-labs.org&quot;&gt;public Hudson instance&lt;/a&gt;. Building Hudson itself, plugins and dependencies of the Hudson project, the Hudson Labs instance will help improve the reliability of the Hudson ecosystem across the board, and should serve as a useful tool for core and plugin developers.&lt;/p&gt;
&lt;/div&gt;
&lt;h5 id=&quot;mirroring&quot; class=&quot;discrete&quot;&gt;Mirroring&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks to the great team over at the &lt;a href=&quot;https://www.osuosl.org&quot;&gt;Oregon State University Open Source Lab&lt;/a&gt; (&lt;a href=&quot;https://twitter.com/osuosl&quot;&gt;OSUOSL&lt;/a&gt;), we’ve been able to build out &lt;a href=&quot;https://ftp.osuosl.org/pub/hudson/&quot;&gt;mirroring infrastructure&lt;/a&gt; for Hudson to provide fast access to native packages and wars alike. Currently the OSUOSL only has mirrors inside the continental United States, so we’re reaching out to friends in Asia and Europe to extend the mirroring system.&lt;/p&gt;
&lt;/div&gt;
&lt;h5 id=&quot;information&quot; class=&quot;discrete&quot;&gt;Information&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m currently working on re-working some of the blog posts you may have read over four months as more structured tutorials. I hope to provide an easily accessible knowledge-base for developing Hudson along with configuring Hudson for various platforms and development environments; this is a more difficult task so all the pieces aren’t entirely in place for this just yet.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To be honest, I’m very enthusiastic about Hudson’s future. Now that InfraDNA is up and running, Kohsuke’s renewed focus combined with the foundation of Hudson Labs and the uncommonly hospitable Hudson developer and user communities, the future is looking bright!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/04/24/hudson-1-355-released/</id>
<title>Hudson 1.355 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-04-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/04/24/hudson-1-355-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<category term='releases'></category>
<summary>
The release of 1.355 came out earlier this week but I hadn&#8217;t had the chance to write anything up about it. Of course, the work never stops on Hudson so we almost have 1.356 ready to roll out the door, but then Kohsuke tweeted this:




Because of the data center migration going on, I won&#8217;t be able to release #hudsonci today.




I won&#8217;t go into details on some of the infrastructure changes we have lined up just yet, so here&#8217;s the breakdown of 1.355


Bugs fixed



Colored ball image at top of build pages was broken for Hudson in some web containers (fixed by...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/hudson_street.jpg&quot; alt=&quot;hudson street&quot; width=&quot;150&quot; /&gt; The release of 1.355 came out earlier this week but I hadn’t had the chance to write anything up about it. Of course, the work never stops on Hudson so we almost have 1.356 ready to roll out the door, but then Kohsuke tweeted this:&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Because of the data center migration going on, I won’t be able to release #hudsonci today.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I won’t go into details on some of the infrastructure changes we have lined up just yet, so here’s the breakdown of 1.355&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;bugs-fixed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs-fixed&quot; /&gt;Bugs fixed&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Colored ball image at top of build pages was broken for Hudson in some web containers (fixed by removing workaround for a Firefox bug fixed since 3.0.5/Dec2008). (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/2341&quot;&gt;issue 2341&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Console page while build is running did not wrap lines when viewed in IE. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5869&quot;&gt;issue 5869&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed build history to indicate test failure for MavenBuild and MavenModuleSetBuild.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make &lt;code&gt;dropdownList&lt;/code&gt; work in repeatable content, such as a build step.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added the agent retention strategy based on a schedule.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added to configure charset option of Mailer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/04/16/hudson-1-354-released/</id>
<title>Hudson 1.354 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-04-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/04/16/hudson-1-354-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<category term='releases'></category>
<summary>
Hear ye, hear ye! Behold, the first release of Hudson ever made by a not-employed-by-Sun Kohsuke (as we covered last week). This iteration of Hudson contains only bug fixes, check the listing below for the specifics on which bugs have been fixed (1.355 is looking like it will contain a number of fixes as well). The release of 1.354 comes slightly later than usual given some of the logistics that needed to, or still need to be resolved.


One of the infrastructure issues that&#8217;s half-way resolved is the question of Debian/Ubuntu packages. Kohuske has packages uploaded in an experimental apt repository...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/scenic_hudson.png&quot; alt=&quot;scenic hudson&quot; /&gt;Hear ye, hear ye! Behold, the first release of Hudson &lt;em&gt;ever&lt;/em&gt; made by a not-employed-by-Sun &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; (as we &lt;a href=&quot;https://www.jenkins.io/content/kohsuke-leaves-sun&quot;&gt;covered last week&lt;/a&gt;). This iteration of Hudson contains only bug fixes, check the listing below for the specifics on which bugs have been fixed (1.355 is looking like it will contain a number of fixes as well). The release of 1.354 comes slightly later than usual given some of the logistics that needed to, or still need to be resolved.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of the infrastructure issues that’s half-way resolved is the question of Debian/Ubuntu packages. Kohuske has packages uploaded in an experimental &lt;a href=&quot;https://hudson-labs.org/debian/&quot;&gt;apt repository on hudson-labs.org&lt;/a&gt; which you can try out. That said, it’s not entirely clear whether this is going to be the preferred means of distributing native Debian/Ubuntu packages in the future (your mileage may vary).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;bugs-fixed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs-fixed&quot; /&gt;Bugs fixed&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;POM parsing was still using the module root as the base for relative paths for alternate settings files. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6080&quot;&gt;issue 6080&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix dynamic updates of build history table when &lt;a href=&quot;https://en.wikipedia.org/wiki/Cross-site%20request%20forgery&quot;&gt;CSRF&lt;/a&gt; protection is turned on. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6072&quot;&gt;issue 6072&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved the error reporting mechanism in LDAP setting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Raw console output contains garbage. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6034&quot;&gt;issue 6034&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a file handle leak in the agents connection. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6137&quot;&gt;issue 6137&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quiet period wasn’t taking effect properly when doing parameterized builds.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The release of 1.354 contains a total of 51 commits to the &quot;core&quot; part of the tree, from 9 different contributors&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;abayer&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;drulli&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kohsuke&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;manuel_carrasco&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mindless&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;sogabe&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;swiest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vlatombe&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;wyukawa&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/04/16/a-new-blog-for-kohsuke/</id>
<title>A new blog for Kohsuke</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-04-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/04/16/a-new-blog-for-kohsuke/" />
<author>
<name>rtyler</name>
</author>
<category term='core'></category>
<category term='mailing list'></category>
<summary>
Historically, our fearless leader Kohsuke has blogged on Java.net. The setup made a whole lot of sense when Kohsuke was employed by Sun, then Oracle, which sponsors and runs Java.net. In a post earlier this week discussing console markups, Kohsuke casually pointed out that he will be cross-posting to Java.net, and his personal blog located at kohsuke.org. The first post over on Kohsuke.org welcomes us:




For the longest time I haven&#8217;t really done anything about kohsuke.org, but as I left Sun/Oracle, I decided to put a bit more effort into it. So this is the new home.


For the time being, I...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Historically, our fearless leader Kohsuke has blogged &lt;a href=&quot;https://www.java.net/blog/kohsuke&quot;&gt;on Java.net&lt;/a&gt;. The setup made a whole lot of sense when Kohsuke was employed by Sun, then Oracle, which sponsors and runs &lt;a href=&quot;https://java.net&quot;&gt;Java.net&lt;/a&gt;. In a post earlier this week discussing &lt;a href=&quot;https://www.java.net/blog/kohsuke/archive/2010/04/14/hudson-console-markups&quot;&gt;console markups&lt;/a&gt;, Kohsuke casually pointed out that he will be cross-posting to Java.net, and his personal blog located at &lt;a href=&quot;https://kohsuke.org&quot;&gt;kohsuke.org&lt;/a&gt;. The &lt;a href=&quot;https://kohsuke.org/2010/04/12/hello/&quot;&gt;first post&lt;/a&gt; over on Kohsuke.org welcomes us:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the longest time I haven’t really done anything about kohsuke.org, but as I left Sun/Oracle, I decided to put a bit more effort into it. So this is the new home.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the time being, I plan to post my blogs both on java.net and here.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re a reader of feeds, I recommend adding the &lt;a href=&quot;https://kohsuke.org/feed/&quot;&gt;rss feed&lt;/a&gt; for the blog to your list of interesting continuous integration/hacker feeds.&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/04/12/pre-tested-commits-with-git/</id>
<title>Pre-tested commits with Git</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-04-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/04/12/pre-tested-commits-with-git/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='feedback'></category>
<category term='jobs'></category>
<category term='tutorial'></category>
<summary>
At the first Bay Area Hackathon in mid-2009, the topic du jour was "pre-tested commits." As potential implementations of the concept were discussed over burgers from Brickhouse in downtown San Francisco, we realized as a group a few things: first, those burgers were delicious, but more importantly: pre-testing commits is very-SCM dependent and involves a lot of moving parts. One of the positive changes that came out shortly after the meet up was the support for "Concurrent Builds", allowing a job to be executed concurrently on different agents, a precursor to pre-tested commit support. Fervor for the pre-tested commit feature...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;At the first &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/BayAreaMeetup&quot;&gt;Bay Area Hackathon&lt;/a&gt; in mid-2009, the topic du jour was &quot;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Designing+pre-tested+commit&quot;&gt;pre-tested commits&lt;/a&gt;.&quot; As potential implementations of the concept were discussed over burgers from &lt;a href=&quot;https://www.brickhousesf.com/&quot;&gt;Brickhouse&lt;/a&gt; in downtown San Francisco, we realized as a group a few things: first, those burgers were &lt;em&gt;delicious&lt;/em&gt;, but more importantly: pre-testing commits is very-SCM dependent and involves a lot of moving parts. One of the positive changes that came out shortly after the meet up was the support for &quot;Concurrent Builds&quot;, allowing a job to be executed concurrently on different agents, a precursor to pre-tested commit support. Fervor for the pre-tested commit feature lowered as time went on, the feature being too dependent on the SCM itself was generally accepted as the reasoning behind the feature languishing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Chances are the feature is in fact too large for Hudson to support alone. It requires Hudson, the SCM and likely a third tool to work in concert together to perform such a feat.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With Git, and the phenomenal code review tool &lt;a href=&quot;https://code.google.com/p/gerrit/&quot;&gt;Gerrit&lt;/a&gt;, and the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gerrit+Plugin&quot;&gt;Gerrit plugin&lt;/a&gt; by intrepid plugin developer, &lt;a href=&quot;https://twitter.com/jyrkiputtonen&quot;&gt;Jyrki Puttonen&lt;/a&gt;, pre-tested commits with Hudson, Git and Gerrit &lt;em&gt;are&lt;/em&gt; possible.
For Git users more familiar with the distributed Git workflows, working with Gerrit should seem familiar. Gerrit has &lt;a href=&quot;https://www.eclipse.org/jgit/&quot;&gt;JGit&lt;/a&gt;, a Java implementation of Git embedded within it, along with an &lt;code&gt;sshd&lt;/code&gt; stack, meaning Gerrit can masquerade as a &quot;regular&quot; Git remote repository. Developers can push and pull to the repository just as they can with any other Git repository (provided they have permissions of course). I won’t delve too much into using Gerrit specifically here, but the pre-tested workflow with Gerrit and Hudson would look something like this:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dev creates a topic branch to work on a change&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code is written (and hopefully tested) and committed locally&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dev pushes commit(s) to Gerrit&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hudson job (set to Poll SCM) picks up the patch, runs the job and marks it as &quot;+1 Verified&quot; or &quot;-1 Fails&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the job fails or is unstable, the change should be reworked or corrected (typically with &lt;a href=&quot;https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html&quot;&gt;git-rebase(1)&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If Hudson says the change is good to go, it can be cherry-picked or pulled directly from Gerrit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For example:&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/gerrit_patch.png&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To learn more about Gerrit, check out the &lt;a href=&quot;https://code.google.com/p/gerrit/&quot;&gt;project page on Google Code&lt;/a&gt;; information on the Gerrit plugin can be &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gerrit+Plugin&quot;&gt;found on the wiki&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/04/07/kohsuke-leaves-sun/</id>
<title>Kohsuke leaves Sun</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-04-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/04/07/kohsuke-leaves-sun/" />
<author>
<name>rtyler</name>
</author>
<category term='core'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<summary>
Those of you on the users@ or dev@ mailing lists have likely already read that Kohsuke (left in the photo), the founder of the Hudson project, is leaving Sun. I say that he is leaving Sun, instead of leaving Oracle as Kohsuke worked at Sun for nine years and Oracle only a few months. In those nine years at Sun, Kohsuke has worked on some great products, the most notable of them being Hudson.


Per Kohsuke&#8217;s post:




Where am I heading next? I&#8217;m actually starting my own company to take Hudson to the next stage.




What this means for Hudson still isn&#8217;t certain...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;span class=&quot;image&quot;&gt;&lt;a class=&quot;image&quot; href=&quot;https://www.flickr.com/photos/skrb/2504160293/&quot;&gt;&lt;img src=&quot;https://farm3.static.flickr.com/2040/2504160293_977ddbf22d_m_d.jpg&quot; alt=&quot;2504160293 977ddbf22d m d&quot; /&gt;&lt;/a&gt;Those of you on the &lt;code&gt;users@&lt;/code&gt; or &lt;code&gt;dev@&lt;/code&gt; mailing lists have likely already read that Kohsuke (&lt;em&gt;left in the photo&lt;/em&gt;), the founder of the Hudson project, &lt;a href=&quot;https://weblogs.java.net/blog/kohsuke/archive/2010/04/05/good-bye-sunoracle&quot;&gt;is leaving Sun&lt;/a&gt;. I say that he is leaving Sun, instead of leaving Oracle as Kohsuke worked at Sun for nine years and Oracle only a few months. In those nine years at Sun, Kohsuke has worked on some great products, the most notable of them being Hudson.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Per Kohsuke’s post:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Where am I heading next? I’m actually starting my own company to take Hudson to the next stage.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What this means for Hudson still isn’t certain yet, fortunately it means that Hudson will continue to have at least one full-time developer. It remains to be seen where KohsukeCorp (the name has not yet been disclosed) will focus within the Hudson code-base. For the greater user-base of Hudson, this means that the schedule for releases may slow down during this transitional period, there are some logistics to work out with Oracle regarding some of the hardware Hudson has traditionally used to host &lt;a href=&quot;https://www.crunchbase.com/product/atlassian&quot;&gt;JIRA&lt;/a&gt;, this blog, and a number of other machines helping support the Hudson project in one fashion or another.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next couple of months will be interesting for the Hudson community; as per usual you’ll be able to get the latest updates from this blog or the &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci&lt;/a&gt; twitter account. I’ll let Kohsuke finish this post off:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;And finally, big thank you to everyone in the Hudson community, and in a broader java.net community. I wouldn’t be here without you guys, and I feel very proud that I’m a part of it.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;hr /&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/04/01/regarding-the-start-of-april/</id>
<title>Regarding the start of April</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-04-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/04/01/regarding-the-start-of-april/" />
<author>
<name>rtyler</name>
</author>
<category term='meta'></category>
<summary>
I had briefly contemplating what sort of silly posts I could write to celebrate April Fool&#8217;s Day, when I sat down to write out some of them, I got a few sentences in and decided that they just weren&#8217;t funny enough. Either I have very high standards, or I&#8217;m terribly unfunny.


The web is awash with April Fool&#8217;s articles, comics, headlines and everything else, so instead I&#8217;m going to just give you a few useful links.


A couple of Twitter links


Besides the @hudsonci account, you can also follow a couple of Hudson&#8217;s more notable (or was it notorious?) hackers, such as our...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I had briefly contemplating what sort of silly posts I could write to celebrate April Fool’s Day, when I sat down to write out some of them, I got a few sentences in and decided that they just weren’t funny enough. Either I have very high standards, or I’m terribly unfunny.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The web is awash with April Fool’s articles, comics, headlines and everything else, so instead I’m going to just give you a few useful links.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;A couple of Twitter links&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Besides the &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci&lt;/a&gt; account, you can also follow a couple of Hudson’s more notable (or was it notorious?) hackers, such as our benevolent dictator, &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt;. &lt;a href=&quot;https://twitter.com/bshine&quot;&gt;Ben Shine&lt;/a&gt; from Yahoo! who’s been working pretty hard on making Hudson prettier. Then there’s &lt;a href=&quot;https://twitter.com/wakaleo&quot;&gt;John Ferguson Smart&lt;/a&gt; who’s been working on a &lt;a href=&quot;http://www.wakaleo.com/books/continuous-integration-with-hudson-the-book&quot;&gt;Hudson book&lt;/a&gt;. Of course I’ve tried to collect as many Hudson contributors as possible in the &lt;a href=&quot;https://twitter.com/hudsonci/contributors&quot;&gt;@contributors Twitter list&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Hacking Hudson&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When starting to hack Hudson, it’s useful to start by understanding &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Building+Hudson&quot;&gt;how to build Hudson&lt;/a&gt;. If hacking Hudson’s core isn’t your cup of tea, you can always start with the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+tutorial&quot;&gt;plugin tutorial&lt;/a&gt; and try your hand at writing another awesome Hudson plugin. If you find yourself struggling to find out what methods do what while you’re hacking, you can always visit the regularly updated, &lt;a href=&quot;https://hudson.dev.java.net/nonav/javadoc/&quot;&gt;online Javadocs for Hudson&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Communicate&lt;/strong&gt;
The two primary mediums for communicating with the Hudson community are through the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mailing%20List&quot;&gt;mailing lists&lt;/a&gt; and the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/IRC+Channel&quot;&gt;IRC channel&lt;/a&gt;. During &quot;regular business hours&quot; for the pacific standard time zone, you can usually get some decent real-time help or answers to most of your queries.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d list more, but I’m too busy reading about &lt;a href=&quot;https://techcrunch.com/2010/03/31/exclusive-google-to-go-nuclear/&quot;&gt;Google’s nuclear weapons program&lt;/a&gt;. ;)&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/04/01/announcing-the-hudson-2-0-roadmap/</id>
<title>Announcing the Hudson 2.0 Roadmap</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-04-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/04/01/announcing-the-hudson-2-0-roadmap/" />
<author>
<name>rtyler</name>
</author>
<category term='just for fun'></category>
<category term='meta'></category>
<summary>
/https://agentdero.cachefly.net/continuousblog/java-evil-edition.png" alt="java evil edition">There have been numerous discussions on the mailing lists over the past couple months regarding memory issues, speed regressions and a number of other issues regarding performance of Hudson, particularly under high load. In an effort to address these concerns, the Hudson core team has /https://agentdero.cachefly.net/continuousblog/just-kidding.jpg">announced a roadmap for Hudson 2.0.


In a message to the dev@ mailing list, Kohsuke said of Hudson 2.0:




As it stands now Hudson 1.0 is a good proof of concept, it&#8217;s time to take the lessons learned and build a truly solid enterprise-ready continuous integration server
Some notable points from Kohsuke&#8217;s announcement with regards...
</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://web.archive.org/web/&amp;lt;strong&amp;gt;/https://agentdero.cachefly.net/continuousblog/java-evil-edition.png&quot; alt=&quot;java evil edition&quot; /&gt;There have been numerous discussions on the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mailing%20List&quot;&gt;mailing lists&lt;/a&gt; over the past couple months regarding memory issues, speed regressions and a number of other issues regarding performance of Hudson, particularly under high load. In an effort to address these concerns, the Hudson core team has &lt;a href=&quot;https://web.archive.org/web/&amp;lt;/strong&amp;gt;/https://agentdero.cachefly.net/continuousblog/just-kidding.jpg&quot;&gt;announced&lt;/a&gt; a roadmap for &lt;strong&gt;Hudson 2.0&lt;/strong&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In a &lt;a href=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/just-kidding.jpg&quot;&gt;message&lt;/a&gt; to the &lt;code&gt;dev@&lt;/code&gt; mailing list, Kohsuke said of Hudson 2.0:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As it stands now Hudson 1.0 is a good proof of concept, it’s time to take the lessons learned and build a truly solid enterprise-ready continuous integration server
Some notable points from Kohsuke’s announcement with regards to the Hudson 2.0 roadmap, which is expected to ship late Q4 2011, are:&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Implementation of &lt;code&gt;core&lt;/code&gt; in portable C for greater speed and code readability&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Selection of a better license, namely the &lt;a href=&quot;https://en.wikipedia.org/wiki/WTFPL&quot;&gt;WTFPL&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Revamped storage architecture around the &lt;a href=&quot;https://www.oracle.com/database/standard_edition.html&quot;&gt;Oracle 11g Database&lt;/a&gt; to provide more optimal synergy over flat XML files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Embedding the Mono, Python, V8 and Lua engines allowing plugins to be written in C#, Python, JavaScript or Lua.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adoption of the Hudson &lt;a href=&quot;https://randomfunnypicture.com/wp2/wp-content/uploads/2009/12/haters-gonna-hate-eagle.jpg&quot;&gt;Eagle&lt;/a&gt; as a mascot instead of the butler&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Social&quot; support will be merged into &lt;code&gt;core&lt;/code&gt;, integrating Hudson directly with Facebook so you can share test failures with your friends.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson 2.0 is expected to follow in the intrepid footsteps of other major revamps such as &lt;a href=&quot;https://en.wikipedia.org/wiki/Netscape_5&quot;&gt;Netscape 5&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Perl%206&quot;&gt;Perl 6&lt;/a&gt; in its ambitiousness and innovation.&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/31/screencast-python-on-hudson-part-1/</id>
<title>Screencast: Python on Hudson (Part 1)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/31/screencast-python-on-hudson-part-1/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='jobs'></category>
<category term='news'></category>
<category term='screencast'></category>
<category term='tutorial'></category>
<summary>
After Hudson got some major publicity at PyCon Atlanta 2010 I haven&#8217;t been as quick as I would have liked with Python-related posts and tutorials. I use Hudson to build and test a number of pure Python modules and C extensions across numerous Python versions (covering 2.4 - 3.1). For most beginners, or those simply looking to get started with Python on Hudson, starting with my job configurations is too much at once, so instead I wanted to start at the "beginning" so to speak.


The trouble with getting people started with Hudson, given how simple and visual it is to...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After Hudson got some major publicity &lt;a href=&quot;https://www.jenkins.io/content/hudson-pycon&quot;&gt;at PyCon Atlanta 2010&lt;/a&gt; I haven’t been as quick as I would have liked with Python-related posts and tutorials. I use Hudson to build and test a number of pure Python modules and C extensions across numerous Python versions (covering 2.4 - 3.1). For most beginners, or those simply looking to get started with Python on Hudson, starting with my job configurations is too much at once, so instead I wanted to start at the &quot;beginning&quot; so to speak.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The trouble with getting people started with Hudson, given how simple and visual it is to use, is that articles with sample configurations are not particularly useful; a screencast however is a good medium for visually walking somebody through Hudson. The screencast below (&lt;a href=&quot;https://www.youtube.com/watch?v=5d-P4j5n_No&quot;&gt;also on YouTube&lt;/a&gt;) is the &lt;em&gt;first&lt;/em&gt; in a series of screencasts I’ll be doing, not only for Python on Hudson, but for Hudson overall. It is just over four minutes long, and covers setting up a simple continuous integration job for the &lt;a href=&quot;https://eventlet.net&quot;&gt;Eventlet&lt;/a&gt; library (which is hosted &lt;a href=&quot;https://bitbucket.org/which_linden/eventlet/&quot;&gt;on Bitbucket&lt;/a&gt;)&lt;center&gt;&lt;object width=&quot;480&quot; height=&quot;295&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;https://www.youtube.com/watch?v=5d-P4j5n_No&quot; /&gt;&amp;lt;/param&amp;gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&amp;lt;/param&amp;gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&amp;lt;/param&amp;gt;&lt;embed src=&quot;https://www.youtube.com/watch?v=5d-P4j5n_No&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;295&quot; /&gt;&amp;lt;/embed&amp;gt;&lt;/object&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/31/hudson-1-353-released/</id>
<title>Hudson 1.353 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-31T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/31/hudson-1-353-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
This week&#8217;s release comes slightly later than usual and is mostly a clean-up of a few bugs. Due to a problem with the Kohsuke&#8217;s GitHub mirror of Hudson&#8217;s core, I can&#8217;t mine the commits for interesting information as per usual so you&#8217;ll just have to trust that Hudson 1.353 is chock full of good, wholesome bug fixes. If the problem persists next week, I&#8217;ll find a better way to dig up information on particularly releases that doesn&#8217;t depend on the GitHub mirror.





Bugs fixed



Tagging a repository can result in NPE.


Fix possible form submission error when using multiple combobox elements. (issue 6025)


Better...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/hudson_soap.jpg&quot; alt=&quot;hudson soap&quot; width=&quot;170&quot; /&gt; This week’s release comes slightly later than usual and is mostly a clean-up of a few bugs. Due to a problem with the Kohsuke’s &lt;a href=&quot;https://github.com/kohsuke/hudson&quot;&gt;GitHub mirror&lt;/a&gt; of Hudson’s core, I can’t mine the commits for interesting information as per usual so you’ll just have to trust that Hudson 1.353 is chock full of good, wholesome bug fixes. If the problem persists next week, I’ll find a better way to dig up information on particularly releases that doesn’t depend on the GitHub mirror.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;bugs-fixed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs-fixed&quot; /&gt;Bugs fixed&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tagging a repository can result in NPE.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix possible form submission error when using multiple combobox elements. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/6025&quot;&gt;issue 6025&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Better escaping of test case names in test results pages. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5982&quot;&gt;issue 5982&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make radio buttons work in repeatable content, such as a build step. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5028&quot;&gt;issue 5028&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed the handling of verifying that the POM path entered for Maven projects exists. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/4693&quot;&gt;issue 4693&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added link to builds in buildTimeTrend (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/3993&quot;&gt;issue 3993&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/30/resurgence-of-releng/</id>
<title>Resurgence of Releng</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-30T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/30/resurgence-of-releng/" />
<author>
<name>rtyler</name>
</author>
<category term='guest post'></category>
<category term='jenkinsci'></category>
<summary>
A few weeks ago I passed a job listing that I had found through one of my many Google Alerts for Hudson-related queries to Andrew (abayer), following up on one of those job listings Andrew recently signed an offer to join the nice folks over at Digg to be their resident "build guy." On its own I thought "great for Andrew!" and nothing more, then I saw this thread on reddit which poses the question:




Anyone here a build engineer, or part of the build team? Could you please share your experience?




It seems, to me at least, the notion of "release...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few weeks ago I passed a job listing that I had found through one of my &lt;strong&gt;many&lt;/strong&gt; Google Alerts for Hudson-related queries to Andrew (&lt;code&gt;abayer&lt;/code&gt;), following up on one of those job listings Andrew recently signed an offer to join the nice folks over at Digg to be their resident &quot;build guy.&quot; On its own I thought &quot;great for Andrew!&quot; and nothing more, then I saw &lt;a href=&quot;https://www.reddit.com/r/programming/comments/bi58m/anyone_here_a_build_engineer_or_part_of_the_build/&quot;&gt;this thread&lt;/a&gt; on reddit which poses the question:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Anyone here a build engineer, or part of the build team? Could you please share your experience?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It seems, to me at least, the notion of &quot;release engineering&quot; is making a come-back, particularly in the aging &quot;Web 2.0&quot; world where companies like Digg, Facebook, Reddit, Twitter, etc are anywhere from five to ten years old. As these companies have aged a couple of important things have happened, their code-base has aged increasing the possibility of bitrot, but they have also expanded in terms of headcount. Start-ups that might have once slighted larger corporations like Oracle, Cisco VMWare and IBM for their burdensome process and longer release schedules now find themselves ensnared with massive code bases, larger development teams and complicated deployments.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/hudson_vs_buildbot.png&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past few months we’ve seen Hudson being used in a number of different contexts, it was &lt;a href=&quot;https://www.jenkins.io/content/hudson-pycon&quot;&gt;pitched at PyCon&lt;/a&gt; as part of a larger appeal to the Python community to get on the continuous integration bandwagon, we’ve seen a few posts from developers using Hudson for testing and packaging &lt;a href=&quot;https://www.jenkins.io/content/getting-started-building-android-apps-hudson&quot;&gt;Android&lt;/a&gt; and &lt;a href=&quot;https://manicwave.com/blog/2010/03/01/that-feels-better-cocoa-hudson-and-running-green/&quot;&gt;iPhone apps&lt;/a&gt;, .NET developers are &lt;a href=&quot;https://bobcravens.com/2010/03/01/getting-started-with-ci-using-hudson-for-your-net-projects/&quot;&gt;jumping on board as well&lt;/a&gt;. Across the board it feels like Hudson is being more and more widely used, it is no longer the mainstay of the Java shop’s toolkit, it’s become a must have for &lt;em&gt;all&lt;/em&gt; developers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;With the allure of &lt;a href=&quot;https://timothyfitz.wordpress.com/2009/02/10/continuous-deployment-at-imvu-doing-the-impossible-fifty-times-a-day/&quot;&gt;continuous deployment&lt;/a&gt; and Hudson’s lowered barrier to entry for testing, packaging and automating releases, is release engineering making a comeback?&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/27/this-week-in-plugins/</id>
<title>This Week in Plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-27T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/27/this-week-in-plugins/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='feedback'></category>
<summary>
I apologize for the lack of posts this week, I&#8217;ve been quite pre-occupied and a quirk in the twipFromSvn.py script prevented the generation of this post&#8217;s contents earlier; thanks to rpetti it works again!


This week was an interesting week in plugin development, a slight regression in the release of Jabber notifier plugin 1.7 resulted in the rapid release of a 1.8 release by kutzi. The Fitnesse plugin saw multiple releases again this week, along with the Libvirt Slaves plugin which has seen an amazing number of releases since it burst onto the plugin scene two weeks ago.


There were a few...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I apologize for the lack of posts this week, I’ve been quite pre-occupied and a quirk in the &lt;a href=&quot;https://github.com/rtyler/continuous-blog-tools/blob/master/twipFromSvn.py&quot;&gt;twipFromSvn.py&lt;/a&gt; script prevented the generation of this post’s contents earlier; thanks to &lt;a href=&quot;https://twitter.com/rpetti&quot;&gt;rpetti&lt;/a&gt; it works again!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week was an interesting week in plugin development, a slight regression in the release of &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jabber+Plugin&quot;&gt;Jabber notifier plugin&lt;/a&gt; 1.7 resulted in the rapid release of a 1.8 release by &lt;code&gt;kutzi&lt;/code&gt;. The &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Fitnesse+Plugin&quot;&gt;Fitnesse plugin&lt;/a&gt; saw multiple releases again this week, along with the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Libvirt+Slaves+Plugin&quot;&gt;Libvirt Slaves plugin&lt;/a&gt; which has seen an amazing number of releases since it burst onto the plugin scene &lt;a href=&quot;https://www.jenkins.io/content/week-plugins-4&quot;&gt;two weeks ago&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There were a few new and notable plugins released this week such as the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/iPhoneView+Plugin&quot;&gt;iPhoneView plugin&lt;/a&gt; which adds a fancy view to make checking Hudson all that prettier on an iPhone or iPod Touch, the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/XShell+Plugin&quot;&gt;cross-platform shell plugin&lt;/a&gt; was released, aiming to solve the problem of running a job on both Windows and Unix agents. My favorite new plugin release this week has to be the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gerrit+Plugin&quot;&gt;Gerrit plugin&lt;/a&gt; which made its debut and shows a lot of potential to enable the &quot;pre-tested commit&quot; workflow with Git and &lt;a href=&quot;https://code.google.com/p/gerrit/&quot;&gt;Gerrit&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mar 20, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Fitnesse+Plugin&quot;&gt;Fitnesse plugin&lt;/a&gt; 1.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/LabeledTestGroupsPublisher+Plugin&quot;&gt;Labeled Test Groups Publisher&lt;/a&gt; 1.2.6&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Libvirt+Slaves+Plugin&quot;&gt;Libvirt Slaves plugin&lt;/a&gt; 1.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Monitoring&quot;&gt;Monitoring&lt;/a&gt; 1.13.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Perforce+Plugin&quot;&gt;Perforce Plugin&lt;/a&gt; 1.0.25&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/iPhoneView+Plugin&quot;&gt;iPhoneView plugin&lt;/a&gt; 0.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Instant+Messaging+Plugin&quot;&gt;instant-messaging plugin&lt;/a&gt; 1.6&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 21, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Fitnesse+Plugin&quot;&gt;Fitnesse plugin&lt;/a&gt; 1.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Ivy+Plugin&quot;&gt;Ivy plugin&lt;/a&gt; 1.4&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 22, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Buckminster+PlugIn&quot;&gt;Buckminster&lt;/a&gt; 0.9.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Cobertura+Plugin&quot;&gt;Cobertura plugin&lt;/a&gt; 0.8.11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Fitnesse+Plugin&quot;&gt;Fitnesse plugin&lt;/a&gt; 1.3.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gerrit+Plugin&quot;&gt;Gerrit plugin&lt;/a&gt; 0.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/JIRA+Plugin&quot;&gt;JIRA plugin&lt;/a&gt; 1.21&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maven Release Plug-in nexus helper 0.0.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Nested+View+Plugin&quot;&gt;Nested View Plugin&lt;/a&gt; 1.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Performance+Plugin&quot;&gt;Performance plugin&lt;/a&gt; 1.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Sonar+Plugin&quot;&gt;Sonar Plugin&lt;/a&gt; 1.5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Subversion+Plugin&quot;&gt;Subversion Plug-in&lt;/a&gt; 1.15&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Translation+Assistance+Plugin&quot;&gt;Translation Assistance plugin&lt;/a&gt; 1.4&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 23, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Subversion+Plugin&quot;&gt;Subversion Plug-in&lt;/a&gt; 1.16&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Nabaztag+Plugin&quot;&gt;nabaztag&lt;/a&gt; 1.9&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 24, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Buckminster+PlugIn&quot;&gt;Buckminster&lt;/a&gt; 0.9.5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jabber+Plugin&quot;&gt;Jabber notifier plugin&lt;/a&gt; 1.8&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 25, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/CollabNet+Plugin&quot;&gt;https://www.collab.net/[CollabNet] Plugins&lt;/a&gt; 1.1.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/CVS+Plugin&quot;&gt;CVS Plug-in&lt;/a&gt; 1.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Dashboard+View&quot;&gt;Dashboard View&lt;/a&gt; 1.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Libvirt+Slaves+Plugin&quot;&gt;Libvirt Slaves plugin&lt;/a&gt; 1.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Perforce+Plugin&quot;&gt;Perforce Plugin&lt;/a&gt; 1.0.26&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 26, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/cmakebuilder+Plugin&quot;&gt;CMake plugin&lt;/a&gt; 1.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gnat+Plugin&quot;&gt;GNAT plugin&lt;/a&gt; 0.2.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Groovy+Postbuild+Plugin&quot;&gt;Groovy Postbuild&lt;/a&gt; 1.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/CppUnit+Plugin&quot;&gt;cppunit plugin&lt;/a&gt; 1.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/XShell+Plugin&quot;&gt;cross-platform shell plugin&lt;/a&gt; 0.2&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr /&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/23/links-for-2010-03-23/</id>
<title>Links for 2010-03-23</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/23/links-for-2010-03-23/" />
<author>
<name>rtyler</name>
</author>
<category term='mailing list'></category>
<summary>
While I work on some screencasts and start to get more "Spotlight" interviews lined up, I figured it&#8217;s time for a link roll-up for your Tuesday morning reading.




We caught a glimpse of a little Java scoreboard app for Hudson from @davefollett


Matt Patterson of Reprocessed.org wrote a great post on continuous integration with Rails with Hudson, running both Rspec and Selenium tests.


At the hackathon at Hacker Dojo on Saturday, Kohsuke pointed us all to the Hudson Cafe Press store, where he gets all his Hudson threads.


C.J. Adams-Collier seems quite pleased to have builds for IronRuby back online, powered by Hudson.


We got...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While I work on some screencasts and start to get more &lt;a href=&quot;https://www.jenkins.io/blog/tags/interview&quot;&gt;&quot;Spotlight&quot; interviews&lt;/a&gt; lined up, I figured it’s time for a link roll-up for your Tuesday morning reading.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We caught a glimpse of a &lt;strong&gt;&lt;a href=&quot;https://twitpic.com/152xhr&quot;&gt;little Java scoreboard app&lt;/a&gt;&lt;/strong&gt; for Hudson from &lt;a href=&quot;https://twitter.com/davefollett&quot;&gt;@davefollett&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Matt Patterson of &lt;a href=&quot;https://reprocessed.org/&quot;&gt;Reprocessed.org&lt;/a&gt; wrote a great post on &lt;strong&gt;&lt;a href=&quot;https://reprocessed.org/blog/easy_rails_ci_with_hudson&quot;&gt;continuous integration with Rails&lt;/a&gt;&lt;/strong&gt; with Hudson, running both &lt;a href=&quot;https://en.wikipedia.org/wiki/RSpec&quot;&gt;Rspec&lt;/a&gt; and &lt;a href=&quot;https://seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt; tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At the hackathon at &lt;a href=&quot;https://twitter.com/hackerdojo&quot;&gt;Hacker Dojo&lt;/a&gt; on Saturday, &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; pointed us all to the &lt;strong&gt;&lt;a href=&quot;https://www.cafepress.com/hudson_ci&quot;&gt;Hudson Cafe Press&lt;/a&gt;&lt;/strong&gt; store, where he gets all his Hudson threads.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/cjadamscollier&quot;&gt;C.J. Adams-Collier&lt;/a&gt; seems quite pleased to have &lt;strong&gt;&lt;a href=&quot;https://wp.colliertech.org/cj/?p=795&quot;&gt;builds for IronRuby back online&lt;/a&gt;&lt;/strong&gt;, powered by Hudson.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We got a sneak-peak into the first chapter of &lt;a href=&quot;https://twitter.com/wakaleo&quot;&gt;John Ferguson Smart’s&lt;/a&gt; &lt;strong&gt;&lt;a href=&quot;http://www.wakaleo.com/books/continuous-integration-with-hudson-the-book&quot;&gt;Continuous Integration with Hudson&lt;/a&gt;&lt;/strong&gt; book.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/bshine&quot;&gt;Ben Shine&lt;/a&gt; showed off some of &lt;strong&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/UI+Mockups&quot;&gt;his UI mock-ups&lt;/a&gt;&lt;/strong&gt; for Hudson.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr /&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/22/hudson-1-352-released/</id>
<title>Hudson 1.352 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/22/hudson-1-352-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
After an exciting week that saw the rushed release of Hudson 1.351 on Monday following a fairly serious regression, Hudson 1.352 was released mid-Friday with a good mix bug fixes and enhancements. Bundled with this release was another localizations drop including translations for ca, es, fi, fr, hi_IN, it, nl, ru, and sv_SE locales. In addition to the nice fancy new community contributed translations, which you can help with by installing the Translation Assistance plugin, the 1.352 release includes the subtle enhancement of hyperlinking URLs in the console output.


In general, 1.352 is looking like a very solid release, that said,...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After an exciting week that saw the rushed release of &lt;a href=&quot;https://www.jenkins.io/content/breaking-hudson-1351-released&quot;&gt;Hudson 1.351&lt;/a&gt; on Monday following a fairly serious regression, Hudson 1.352 was released mid-Friday with a good mix bug fixes and enhancements. Bundled with this release was another localizations drop including translations for ca, es, fi, fr, hi_IN, it, nl, ru, and sv_SE locales.&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/hudson_neon.jpg&quot; alt=&quot;hudson neon&quot; /&gt; In addition to the nice fancy new community contributed translations, which you can help with by installing the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Translation+Assistance+Plugin&quot;&gt;Translation Assistance plugin&lt;/a&gt;, the 1.352 release includes the subtle enhancement of hyperlinking URLs in the console output.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In general, 1.352 is looking like a very solid release, that said, here’s the breakdown for this release:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;bugs-fixed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs-fixed&quot; /&gt;Bugs fixed&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fixed a file handle leak when a copy fails. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5899&quot;&gt;issue 5899&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace &#39;&amp;gt;&#39; with &#39;_&#39; in username, as already done for &#39;&amp;lt;&#39;. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5833&quot;&gt;issue 5833&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix &lt;tt&gt;editableComboBox&lt;/tt&gt; to select item when mouse click takes more than 100ms. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/2722&quot;&gt;issue 2722&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed NPE when configuring a view without &quot;Regular expression&quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Page shouldn’t scroll up when the user opens/closes a stack trace in the test failure report.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a bug where Hudson can put a wrong help file link. (&lt;a href=&quot;https://n4.nabble.com/Resolution-of-help-files-in-jelly-entries-tp1592533p1592533.html&quot;&gt;report&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed Maven site goal archiving from agents. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5943&quot;&gt;issue 5943&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a regression with NetBeans Hudson plugin progressive console output. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5941&quot;&gt;issue 5941&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a situation where a failure in plugin start up can prevent massive number of job loss. &amp;lt;/ul&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Supported JBoss EAP 5.0.0 GA. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5922&quot;&gt;issue 5922&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CLI commands on protected Hudson now asks a password interactively, if run on Java6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added CLI &#39;login&#39; and &#39;logout&#39; commands so that you don’t have to specify a credential for individual CLI invocation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;URLs in the console output are now hyperlinks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved the URL annotation logic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add drag&amp;amp;drop support for &lt;tt&gt;f:repeatable&lt;/tt&gt; lists and use this for the JDK/Ant/Maven installations in global config so these can be reordered.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integrated a new round of community-contributed localizations (ca, es, fi, fr, hi_IN, it, nl, ru, and sv_SE locales.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release contains 63 commits, from six different contributors including our very own &lt;a href=&quot;https://www.jenkins.io/content/keeping-your-configuration-and-data-subversion&quot;&gt;Subversion-loving&lt;/a&gt; &lt;a href=&quot;https://twitter.com/MikeRooney&quot;&gt;Mike Rooney&lt;/a&gt; (mcrooney).&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://twitter.com/abayer&quot;&gt;abayer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.sun.com/jglick/&quot;&gt;jglick&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;kohsuke&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/MikeRooney&quot;&gt;mcrooney&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.sun.com/mindless&quot;&gt;mindless&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ssogabe&quot;&gt;sogabe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/19/recap-of-hackathon-part-one/</id>
<title>Recap of Hackathon Part One</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/19/recap-of-hackathon-part-one/" />
<author>
<name>rtyler</name>
</author>
<category term='meetup'></category>
<summary>
Kohsuke just posted a brief write-up on his personal blog about the first day of the Bay Area Hudson hackathon/meetup. He writes:




Total of 9 people came and we had a great time talking about infrastructure issues, possible enhancements, design discussions, exchanging tips and plugins that they&#8217;ve developed, and otherwise building personal relationships.




A number of folks joined us on the #Hudson IRC channel on Freenode and the WebEx conference, participating remotely. Since day one was primarily intended for hacking on Hudson itself, we&#8217;re expecting more people tomorrow when we&#8217;ll have a good mix of folks hacking on Hudson, folks hacking with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; just posted a brief write-up on &lt;a href=&quot;https://weblogs.java.net/blog/kohsuke/archive/2010/03/19/hudson-hackathon-day-1&quot;&gt;his personal blog&lt;/a&gt; about the first day of the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hudson+Bay+Area+Hackathon+2.0&quot;&gt;Bay Area Hudson hackathon/meetup&lt;/a&gt;. He writes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Total of 9 people came and we had a great time talking about infrastructure issues, possible enhancements, design discussions, exchanging tips and plugins that they’ve developed, and otherwise building personal relationships.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A number of folks joined us on the &lt;code&gt;#Hudson&lt;/code&gt; IRC channel on &lt;a href=&quot;https://freenode.net/&quot;&gt;Freenode&lt;/a&gt; and the WebEx conference, participating remotely. Since day one was primarily intended for hacking on Hudson itself, we’re expecting more people tomorrow when we’ll have a good mix of folks hacking &lt;strong&gt;on&lt;/strong&gt; Hudson, folks hacking &lt;strong&gt;with&lt;/strong&gt; Hudson and plain old folks.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/HackathonDay1.jpeg&lt;span class=&quot;The team&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/19/links-for-2010-03-19/</id>
<title>Links for 2010-03-19</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/19/links-for-2010-03-19/" />
<author>
<name>rtyler</name>
</author>
<category term='mailing list'></category>
<summary>
It&#8217;s been quite a busy week, preparing for the Bay Area Hudson hackathon/meetup which starts today, receiving requests for crazy-awesome Hudson stickers and my day job. Regardless, I&#8217;ve stumbled across a few links to share in this links roll-up.




John Ferguson Smart discusses some of the gotchas with migrating Hudson build jobs from one server to another


Learned a bit about how Kim Moir and the Eclipse Foundation are "building better" with Hudson


dbaktiar gave a quick overview of installing Hudson on Ubuntu Karma Koala




Looking forward even more interesting things to read next week after the hackathon and meetup here in California....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been quite a busy week, preparing for the &lt;a href=&quot;https://www.jenkins.io/content/meet-and-hack-alongside-kohsuke-and-co&quot;&gt;Bay Area Hudson hackathon/meetup&lt;/a&gt; which starts today, receiving requests for &lt;a href=&quot;https://www.jenkins.io/content/want-some-hudson-stickers&quot;&gt;crazy-awesome Hudson stickers&lt;/a&gt; and my &lt;a href=&quot;https://apture.com&quot;&gt;day job&lt;/a&gt;. Regardless, I’ve stumbled across a few links to share in this links roll-up.&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://twitter.com/wakaleo&quot;&gt;John Ferguson Smart&lt;/a&gt; discusses some of the gotchas with &lt;strong&gt;&lt;a href=&quot;http://www.wakaleo.com/blog/261-migrating-hudson-build-jobs-from-one-server-to-another&quot;&gt;migrating Hudson build jobs from one server to another&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learned a bit about how &lt;a href=&quot;https://twitter.com/Kim_Moir&quot;&gt;Kim Moir&lt;/a&gt; and the Eclipse Foundation are &lt;strong&gt;&lt;a href=&quot;https://relengofthenerds.blogspot.com/2010/03/better-builds-with-hudson-hardware-and.html&quot;&gt;&quot;building better&quot; with Hudson&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/dbaktiar&quot;&gt;dbaktiar&lt;/a&gt; gave a quick overview of &lt;strong&gt;&lt;a href=&quot;https://dbaktiar.wordpress.com/2010/03/17/installation-of-hudson-in-karmic-koala-ubuntu-9-10/&quot;&gt;installing Hudson on Ubuntu Karma Koala&lt;/a&gt;&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;Looking forward even more interesting things to read next week after the hackathon and meetup here in California.&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/19/get-excited-and-make-things/</id>
<title>Get excited and make things</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/19/get-excited-and-make-things/" />
<author>
<name>rtyler</name>
</author>
<category term='feedback'></category>
<category term='meetup'></category>
<summary>
The day of hackery is upon us! Today is Day One of the Bay Area Hudson hackathon/meetup, the hacking will start at 10am today and continue until 5pm at the Oracle Santa Clara campus in the "library" conference room of SCA7 "Mansion" building. The focus today will be largely on hacking Hudson itself.


Can&#8217;t attend?

Not everybody lives in the Bay Area, fortunately all of you are on the internets! There&#8217;s two ways you can participate remotely in the hackathon:




WebEx: Meeting Number: 201 389 367, Password: hudson (audio conference, app sharing, etc)


IRC As always, there&#8217;s the #hudson IRC channel on the Freenode...
</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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/getexcited.jpg&quot; alt=&quot;Get excited and make things&quot; /&gt;The day of hackery is upon us! Today is Day One of the &lt;a href=&quot;https://www.jenkins.io/content/meet-and-hack-alongside-kohsuke-and-co&quot;&gt;Bay Area Hudson hackathon/meetup&lt;/a&gt;, the hacking will start at 10am today and continue until 5pm at the &lt;a href=&quot;https://tinyurl.com/yznmdoo&quot;&gt;Oracle Santa Clara campus&lt;/a&gt; in the &quot;library&quot; conference room of SCA7 &quot;Mansion&quot; building. The focus today will be largely on hacking Hudson itself.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;cant-attend&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#cant-attend&quot; /&gt;Can’t attend?&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Not everybody lives in the Bay Area, fortunately all of you are on the internets! There’s two ways you can participate remotely in the hackathon:&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;WebEx:&lt;/strong&gt; &lt;a href=&quot;https://cisco.webex.com/ciscosales/j.php?ED=136431942&amp;amp;UID=0&amp;amp;PW=NN2U2OTAwNzg0&amp;amp;RT=MiM0&quot;&gt;Meeting Number: 201 389 367, Password: hudson&lt;/a&gt; (audio conference, app sharing, etc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IRC&lt;/strong&gt; As always, there’s the &lt;code&gt;#hudson&lt;/code&gt; IRC channel on the Freenode where you can participate via text chat&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re in the Bay Area, but busy at work today, come by for &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hudson+Bay+Area+Hackathon+2.0&quot;&gt;Day Two&lt;/a&gt; of the hackathon/meetup tomorrow (Saturday) from 10am to 6pm at &lt;a href=&quot;https://hackerdojo.pbworks.com/&quot;&gt;Hacker Dojo&lt;/a&gt; in Mountain View!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;friday-agenda&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#friday-agenda&quot; /&gt;Friday Agenda&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Currently there is only one item on the agenda for Friday:&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;Improving Client-Side Code Quality with YUI 3:&lt;/strong&gt; A Proposal (by: &lt;a href=&quot;https://twitter.com/bshine&quot;&gt;Benjamin Shine&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;&lt;small&gt;&lt;em&gt;Image courtesy of &lt;a href=&quot;https://www.flickr.com/photos/blackbeltjones/3365682994/&quot;&gt;blackbeltjones&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: The WebEx link for today has been corrected.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/16/slaves-building-robots/</id>
<title>Agents building robots</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/16/slaves-building-robots/" />
<author>
<name>rtyler</name>
</author>
<category term='meta'></category>
<summary>
A few weeks ago we covered building Android apps with Hudson thanks to a very informative post by Hugo Visser, ever thought about building Android itself with Hudson? Sony Ericsson apparently has, Continuous Blog reader and Hudson user Christopher Orr sent me this screen shot from his recently purchased Sony Ericsson Xperia X10 mini, notice the "Kernel version" field.image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/x10-mini-hudson.png






If you&#8217;ve got screen shots or photos spotting Hudson out in the big blue room, drop me an email at tyler at linux dot com...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few weeks ago we covered &lt;a href=&quot;https://www.jenkins.io/content/getting-started-building-android-apps-hudson&quot;&gt;building Android apps with Hudson&lt;/a&gt; thanks to a very informative post by &lt;a href=&quot;http://blog.hudson-ci.org/users/hvisser&quot;&gt;Hugo Visser&lt;/a&gt;, ever thought about building Android &lt;em&gt;itself&lt;/em&gt; with Hudson? Sony Ericsson apparently has, Continuous Blog reader and Hudson user &lt;a href=&quot;https://www.linkedin.com/in/christopherorr&quot;&gt;Christopher Orr&lt;/a&gt; sent me this screen shot from his recently purchased &lt;a href=&quot;https://www.engadget.com/2010/02/14/sony-ericsson-outs-xperia-x10-mini-and-xperia-x10-mini-pro/&quot;&gt;Sony Ericsson Xperia X10 mini&lt;/a&gt;, notice the &quot;Kernel version&quot; field.&lt;center&gt;image:https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/x10-mini-hudson.png&lt;span class=&quot;About Me on the X10 Mini&quot; /&gt;&lt;/center&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve got screen shots or photos spotting Hudson out in the big blue room, drop me an email at &lt;code&gt;tyler&lt;/code&gt; at &lt;code&gt;linux dot com&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/15/hudson-1-350-released/</id>
<title>Hudson 1.350 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/15/hudson-1-350-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
Finishing off the second week in March, the Hudson team rolled Hudson 1.350 off the assembly line last Friday, bringing a slew of fixes. Of particular interest to users of Hudson&#8217;s various native packages for Red Hat, openSuSE, Ubuntu/Debian and Solaris, was a change that suppress the "self-upgrade" functionality in the "Manage Hudson" page. On the enhancements side of the fence, the team added authentication support to the Hudson CLI (issue 3796) allowing Hudson users with locked down installations to take advantage of everything the CLI has to offer.


Internal to Hudson, some more changes from Alan Harder (a.k.a mindless, a.k.a...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Finishing off the second week in March, the Hudson team rolled Hudson 1.350 off the assembly line last Friday, bringing a &lt;strong&gt;slew&lt;/strong&gt; of fixes. Of particular interest to users of Hudson’s various native packages for &lt;a href=&quot;https://www.crunchbase.com/company/red-hat&quot;&gt;Red Hat&lt;/a&gt;, &lt;a href=&quot;https://www.opensuse.org/&quot;&gt;openSuSE&lt;/a&gt;, &lt;a href=&quot;https://www.ubuntu.com/&quot;&gt;Ubuntu/Debian&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Solaris%20%28operating%20system%29&quot;&gt;Solaris&lt;/a&gt;, was a change that suppress the &quot;self-upgrade&quot; functionality in the &quot;Manage Hudson&quot; page. On the enhancements side of the fence, the team added authentication support to the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hudson+CLI&quot;&gt;Hudson CLI&lt;/a&gt; (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/3796&quot;&gt;issue 3796&lt;/a&gt;) allowing Hudson users with locked down installations to take advantage of everything the CLI has to offer.&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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/garbageman.jpg&quot; alt=&quot;garbageman&quot; /&gt;Internal to Hudson, some more changes from Alan Harder (a.k.a &lt;a href=&quot;https://blogs.sun.com/mindless&quot;&gt;mindless&lt;/a&gt;, a.k.a The Garbage Man), deprecating or otherwise removing deprecated APIs. Alan’s been doing some great work on Hudson’s internals, if you’re coming out to &lt;a href=&quot;https://www.jenkins.io/content/meet-and-hack-alongside-kohsuke-and-co&quot;&gt;this weekend’s hackathon&lt;/a&gt;, but sure to pat him on the back for his tireless efforts.&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;bug-fixes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bug-fixes&quot; /&gt;Bug fixes&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fix handling of relative paths in alternate settings.xml path for Maven projects. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/4693&quot;&gt;issue 4693&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alternate settings, private repository, profiles, etc were not used in embedded Maven for deploy publisher. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/4939&quot;&gt;issue 4939&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make &lt;tt&gt;editableComboBox&lt;/tt&gt; work in repeatable content, such as a build step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If content is captured using &lt;tt&gt;&amp;lt;j:set var=&quot;..&quot;&amp;gt;..content..&amp;lt;/j:set&amp;gt;&lt;/tt&gt;, fixed this to use proper HTML rendering when appropriate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;&amp;lt;&#39; and &#39;&amp;amp;&#39; in the console output was not escaped since 1.349 (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5852&quot;&gt;issue 5852&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed an &lt;tt&gt;AbstractMethodError&lt;/tt&gt; in SCM polling under some circumstances. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5756&quot;&gt;issue 5756&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a &lt;tt&gt;ClassCastException&lt;/tt&gt; in the Subversion plugin - now using Subversion plugin 1.13. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5827&quot;&gt;issue 5827&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Maven Integration plugin link in the Update Center was going to a dead location. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/4811&quot;&gt;issue 4811&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On RPM/DEB/etc installation, don’t offer the self upgrade. It should be done by the native package manager. (&lt;a href=&quot;https://n4.nabble.com/RPM-for-Hudson-1-345-does-not-Upgrade-Automatically-tp1579580p1579580.html&quot;&gt;report&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a possible lock up of agents.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added advanced option to LogRotator to allow for removing artifacts from old builds without removing the logs, history, etc. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/834&quot;&gt;issue 834&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Authentication support in Hudson CLI. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/3796&quot;&gt;issue 3796&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added console annotation support to SCM polling logs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The 1.350 release of Hudson contains 54 commits from 6 different contributors,&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://twitter.com/abayer&quot;&gt;abayer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.sun.com/jglick/&quot;&gt;jglick&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;kohsuke&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;manuel_carrasco&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://bitbucket.org/mfriedenhagen&quot;&gt;mfriedenhagen&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.sun.com/mindless&quot;&gt;mindless&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/15/breaking-hudson-1-351-released/</id>
<title>Breaking! Hudson 1.351 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/15/breaking-hudson-1-351-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
Rush delivery from Hudson HQ! Hudson 1.351 just rolled out with a very important regression fix:




Regression in 1.350 that can delete old build artifacts. (mailing list thread, issue 5937)




Sorry for the hiccup everybody, we&#8217;re working pretty hard on getting a better, more stable, release process in place.



You can go grab the latest .war file straight from hudson-ci.org or if you&#8217;re using a native package, use your package manager to upgrade....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Rush delivery from Hudson HQ! Hudson 1.351 just rolled out with a &lt;strong&gt;very&lt;/strong&gt; important regression fix:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Regression in 1.350 that can delete old build artifacts. (&lt;a href=&quot;https://n4.nabble.com/Warning-about-Hudson-1-350-Could-delete-your-artifacts-td1593483.html&quot;&gt;mailing list thread&lt;/a&gt;, &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5937&quot;&gt;issue 5937&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;Sorry for the hiccup everybody, we’re working pretty hard on getting a better, more stable, release process in place.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;hr /&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/14/would-you-like-to-ok/</id>
<title>Would you like to, OK</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/14/would-you-like-to-ok/" />
<author>
<name>rtyler</name>
</author>
<category term='meta'></category>
<summary>
As Matt Brown pointed out on the dev@ list, Hudson made a cameo on The Daily WTF in their post Nobulation Fail.


Kohsuke went on to mention on the mailing list:




Looks like this one is already fixed back in October last year....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Matt Brown pointed out on the &lt;code&gt;dev@&lt;/code&gt; list, Hudson made a cameo on &lt;a href=&quot;https://thedailywtf.com&quot;&gt;The Daily WTF&lt;/a&gt; in their post &lt;a href=&quot;https://thedailywtf.com/Articles/Nobulation-Fail.aspx&quot;&gt;Nobulation Fail&lt;/a&gt;.&lt;center&gt;&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/scratch/hudson_install_dailywtf.png&quot; alt=&quot;hudson install dailywtf&quot; /&gt;&lt;/span&gt;&lt;/center&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Kohsuke went on to mention on the mailing list:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looks like this one is already fixed back in October last year.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/13/this-week-in-plugins/</id>
<title>This Week in Plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-13T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/13/this-week-in-plugins/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='feedback'></category>
<summary>
Apologies for the slight delay in posting another TWiP, both within the Hudson community and outside of it, it was quite a busy week. This past week we&#8217;ve had roughly 15 plugins released, with a few going through a number of iterations over the course of the week such as the Emma plugin and one of Hudson&#8217;s newest plugins, the Libvirt Slaves plugin.
One of Hudson&#8217;s most active contributors, Alan Harder (a.k.a mindless) was responsible for this week&#8217;s only new plugin: Copy Artifact Plugin. The Copy Artifact plugin does exactly what you&#8217;d think it does, according to the short-and-sweet wiki page:




Adds...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Apologies for the slight delay in posting another &lt;a href=&quot;https://www.jenkins.io/blog/tags/plugins&quot;&gt;TWiP&lt;/a&gt;, both within the Hudson community and outside of it, it was quite a busy week. This past week we’ve had roughly &lt;strong&gt;15&lt;/strong&gt; plugins released, with a few going through a number of iterations over the course of the week such as the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Emma+Plugin&quot;&gt;Emma plugin&lt;/a&gt; and one of Hudson’s newest plugins, the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Libvirt+Slaves+Plugin&quot;&gt;Libvirt Slaves plugin&lt;/a&gt;.
One of Hudson’s most active contributors, Alan Harder (a.k.a &lt;code&gt;mindless&lt;/code&gt;) was responsible for this week’s only new plugin: &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Copy+Artifact+Plugin&quot;&gt;Copy Artifact Plugin&lt;/a&gt;. The Copy Artifact plugin does exactly what you’d think it does, according to the short-and-sweet wiki page:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Adds a build step to copy artifacts from another project.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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;
If you’re a plugin developer in the Bay Area, this upcoming Friday and Saturday is the &lt;a href=&quot;https://www.jenkins.io/content/meet-and-hack-alongside-kohsuke-and-co&quot;&gt;Bay Area Hudson Hackathon/Meetup&lt;/a&gt;; don’t miss out!
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mar 07, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Copy+Artifact+Plugin&quot;&gt;Copy Artifact Plugin&lt;/a&gt; 1.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Emma+Plugin&quot;&gt;Emma plugin&lt;/a&gt; 1.15&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 08, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/CAS1+Plugin&quot;&gt;CAS protocol version 1 plugin&lt;/a&gt; 1.0.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Copy+To+Slave+Plugin&quot;&gt;Copy To Slave Plugin&lt;/a&gt; 1.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Emma+Plugin&quot;&gt;Emma plugin&lt;/a&gt; 1.16&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Libvirt+Slaves+Plugin&quot;&gt;Libvirt Slaves plugin&lt;/a&gt; 1.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Sidebar-Link+Plugin&quot;&gt;Sidebar Link&lt;/a&gt; 1.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Subversion+Plugin&quot;&gt;Subversion Plug-in&lt;/a&gt; 1.13&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 09, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Emma+Plugin&quot;&gt;Emma plugin&lt;/a&gt; 1.17&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mercurial+Plugin&quot;&gt;Mercurial plugin&lt;/a&gt; 1.26&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 10, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Libvirt+Slaves+Plugin&quot;&gt;Libvirt Slaves plugin&lt;/a&gt; 1.2&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 11, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/File+System+SCM&quot;&gt;File System SCM&lt;/a&gt; 1.7&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 12, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Perforce+Plugin&quot;&gt;Perforce Plugin&lt;/a&gt; 1.0.24&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mar 13, 2010&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/IRC+Plugin&quot;&gt;IRC Plugin&lt;/a&gt; 2.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Jabber+Plugin&quot;&gt;Jabber notifier plugin&lt;/a&gt; 1.6&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Sonar+Plugin&quot;&gt;Sonar Plugin&lt;/a&gt; 1.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Global+Build+Stats+Plugin&quot;&gt;global-build-stats plugin&lt;/a&gt; 0.1-alpha4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Instant+Messaging+Plugin&quot;&gt;instant-messaging plugin&lt;/a&gt; 1.5&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/12/want-some-hudson-stickers/</id>
<title>Want some Hudson stickers?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/12/want-some-hudson-stickers/" />
<author>
<name>rtyler</name>
</author>
<category term='core'></category>
<category term='jenkinsci'></category>
<summary>
Rarely do I ever get mail, let alone mail I like, so I was quite excited when a shipment of stickers from Hudson HQ arrived yesterday.  I&#8217;m certain you&#8217;re thinking to yourself "what does this guy need hundreds of Hudson stickers for?" Fact is, I don&#8217;t! They&#8217;re not for me, they&#8217;re for you!


I am willing to mail stickers vast distances to you (with some conditions)





Conferences

If you&#8217;re presenting at a conference or otherwise would like some Hudson stickers to go around, email me with a rough estimate of how many you need. The only condition being that you tell me...
</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://farm3.static.flickr.com/2743/4425921960_a056d816f1_m.jpg&quot; alt=&quot;4425921960 a056d816f1 m&quot; /&gt; Rarely do I ever get mail, let alone mail I like, so I was quite excited when a shipment of stickers from &lt;a href=&quot;https://tinyurl.com/SunSantaClaraCampus&quot;&gt;Hudson HQ&lt;/a&gt; arrived yesterday.  I’m certain you’re thinking to yourself &quot;what does this guy need hundreds of Hudson stickers for?&quot; Fact is, I don’t! They’re not for me, they’re for you!&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;I am willing to mail stickers vast distances to you&lt;/strong&gt; (&lt;em&gt;with some conditions&lt;/em&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;conferences&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#conferences&quot; /&gt;Conferences&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re presenting at a conference or otherwise would like some Hudson stickers to go around, email me with a rough estimate of how many you need. The only condition being that you tell me all about the event and how Hudson was received after the fact (this may involve an interview).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;user-groups&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#user-groups&quot; /&gt;User Groups&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you email me requesting some stickers for a user group, I’ll need an estimate of how many folks attend meetings. Depending on supplies, I may send you a little more than requested to be shared.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;companies&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#companies&quot; /&gt;Companies&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If your company wants some Hudson stickers, I’d be happy to oblige, and of course I always appreciate stickers, pens, branded bouncy balls, etc (see: &lt;a href=&quot;https://en.wikipedia.org/wiki/Promotional%20item&quot;&gt;swag&lt;/a&gt;) in return!&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;people-who-like-stickers&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#people-who-like-stickers&quot; /&gt;People who like stickers&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re just a fan of Hudson, stickers, or both, I’ll still gladly mail you a few stickers with the condition that you take pictures of where the stickers end up (and maybe of your Hudson install) and either email me some cool pictures or post them to &lt;a href=&quot;https://www.crunchbase.com/company/flickr&quot;&gt;Flickr&lt;/a&gt; (tagged: &quot;&lt;a href=&quot;https://www.flickr.com/photos/agentdero/tags/hudsonstickers/&quot;&gt;hudsonstickers&lt;/a&gt;&quot;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br&gt;
I will be stuffing envelopes in my free time, so there may be a slight delay. You can email me at &lt;code&gt;tyler&lt;/code&gt; at &lt;code&gt;linux&lt;/code&gt; dot &lt;code&gt;com&lt;/code&gt; requesting stickers, I’ll need:&lt;/br&gt;
&lt;/p&gt;
&lt;div class=&quot;literalblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;How many: (estimate)
What for: (conference|usergroup|company|iwantsomeokay)
Mailing Address:&lt;/pre&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/2010/03/12/links-for-2010-03-12/</id>
<title>Links for 2010-03-12</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/12/links-for-2010-03-12/" />
<author>
<name>rtyler</name>
</author>
<category term='mailing list'></category>
<summary>
Been a bit pre-occupied this week, so this links roll-up is short and sweet.




The JavaDude details a fairly simple test application embedding Glassfish + Netbeans + Hudson


Thanks to @chrisbingham, discovered a .NET wrapper for Hudson&#8217;s remote API


Learned all about getting started with Hudson for .NET projects from Bob Cravens


Robert Fletcher wrote a groovy post about testing Grails plugins on Hudson....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Been a bit pre-occupied this week, so this links roll-up is short and sweet.&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://twitter.com/anotherjavadude&quot;&gt;The JavaDude&lt;/a&gt; details a fairly simple &lt;a href=&quot;https://javadude.wordpress.com/2010/02/22/tutorial-most-simple-test-application-for-embedded-glassfish-netbeans-hudson/&quot;&gt;test application embedding Glassfish + Netbeans + Hudson&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;https://twitter.com/chrisbingham&quot;&gt;@chrisbingham&lt;/a&gt;, discovered a &lt;a href=&quot;https://code.google.com/p/hudson-lib/&quot;&gt;.NET wrapper for Hudson’s remote API&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learned all about &lt;a href=&quot;https://bobcravens.com/2010/03/01/getting-started-with-ci-using-hudson-for-your-net-projects/&quot;&gt;getting started with Hudson for .NET projects&lt;/a&gt; from &lt;a href=&quot;https://twitter.com/rcravens&quot;&gt;Bob Cravens&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/rfletcherEW&quot;&gt;Robert Fletcher&lt;/a&gt; wrote a groovy post about testing &lt;a href=&quot;https://adhockery.blogspot.com/2010/03/grails-plugins-on-hudson.html&quot;&gt;Grails plugins on Hudson&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr /&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/09/one-month-of-continuous-blog/</id>
<title>One month of Continuous Blog</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/09/one-month-of-continuous-blog/" />
<author>
<name>rtyler</name>
</author>
<category term='core'></category>
<summary>
It&#8217;s been a little over a month since I pinged Kohsuke about an "official Hudson blog"; my role has been nothing more than writer and editor of a community resource, while I have invested a lot of time in Continuous Blog it is not "mine" so much as it is "ours." I feel I have a responsibility as the current maintainer of this resource to be as open as possible about what&#8217;s going on with CB. When I sat down to write the inaugural post, Welcome to Continuous Blog, I set forth a few goals:






Help advocate the use of Hudson...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s been a little over a month since I pinged Kohsuke about an &quot;official Hudson blog&quot;; my role has been nothing more than writer and editor of a community resource, while I have invested a lot of time in Continuous Blog it is not &quot;mine&quot; so much as it is &quot;ours.&quot; I feel I have a responsibility as the current maintainer of this resource to be as open as possible about what’s going on with CB. When I sat down to write the inaugural post, &lt;a href=&quot;https://www.jenkins.io/content/welcome-continuous-blog&quot;&gt;Welcome to Continuous Blog&lt;/a&gt;, I set forth a few goals:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Help advocate the use of Hudson to the larger internet community&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be a central source for tutorials and helpful information to Hudson users of all skill-levels&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recognize the numerous contributors to the Hudson project for their efforts&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Being a community resource, I wanted to review our progress on those goals along with some other interesting details about Continuous Blog and my community efforts. My metrics for achieving these goals are largely based on web traffic to this blog and retweets via the &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci&lt;/a&gt; twitter account. First a minor overview of some of Continuous Blog’s traffic, then I’ll get to reviewing the goals.&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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/cb_visits.png&quot; alt=&quot;cb visits&quot; width=&quot;550&quot; /&gt;
&lt;em&gt;Visitor trend via Google Analytics&lt;/em&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Over the past month Continuous Blog has seen just under 10,000 visits from a number of different sources, the top sources being:&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://feedburner.google.com/&quot;&gt;Feedburner&lt;/a&gt; links posted to &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Direct visits&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://feedburner.google.com/&quot;&gt;Feedburner&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Referrals from the &quot;blog&quot; link on &lt;a href=&quot;https://hudson-ci.org&quot;&gt;hudson-ci.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/domain/hudson-ci.org&quot;&gt;reddit&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Links from the &lt;a href=&quot;https://java.net&quot;&gt;Java.net&lt;/a&gt; community portal and associated weblogs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In addition to general web traffic, Continuous Blog has around 350 RSS subscribers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To put these numbers into perspective, Hudson has seen commits from 173 different developers and the &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci&lt;/a&gt; twitter account has about 1,100 followers.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;hudson-advocacy&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#hudson-advocacy&quot; /&gt;Hudson Advocacy&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Looking at the traffic sources and the volume of traffic coming from what I would consider &quot;the wider internet community&quot; I’d say I failed to meet my own expectations. The majority of traffic seems to be coming from &quot;within the community&quot;, which is certainly not a bad thing by a stretch, but I was hoping to start to see more visitors who are less likely to be using Hudson already. There are signs of this (I think) in the low number of search referrals, roughly 370 visits. To me this indicates the early age of this site, small number of external links to Continuous Blog and the content isn’t &quot;interesting&quot; enough to come up in searches for terms like &quot;continuous integration with python&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The vector for improvement in advocacy, in my opinion, is to focus more on tutorials and user guides in the next month. Mike Rooney’s post on &lt;a href=&quot;https://www.jenkins.io/content/keeping-your-configuration-and-data-subversion&quot;&gt;Keeping your configuration and data in Subversion&lt;/a&gt; was both discussion provoking, but one of the more visited pages over the past month. I’ll be reaching out to more power-users from differing backgrounds to try to get some more tutorials on using Hudson for Python, Ruby, and Cocoa development while continuing to bug some of you Maven2 pros about guides.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;central-information-repository&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#central-information-repository&quot; /&gt;Central information repository&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I feel I failed to meet my own expectations here as well, it has only been a month (feels like an eternity!) so the amount of information we’ve been able to aggregate is small, but growing.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I have likely spent too much time covering Hudson community news, which I feel is important, to put a human voice in front of commits and releases, but it is not what I originally intended to spend the majority of my time doing.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;recognition-of-contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#recognition-of-contributors&quot; /&gt;Recognition of contributors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In my opinion, this goal I’ve met. When writing up each Hudson release I’ve made certain to give credit where credit is due, to those that contributed, Through the &quot;spotlight&quot; series of posts I’ve also made an effort to highlight power-users of Hudson, trying to glean interesting details about their installations from them for our benefit. Unfortunately I’ve done a poor job highlighting the contributions from individual plugin developers, something I’m still not certain how to correct.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;content&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#content&quot; /&gt;Content&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’ve been following the blog you have no doubt noticed the regular occurrence of certain types of posts, these regular series are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&quot;This Week in Plugins&quot;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This post is halfway script generated, pulling all the release details out of SVN history to help me generate a post. The intention of the post being to cite new or notable plugins, while giving an informative listing of &quot;what’s happening&quot; in plugin development for the past week.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Spotlight On&quot;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The only interview-formatted series I’ve got going right now, I’ve been trying to find companies or organizations who are using Hudson in interesting ways and are willing to let &quot;us&quot; peek behind the curtains a bit. This started more from curiosity, but I think it’s fun to let Hudson users brag about their set ups.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hudson 1.xxx Released&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pretty straight-forward reporting on a release of Hudson, depending on the contents of the release there may be some calls to action or editorializing on what’s gone into the release.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Links for&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Roll-up of links shared or retweeted via the &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci&lt;/a&gt; account, uncertain whether this is worth the time spent.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;My two questions to the community in general would be:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Do you dislike any of these?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What else would you like to see on a regular basis?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m certainly open to suggestion, I’d like Continuous Blog to continue to be interesting to the Hudson community and if certain kinds of posts are boring or uninteresting, I can cut them from the line-up.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;challenges&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#challenges&quot; /&gt;Challenges&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The largest challenge of Continuous Blog is &lt;strong&gt;time&lt;/strong&gt;. As it stands the majority of content I write or edit in some capacity, which is a larger amount of time than I expected to spend. All said and done it takes me between 6-10 hours a week to write for CB, keep tabs on &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci&lt;/a&gt; and peruse the mailing list for interesting things. This probably isn’t maintainable, and if for some reason a bus hits me (&lt;a href=&quot;https://www.google.com/search?ie=UTF-8&amp;amp;q=muni+hits+pedestrian&quot;&gt;not uncommon around here&lt;/a&gt;), this blog would go dark for a while.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This can be easily fixed by simply adding more contributors to the blog, I’ll post more on how to write for Continuous Blog in another post.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All said and done, I am looking forward to another month of writing and following the Hudson community. I’m grateful for all those who’ve asked questions, been interviewed, wrote content and participated in discussion in the comments. For those of you in the Bay Area, I do hope you come out for the &lt;a href=&quot;https://www.jenkins.io/content/meet-and-hack-alongside-kohsuke-and-co&quot;&gt;meet-up in mid-March&lt;/a&gt;, for the rest of you, I’ll catch you on IRC :)&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/08/meet-up-and-hack-alongside-kohsuke-and-co/</id>
<title>Meet-up and Hack alongside Kohsuke and Co.</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/08/meet-up-and-hack-alongside-kohsuke-and-co/" />
<author>
<name>rtyler</name>
</author>
<category term='feedback'></category>
<category term='meetup'></category>
<summary>
Ever wanted to pick the brains of multiple Hudson developers and users, all at the same time? Feel like finally meeting Kohsuke in person? Now&#8217;s your chance!


We&#8217;re hosting our second-ever Bay Area Hudson Hackathon/Meetup on March 19th and 20th. That&#8217;s nearly two whole days of Hudson!


Day One (Mar. 19)

The first day of the hackathon/meetup is aimed primarily at those working with Hudson&#8217;s core, or are building on top of Hudson (plugins, etc).




Start: 10 a.m.


End:   5 p.m.


Location: Oracle Santa Clara campus in the "library" conference room of SCA7 "Mansion" building.




There will a number of community and corporate Hudson hackers...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ever wanted to pick the brains of &lt;strong&gt;multiple&lt;/strong&gt; Hudson developers and users, all at the same time? Feel like finally meeting Kohsuke in person? Now’s your chance!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re hosting our &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hudson+Bay+Area+Hackathon+2.0&quot;&gt;second-ever Bay Area Hudson Hackathon/Meetup&lt;/a&gt; on &lt;strong&gt;March 19th and 20th&lt;/strong&gt;. That’s nearly &lt;em&gt;two&lt;/em&gt; whole days of Hudson!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;day-one-mar-19&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-one-mar-19&quot; /&gt;Day One (Mar. 19)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The first day of the hackathon/meetup is aimed primarily at those working with Hudson’s core, or are building on top of Hudson (plugins, etc).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Start:&lt;/em&gt; 10 a.m.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;End:&lt;/em&gt;   5 p.m.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Location:&lt;/em&gt; &lt;a href=&quot;https://tinyurl.com/SunSantaClaraCampus&quot;&gt;Oracle Santa Clara campus&lt;/a&gt; in the &quot;library&quot; conference room of SCA7 &quot;Mansion&quot; building.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There will a number of community and corporate Hudson hackers joining us on Friday, so bring everything you’ll need to get some grade A hacking done with Kohsuke, Andrew Bayer, Alan Harder and your fellow plugin hackers.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;day-two-mar-20&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#day-two-mar-20&quot; /&gt;Day Two (Mar. 20)&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m tentatively calling this the &lt;strong&gt;main event&lt;/strong&gt;, which will be hosted at the delightful &lt;a href=&quot;https://hackerdojo.pbworks.com&quot;&gt;Hacker Dojo&lt;/a&gt; in Mountain View. The &quot;main event&quot; will carry over the hackathon from the day before at Oracle, into a full blown community hackathon and meet-up. This is for Hudson &lt;strong&gt;hackers and users&lt;/strong&gt; alike!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Start:&lt;/em&gt; 10 a.m.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;End:&lt;/em&gt;   6 p.m.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Location:&lt;/em&gt; &lt;a href=&quot;https://hackerdojo.pbworks.com/&quot;&gt;Hacker Dojo&lt;/a&gt; (Savanna room)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I’ve &lt;a href=&quot;https://www.jenkins.io/content/hudson-pycon&quot;&gt;pointed out before&lt;/a&gt;, Hudson’s getting a lot of attention in other developer circles such as the Python, Ruby, Cocoa communities. As such, I’m hoping to get a lot of folks interested in using Hudson to come to Hacker Dojo where we (already being Hudson users) can help get them up to speed with all the great things Hudson can do.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;If you’re interested please RSVP:&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;Via the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hudson+Bay+Area+Hackathon+2.0&quot;&gt;hackathon page on the wiki&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Via Facebook for &lt;a href=&quot;https://www.facebook.com/event.php?eid=369652692847&quot;&gt;day one&lt;/a&gt; and &lt;a href=&quot;https://www.facebook.com/event.php?eid=359578281880&quot;&gt;day two&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;how-you-can-help&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#how-you-can-help&quot; /&gt;How you can help&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While I casually refer to myself as a &quot;PR intern&quot; for &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt;, I’m technically a busy software engineer, meaning I’m grateful for all the help I can get.&lt;/p&gt;
&lt;/div&gt;
&lt;h5 id=&quot;get-the-word-out&quot; class=&quot;discrete&quot;&gt;Get the word out&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The best way to help get the word out is to talk about Hudson and the meetup, this includes:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Link to this post on Twitter&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ping any user groups you are a member of in the area&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blog about it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let your co-workers know about it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attend!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;h5 id=&quot;volunteer-to-help-setupteardown&quot; class=&quot;discrete&quot;&gt;Volunteer to help setup/teardown&lt;/h5&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hosting the Saturday event at Hacker Dojo does carry some responsibilities with it. We will need some extra hands to make sure everybody has power, refreshments are chilled, lunch is ordered and delivered, and of course, cleaning up after we leave. If you’re in a generous mood, or in a real need for some karma, sign up to help on &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Hudson+Bay+Area+Hackathon+2.0&quot;&gt;the bottom of the wiki page&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I am hoping Oracle and some other heavy users/contributors will kick in a few bucks for lunch and drinks on Saturday, if you think your company can help us out, feel free to ping me directly at &lt;code&gt;tyler&lt;/code&gt; at &lt;code&gt;linux.com&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/08/hudson-1-349-released/</id>
<title>Hudson 1.349 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/08/hudson-1-349-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
Last Friday, March 5th, Hudson 1.349 was pushed out into the wild with an even split of bug fixes and enhancements. Included in this release is Alan Harder&#8217;s (a.k.a mindless) old data monitor code, discussed previously in the post "Call for Testers: The older the better." Included in this release were further updates to the japanese and german localizations of Hudson; if you&#8217;re interested in helping localize Hudson into more languages you can join the effort via the Internationalization page on the wiki.


Now for the breakdown of the 1.349 release:


Bug fixes



Fix deserialization problem with fields containing double underscore. (issue 5768)


Fix...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last Friday, March 5th, Hudson 1.349 was pushed out into the wild with an even split of bug fixes and enhancements. Included in this release is Alan Harder’s (a.k.a &lt;code&gt;mindless&lt;/code&gt;) old data monitor code, discussed previously in the post &quot;&lt;a href=&quot;https://www.jenkins.io/content/call-testers-older-better&quot;&gt;Call for Testers: The older the better&lt;/a&gt;.&quot; Included in this release were further updates to the japanese and german localizations of Hudson; if you’re interested in helping localize Hudson into more languages you can join the effort via the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Internationalization&quot;&gt;Internationalization page on the wiki&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now for the breakdown of the 1.349 release:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;bug-fixes&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bug-fixes&quot; /&gt;Bug fixes&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fix deserialization problem with fields containing double underscore. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5768&quot;&gt;issue 5768&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix deserialization problem for Exception objects where the XML has bad/old data. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5769&quot;&gt;issue 5769&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix serialization problem with empty CopyOnWriteMap.Tree. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5776&quot;&gt;issue 5776&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a bug that can cause 404 in the form validation check.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Remote build result submission shouldn’t hang forever even if Hudson goes down.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added a monitor for old or unreadable data in XML files and a manage screen to assist in updating files to the current data format and/or removing unreadable data from plugins that are no longer active. &quot;Manage Hudson&quot; page will show a link if any old/unreadable data was detected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added a mechanism to bundle &lt;tt&gt;init.groovy&lt;/tt&gt; inside the war for OEM. (&lt;a href=&quot;https://n4.nabble.com/preconfigured-hudson-war-tp1575216p1575216.html&quot;&gt;report&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added an extension point to annotate console output. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/2137&quot;&gt;issue 2137&lt;/a&gt;)&amp;lt;/ul&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson 1.349 contains &lt;strong&gt;43&lt;/strong&gt; commits from 6 contributors, due to the merging in of Alan Harder’s old-data-monitor branch the commit count is a bit off from the amount of code change that actually went out in 1.349.&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://twitter.com/abayer&quot;&gt;abayer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;kohsuke&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.sun.com/mindless&quot;&gt;mindless&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ssogabe&quot;&gt;sogabe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;swiest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/wyukawa&quot;&gt;wyukawa&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;&lt;br&gt;
As usual, you can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/br&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;/hr&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/07/this-week-in-plugins/</id>
<title>This Week in Plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-07T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/07/this-week-in-plugins/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='feedback'></category>
<summary>
A little late, but this past week we released 19 plugins including one new release, the Libvirt Slaves.




Feb 28th



Accurev plugin 0.6.10





Mar 1st



Subversion Release Manager plugin 1.1


Clover plugin 2.6.3


SCTMExecutor 1.5


global-build-stats plugin 0.1-alpha3





Mar 2nd



ClearCase UCM Baseline Plug-in 1.4


Accurev plugin 0.6.11


JIRA plugin 1.20





Mar 3rd



NAnt Plugin 1.4.1


Edgewall Trac plugin 1.10


NCover plugin 0.3


nabaztag 1.7


Mozmill Plugin 1.3


Mantis plugin 0.9


Harvest SCM 0.3


Subversion Plug-in 1.12





Mar 4th



Performance Publisher plugin 7.96


Artifactory Plugin 1.0.7





Mar 5th



Perforce Plugin 1.0.23





Mar 6th



SCTMExecutor 1.5.1





Mar 7th



Libvirt Slaves plugin 1.0


Emma plugin 1.13...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A little late, but this past week we released &lt;strong&gt;19&lt;/strong&gt; plugins including one new release, the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Libvirt+Slaves+Plugin&quot;&gt;Libvirt Slaves&lt;/a&gt;.&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;Feb 28th&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Accurev+Plugin&quot;&gt;Accurev plugin&lt;/a&gt; 0.6.10&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mar 1st&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Subversion+Release+Manager&quot;&gt;Subversion Release Manager plugin&lt;/a&gt; 1.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Clover+Plugin&quot;&gt;Clover plugin&lt;/a&gt; 2.6.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/SCTMExecutor&quot;&gt;SCTMExecutor&lt;/a&gt; 1.5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Global+Build+Stats+Plugin&quot;&gt;global-build-stats plugin&lt;/a&gt; 0.1-alpha3&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mar 2nd&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/ClearCase+UCM+Baseline+Plugin&quot;&gt;ClearCase UCM Baseline Plug-in&lt;/a&gt; 1.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Accurev+Plugin&quot;&gt;Accurev plugin&lt;/a&gt; 0.6.11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/JIRA+Plugin&quot;&gt;JIRA plugin&lt;/a&gt; 1.20&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mar 3rd&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/NAnt+Plugin&quot;&gt;NAnt Plugin&lt;/a&gt; 1.4.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Trac+Plugin&quot;&gt;Edgewall Trac plugin&lt;/a&gt; 1.10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/NCover+Plugin&quot;&gt;NCover plugin&lt;/a&gt; 0.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Nabaztag+Plugin&quot;&gt;nabaztag&lt;/a&gt; 1.7&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mozmill+Plugin&quot;&gt;Mozmill Plugin&lt;/a&gt; 1.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mantis+Plugin&quot;&gt;Mantis plugin&lt;/a&gt; 0.9&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Harvest+Plugin&quot;&gt;Harvest SCM&lt;/a&gt; 0.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Subversion+Plugin&quot;&gt;Subversion Plug-in&lt;/a&gt; 1.12&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mar 4th&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/PerfPublisher+Plugin&quot;&gt;Performance Publisher plugin&lt;/a&gt; 7.96&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Artifactory+Plugin&quot;&gt;Artifactory Plugin&lt;/a&gt; 1.0.7&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mar 5th&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Perforce+Plugin&quot;&gt;Perforce Plugin&lt;/a&gt; 1.0.23&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mar 6th&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/SCTMExecutor&quot;&gt;SCTMExecutor&lt;/a&gt; 1.5.1&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mar 7th&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Libvirt+Slaves+Plugin&quot;&gt;Libvirt Slaves plugin&lt;/a&gt; 1.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Emma+Plugin&quot;&gt;Emma plugin&lt;/a&gt; 1.13&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/05/tag-team-automating-massive-projects-with-hudson-and-artifactory/</id>
<title>Tag team: Automating massive projects with Hudson and Artifactory</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/05/tag-team-automating-massive-projects-with-hudson-and-artifactory/" />
<author>
<name>rtyler</name>
</author>
<category term='feedback'></category>
<category term='meetup'></category>
<summary>
For those of you living in or around Silicon Valley, next Wednesday (March 10th) you might want to reserve some space around 6pm on your calendar. Frederic Simon and Yoav Landman from JFrog will be presenting at the Silicon Valley JavaFX Users Group meeting at the Googleplex. Frederic and Yoav will be discussing and demonstrating how JFrog&#8217;s Artifactory works with Hudson to combine continuous integration with release management.




Join with the Artifactory team to realize the benefits of managing your software development life-cycle through continuous integration.


Frederic Simon (JFrog Chief Architect) and Yoav Landman (JFrog CTO) will demonstrate how to automate large-scale...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For those of you living in or around Silicon Valley, next Wednesday (March 10th) you might want to reserve some space around 6pm on your calendar. &lt;a href=&quot;https://freddy33.blogspot.com/&quot;&gt;Frederic Simon&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/yoavlandman&quot;&gt;Yoav Landman&lt;/a&gt; from &lt;a href=&quot;https://twitter.com/artifrog&quot;&gt;JFrog&lt;/a&gt; will be presenting at the &lt;a href=&quot;https://www.meetup.com/svjugfx/&quot;&gt;Silicon Valley JavaFX Users Group&lt;/a&gt; meeting at the Googleplex. Frederic and Yoav will be discussing and demonstrating how JFrog’s Artifactory works with Hudson to combine continuous integration with release management.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Join with the Artifactory team to realize the benefits of managing your software development life-cycle through continuous integration.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Frederic Simon (JFrog Chief Architect) and Yoav Landman (JFrog CTO) will demonstrate how to automate large-scale multi-module projects, using a fully-integrated platform with Artifactory and Hudson.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Using Maven, Gradle or Ivy builds, it is now possible to dynamically automate and manage the pyramidal stacks of Unit, Functional, and Integration Tests.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This demo-based session will show you how Artifactory and Hudson together make it much easier to promote certified builds to milestone releases , and finally to general availability, while making sure all builds are fully reproducible.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Staying dynamic all through the development process avoids code freeze and provides very accurate feedback loops. This is crucial for Developers, QA teams, System and Integration testers, Users, Customers, and all the remaining actors of the development process.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in attending, you can RSVP on &lt;a href=&quot;https://www.svjugfx.org/calendar/12559455/?eventId=12559455&amp;amp;action=detail&quot;&gt;the meetup page&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/05/links-for-2010-03-04/</id>
<title>Links for 2010-03-04</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-05T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/05/links-for-2010-03-04/" />
<author>
<name>rtyler</name>
</author>
<category term='mailing list'></category>
<summary>
Since I&#8217;ve been a bit pre-occupied with non-Hudson related activities lately, I have missed a few days of link rollups, I suppose it&#8217;s fitting to get a couple days worth of links in one post.


While The Build Doctor has the time to follow the continuous integration world and post links on a daily basis, I haven&#8217;t found the same quantity of Hudson links on a day-to-day basis. Therefore, I will be posting a link-rollup every few days. Do let me know if this is too infrequent. That said, here&#8217;s some interesting links!




That feels better&#8201;&#8212;&#8201;Cocoa, Hudson and running green



Indie iPhone app...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since I’ve been a bit pre-occupied with non-Hudson related activities lately, I have missed a few days of link rollups, I suppose it’s fitting to get a couple days worth of links in one post.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;While The Build Doctor has the time to follow the continuous integration world and post links on a daily basis, I haven’t found the same quantity of Hudson links on a day-to-day basis. Therefore, I will be posting a link-rollup every few days. Do let me know if this is too infrequent. That said, here’s some interesting links!&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://manicwave.com/blog/2010/03/01/that-feels-better-cocoa-hudson-and-running-green/&quot;&gt;That feels better — Cocoa, Hudson and running green&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Indie iPhone app developer &lt;a href=&quot;https://twitter.com/JeffSchilling&quot;&gt;Jeff Schilling&lt;/a&gt; writes about working more efficient with Hudson and Cocoa for developing iPhone apps, he covers &lt;a href=&quot;https://developer.apple.com/tools/unittest.html&quot;&gt;OCUnit&lt;/a&gt; integration and code coverage with &lt;a href=&quot;https://software.sandia.gov/trac/fast/wiki/Documentation/gcovr&quot;&gt;gcovr&lt;/a&gt;, a good read for iPhone and Mac developers alike.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://sonar.codehaus.org/add-ci-build-stability-to-your-sonar-dashboard/&quot;&gt;Add CI Build Stability to your Sonar Dashboard&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hudson contributor &lt;a href=&quot;https://twitter.com/&amp;lt;em&amp;gt;godin&amp;lt;/em&amp;gt;&quot;&gt;godin&lt;/a&gt; (also known as Evgeny Mandrikov) has released a Sonar plugin to report build stability back into &lt;a href=&quot;https://sonar.codehaus.org/&quot;&gt;Sonar&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://kannan.jumbledthoughts.com/index.php/how-to-get-logged-in-username-in-hudson/&quot;&gt;How to get logged-in username in Hudson?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.amaxus.com/cms-blog/from-cruisecontrol-to-hudson-ci&quot;&gt;Switching from CruiseControl to Hudson&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The developers over at &lt;a href=&quot;https://www.amaxus.com/&quot;&gt;Amaxus&lt;/a&gt; wax poetic on reducing their &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Bus%20factor&quot;&gt;bus factor&lt;/a&gt;&quot; by switching from CruiseControl to Hudson&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.infostretch.com/?p=328&quot;&gt;Integrating Selenium tests with Hudson CI&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The folks at &lt;a href=&quot;https://infostretch.com&quot;&gt;InfoStretch&lt;/a&gt; have written up a nice, short-and-sweet, overview of getting higher level integration tests built with &lt;a href=&quot;https://seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt; to play with Hudson&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/02/what-new-features-do-you-want-to-see/</id>
<title>What new features do you want to see?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/02/what-new-features-do-you-want-to-see/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='development'></category>
<category term='core'></category>
<category term='just for fun'></category>
<category term='jenkinsci'></category>
<summary>
Michael Donohue, a Hudson developer who has taken on the role of master bug triage guy for Hudson, does something regularly which I&#8217;ve really come to appreciate as a Hudson developer myself: he sends out emails to the dev list with the top 10 voted issues at that time. This gives those of us in the Hudson development community a good sense of what&#8217;s really important to our users, which in turn helps us decide where to focus our efforts. If you&#8217;re interested, you can see the top voted issues over at our JIRA server.


A good number of those issues...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Michael Donohue, a Hudson developer who has taken on the role of master bug triage guy for Hudson, does something regularly which I’ve really come to appreciate as a Hudson developer myself: he sends out emails to the dev list with the top 10 voted issues at that time. This gives those of us in the Hudson development community a good sense of what’s really important to our users, which in turn helps us decide where to focus our efforts. If you’re interested, you can see &lt;a href=&quot;https://issues.hudson-ci.org/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=10045&quot;&gt;the top voted issues&lt;/a&gt; over at &lt;a href=&quot;https://issues.hudson-ci.org&quot;&gt;our JIRA server.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A good number of those issues have been high on the list for a while - I’m actually in the early stages of work on a plugin to answer &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/682&quot;&gt;HUDSON-682&lt;/a&gt;, the current #1 most voted-for issue, two and a half years after it was opened. But I’m sure there are some equally useful features Hudson users would like to see added which aren’t on that list. So I’m asking you, dear readers: what are you looking for in Hudson that isn’t already there? Take a look around the existing issues - you may find a request that fits what you want lurking just out of the top 10, needing only your vote to push it into the spotlight. If no one’s yet created an issue requesting your desired feature, well, create one.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Or, better still, write a plugin or contribute a patch yourself!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note:&lt;/strong&gt;  If you’re interested in writing a plugin, you can check out &lt;a href=&quot;https://wiki.jenkins.io&quot;&gt;Hudson’s wiki&lt;/a&gt; and/or &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+tutorial&quot;&gt;this guide&lt;/a&gt; on the subject.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Andrew Bayer (&lt;code&gt;abayer&lt;/code&gt;) has been a contributor to Hudson since early 2009, contributing to the ClearCase plugin, Hudson’s core and a small number of other plugins. Andrew also helps Kohsuke with a lot of Hudson’s project infrastructure, most notably the migration from Bugzilla on Java.net to JIRA running at &lt;a href=&quot;https://issues.hudson-ci.org&quot;&gt;issues.hudson-ci.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/02/call-for-testers-the-older-the-better/</id>
<title>Call for Testers: The older the better</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/02/call-for-testers-the-older-the-better/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='jenkinsci'></category>
<summary>
A couple weeks ago in the post outlining the release of Hudson 1.347 I mentioned that Alan Harder (a.k.a. mindless) had undertaken a deprecation-crusade; that is to say Alan has taken it upon himself to rid Hudson&#8217;s code-base, particularly in the plugin area, of older code. One of Alan&#8217;s branches old-data-monitor was merged into trunk with r28147 bringing with it some changes to help migrate older plugin datasets to newer formats.


When I reached out to Alan earlier today on IRC (#hudson on the Freenode) about the subject he agreed that polling the community for beta testers would be a good...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A couple weeks ago in the &lt;a href=&quot;https://www.jenkins.io/content/hudson-1347-released/&quot;&gt;post outlining the release of Hudson 1.347&lt;/a&gt; I mentioned that Alan Harder (a.k.a. mindless) had undertaken a deprecation-crusade; that is to say Alan has taken it upon himself to rid Hudson’s code-base, particularly in the plugin area, of older code. One of Alan’s branches &lt;code&gt;old-data-monitor&lt;/code&gt; was merged into trunk with &lt;code&gt;r28147&lt;/code&gt; bringing with it some changes to help migrate older plugin datasets to newer formats.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When I reached out to Alan earlier today on IRC (&lt;code&gt;#hudson&lt;/code&gt; on the &lt;a href=&quot;https://en.wikipedia.org/wiki/Freenode&quot;&gt;Freenode&lt;/a&gt;) about the subject he agreed that polling the community for beta testers would be a good idea; &lt;strong&gt;this is where &lt;em&gt;you&lt;/em&gt; come in&lt;/strong&gt;. Per Alan’s message to the &lt;code&gt;dev@&lt;/code&gt; mailing list:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Visit your &quot;Manage Hudson&quot; screen to see if the notice about old/unreadable data appears. I’ll be curious to see which of the old deprecated data structures are actually out there in people’s XML files.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Instead of waiting for the release candidate to be packaged Wednesday evening, I’ve gone ahead and published the artifact from &lt;a href=&quot;https://hudson.glassfish.org/view/Hudson/job/hudson-trunk/4544&quot;&gt;build #4544&lt;/a&gt; which can be downloaded here: &lt;a href=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/hudson_build4544.war&quot;&gt;hudson.war&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you have an &lt;strong&gt;old&lt;/strong&gt; Hudson installation with, testing this build would be incredibly useful. Alan went on to say:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If people find issues with OldDataMonitor, they should file them at &lt;a href=&quot;https://issues.hudson-ci.org&quot;&gt;issues.hudson-ci.org&lt;/a&gt; in &quot;core&quot; component and assign them to &quot;mindless&quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This change does not mutate any data (or at least it shouldn’t) so it should be safe, be on the look out for exceptions in Hudson’s log on startup.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/01/learn-about-ci-with-hudson-sf-java-user-group/</id>
<title>Learn about CI with Hudson (SF Java User Group)</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/01/learn-about-ci-with-hudson-sf-java-user-group/" />
<author>
<name>rtyler</name>
</author>
<category term='feedback'></category>
<category term='jobs'></category>
<category term='just for fun'></category>
<summary>
A few weeks ago our fearless leader Kohsuke Kawaguchi joined the San Francisco Java Users Group to talk about continuous integration with Hudson. Thanks to Marakana for organizing the meetup, and Aleksandar Gargenta for posting the video and slides, embedded below.




Learn About Continuous Integration With Hudson Directly From the Source...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A few weeks ago our fearless leader &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke Kawaguchi&lt;/a&gt; joined the &lt;a href=&quot;https://www.meetup.com/sfjava/&quot;&gt;San Francisco Java Users Group&lt;/a&gt; to talk about continuous integration with Hudson. Thanks to &lt;a href=&quot;https://marakana.com/&quot;&gt;Marakana&lt;/a&gt; for organizing the meetup, and &lt;a href=&quot;https://www.linkedin.com/in/aleksandargargenta&quot;&gt;Aleksandar Gargenta&lt;/a&gt; for posting the video and slides, embedded below.&lt;/p&gt;
&lt;/div&gt;
&lt;center&gt;&lt;object width=&quot;500&quot; height=&quot;315&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;https://www.youtube-nocookie.com/v/6k0S4O2PnTc&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1&quot; /&gt;&lt;/object&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;/center&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;embed src=&quot;https://www.youtube-nocookie.com/v/6k0S4O2PnTc&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;500&quot; height=&quot;315&quot; /&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/marakana/learn-about-continuous-integration-with-hudson-directly-from-the-source&quot;&gt;Learn About Continuous Integration With Hudson Directly From the Source&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/03/01/hudson-1-348-released/</id>
<title>Hudson 1.348 Released </title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-03-01T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/03/01/hudson-1-348-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
The latest release, 1.348 of Hudson was pushed out to the repositories on the 26th of Feb. This release is primarily a bugfix release containing a number of fixes (listed below) and a few localization corrections


Bugs fixed



Fixed a performance problem of the job/build top page when there are too many artifacts.


Improved /etc/shadow permission checks.


Disable auto-refresh in Groovy script console (issue 5729)








Contributors

This release of Hudson contained 19 commits from 5 different contributors to "core":




godin">godin


kohsuke


swiest


manuel_carrasco


rseguy





As usual, you can go grab the latest .war file straight from hudson-ci.org or if you&#8217;re using a native package, use your package manager to upgrade....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latest release, 1.348 of Hudson was pushed out to the repositories on the 26th of Feb. This release is primarily a bugfix release containing a number of fixes (listed below) and a few localization corrections&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;bugs-fixed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs-fixed&quot; /&gt;Bugs fixed&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fixed a performance problem of the job/build top page when there are too many artifacts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved /etc/shadow permission checks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disable auto-refresh in Groovy script console (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5729&quot;&gt;issue 5729&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;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release of Hudson contained 19 commits from &lt;strong&gt;5&lt;/strong&gt; different contributors to &quot;core&quot;:&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://twitter.com/&amp;lt;em&amp;gt;godin&amp;lt;/em&amp;gt;&quot;&gt;godin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;kohsuke&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;swiest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;manuel_carrasco&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;rseguy&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br&gt;
As usual, you can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/br&gt;
&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/26/this-week-in-plugins/</id>
<title>This Week in Plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/26/this-week-in-plugins/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='feedback'></category>
<summary>
This week we had 18 plugin releases, with the xUnit plugin managing to have a release almost every day. For this edition of TWiP I was actually able to generate the log of releases mostly automatically thanks to rpetti who contributed the script to the continuous-blog-tools repository on GitHub.


This past week saw two new plugins, the SSH plugin and the Global Build Stats plugin, the latter of which is still in "alpha".




Feb 19th, 2010



Perforce Plugin 1.0.21





Feb 20th, 2010



Monitoring 1.12.0





Feb 21st, 2010



Hudson global-build-stats plugin 0.1-alpha1


Hudson Gallio plugin 0.70


Hudson cppunit plugin 1.2


Hudson Emma plugin 1.12


Hudson Backup plugin 1.4.1





Feb 23rd, 2010



Hudson Sonar Plugin...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This week we had &lt;strong&gt;18&lt;/strong&gt; plugin releases, with the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/xUnit+Plugin&quot;&gt;xUnit plugin&lt;/a&gt; managing to have a release almost &lt;em&gt;every day&lt;/em&gt;. For this edition of TWiP I was actually able to generate the log of releases mostly automatically thanks to &lt;a href=&quot;https://twitter.com/rpetti&quot;&gt;rpetti&lt;/a&gt; who contributed the script to the &lt;a href=&quot;https://github.com/rtyler/continuous-blog-tools&quot;&gt;continuous-blog-tools&lt;/a&gt; repository on GitHub.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This past week saw &lt;em&gt;two&lt;/em&gt; new plugins, the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/SSH+plugin&quot;&gt;SSH plugin&lt;/a&gt; and the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Global+Build+Stats+Plugin&quot;&gt;Global Build Stats plugin&lt;/a&gt;, the latter of which is still in &quot;alpha&quot;.&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;Feb 19th, 2010&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Perforce+Plugin&quot;&gt;Perforce Plugin&lt;/a&gt; 1.0.21&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 20th, 2010&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Monitoring&quot;&gt;Monitoring&lt;/a&gt; 1.12.0&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 21st, 2010&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Global+Build+Stats+Plugin&quot;&gt;Hudson global-build-stats plugin&lt;/a&gt; 0.1-alpha1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gallio+Plugin&quot;&gt;Hudson Gallio plugin&lt;/a&gt; 0.70&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/CppUnit+Plugin&quot;&gt;Hudson cppunit plugin&lt;/a&gt; 1.2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Emma+Plugin&quot;&gt;Hudson Emma plugin&lt;/a&gt; 1.12&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Backup+Plugin&quot;&gt;Hudson Backup plugin&lt;/a&gt; 1.4.1&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 23rd, 2010&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Sonar+Plugin&quot;&gt;Hudson Sonar Plugin&lt;/a&gt; 1.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Gradle+Plugin&quot;&gt;Hudson Gradle plugin&lt;/a&gt; 1.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Sectioned+View+Plugin&quot;&gt;Hudson Sectioned View Plugin&lt;/a&gt; 1.10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/xUnit+Plugin&quot;&gt;Hudson xUnit plugin&lt;/a&gt; 0.6.1&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 24th, 2010&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Cpptest+Plugin&quot;&gt;Hudson Cpptest plugin&lt;/a&gt; 0.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/SSH+plugin&quot;&gt;Hudson SSH plugin&lt;/a&gt; 1.0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/ClearCase+UCM+Baseline+Plugin&quot;&gt;Hudson ClearCase UCM Baseline Plug-in&lt;/a&gt; 1.3&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 25th, 2010&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/NAnt+Plugin&quot;&gt;Hudson NAnt Plugin&lt;/a&gt; 1.3.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Ivy+Plugin&quot;&gt;Hudson Ivy plugin&lt;/a&gt; 1.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Bazaar+Plugin&quot;&gt;Hudson Bazaar plugin&lt;/a&gt; 1.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Dimensions+Plugin&quot;&gt;Dimensions SCM plugin&lt;/a&gt; 0.7.0&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/26/links-for-2010-02-25/</id>
<title>Links for 2010-02-25</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-26T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/26/links-for-2010-02-25/" />
<author>
<name>rtyler</name>
</author>
<category term='mailing list'></category>
<summary>
Justifying Continuous Integration Expenditure



Our friend the Build Doctor, tries to quantify spending on continuous integration. In the comment thread on another related post of his, he strikes gold with:









People are more expensive than Continuous Integration servers; let&#8217;s optimise the system for them....
</summary>
<content type='html'>
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.build-doctor.com/2010/02/25/justifying-continuous-integration-expenditure/&quot;&gt;Justifying Continuous Integration Expenditure&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Our friend the &lt;a href=&quot;https://twitter.com/builddoctor&quot;&gt;Build Doctor&lt;/a&gt;, tries to quantify spending on continuous integration. In the comment thread on another related post of his, he strikes gold with:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;People are more expensive than Continuous Integration servers; let’s optimise the system for them.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/25/spotlight-on-springsource/</id>
<title>Spotlight on: SpringSource</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/25/spotlight-on-springsource/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='interview'></category>
<summary>
For this week&#8217;s user spotlight segment, I&#8217;m talking with Doug MacEachern of Hyperic, part of SpringSource, a division of VMware, hoping I got that dependency chain correct. Hyperic builds enterprise systems monitoring and management software and also contributes to a number of open source projects, many of which are built with Hudson.


To date I must say that Doug&#8217;s use of Hudson is one of the largest and more impressive installations I&#8217;ve seen. I don&#8217;t want to spoil the interview, but they&#8217;re testing on platforms that don&#8217;t even run Java. Madness! If you think you can out-do him, you can find...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this week’s user spotlight segment, I’m talking with &lt;a href=&quot;https://twitter.com/dougmaceachern&quot;&gt;Doug MacEachern&lt;/a&gt; of &lt;a href=&quot;https://www.crunchbase.com/company/hyperic&quot;&gt;Hyperic&lt;/a&gt;, part of &lt;a href=&quot;https://www.crunchbase.com/company/springsource&quot;&gt;SpringSource&lt;/a&gt;, a division of VMware, hoping I got that dependency chain correct. Hyperic builds enterprise systems monitoring and management software and also contributes to a number of open source projects, many of which are built with Hudson.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To date I must say that Doug’s use of Hudson is one of the largest and more impressive installations I’ve seen. I don’t want to spoil the interview, but they’re testing on platforms that don’t even run &lt;em&gt;Java&lt;/em&gt;. Madness! If you think you can out-do him, you can find my email information at the bottom of the interview, I’d love to hear about it!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Without further ado, Doug from SpringSource.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Doug&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;We started using Hudson in early 2008 to automate the build and testing of our &lt;a href=&quot;https://sigar.hyperic.com/&quot;&gt;SIGAR library&lt;/a&gt;.  The SIGAR API implements a portable interface in C for gathering system information related to memory, processors, file systems, network interfaces, network connection tables, the process table and more.  We support dozens of OS + version + architecture combinations, along with several language bindings.  SIGAR is a key component of the Hyperic HQ agent and is used in other projects including &lt;a id=&quot;aptureLink_WX9L4DHx0m&quot; href=&quot;https://en.wikipedia.org/wiki/Hypertable&quot;&gt;Hypertable&lt;/a&gt;, &lt;a id=&quot;aptureLink_Fy6elgHTOH&quot; href=&quot;https://www.crunchbase.com/company/terracota&quot;&gt;Terracotta&lt;/a&gt;, &lt;a id=&quot;aptureLink_RhcetOJ6YC&quot; href=&quot;https://www.gridgain.com/&quot;&gt;GridGain&lt;/a&gt; and MySQL enterprise.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Was SpringSource using continuous integration before Hudson? If so, what caused you guys to switch?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Doug&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;The SIGAR project actually started back in late 2002 and our initial CI system for the project was a good old-fashioned Perl script / ssh for-loop.  It was good enough to get by in the early years, but a proper replacement was long overdue.  We were (and still are) using &lt;a id=&quot;aptureLink_koprNR3BrL&quot; href=&quot;https://www.atlassian.com/software/bamboo/&quot;&gt;Bamboo&lt;/a&gt; to build and test Hyperic HQ.  We looked at using Bamboo for SIGAR, but at the time the &quot;Remote Agent&quot; feature was new to Bamboo and was not in the version we were running. Rather than disrupt HQ’s CI along with taking on an additional licensing cost, we gave Hudson a shot and haven’t looked back.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Might be a bit of personal bias, but I think you guys made the right choice there! Checking out the &lt;a href=&quot;https://hudson.hyperic.com&quot;&gt;public Hudson server&lt;/a&gt;, I see that SpringSource is building/testing products on AIX, the BSDs, various flavors of Linux, Solaris, Windows and Mac OS X, what kinds of languages/build systems are being built by Hudson? How varied are the environments that Hudson executes jobs in?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Doug&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;And HP-UX! The matrix of SIGAR’s supported OS + kernel version + architecture + distribution is north of 100 combinations.  So, Hudson is covering a very heterogeneous collection of systems with most jobs tied to a specific node.  Our primary focus has been the C API and Java JNI bindings, using an Ant based build system and a JUnit test suite.  SIGAR also has language bindings for Perl, Ruby, Python, Erlang, PHP, C# and Lua.  So, Hudson is also driving each language’s extension build system of choice, respectively: MakeMaker, Rake, distutils, emake, phpize, Nant and autotools.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;What do you consider to be noteworthy about your Hudson implementation? Besides, clearly, that you’re running Hudson agents on just about every OS that will run Java :)&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Doug&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;The majority of our x86/x64 nodes are virtualized on VMware ESX and VMware Server.  We also have a fine collection of PPC, PA-RISC and Sparc hardware in house, with IA-64 and s390x hosted elsewhere by third parties.  Some of these systems are too old to support Java 1.5 and/or Git.  As a simple work-around, the nodes share an NFS workspace where the agent node takes care of &#39;SCM&#39; and &#39;Post-build Actions&#39;, but the &#39;Build&#39; step in between is invoked via ssh.&lt;/p&gt;&lt;p&gt;The SIGAR distribution includes about two dozen native binaries that are compatible with most of the supported platform matrix.  There’s a Hudson job for each Git branch that rolls these binaries into a release bundle. Another job flavor uses the Hudson URL SCM plugin to download and unit test the binary releases on the rest of the platform matrix.  This is key to testing binary compatibility.  Similar for the &lt;a href=&quot;https://collectd.org&quot;&gt;collectd&lt;/a&gt; project, each Git branch has a job that runs automake, autoconf, etc. and &#39;make dist&#39; into the collectd release flavor tarball.  So a push to git.verplant.org by octo in Germany triggers an update of the collectd release artifact, which in turn triggers the URL SCM jobs to download the tarball, unpack and build over here at our west coast locations.&lt;/p&gt;&lt;p&gt;We have four Hudson servers in different locations, three of which are managing most of the jobs behind firewalls.  Select jobs use the Build Publisher plugin to post the job and its artifacts to our &lt;a href=&quot;https://hudson.hyperic.com&quot;&gt;public Hudson server&lt;/a&gt;. This makes it easy for us to provide platform specific bug fixes in binary form, share build logs with external projects and host a central repository of artifacts reachable by all of the URL SCM based jobs. Our public Hudson server also provides CI for the HQApi project and jobs to build HQ plugins, again making it easier to distribute patch fixes in binary form between releases.
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;I’ve very impressed! I’m glad the fact that Java won’t run on some of the platforms you want to support hasn’t stopped you from testing anyways. Clearly you folks have written some addition tools behind the scenes, mind discussing them a bit?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Doug&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Other than some Hudson plugin tweaks and additions, the Perl script I mentioned earlier was converted to generate the majority of our Hudson jobs and includes a simple templating system.  The same script generates jobs to build collectd and a few other projects.  We’ve outgrown this flavor of the script and have started working on integrating &lt;a href=&quot;https://www.opscode.com/chef&quot;&gt;Opscode Chef&lt;/a&gt; to automate our Hudson configuration along with the systems we build and test on. And of course, we’re using Hyperic HQ to monitor our Hudson server instances, agent and node machines.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;But of course, I’d say &lt;a id=&quot;aptureLink_WWkmPVpHxI&quot; href=&quot;https://en.wikipedia.org/wiki/Eating%20one%27s%20own%20dog%20food&quot;&gt;dog-fooding&lt;/a&gt; is an important part of any continuous testing set up. It appears that SpringSource has bought in pretty deeply to a Hudson-oriented workflow, given the amount of time and resources you all have invested in getting the massive farm set up that you have. That said, on a scale from 1-10, how important would you rate Hudson to your day-to-day workflow?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Doug&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;I’d say at least an 8, although my daily workflow doesn’t always directly involve Hudson.  Most of those points go to Hudson for automating what otherwise would be interrupting my workflow on a daily basis.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&amp;lt;/table&amp;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;nowrap&quot;&gt;I&#39;d like to thank Doug again for giving us a peek behind the curtains at SpringSource and how they&#39;re using Hudson. If you would like to discuss your organization or company&#39;s use of Hudson for Continuous Blog, you can contact me at `tyler` at `linux.com`&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s note:&lt;/strong&gt; Doug was the primary author of &lt;a id=&quot;aptureLink_qgVLRGgSjp&quot; href=&quot;https://en.wikipedia.org/wiki/Mod%20perl&quot;&gt;mod_perl&lt;/a&gt; for many years until he was tricked into &quot;helping out&quot; with a new project.  This project turned into Hyperic HQ which shifted his focus to systems and application management for the past ~7 years and counting.  He occasionally rambles on Twitter as &lt;a id=&quot;aptureLink_1GSwGzVfcP&quot; href=&quot;https://twitter.com/dougmaceachern&quot;&gt;@dougmaceachern&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/tr&gt;&lt;/p&gt;&lt;/div&gt;

</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/25/sonatype-freeing-projects-from-java-nets-maven-repo/</id>
<title>Sonatype freeing projects from java.net&#39;s Maven repo</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/25/sonatype-freeing-projects-from-java-nets-maven-repo/" />
<author>
<name>rtyler</name>
</author>
<category term='core'></category>
<category term='just for fun'></category>
<summary>
Are you working on a project which uses java.net&#8217;s Maven repository for deploying its artifacts?


Well, if so, there&#8217;s a great opportunity opening up for you to get off that problematic repository: Sonatype is helping java.net projects move to Sonatype&#8217;s hosted OSS Nexus repository, starting March 5th. We&#8217;re looking into moving Hudson over but for most smaller projects, this should be a no-brainer. Problems with the java.net Maven repository are legendary and Sonatype&#8217;s OSS Nexus repository is a great alternative.


Take a look and see if this can work for you.



Editor&#8217;s Note: Andrew Bayer (abayer) has been a contributor to Hudson since...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Are you working on a project which uses java.net’s &lt;a href=&quot;https://en.wikipedia.org/wiki/Apache%20Maven&quot;&gt;Maven&lt;/a&gt; repository for deploying its artifacts?&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Well, if so, there’s a great opportunity opening up for you to get off that problematic repository: &lt;a href=&quot;https://www.sonatype.com/&quot;&gt;Sonatype&lt;/a&gt; is &lt;a href=&quot;https://www.sonatype.com/people/2010/02/java-net-maven-repository-rescue-mission-on-march-5th/&quot;&gt;helping java.net projects move to Sonatype’s hosted OSS Nexus repository&lt;/a&gt;, starting March 5th. We’re looking into moving Hudson over but for most smaller projects, this should be a no-brainer. Problems with the java.net Maven repository are legendary and Sonatype’s OSS Nexus repository is a great alternative.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Take a look and see if this can work for you.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note:&lt;/strong&gt; Andrew Bayer (&lt;code&gt;abayer&lt;/code&gt;) has been a contributor to Hudson since early 2009, contributing to the ClearCase plugin, Hudson’s core and a small number of other plugins. Andrew also helps Kohsuke with a lot of Hudson’s project infrastructure, most notably the migration from Bugzilla on Java.net to JIRA running at &lt;a href=&quot;https://issues.hudson-ci.org&quot;&gt;issues.hudson-ci.org&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/25/links-for-2010-02-24/</id>
<title>Links for 2010-02-24</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-25T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/25/links-for-2010-02-24/" />
<author>
<name>rtyler</name>
</author>
<category term='mailing list'></category>
<summary>
Via the @hudsonci twitter account I typically share or "retweet" a number of links during the day, I realize a number of people either do not use Twitter or do not constantly pay attention to it. A lot of the links I find quite interesting, so I&#8217;d like to try sharing them after the fact here.




Java.net Maven Repository Rescue Mission on March 5th


Fighting Problems with Hudson Matrix Jobs and Perforce Plugin



Working around issues with matrix jobs and the Perforce plugin (issue 1022)





Oracle ADF Development Essentials - Part 7&#8201;&#8212;&#8201;Continuous Integration with Hudson



Learn how to use Hudson in tandem with the Oracle...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Via the &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci&lt;/a&gt; twitter account I typically share or &quot;retweet&quot; a number of links during the day, I realize a number of people either do not use Twitter or do not constantly pay attention to it. A lot of the links I find quite interesting, so I’d like to try sharing them after the fact 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://www.sonatype.com/people/2010/02/java-net-maven-repository-rescue-mission-on-march-5th/&quot;&gt;Java.net Maven Repository Rescue Mission on March 5th&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.coremedia.com/cm/post/14886341/Fighting_Problems_with_Hudson_Matrix_Jobs_and_Perforce_Plugin.html&quot;&gt;Fighting Problems with Hudson Matrix Jobs and Perforce Plugin&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Working around issues with matrix jobs and the Perforce plugin (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/1022&quot;&gt;issue 1022&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.oracle.com/technology/pub/articles/adf-development-essentials/part7.html&quot;&gt;Oracle ADF Development Essentials - Part 7 — Continuous Integration with Hudson&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Learn how to use Hudson in tandem with the Oracle Application Development Framework (with screenshots).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/723322/what-is-the-best-version-control-for-visual-studio-2008-sp1/723326#723326&quot;&gt;What is the best Version Control for Visual Studio 2008 SP1?&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Asked on Stack Overflow, guess what the chosen answer was?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://technology.amis.nl/blog/7408/automatic-testing-oracle-service-bus-using-hudson-maven-and-soapui&quot;&gt;Automatic testing Oracle Service Bus using Hudson, maven and SoapUI&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/24/hudson-at-pycon/</id>
<title>Hudson at PyCon</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-24T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/24/hudson-at-pycon/" />
<author>
<name>rtyler</name>
</author>
<category term='core'></category>
<category term='feedback'></category>
<summary>
This past week PyCon has been going on in Atlanta, where Titus Brown gave a talk titled:




Why not run all your tests all the time? A study of continuous integration systems




&lt;


Titus has some notable quotes "just use Hudson" but overall a good introduction of CI and a breakdown of some of the challenges behind continuous integration. He also does a good job going over getting started with Hudson, setting up a basic Python project that incorporates JUnit XML reporting and agents.




"Yeah, we used Buildbot until recently, then I switched us to Hudson and my life got a lot better"




If you&#8217;re...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This past week &lt;a href=&quot;https://twitter.com/pycon&quot;&gt;PyCon&lt;/a&gt; has been going on in Atlanta, where &lt;a href=&quot;https://twitter.com/ctitusbrown&quot;&gt;Titus Brown&lt;/a&gt; gave a talk titled:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Why not run all your tests all the time? A study of continuous integration systems&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&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://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/just_use_hudson.png&quot; alt=&quot;Just use Hudson&quot; width=&quot;500&quot; /&gt;&amp;lt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Titus has some notable quotes &quot;just use Hudson&quot; but overall a good introduction of CI and a breakdown of some of the challenges behind continuous integration. He also does a good job going over getting started with Hudson, setting up a basic Python project that incorporates JUnit XML reporting and agents.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&quot;Yeah, we used Buildbot until recently, then I switched us to Hudson and my life got a lot better&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re using Python with Hudson, I highly recommend watching the talk (embedded below).&lt;embed src=&quot;http://blip.tv/play/g4VigciTVwI%2Em4v&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;480&quot; height=&quot;350&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&amp;lt;/embed&amp;gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/23/would-you-run-hudson-in-the-cloud/</id>
<title>Would you run Hudson in the cloud?</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-23T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/23/would-you-run-hudson-in-the-cloud/" />
<author>
<name>rtyler</name>
</author>
<category term='jenkinsci'></category>
<summary>
One of my favorite bloggers on the subject of continuous integration, The Build Doctor, posed this question in a recent post:




Continuous Integration in the cloud: good idea?




The topic of running a CI server in a virtualized environment, such as with Amazon&#8217;s EC2 service, is an interesting issue, particularly in the Hudson community. About 10 months ago Kohsuke announced the Hudson EC2 plugin which has seen slow, but steady development since then, including support for the Ubuntu Enterprise Cloud which was added to the plugin in a release last Monday.


As The Build Doctor and his readers point out, continuous integration is...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One of my favorite bloggers on the subject of continuous integration, &lt;a href=&quot;https://twitter.com/builddoctor&quot;&gt;The Build Doctor&lt;/a&gt;, posed this question in &lt;a href=&quot;https://www.build-doctor.com/2010/02/23/continuous-integration-in-the-cloud-good-idea/&quot;&gt;a recent post&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Continuous Integration in the cloud: good idea?&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The topic of running a CI server in a virtualized environment, such as with &lt;a href=&quot;https://en.wikipedia.org/wiki/Amazon%20Elastic%20Compute%20Cloud&quot;&gt;Amazon’s EC2 service&lt;/a&gt;, is an interesting issue, particularly in the Hudson community. About 10 months ago Kohsuke &lt;a href=&quot;https://weblogs.java.net/blog/2009/05/18/hudson-ec2-plugin&quot;&gt;announced the Hudson EC2 plugin&lt;/a&gt; which has seen slow, but steady development since then, including support for the &lt;a href=&quot;https://www.ubuntu.com/cloud/private&quot;&gt;Ubuntu Enterprise Cloud&lt;/a&gt; which was added to the plugin in a release last Monday.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As The Build Doctor and his readers point out, continuous integration is a difficult task to offload into the cloud because of the immense hardware demands constant building and testing presents. That said, Hudson &lt;em&gt;does&lt;/em&gt; very effectively manage spinning agents up and down on demand if you’ve configured it as such. Implication being: running Hudson in the cloud may be more efficient to meet peak demands without needing to run a large farm of machines.&lt;span class=&quot;image&quot;&gt;&lt;img src=&quot;https://web.archive.org/web/*/https://agentdero.cachefly.net/continuousblog/hudson_in_the_cloud.png&quot; alt=&quot;hudson in the cloud&quot; /&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re interested in trying out the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Amazon+EC2+Plugin&quot;&gt;EC2 plugin&lt;/a&gt;, check out &lt;a href=&quot;https://www.sonatype.com/&quot;&gt;Sonatype’s&lt;/a&gt; post on &lt;a href=&quot;https://www.sonatype.com/people/2009/06/nexus-open-source-and-hudson-on-ec2/&quot;&gt;Nexus Open Source and Hudson on EC2&lt;/a&gt; might be a good start.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Would you run Hudson in the cloud?&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/22/hudson-1-347-released/</id>
<title>Hudson 1.347 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-22T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/22/hudson-1-347-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
The release of Hudson 1.347 last friday, February 19th, was a relatively "minor" one insofar that it contained an assortment of smaller fixes instead of fixes to major regressions (they weren&#8217;t any to be fixed) or major features added. There were however some notable commits in this release cycle that didn&#8217;t make the changelog just yet, for example godin">godin committed an ebuild which will allow for a native package of Hudson for Gentoo Linux, joining the ranks of the existing packages for Debian/Ubuntu, FreeBSD, OpenSolaris, openSUSE and RedHat/Fedora Linux. The bundled Subversion plugin was updated and thanks to sogabe and...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The release of Hudson 1.347 last friday, February 19th, was a relatively &quot;minor&quot; one insofar that it contained an assortment of smaller fixes instead of fixes to major regressions (they weren’t any to be fixed) or major features added. There were however some notable commits in this release cycle that didn’t make the changelog just yet, for example &lt;a href=&quot;https://twitter.com/&amp;lt;em&amp;gt;godin&amp;lt;/em&amp;gt;&quot;&gt;godin&lt;/a&gt; committed an &lt;a href=&quot;https://en.wikipedia.org/wiki/Ebuild&quot;&gt;ebuild&lt;/a&gt; which will allow for a native package of Hudson for &lt;a href=&quot;https://en.wikipedia.org/wiki/Gentoo%20Linux&quot;&gt;Gentoo Linux&lt;/a&gt;, joining the ranks of the existing packages for Debian/Ubuntu, FreeBSD, OpenSolaris, openSUSE and RedHat/Fedora Linux. The bundled Subversion plugin was updated and thanks to &lt;a href=&quot;https://twitter.com/ssogabe&quot;&gt;sogabe&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/wyukawa&quot;&gt;wyukawa&lt;/a&gt; the Japanese translations for Hudson got some updates as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For Hudson developers, both plugin and core, this release contains some notable changes from &lt;a href=&quot;https://blogs.sun.com/mindless&quot;&gt;mindless&lt;/a&gt; (a.k.a Alan Harder), a number of calls which have been deprecated for over &lt;strong&gt;two years&lt;/strong&gt; have finally been pruned from the code base:&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;Hudson.addListener(JobListener)&lt;/code&gt;, &lt;code&gt;Hudson.removeListener(JobListener)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Entire &lt;code&gt;listeners.JobListener&lt;/code&gt; class (replaced by &lt;code&gt;ItemListener&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One form of &lt;code&gt;DirectoryBrowser&lt;/code&gt; constructor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One form of &lt;code&gt;Descriptor.configure()&lt;/code&gt; (with &lt;code&gt;HttpServletRequest&lt;/code&gt; param)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Descriptor.convert(Map)&lt;/code&gt; and 4 implementations of this method, and code calling it in &lt;code&gt;Descriptor.readResolve()&lt;/code&gt; (this code called &lt;code&gt;save()&lt;/code&gt; whenever updating data, so there should be no remaining cases out there)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Alan’s quest for removing deprecated code will likely continue for a while, but this is a good step in the right direction, keeping Hudson’s internals in good working order. Worth mentioning, the influx of plugin releases in the &lt;a href=&quot;https://www.jenkins.io/content/week-plugins-0&quot;&gt;This Week in Plugins&lt;/a&gt; from a couple weeks ago, was driven largely by Alan, rummaging through the code of older plugins, updating plugins left and right.
Now the breakdown for this release:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;bugs-fixed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs-fixed&quot; /&gt;Bugs fixed&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fix javascript problem showing test failure detail for test name with a quote character. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/1544&quot;&gt;issue 1544&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hudson can incorrectly configure labels for the controller when bleeding edge EC2 plugin is used.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed the regression wrt the whitespace trimming caused by 1.346. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5633&quot;&gt;issue 5633&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under some circumstances, Hudson can incorrectly delete the temporary directory itself. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5642&quot;&gt;issue 5642&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Newlines in MAVEN_OPTS environment variable can cause problems in other contexts. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5651&quot;&gt;issue 5651&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;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Improved the form validation mechanism to support multiple controls. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5610&quot;&gt;issue 5610&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added message to agent log when it has successfully come online. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5630&quot;&gt;issue 5630&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;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release of Hudson contained 36 commits from &lt;strong&gt;7&lt;/strong&gt; different contributors to &quot;core&quot;:&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://twitter.com/abayer&quot;&gt;abayer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/&amp;lt;em&amp;gt;godin&amp;lt;/em&amp;gt;&quot;&gt;godin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/thuybrechts&quot;&gt;huybrechts&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;kohsuke&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.sun.com/mindless&quot;&gt;mindless&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ssogabe&quot;&gt;sogabe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/wyukawa&quot;&gt;wyukawa&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;&lt;br&gt;
As usual, you can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/br&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/2010/02/19/this-week-in-plugins/</id>
<title>This Week in Plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-19T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/19/this-week-in-plugins/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='feedback'></category>
<summary>
Last week&#8217;s TWIP enumerated the release of 26 different plugin, this past week has seen 19 unique releases in comparison. You might be tempted to assume that less plugin development has occurred over the past week, which isn&#8217;t the case. Last week a number of the releases were "code updates", i.e. plugins being rebuilt against the latest Hudson plugin API as opposed to new features or bug-fixes. With the releases of plugins this past week, it seems a large number of the releases contained new features and bug fixes, including three new plugins!


Making their Hudson debut are the following




Agent Monitor...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Last week’s TWIP enumerated the release of &lt;strong&gt;26&lt;/strong&gt; different plugin, this past week has seen 19 unique releases in comparison. You might be tempted to assume that &lt;em&gt;less&lt;/em&gt; plugin development has occurred over the past week, which isn’t the case. Last week a number of the releases were &quot;code updates&quot;, i.e. plugins being rebuilt against the latest Hudson plugin API as opposed to new features or bug-fixes. With the releases of plugins this past week, it seems a large number of the releases contained new features and bug fixes, including &lt;strong&gt;three new plugins!&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Making their Hudson debut are the following&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/systemloadaverage-monitor&quot;&gt;Agent Monitor for system load average&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/toolenv&quot;&gt;Tool Environment plugin&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/ivy&quot;&gt;Ivy 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;If you’re interested in contributing to an existing plugin, or building your own, I highly recommend checking out the &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Plugin+tutorial&quot;&gt;plugin tutorial&lt;/a&gt; and joining the &lt;a href=&quot;https://hudson.dev.java.net/servlets/ProjectMailingListList&quot;&gt;dev@ mailing list&lt;/a&gt;. That said, here are this week’s releases, starting with last Friday.&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;Feb 12th, 2010&lt;/strong&gt;&lt;/p&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/filesystem_scm&quot;&gt;File System SCM 1.6 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/jira&quot;&gt;JIRA plugin 1.19 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/jobconfighistory&quot;&gt;Job Configuration History Plugin 1.2 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/mstest&quot;&gt;MSTest plugin 0.6 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/systemloadaverage-monitor&quot;&gt;Agent Monitor for system load average 1.1 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/template-project&quot;&gt;Template Project plugin 1.2 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 13th, 2010&lt;/strong&gt;&lt;/p&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/xunit&quot;&gt;xUnit plugin 0.5.2 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 14th, 2010&lt;/strong&gt;&lt;/p&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/ec2&quot;&gt;Amazon EC2 plugin 1.6 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/dependencyanalyzer&quot;&gt;Dependency Analyzer Plugin 0.5 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/doclinks&quot;&gt;DocLinks plugin 0.3 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/toolenv&quot;&gt;Tool Environment plugin 1.0 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 15th, 2010&lt;/strong&gt;&lt;/p&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/artifactory&quot;&gt;Artifactory Plugin 1.0.6 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/dimensions&quot;&gt;Dimensions SCM plugin 0.6.8 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 16th, 2010&lt;/strong&gt;&lt;/p&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/htmlpublisher&quot;&gt;HTML Publisher plugin 0.2.2 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 17th, 2010&lt;/strong&gt;&lt;/p&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/ivy&quot;&gt;Ivy plugin 1.0 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/jboss&quot;&gt;JBoss Management Plugin 1.0.2 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/18/spotlight-on-visfleet/</id>
<title>Spotlight on: VisFleet</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-18T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/18/spotlight-on-visfleet/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='interview'></category>
<summary>
For this week&#8217;s user spotlight, I&#8217;m talking to Rasheed Abdul-Aziz of
VisFleet Ltd. out of New Zealand. This being our second "spotlight" on a particular company, the format can still be considered beta; if you have any additional questions for Rasheed, feel free to ask them in the comments and I&#8217;ll try to get Rasheed to answer.


Similar to the spotlight on ITA Software from last week, VisFleet builds business software helping their customers operate their businesses more effectively through web applications in tandem with mobile applications. While I could endlessly discuss the power and flexibility of Hudson, particularly for building web...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For this week’s user spotlight, I’m talking to Rasheed Abdul-Aziz of
VisFleet Ltd. out of New Zealand. This being our second &quot;spotlight&quot; on a particular company, the format can still be considered &lt;em&gt;beta&lt;/em&gt;; if you have any additional questions for Rasheed, feel free to ask them in the comments and I’ll try to get Rasheed to answer.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Similar to the spotlight on ITA Software from last week, VisFleet builds business software helping their customers operate their businesses more effectively through web applications in tandem with mobile applications. While I could endlessly discuss the power and flexibility of Hudson, particularly for building web software, I’ll let Rasheed do the majority of the talking, so let’s get to it.
introducing &lt;a id=&quot;aptureLink_qn9wDVslnL&quot; href=&quot;https://twitter.com/visfleet&quot;&gt;VisFleet&lt;/a&gt;, would you mind explaining a bit more of what you guys do and some of the challenges it presents?&lt;/p&gt;&lt;/div&gt;

&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Rasheed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;It’s a pleasure. VisFleet has changed it’s direction somewhat, moving from
services into product development. As we move into product, we want to be
responsive to our customers. Agile development is becoming core to how we
operate, and as such, continuous builds and integration became a major
factor. We now plan to offer two products for work planning and and vehicle
tracking. We want to present these systems with a SaaS model. The world of
online, pay as you go software, has a culture of frequent improvements and
responsiveness to user feedback. If we want to do well in this space, it’s
important that we can code, test, release and feed back in
tight iterations.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;How long has VisFleet been using Hudson?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Rasheed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;About 14 months now.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Did you guys work with continuous integration prior to starting to use
Hudson? If so, what system was VisFleet using and what compelled the switch
to
Hudson?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Rasheed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;We didn’t actually, but certainly everyone I knew who was doing continuous
integration recommended Hudson.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;That’s good to hear! How lucky you are to know so many smart people :)&lt;br /&gt;&lt;br /&gt;
What kinds of projects is VisFleet building with Hudson?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Rasheed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;We build and test Ruby On Rails service layer applications. We also build &lt;a id=&quot;aptureLink_hbiB8O3Dwj&quot; href=&quot;https://en.wikipedia.org/wiki/Adobe%20Flex&quot;&gt;Flex&lt;/a&gt; applications using the Flex SDK for our web-deployed RIA offering. Lastly, we build our iPhone applications using Hudson.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;I’d say building and testing web applications alone with Hudson would be quite notable, but to add Flex and iPhone applications into the mix as well is certainly interesting! Anything specific that’s interesting about VisFleet’s use of Hudson?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Rasheed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;It runs multiple agent types, and automates deploys to different cloud
infrastructures. At the moment we have 2 Flex build agents running Ubuntu, A
Mac Mini building our iPhone app, and several Ubuntu Servers testing our web
tier. We currently deploy to Citrix Xen servers, and soon to &lt;a id=&quot;aptureLink_Xq08IAbEb1&quot; href=&quot;https://twitter.com/RackCloud&quot;&gt;Rackspace Cloud&lt;/a&gt; as well.
&lt;br /&gt;
&lt;br /&gt;
In the near future, we will automate integration by first updating an
integration system on the cloud, deploying our system and then running our
tests. All very quickly.
&lt;br /&gt;
&lt;br /&gt;
We have very little metric and reporting output from Hudson, and this is
noteworthy in it’s absence. It’s very important  to use to provide clear
development metrics and integrate those into our &lt;a id=&quot;aptureLink_ZAd2AShPj0&quot; href=&quot;https://en.wikipedia.org/wiki/Scrum%20%28development%29&quot;&gt;Scrum&lt;/a&gt;/&lt;a id=&quot;aptureLink_U9x9KuaN08&quot; href=&quot;https://en.wikipedia.org/wiki/Kanban&quot;&gt;Kanban&lt;/a&gt; approach. What
Hudson has done for us is educate us about the possibilities in
visualisation and reporting, and is informing the way we structure our
codebase going forward. Soon, we expect to have a premium test driven
development environment and workflow.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;We all know Hudson isn’t perfect but there’s a lot of room for extending it to meet your demands if need be, what additional tools have you written to glue everything together behind
the scenes?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Rasheed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;We are using &#39;&lt;a id=&quot;aptureLink_dcU0BLKBi3&quot; href=&quot;https://rubyhitsquad.com/Vlad_the_Deployer.html&quot;&gt;Vlad the Deployer&lt;/a&gt;&#39; and in legacy, &#39;&lt;a id=&quot;aptureLink_CMeh4NNwSI&quot; href=&quot;https://www.capify.org/&quot;&gt;Capistrano&lt;/a&gt;&#39; for a lot of
our deployment and build tasks. These are merely infrastructure specific
scripts to ensure we can bring up live environments in the shortest amount
of time possible.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;So it sounds like you guys are all on board with Hudson, on a 1-10 scale, how important would you rate Hudson’s importance to VisFleet’s workflow?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Rasheed&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;7, aiming at 10. The missing points are just a matter of time :)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Thanks again to Rasheed for chatting with me about how Hudson helps VisFleet keep cranking on what they do best. If you would like to discuss your company’s use of Hudson for Continuous Blog, you can contact me at &lt;code&gt;tyler&lt;/code&gt; at &lt;code&gt;linux.com&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note:&lt;/strong&gt; Rasheed Abdul-Aziz is a Software Architect at VisFleet Ltd. Rasheed specializes in Flex RIA development, but also loves a good build script and manages Hudson for VisFleet. Find out more about VisFleet and Rasheed on the &lt;a href=&quot;https://devblog.visfleet.com/&quot;&gt;VisFleet devblog&lt;/a&gt; and &lt;a href=&quot;https://squeedee.tumblr.com&quot;&gt;Rasheed’s blog&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/17/getting-started-building-android-apps-with-hudson/</id>
<title>Getting started: Building Android apps with Hudson</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-17T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/17/getting-started-building-android-apps-with-hudson/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='guest post'></category>
<category term='jobs'></category>
<category term='tutorial'></category>
<summary>
In this post I&#8217;ll show a very basic tips on how to compile an Android project using Hudson. Specifically how  I use Hudson to create release versions of my apps.


Debug vs Release


I&#8217;m assuming that you are using Eclipse with the ADT plugin. During development you can test your app on the emulator or a device and resources like R.java and aidl files are compiled for you automatically by the plugin. When it&#8217;s time to release your app, you&#8217;ll need to go through some steps:




You must sign your app using a certificate


You must update your AndroidManifest.xml to remove the android:debuggable...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;In this post I’ll show a very basic tips on how to compile an Android project using Hudson. Specifically how  I use Hudson to create release versions of my apps.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;debug-vs-release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#debug-vs-release&quot; /&gt;Debug vs Release&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’m assuming that you are using &lt;a href=&quot;https://en.wikipedia.org/wiki/Eclipse%20%28software%29&quot;&gt;Eclipse&lt;/a&gt; with the &lt;a href=&quot;https://developer.android.com/guide/developing/tools/adt.html&quot;&gt;ADT plugin&lt;/a&gt;. During development you can test your app on the emulator or a device and resources like R.java and aidl files are compiled for you automatically by the plugin. When it’s time to release your app, you’ll need to go through some steps:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You must sign your app using a certificate&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You must update your AndroidManifest.xml to remove the android:debuggable attribute&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace your Google Maps API debug key with the one belonging to your release certificate (if you are using a MapView)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate an apk package for the release and test it on a device or emulator&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It would be nice to automate a few of these steps, and this is where Hudson comes in.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;automated-builds-ant&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#automated-builds-ant&quot; /&gt;Automated builds: Ant&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For automated builds the Android SDK uses &lt;a href=&quot;https://en.wikipedia.org/wiki/Apache%20Ant&quot;&gt;Apache Ant&lt;/a&gt;, which Hudson has great support for. To generate a template build.xml you can use the android tool from the SDK using the following 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;nowrap&quot;&gt;android create project -n template -t android-7 -p template -k dummy.pkg -a Dummy&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The target is specified as &quot;android-7&quot; meaning that we are building for Android 2.1. For apps that use MapView we would use &quot;Google Inc.:Google APIs:7&quot;. It is a good idea to always &lt;a href=&quot;https://d.android.com/guide/practices/screens_support.html#strategies&quot;&gt;target the latest SDK&lt;/a&gt;. From this template project we’ll grab the &lt;em&gt;build.properties&lt;/em&gt; and the &lt;em&gt;build.xml&lt;/em&gt; and copy those to the Android project that we want to build. Edit &lt;em&gt;build.xml&lt;/em&gt; and set the project name to your Android project name.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;em&gt;local.properties&lt;/em&gt; file contains the path to the SDK root and shouldn’t be checked in to version control. For our use we’ll set the properties that are in that file on the Hudson job configuration page.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;running-the-build-in-hudson&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#running-the-build-in-hudson&quot; /&gt;Running the build in Hudson&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This part is easy: create a new freestyle job and let it be build with ant. The targets that we want to execute are &lt;code&gt;clean release&lt;/code&gt;. Release will compile, package and sign your apk. Now to get this working right, some custom properties should be set (use the Advanced button).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;nowrap&quot;&gt;sdk.dir=/Users/hugo/Code/android-sdk-mac
target=Google Inc.:Google APIs:7
key.store=certs/rd-release.keystore
key.alias=rainydays
key.store.password=thisisnotmypassword
key.alias.password=thisisnotmypassword&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;em&gt;sdk.dir&lt;/em&gt; should point to the Android SDK root on your Hudson node. In my case I’m running Hudson locally on my machine.  The &lt;em&gt;target&lt;/em&gt; property refers to the SDK we want to use as mentioned earlier.  The &lt;em&gt;key.&lt;strong&gt; properties are related to signing of the apk. My &lt;a href=&quot;https://d.android.com/guide/publishing/app-signing.html#strategies&quot;&gt;strategy&lt;/a&gt; is to have a separate key store and private key for each application that I develop. I also check that keystore in to SVN. I also archive the &lt;/strong&gt;-release.apk&lt;/em&gt; artifact so that I can download the latest release apk directly from Hudson.  After completing these steps, you should be able to build your Android app with Hudson.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;updating-the-androidmanifest-for-release&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#updating-the-androidmanifest-for-release&quot; /&gt;Updating the AndroidManifest for release&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;…​But we’re not done yet :) Remember what I said about updating the AndroidManifest.xml? For that we need to edit the build.xml, which by default contains nothing more then a &lt;code&gt;&amp;lt;setup/&amp;gt;&lt;/code&gt; tag to pull in the Android SDK ant target definitions. For my Rainy Days application, I adjusted build.xml like 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;nowrap&quot;&gt;   ...
   &amp;lt;setup /&amp;gt;
   &amp;lt;property environment=&quot;env&quot;/&amp;gt;
   &amp;lt;target name=&quot;preprocess&quot; if=&quot;env.BUILD_TAG&quot;&amp;gt;
      &amp;lt;echo&amp;gt;Removing debug attribute from AndroidManifest.xml&amp;lt;/echo&amp;gt;
      &amp;lt;replaceregexp file=&quot;AndroidManifest.xml&quot; match=&quot;android:debuggable=&amp;amp;quot;.*?&amp;amp;quot;&quot; replace=&quot;&quot;/&amp;gt;
      &amp;lt;echo&amp;gt;Setting release maps key&amp;lt;/echo&amp;gt;
      &amp;lt;replaceregexp file=&quot;res/layout/maplayout.xml&quot; match=&quot;android:apiKey=&amp;amp;quot;.*?&amp;amp;quot;&quot; replace=&quot;android:apiKey=&amp;amp;quot;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&amp;amp;quot;&quot;/&amp;gt;
   &amp;lt;/target&amp;gt;

   &amp;lt;!-- this target is only hooking release processing of the manifest --&amp;gt;
   &amp;lt;target name=&quot;-package-resources&quot; depends=&quot;preprocess, android_rules.-package-resources&quot;&amp;gt;
   &amp;lt;/target&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What the above snippet does is removing the &lt;em&gt;android:debuggable&lt;/em&gt; attribute from the &lt;em&gt;AndroidManifest.xml&lt;/em&gt; and replacing the maps API key in &lt;em&gt;res/layout/maplayout.xml&lt;/em&gt; with the correct key for release. The &lt;code&gt;-package-resources&lt;/code&gt; target is pulled in from the Android &lt;em&gt;android_rules.xml&lt;/em&gt; file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now when Hudson builds my app I get a ready to release apk that I can install on my device or emulator, which is pretty nice.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;There is are some issues with this approach however. As you might have noticed:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Replacements are done in the workspace, we are not really building &lt;strong&gt;exactly&lt;/strong&gt; what’s in svn&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Each new build should start out fresh for that reason, for example by using the svn revert option.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Additionally I can not yet tag the release version with the updated files, because the &lt;a href=&quot;https://plugins.jenkins.io/subversion-tagging&quot;&gt;subversion tagging plugin&lt;/a&gt; doesn’t support this by design. This could be worked around by adding svn statements in the build.xml however.  For now I don’t really mind as I make minor changes to the resource files, but I’ll be looking at improving this situation.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;things-to-add-unit-testing-coverage&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#things-to-add-unit-testing-coverage&quot; /&gt;Things to add: unit testing, coverage…​&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;One thing that I’d really like to add is unit testing. This is a little bit more complicated though, since unit tests require a running emulator and a running emulator requires a gui. The Hudson &lt;a href=&quot;https://plugins.jenkins.io/xvnc&quot;&gt;Xvnc&lt;/a&gt; plugin could be very helpful here.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Android build scripts for test projects already include &lt;a href=&quot;http://emma.sourceforge.net/&quot;&gt;EMMA&lt;/a&gt; output, it shouldn’t be to hard to use the Hudson &lt;a href=&quot;https://plugins.jenkins.io/emma&quot;&gt;plugin&lt;/a&gt; for that.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;When Hudson is running on a local machine, the &lt;a href=&quot;https://plugins.jenkins.io/batch-task&quot;&gt;Batch task&lt;/a&gt; plugin can automate installing the apk on a device to automate things further.&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;Building Android applications with Hudson is not that hard, since the builds are based on Ant. By hooking in to the standard Android build targets it’s easy to update files like &lt;em&gt;AndroidManifest.xml&lt;/em&gt; which in turn makes sure the release process is controlled and predictable.&lt;br&gt;
Android unit tests depend on the emulator which is a little bit more challenging to set up, but Hudson already has some plugins available to make this easier.&lt;/br&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note:&lt;/strong&gt; Hugo Visser is the developer of &lt;a href=&quot;https://code.neenbedankt.com/my-first-published-android-app-rainy-days&quot;&gt;Rainy Days&lt;/a&gt; and &lt;a href=&quot;https://code.neenbedankt.com/monitor-your-app-engine-application-from-your-pocket-with-engine-watch-for-android/&quot;&gt;Engine Watch&lt;/a&gt; for Android. You can
follow him &lt;a href=&quot;https://twitter.com/botteaap&quot;&gt;on Twitter&lt;/a&gt; and &lt;a href=&quot;https://code.neenbedankt.com&quot;&gt;on his blog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/16/performance-improvements-in-1-346/</id>
<title>Performance improvements in 1.346</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-16T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/16/performance-improvements-in-1-346/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<summary>
From time to time, we get a report of out of memory problems in Hudson. It&#8217;s frequent enough that we have a dedicated Wiki page that talks about how to obtain information to help devs work on the problem.


So the latest thread from David Woon was assumed to be one of those ordinary trouble-shooting sessions, but thanks to Gustaf Lundh, it turned out to be a very interesting exercise.


What we discovered was that the profiler I was using (Your Kit Profiler), was basically eliminating all the weak/soft references from the picture entirely. If we are looking for leaks, this was...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;From time to time, we get a report of out of memory problems in Hudson. It’s frequent enough that &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/I’m+getting+OutOfMemoryError&quot;&gt;we have a dedicated Wiki page&lt;/a&gt; that talks about how to obtain information to help devs work on the problem.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So &lt;a href=&quot;https://n4.nabble.com/Restarting-hudson-every-day-memory-leaks-td1311161.html&quot;&gt;the latest thread&lt;/a&gt; from &lt;a href=&quot;https://www.linkedin.com/in/davidwoon&quot;&gt;David Woon&lt;/a&gt; was assumed to be one of those ordinary trouble-shooting sessions, but thanks to Gustaf Lundh, it turned out to be a very interesting exercise.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;What we discovered was that the profiler I was using (&lt;a href=&quot;https://www.yourkit.com/&quot;&gt;Your Kit Profiler&lt;/a&gt;), was basically eliminating all the weak/soft references from the picture entirely. If we are looking for leaks, this was the right thing, as those references will be cleared before VM chokes with &lt;tt&gt;OutOfMemoryError&lt;/tt&gt;. But because of this elimination, I was completely blind to the wasteful memory usage in Jelly, which are only reachable via soft references.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;So I used &lt;a href=&quot;https://www.eclipse.org/mat/&quot;&gt;Eclipse Memory Analyzer&lt;/a&gt; and YJP side by side to look into Jelly’s memory usage, and based on that insight, I was able to substantially improve the memory usage and speed of Jelly.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I monitor my production Hudson deployment with &lt;a href=&quot;https://java.sun.com/performance/jvmstat/visualgc.html&quot;&gt;VisualGC&lt;/a&gt;, and the result was quite noticeable. And I hope you’ll notice that the response from Hudson is also snappier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;All these changes are a part of the latest 1.346 release.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note:&lt;/strong&gt; Kohsuke Kawaguchi a senior engineer at Oracle (formerly Sun) and is the founder and author of the Hudson project. To learn more about Kohsuke, you can &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;follow him on Twitter&lt;/a&gt; or subscribe to &lt;a href=&quot;https://weblogs.java.net/blog/kohsuke/&quot;&gt;his blog&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/15/hudson-1-346-released/</id>
<title>Hudson 1.346 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-15T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/15/hudson-1-346-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
After some scrambling earlier in the week to get 1.345 out the door, correcting some regressions in 1.344, the Hudson team still rolled out a 1.346 release last Friday, February 12th, 2010. Similar to the past couple releases, 1.346 had a good number of bug fixes, including a a performance fix when dealing with larger build submissions and a substantial revision of the SCM polling code to fix a long-standing issue with the quiet period blocking the build from running (issue 2180), there were also some additionally memory improvements made to Jelly, the library with which the majority of Hudson&#8217;s...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;After some scrambling earlier in the week to get &lt;a href=&quot;https://www.jenkins.io/blog/2010/02/08/breaking-hudson-1-345-released/&quot;&gt;1.345 out the door&lt;/a&gt;, correcting some regressions in 1.344, the Hudson team still rolled out a 1.346 release last Friday, February 12th, 2010. Similar to the past couple releases, 1.346 had a good number of bug fixes, including a a performance fix when dealing with larger build submissions and a substantial revision of the SCM polling code to fix a long-standing issue with the quiet period blocking the build from running (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/2180&quot;&gt;issue 2180&lt;/a&gt;), there were also some additionally memory improvements made to &lt;a href=&quot;https://en.wikipedia.org/wiki/Apache%20Jelly&quot;&gt;Jelly&lt;/a&gt;, the library with which the majority of Hudson’s web interface is rendered, that Kohsuke will detail in a later post.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Here’s the breakdown:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;bugs-fixed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs-fixed&quot; /&gt;Bugs fixed&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Maven modules should not be buildable when the parent project is disabled. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/1375&quot;&gt;issue 1375&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed the broken quiet period implementation when polling interval is shorter than the quiet period. (Changes in SCM impls are needed for this to take effect.) (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/2180&quot;&gt;issue 2180&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Escape username in URLs in case it contains special characters such as &quot;#&quot;. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/2610&quot;&gt;issue 2610&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix sidepanel link for People to be visible and show view-specific info when appropriate. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5443&quot;&gt;issue 5443&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Improved HTML rendering, not using closing tags that do not exist in HTML. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5458&quot;&gt;issue 5458&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Show better error message for missing view type selection when creating a view. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5469&quot;&gt;issue 5469&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hudson wasn’t properly streaming a large external build submission, which can result in OOME and unresponsiveness.&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;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&lt;/h3&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use fixed-width font in text area for shell/batch build steps. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5471&quot;&gt;issue 5471&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use user selected icon size on People page. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5447&quot;&gt;issue 5447&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speed/footprint improvement in the HTML rendering.&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;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release of Hudson contained 37 commits from 3 different contributors to &quot;core&quot;:&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://twitter.com/kohsukekawa&quot;&gt;kohsuke&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.sun.com/mindless&quot;&gt;mindless&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ssogabe&quot;&gt;sogabe&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;As usual, you can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Updated:&lt;/strong&gt; Added the &quot;official&quot; changelog notes&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/14/thanks-for-the-help/</id>
<title>Thanks for the help!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-14T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/14/thanks-for-the-help/" />
<author>
<name>rtyler</name>
</author>
<category term='core'></category>
<summary>
A great community of developers and users is one of the many things that make Hudson a great tool and a fun project to work with, after launching Continuous Blog as an extensions of that community earlier this week there are some thanks in order to those that helped spread the word about CB and in turn, Hudson. Thanks to:




Everybody on Twitter who retweeted the Continuous Blog launch announcement


Julian Simpson, also known as The Build Doctor for helping spread the word


Kevin Farnham for featuring the launch of Continuous Blog on the Java.net home page!




Of course, none of this would be...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A great community of developers and users is one of the many things that make Hudson a great tool and a fun project to work with, after launching Continuous Blog as an extensions of that community earlier this week there are some thanks in order to those that helped spread the word about CB and in turn, Hudson. Thanks to:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Everybody on Twitter who retweeted the &lt;a href=&quot;https://twitter.com/hudsonci/status/8796480478&quot;&gt;Continuous Blog launch announcement&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20160422084828/http://www.juliansimpson.org/&quot;&gt;Julian Simpson&lt;/a&gt;, also known as &lt;a href=&quot;https://www.build-doctor.com/&quot;&gt;The Build Doctor&lt;/a&gt; for helping &lt;a href=&quot;https://www.build-doctor.com/2010/02/08/the-official-hudson-weblog/&quot;&gt;spread the word&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kevin_farnham&quot;&gt;Kevin Farnham&lt;/a&gt; for featuring the launch of Continuous Blog on the &lt;a href=&quot;https://java.net&quot;&gt;Java.net&lt;/a&gt; home page!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Of course, none of this would be possible without &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; and a large collection of contributors that have made Hudson what it is today.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/12/this-week-in-plugins/</id>
<title>This Week in Plugins</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-12T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/12/this-week-in-plugins/" />
<author>
<name>rtyler</name>
</author>
<category term='infrastructure'></category>
<category term='feedback'></category>
<summary>
Since this is the first "This Week in Plugins" (TWiP), I&#8217;m trying a fairly basic format out. I&#8217;m debating how much information I want to include in these, while I would like to include details on "what&#8217;s changed" for each plugin over the course of the week, the means of fetching that information would be incredibly tedious (read: no fun) since there&#8217;s not particularly any standard meta-data to be scraped from the wiki. Duplicates have been pruned from the list, meaning the latest release of a plugin is what&#8217;s being shown; sorting is also by day of release then alphabetical.




Feb...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Since this is the first &quot;This Week in Plugins&quot; (TWiP), I’m trying a fairly basic format out. I’m debating how much information I want to include in these, while I would like to include details on &quot;what’s changed&quot; for each plugin over the course of the week, the means of fetching that information would be incredibly tedious (read: no fun) since there’s not particularly any standard meta-data to be scraped from the &lt;a href=&quot;https://wiki.jenkins.io&quot;&gt;wiki&lt;/a&gt;. Duplicates have been pruned from the list, meaning the latest release of a plugin is what’s being shown; sorting is also by day of release then alphabetical.&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;Feb 4th, 2010&lt;/strong&gt;&lt;/p&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/codescanner&quot;&gt;Codescanner Plug-in 0.9 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 5th, 2010&lt;/strong&gt;&lt;/p&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/logaction-plugin&quot;&gt;Centralized Job(Re)Action 1.1 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/perfpublisher&quot;&gt;Performance Publisher plugin 7.95 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/selenium-aes&quot;&gt;Selenium Auto Exec Server(AES) plugin 0.3 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 6th, 2010&lt;/strong&gt;&lt;/p&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/mstest&quot;&gt;MSTest plugin 0.5 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/text-finder&quot;&gt;TextFinder plugin 1.8 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 7th, 2010&lt;/strong&gt;&lt;/p&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/configurationslicing&quot;&gt;Configuration Slicing plugin 1.16 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 8th, 2010&lt;/strong&gt;&lt;/p&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/ClearCase-UCM-Baseline&quot;&gt;ClearCase UCM Baseline Plug-in 1.2 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/Join&quot;&gt;Join plugin 1.8 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 9th, 2010&lt;/strong&gt;&lt;/p&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/downstream-ext&quot;&gt;Downstream-Ext 1.5 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/groovy-postbuild&quot;&gt;Groovy Postbuild 1.1 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 10th, 2010&lt;/strong&gt;&lt;/p&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/batch-task&quot;&gt;Batch task plugin 1.13 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/disk-usage&quot;&gt;disk-usage plugin 0.10 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/jboss&quot;&gt;JBoss Management Plugin 1.0 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/sidebar-link&quot;&gt;Sidebar Link 1.3 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/slave-status&quot;&gt;slave-status 1.4 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/sloccount&quot;&gt;SLOCCount Plug-in 1.4 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/starteam&quot;&gt;StarTeam plugin 0.2 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/template-project&quot;&gt;Template Project plugin 1.1 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/tuxdroid&quot;&gt;TuxDroid Plugin 1.6 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/zentimestamp&quot;&gt;Zentimestamp plugin 1.2 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Feb 11th, 2010&lt;/strong&gt;&lt;/p&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/backup&quot;&gt;Backup plugin 1.4 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/promoted-builds-simple&quot;&gt;Promoted Builds (Simple) 1.2 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/python&quot;&gt;Python Plugin 1.1 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://plugins.jenkins.io/subversion&quot;&gt;Subversion Plug-in 1.11 released&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/11/spotlight-on-ita-software/</id>
<title>Spotlight on: ITA Software</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-11T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/11/spotlight-on-ita-software/" />
<author>
<name>rtyler</name>
</author>
<category term='general'></category>
<category term='feedback'></category>
<category term='interview'></category>
<summary>
For the first "User Spotlight" interview ever on Continuous Blog, I am talking with Matt Girard of
ITA Software, a Boston-based software company that produces travel industry software which is used by many of the major carriers in the U.S. and abroad. When I sent out a message asking for users of Hudson in the corporate space to ping me about doing a "spotlight" on them, ITA Software stuck out in particular; they&#8217;re hiring a Hudson expert!







The format for the "spotlight" series isn&#8217;t entirely nailed down yet so feel free to ask questions in the comments section and I&#8217;ll follow-up with...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;For the first &quot;User Spotlight&quot; interview &lt;em&gt;ever&lt;/em&gt; on Continuous Blog, I am talking with Matt Girard of
&lt;a href=&quot;https://itasoftware.com/?continuousblog&quot;&gt;ITA Software&lt;/a&gt;, a Boston-based software company that produces travel industry software which is used by many of the major carriers in the U.S. and abroad. When I sent out &lt;a href=&quot;https://twitter.com/hudsonci/status/8553593409&quot;&gt;a message&lt;/a&gt; asking for users of Hudson in the corporate space to ping me about doing a &quot;spotlight&quot; on them, ITA Software stuck out in particular; they’re hiring a Hudson expert!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;a class=&quot;image&quot; href=&quot;https://twitter.com/equalize/status/8338991375&quot;&gt;&lt;img src=&quot;https://placeholder.apture.com/ph/355x210_TwitterArticle/&quot; alt=&quot;355x210 TwitterArticle&quot; width=&quot;355px&quot; /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The format for the &quot;spotlight&quot; series isn’t entirely nailed down yet so feel free to ask questions in the comments section and I’ll follow-up with Matt after the fact if need be. That said, without further delay, Matt Girard from ITA Software, on Hudson.
---&lt;table border=&quot;0&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Matt, appreciate you taking the time to answer some questions about Hudson at ITA Software, let’s start with a simple one: How long has ITA been using Hudson?&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Matt&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;My pleasure, glad to be a part of the community. We have been using Hudson in some form since early 2008. Predictably our usage has increased over time and now encompasses the majority of our automated build and test infrastructure.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Was continuous integration a part of ITA’s workflow prior to adopting Hudson? If so: what did ITA switch to Hudson from, and why?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Matt&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Yes, though not to the degree that we have now. Prior to Hudson we were reliant on &lt;a id=&quot;aptureLink_0DdF7ImGgA&quot; href=&quot;https://en.wikipedia.org/wiki/BuildBot&quot;&gt;BuildBot&lt;/a&gt; for our automated builds, but we were not doing continuous integration
 across our components until after the transition to Hudson. The easy to understand UI and flexibility were primary features that compelled our switch. I should mention
 that when we decided to switch we also evaluated &lt;a id=&quot;aptureLink_3DDvWBrYei&quot; href=&quot;https://en.wikipedia.org/wiki/CruiseControl&quot;&gt;CruiseControl&lt;/a&gt; but Hudson came out on top for our needs.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;What kind of projects are you typically using Hudson for? What
languages/build system(s)? What platforms is Hudson performing builds? What kinds of jobs primarily run on ITA’s Hudson cluster?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;++&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Matt&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Our Hudson environments (yes, we have more than one) have been optimized for building C++, Java (all &lt;a id=&quot;aptureLink_dkCKWMZxl1&quot; href=&quot;https://en.wikipedia.org/wiki/Apache%20Maven&quot;&gt;maven&lt;/a&gt; based), Lisp (a surprise to some to be sure &lt;a href=&quot;https://itasoftware.com/careers/l_e_t_lisp.html?catid=8&quot;&gt;more about that here&lt;/a&gt;), and Python on Linux build agents (Fedora and CentOS).&lt;/td&gt;
&lt;/tr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Our jobs are (loosely) grouped into one of three categories: rpm (we are primarily RedHat based), tests, and tools. The rpm jobs are the actual code builds and individual component unit tests. The test jobs (thank you &lt;a id=&quot;aptureLink_ZDsnAh3cPt&quot; href=&quot;https://plugins.jenkins.io/parameterized-trigger&quot;&gt;parameterized trigger plugin&lt;/a&gt;!) are part of a larger cross-component integration testing and promotion scheme. The (handful of) tools jobs support us in tasks such as cleaning up stale sandbox database connections.&lt;/p&gt;&lt;/div&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Given the flexibility of Hudson, it’s safe to say that not everybody is using it in the exact same fashion, is there anything you would consider interesting or noteworthy about the use of Hudson at ITA?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Matt&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;I think that our most interesting usage of Hudson has to be how we have combined parameterized builds with the parameterized trigger plugin in order to do cross-component testing of trunk code. More specifically, we pass a properties file (to us a &quot;scoreboard&quot; that tells the jobs what exact revisions of which projects to
 test together) to several jobs and only build a final promotion job if ALL of downstream jobs (with the same scoreboard) passed. In this way we create a hurdle that all of our code must clear before we even consider deploying it anywhere else.&lt;/td&gt;
&lt;/tr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The next most interesting thing we are doing is using Hudson for continuous &lt;em&gt;deployment&lt;/em&gt; of monitoring changes into our staging environment. It’s quite rewarding to watch a check-in makes it’s way through Hudson, into and rpm, and out to a server without a human being involved.&lt;/p&gt;&lt;/div&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Are there any additional tools ITA has written to better integrate things &quot;behind the scenes&quot;?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; valign=&quot;top&quot;&gt;&lt;strong&gt;Matt&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;We evolved what became a very large build script (mostly derived from what we had for BuildBot) that handles all of the nitty-gritty details involved in the building, packaging, and testing of our software. Recently we have been working to refactor this into several smaller build tools each with a more focused purpose. The first of these is designed (largely as a wrapper to &lt;a id=&quot;aptureLink_IpFANHwY8F&quot; href=&quot;https://en.wikipedia.org/wiki/RPM%20Package%20Manager&quot;&gt;rpmbuild&lt;/a&gt;) to standardize our package building while leaving the .spec files (with the real specifics) living alongside the code where they belong.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Hudson&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;On a scale from 1-10, how important would you rate Hudson for ITA’s
day-to-day workflow?&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;Matt&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;ITA is a decent size company and there is plenty of work that goes on that does not involve Hudson in any way. Still since we rely on the building and testing that Hudson does in order to promote new code to production, I would say that we are somewhere around an 8.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I’d like to thank Matt again for being a good sport as the very first in what I hope will be a long line of &quot;spotlights&quot; on companies using Hudson to help them work smart, better and faster. If you would like to discuss your company’s use of Hudson for Continuous Blog, you can contact me at &lt;code&gt;tyler&lt;/code&gt; at &lt;code&gt;linux.com&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note:&lt;/strong&gt; Matt Girard is the Manager of Build and Integration at ITA Software and a passionate advocate for continuous integration and continuous deployment. He believes that release engineering exists to make developers lives easier — not harder — and can be found posting about such topics on Twitter as &lt;a href=&quot;https://twitter.com/equalize&quot;&gt;@equalize&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;&lt;/hr&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/10/keeping-your-configuration-and-data-in-subversion/</id>
<title>Keeping your configuration and data in Subversion</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-10T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/10/keeping-your-configuration-and-data-in-subversion/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='guest post'></category>
<category term='jobs'></category>
<category term='just for fun'></category>
<category term='tutorial'></category>
<summary>
We all know that keeping important files in version control is critical, as it ensures problematic changes can be reverted and can serve as a backup mechanism as well. Code and resources are often kept in version control, but it can be easy to forget your continuous integration (CI) server itself! If a disk were to die or fall victim to a misplaced rm -rf, you could lose all the history and configuration associated with the jobs your CI server manages.


It&#8217;s pretty simple to create a repository, but it isn&#8217;t obvious which parts of your $HUDSON_HOME you&#8217;ll want to backup....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We all know that keeping important files in version control is critical, as it ensures problematic changes can be reverted and can serve as a backup mechanism as well. Code and resources are often kept in version control, but it can be easy to forget your continuous integration (CI) server itself! If a disk were to die or fall victim to a &lt;a href=&quot;https://twitter.com/progrium/status/7646048501&quot;&gt;misplaced&lt;/a&gt; &lt;code&gt;rm -rf&lt;/code&gt;, you could lose all the history and configuration associated with the jobs your CI server manages.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;It’s pretty simple to create a repository, but it isn’t obvious which parts of your $HUDSON_HOME you’ll want to backup. You’ll also want to have some automation so new projects get added to the repository, and deleted ones get removed. Luckily we have a great tool to handle this: Hudson!&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We have a Hudson job which runs nightly, performs the appropriate SVN commands, and checks in. The high-level overview of this job is basically:&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;Add any new jobs, users, plugin configurations, et cetera: &lt;code&gt;svn add -q --parents &lt;strong&gt;.xml jobs/&lt;/strong&gt;/config.xml users/&lt;strong&gt;/config.xml userContent/&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove anything from SVN that no longer exists (such as a deleted job): &lt;code&gt;svn status | grep &#39;!&#39; | awk &#39;{print $2;}&#39; | xargs -r svn rm&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check it in! &lt;code&gt;svn ci --non-interactive --username=mrhudson -m &quot;automated commit of Hudson configuration&quot;&lt;/code&gt;
You’ll want to make sure to use the &lt;code&gt;--non-interactive&lt;/code&gt; option for any automated svn operations, as this ensures Subversion won’t hang asking a question but instead fail immediately. You may also need to provide your password with the &lt;code&gt;--password&lt;/code&gt; option.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;To make such a Hudson job, create a new job, tie it to the controller (since this is where the configuration files are), set it to build periodically (we use “@midnight”), and add an “Execute shell” build step. Here’s the full script we use, to put into the build step:&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;# Change into your HUDSON_HOME.&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /opt/hudson
&lt;span class=&quot;c&quot;&gt;# Add any new conf files, jobs, users, and content.&lt;/span&gt;
svn add &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--parents&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.xml &lt;span class=&quot;nb&quot;&gt;jobs&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/config.xml &lt;span class=&quot;nb&quot;&gt;users&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/config.xml userContent/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Ignore things in the root we don&#39;t care about.&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;warnlogn*.logn*.tmpn*.oldn*.bakn*.jarn*.json&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; myignores
svn propset svn:ignore &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; myignores &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;rm &lt;/span&gt;myignores
&lt;span class=&quot;c&quot;&gt;# Ignore things in jobs/* we don&#39;t care about.&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;buildsnlast*nnext*n*.txtn*.lognworkspace*ncoberturanjavadocnhtmlreportsnncoverndoclinks&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; myignores
svn propset svn:ignore &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; myignores &lt;span class=&quot;nb&quot;&gt;jobs&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;rm &lt;/span&gt;myignores
&lt;span class=&quot;c&quot;&gt;# Remove anything from SVN that no longer exists in Hudson.&lt;/span&gt;
svn status | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;!&#39;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;{print $2;}&#39;&lt;/span&gt; | xargs &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; svn &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# And finally, check in of course, showing status before and after for logging.&lt;/span&gt;
svn st &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; svn ci &lt;span class=&quot;nt&quot;&gt;--non-interactive&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--username&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;mrhudson &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;automated commit of Hudson configuration&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; svn st&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You’ll notice this does some extra things like set the svn:ignores property to provide a relatively clean &lt;code&gt;svn st&lt;/code&gt; which it shows before and after the commit for logging purposes. One thing this job &lt;em&gt;doesn’t&lt;/em&gt; do is put the build results of your jobs in version control. Because historical build logs and artifacts will never change and are also potentially large, a periodic (daily or weekly) &lt;code&gt;cp&lt;/code&gt; or &lt;code&gt;rsync&lt;/code&gt; of the &lt;strong&gt;jobs&lt;/strong&gt; directory will still give you restorability while keeping your repository lean.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Now you can sleep well at night knowing that your CI server is safe and sound. If you are doing a similar thing with Hudson or another CI system, let us know about your solution!&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note:&lt;/strong&gt; &lt;a href=&quot;https://twitter.com/MikeRooney&quot;&gt;Mike Rooney&lt;/a&gt; is a Software Engineer at &lt;a href=&quot;https://twitter.com/Genius_com&quot;&gt;Genius.com&lt;/a&gt;, provider of real-time marketing automation software connecting marketing and sales. You can read more posts from Mike and other Geniuses at &lt;a href=&quot;https://eng.genius.com&quot;&gt;eng.genius.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/09/whats-going-on-with-the-hudsons-infrastructure/</id>
<title>What&#39;s going on with the Hudson&#39;s infrastructure</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-09T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/09/whats-going-on-with-the-hudsons-infrastructure/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='core'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<summary>
A lot has changed in the Hudson development and distribution infrastructure since last summer - we&#8217;ve made a distinct effort to get the quality of our infrastructure to match the quality of Hudson itself. We owe a special thanks to the wonderful folks over at Atlassian - we&#8217;re taking advantage of their generous open source license for our bug tracking (JIRA), wiki (Confluence), and source repository browser (FishEye). Obviously, there&#8217;s a lot more we can improve going forward - I&#8217;ll have another post up soon, looking at some of the ideas we&#8217;re kicking around. But for now, take a look...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;A lot has changed in the Hudson development and distribution infrastructure since last summer - we’ve made a distinct effort to get the quality of our infrastructure to match the quality of Hudson itself. We owe a special thanks to the wonderful folks over at &lt;a href=&quot;https://atlassian.com/&quot;&gt;Atlassian&lt;/a&gt; - we’re taking advantage of their generous &lt;a href=&quot;https://www.atlassian.com/opensource/&quot;&gt;open source license&lt;/a&gt; for our bug tracking (&lt;a href=&quot;https://www.atlassian.com/software/jira/&quot;&gt;JIRA&lt;/a&gt;), wiki (&lt;a href=&quot;https://www.atlassian.com/software/confluence/&quot;&gt;Confluence&lt;/a&gt;), and source repository browser (&lt;a href=&quot;https://www.atlassian.com/software/fisheye/&quot;&gt;FishEye&lt;/a&gt;). Obviously, there’s a lot more we can improve going forward - I’ll have another post up soon, looking at some of the ideas we’re kicking around. But for now, take a look at what we’ve already done, below the fold.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The Hudson war and plugin downloads have all moved off of the unreliable java.net to our own hudson-ci.org with the downloads being powered by the same system used for distributing Java, OpenSolaris, and NetBeans. Downloading Hudson and/or plugins is now easier and more reliable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’ve moved issue tracking from java.net’s system to our own JIRA instance, at issues.hudson-ci.org. As with moving downloads off java.net, we’ve made reporting and browsing Hudson’s issues much faster, easier and more reliable, while still using the same authentication on the back-end as our Subversion and Maven repositories. We’re still working out some kinks in the system but since we’re running our own issue tracker now, rather than using one we didn’t have control over, we’ve got the flexibility we need to adapt our tools to best serve the developer and user communities.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Speaking of tools we now run ourselves, we’ve put up our own FishEye instance at fisheye.hudson-ci.org - until that was in place, we’d been relying on Atlassian’s public FishEye instance, which has many other open source projects&#39; repositories available. Getting our own server up means we don’t have to bug the generous folks over at Atlassian every time the java.net SVN server confuses FishEye into failing to update. It also opens the door for us to use &lt;a href=&quot;https://www.atlassian.com/software/crucible/&quot;&gt;Crucible&lt;/a&gt; for code review in the future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hudson’s moved onto Twitter more and more over the last 6-9 months - we’ve got the always fabulous &lt;a href=&quot;https://twitter.com/hudsonci&quot;&gt;@hudsonci&lt;/a&gt;, tweeting new releases, Hudson-related tweets, and more, as well as the &lt;a href=&quot;https://twitter.com/search?q=%23hudsonci&quot;&gt;#hudsonci&lt;/a&gt; hashtag.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This may not strictly be infrastructure but it’s worth mentioning that we’ve now got native packages and distribution for Hudson for &lt;a href=&quot;https://hudson-ci.org/debian/&quot;&gt;Ubuntu/Debian&lt;/a&gt;, &lt;a href=&quot;https://hudson-ci.org/redhat/&quot;&gt;Red Hat/Fedora/CentOS&lt;/a&gt;, &lt;a href=&quot;https://hudson-ci.org/opensuse/&quot;&gt;openSUSE&lt;/a&gt;, &lt;a href=&quot;https://pkg.hudson-ci.org/&quot;&gt;OpenSolaris/Nevada&lt;/a&gt;, and &lt;a href=&quot;https://www.freshports.org/www/hudson/&quot;&gt;FreeBSD&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This is all in addition to key parts of our infrastructure that haven’t changed: our &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Home&quot;&gt;official wiki&lt;/a&gt;, our &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mailing+List&quot;&gt;user and developer mailing lists&lt;/a&gt;, our &lt;a href=&quot;https://hudson.dev.java.net/svn/hudson/trunk/hudson/&quot;&gt;Subversion repository&lt;/a&gt; (and a &lt;a href=&quot;https://github.com/kohsuke/hudson/&quot;&gt;Git mirror&lt;/a&gt; on GitHub) and our &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/IRC+Channel&quot;&gt;IRC channel over on Freenode&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Oh, and I hear there’s a blog now too.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Editor’s Note: *Andrew Bayer (&lt;code&gt;abayer&lt;/code&gt;) has been a contributor to Hudson since early 2009, contributing to the ClearCase plugin, Hudson’s core and a small number of other plugins. Andrew also helps Kohsuke with a lot of Hudson’s project infrastructure, most notably the migration from Bugzilla on Java.net to JIRA running at &lt;a href=&quot;https://issues.hudson-ci.org&quot;&gt;issues.hudson-ci.org&lt;/a&gt;&lt;/strong&gt;*&lt;/p&gt;
&lt;/div&gt;&lt;/hr&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/08/incoming-more-translations/</id>
<title>Incoming! More Translations</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/08/incoming-more-translations/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<summary>
As Kohsuke mentioned on the dev@ mailing
list on January 29th,
another series of community translations of Hudson have been committed
(r26764) and have been released with the
Hudson 1.344 release.


The locales included in this update are:




Czech


Spanish


Finnish


French


Hungarian


Japanese


Korean


Lithuanian


Norwegian


Dutch


Polish


Brazilian Portuguese


Russian


Slovenian


Swedish


Chinese (Simplified/Traditional)




If you&#8217;re fluent in any of the locales above, check out the latest release of Hudson to verify that the translations are correct, if there&#8217;s translations that you feel are incorrect, you can report them in JIRA.


The internationalization project could always use some more help whether it be from patches or via the Translation Assistance Plugin....
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As &lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt; mentioned on the dev@ &lt;a href=&quot;https://wiki.jenkins.io/display/JENKINS/Mailing+List&quot;&gt;mailing
list&lt;/a&gt; on January 29th,
another series of community translations of Hudson have been committed
(&lt;a href=&quot;https://hudson-ci.org/commit/26764&quot;&gt;r26764&lt;/a&gt;) and have been released with the
Hudson 1.344 release.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The locales included in this update are:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Czech&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spanish&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finnish&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;French&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hungarian&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Japanese&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Korean&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lithuanian&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Norwegian&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dutch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Polish&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Brazilian Portuguese&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Russian&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Slovenian&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Swedish&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chinese (Simplified/Traditional)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you’re fluent in any of the locales above, check out the latest release of Hudson to verify that the translations are correct, if there’s translations that you feel are incorrect, you can report them in &lt;a href=&quot;https://issues.hudson-ci.org&quot;&gt;JIRA&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.jenkins.io/doc/developer/internationalization/&quot;&gt;internationalization&lt;/a&gt; project could always use some more help whether it be from patches or via the &lt;a href=&quot;https://plugins.jenkins.io/translation&quot;&gt;Translation Assistance Plugin&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/08/hudson-1-344-released/</id>
<title>Hudson 1.344 Released</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/08/hudson-1-344-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
The latest release of Hudson, 1.344, was released on February 5th, 2010. The release contains primarily bug-fixes but has a few enhancements baked into it as well. As mentioned in "[Incoming! More Translations", 1.344 incorporates a number of community-driven translations (see the other post for more information). Additionally, 1.344 removes the "easter egg" background image I wrote about in a post to my personal blog: Mourning Sun Enough of the small talk, here&#8217;s the breakdown.


Bugs fixed




Removed the forced upper casing in parameterized builds. (issue 5391)


Password parameter on the disk should be encrypted. (issue 5420)


Duplicate entries on Upstream/Downstream project with "Build...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;The latest release of Hudson, 1.344, was released on February 5th, 2010. The release contains primarily bug-fixes but has a few enhancements baked into it as well. As mentioned in &quot;&lt;a href=&quot;https://www.jenkins.io/content/incoming-more-translations&quot;&gt;[Incoming! More Translations&lt;/a&gt;&quot;, 1.344 incorporates a number of community-driven translations (see the other post for more information). Additionally, 1.344 removes the &quot;easter egg&quot; background image I wrote about in a post to my personal blog: &lt;a href=&quot;http://unethicalblogger.com/posts/2010/01/mourning_sun&quot;&gt;Mourning Sun&lt;/a&gt; Enough of the small talk, here’s the breakdown.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;bugs-fixed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs-fixed&quot; /&gt;Bugs fixed&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;Removed the forced upper casing in parameterized builds. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5391&quot;&gt;issue 5391&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Password parameter on the disk should be encrypted. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5420&quot;&gt;issue 5420&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Duplicate entries on Upstream/Downstream project with &quot;Build modules in parallel&quot;. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5293&quot;&gt;issue 5293&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Projects tied on&quot; should be &quot;Projects tied to&quot;. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5451&quot;&gt;issue 5451&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed the bug that prevents update center metadata retrieval in Jetty. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5210&quot;&gt;issue 5210&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;enhancements&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#enhancements&quot; /&gt;Enhancements&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;Show which plugins have already been upgraded in Plugin Manager. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/2313&quot;&gt;issue 2313&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Show Hudson upgrade status on manage page instead of offering same upgrade again. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/3055&quot;&gt;issue 3055&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make badges in build history line up. (&lt;a href=&quot;https://web.archive.org/web/20100524080401/https://hudson.361315.n4.nabble.com/Align-lock-sign-of-keep-build-forever-td1016427.html&quot;&gt;report&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;contributors&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#contributors&quot; /&gt;Contributors&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;This release of Hudson contained 44 commits from 5 different contributors to &quot;core&quot;:&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://twitter.com/abayer&quot;&gt;abayer&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;kohsuke&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://blogs.sun.com/mindless&quot;&gt;mindless&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ssogabe&quot;&gt;sogabe&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/thuybrechts&quot;&gt;huybrechts&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;As usual, you can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; This post was written a day before &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5536&quot;&gt;issue 5536&lt;/a&gt; was discovered. I recommend waiting until 1.345 to update any production Hudson instances.&lt;/p&gt;
&lt;/div&gt;
&lt;/hr&gt;
&lt;/div&gt;&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/08/breaking-hudson-1-345-released/</id>
<title>Breaking! Hudson 1.345 Released!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-08T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/08/breaking-hudson-1-345-released/" />
<author>
<name>rtyler</name>
</author>
<category term='development'></category>
<category term='feedback'></category>
<category term='just for fun'></category>
<category term='links'></category>
<summary>
As I mentioned in the footer of the post on the Hudson 1.344 release, there were a couple big regressions in the 1.344 release that were causing a number of users issues (such as issue 5536 and issue 5546).


As a result, Kohsuke and the team have quickly pushed out a hot-fix release: 1.345. Here&#8217;s the break down:


Bugs fixed:



Update center retrieval, "build now" link, and real-time console update was broken in 1.344 (issue 5536)


Fixed the backward incompatibility introduced in HUDSON-5391 fix in 1.344. (issue 5391)




If you have already updated to 1.344, your "Update Center" is most likely busted and you&#8217;ll need...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As I mentioned in the footer of the post on the &lt;a href=&quot;https://www.jenkins.io/blog/2010/02/08/hudson-1-344-released/&quot;&gt;Hudson 1.344 release&lt;/a&gt;, there were a couple big regressions in the 1.344 release that were causing a number of users issues (such as &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5536&quot;&gt;issue 5536&lt;/a&gt; and &lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5546&quot;&gt;issue 5546&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As a result, Kohsuke and the team have quickly pushed out a hot-fix release: 1.345. Here’s the break down:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;bugs-fixed&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#bugs-fixed&quot; /&gt;Bugs fixed:&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Update center retrieval, &quot;build now&quot; link, and real-time console update was broken in 1.344 (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5536&quot;&gt;issue 5536&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed the backward incompatibility introduced in HUDSON-5391 fix in 1.344. (&lt;a href=&quot;https://issue-redirect.jenkins.io/issue/5391&quot;&gt;issue 5391&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;If you have already updated to 1.344, your &quot;Update Center&quot; is most likely busted and you’ll need to download the &lt;code&gt;hudson.war&lt;/code&gt; file manually.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;You can go grab the &lt;a href=&quot;https://mirrors.jenkins.io/war-stable/latest/jenkins.war&quot;&gt;latest .war file&lt;/a&gt; straight from &lt;code&gt;hudson-ci.org&lt;/code&gt; or if you’re using a native package, use your package manager to upgrade.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
<entry>
<id>https://www.jenkins.io/blog/2010/02/02/welcome-to-continuous-blog/</id>
<title>Welcome to Continuous Blog!</title>
<updated>2026-05-26T08:43:08+00:00</updated>
<published>2010-02-02T00:00:00+00:00</published>
<link rel="alternate" type="text/html" href="https://www.jenkins.io/blog/2010/02/02/welcome-to-continuous-blog/" />
<author>
<name>rtyler</name>
</author>
<category term='core'></category>
<category term='feedback'></category>
<summary>
Hello and welcome to "Continuous Blog", the official Hudson weblog! If you
don&#8217;t mind me saying so, I think its arrival is long overdue. Since Hudson
started in November of 2006, there hasn&#8217;t been a central "voice" for the
project. In just a few short years Hudson has grown into a substantial project
with hundreds of plugins and thousands of users around the world.
Kohsuke's
nice Java-based extensible continuous integration server has grown up into
fantastic tool with a great community around it.


Goals for this weblog

I think it is important to set out a couple of goals for this weblog, some simple items that should help guide...
</summary>
<content type='html'>
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Hello and welcome to &quot;Continuous Blog&quot;, the official Hudson weblog! If you
don’t mind me saying so, I think its arrival is long overdue. Since Hudson
started in November of 2006, there hasn’t been a central &quot;voice&quot; for the
project. In just a few short years Hudson has grown into a substantial project
with &lt;strong&gt;hundreds&lt;/strong&gt; of plugins and thousands of users around the world.
&lt;a href=&quot;https://twitter.com/kohsukekawa&quot;&gt;Kohsuke&lt;/a&gt;&#39;s
nice Java-based extensible continuous integration server has grown up into
fantastic tool with a great community around it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;goals-for-this-weblog&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#goals-for-this-weblog&quot; /&gt;Goals for this weblog&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;I think it is important to set out a couple of goals for this weblog, some simple items that should help guide the content and discussion around Continuous Blog and its future.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Continuous Blog should:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Help advocate the use of Hudson to the larger internet community&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be a central source for tutorials and helpful information to Hudson users of all skill-levels&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recognize the numerous contributors to the Hudson project for their efforts&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;what-to-expect&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#what-to-expect&quot; /&gt;What to expect&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;As Continuous Blog grows and matures, you can expect to see a variety of Hudson-related content. Overviews of the latest releases of Hudson and its plugins, interviews and discussions with the developers who have contributed to Hudson over the years, guest posts by power-users on how Hudson fits into their workflow and much much more (really).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;If you look around the page you’ll already see a good amount of content, in the
sidebar to the right you’ll notice the &quot;Recently Released&quot; section which
aggregates recently released plugins via &lt;a href=&quot;https://hudson.dev.java.net/servlets/ProjectRSS?type=news&quot;&gt;this RSS
feed&lt;/a&gt; , the &quot;Blogs&quot;
section which is an aggregation of Hudson community blogs (from &lt;a href=&quot;https://feeds.feedburner.com/KohsukesHudsonBlogs&quot;&gt;this RSS
feed&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;We’re just starting out so make sure you &lt;a href=&quot;https://feeds.feedburner.com/ContinuousBlog&quot;&gt;subscribe to the RSS feed&lt;/a&gt;, we’ve got a lot to talk about here on Continuous Blog.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content>
</entry>
</feed>
